做这个小游戏,主要是学习一下游戏制作的基本逻辑,加深对面向对象的理解。

游戏引擎:

/*** 大牛程序员写的游戏的公共类 * 使用Game.init()方法初始化游戏* 使用Game.gameOver()方法退出游戏*/
public class Game extends JPanel {private GameEngine engine;private Graphics2D g2d;private static JFrame frame;@Overridepublic void paint(Graphics g) {super.paint(g);g2d = (Graphics2D) g;g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);engine.renderUI(g2d);}/*** 使用游戏引擎初始化游戏的方法* @param title 游戏窗体的标题* @param width 游戏窗体的宽度* @param height 游戏窗体的高度* @param engine 游戏引擎*/public static void init(String title, int width, int height, GameEngine engine){frame = new JFrame(title);Game game = new Game();game.engine = engine;game.addKeyListener(engine.listener);game.setFocusable(true);game.setPreferredSize(new Dimension(width, height));frame.add(game);frame.pack();frame.setVisible(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);while (true) {engine.updateLogic();game.repaint();try {Thread.sleep(Config.SLEEP_TIME);} catch (InterruptedException e) {e.printStackTrace();}}}/*** 显示退出游戏对话框的方法* @param message 对话框提示的消息* @param title 对话框提示的标题*/public static void gameOver(String message,String title) {JOptionPane.showMessageDialog(frame, message, title, JOptionPane.YES_NO_OPTION);System.exit(ABORT);}
}
/*** 由大牛程序员编写的游戏引擎的抽象模板类* 需要调用者实现两个抽象方法, 更新逻辑方法updateLogic* 更新UI方法 renderUI*/
public abstract class GameEngine {KeyListener listener;private int currentPressedKeyCode;/*** 构造方法,创建出游戏引擎*/public  GameEngine(){this.listener = new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {currentPressedKeyCode = e.getKeyCode();}@Overridepublic void keyReleased(KeyEvent e) {currentPressedKeyCode = -1;}};}/*** 获取当前用户的按键代码 按键代码的定义在KeyEvent对象中定义* @return 返回KeyEvent的按键代码*/public int getCurrentPressedKeyCode(){return  currentPressedKeyCode;}/*** 根据用户行为或者游戏的时间更新游戏的逻辑*/public abstract void updateLogic();/*** 根据用户需求更新绘制图形化界面的内容* 示例代码,绘制矩形:    g2d.fillRect(左上角x的坐标, 左上角y的坐标, 矩形的宽度, 矩形的高度);* 示例代码:绘制椭圆形:  g2d.fillOval(椭圆外包裹矩形左上角x的坐标, 椭圆外包裹矩形y的坐标, 要填充椭圆形的宽度, 要填充椭圆形的高度);* @param g2d*/public abstract void renderUI(Graphics2D g2d);
}

分析过程:

其实游戏就是逻辑判断,页面更新的死循环。

我们要做的就是继承GameEngine,实现updateLogic,renderUI方法。

一开始我们可以画上网格线,方便程序的编写。等到完成之后,将网格线去除即可。

面向对象思想(指的是程序的最小单位是对象。对象之间彼此协调,相互调用,构成了程序):

我们需要什么,我们就创建什么类:我们需要一个蛇,于是创建了一个Snake类,然后蛇又是由一个个的节点组成,于是我们又创建了Node类,以此类推,我们又创建了Apple类…

贪吃蛇的具体实现代码:

public class SnakeGameEngine extends GameEngine {Grid grid = new Grid();Snake snake = new Snake();Apple apple = new Apple();@Overridepublic void updateLogic() {boolean flag = snake.headHaveApple(apple);int keyCode = getCurrentPressedKeyCode();if (keyCode == KeyEvent.VK_RIGHT) {snake.moveRight(flag);}if (keyCode == KeyEvent.VK_LEFT) {snake.moveLeft(flag);}if (keyCode == KeyEvent.VK_UP) {snake.moveUp(flag);}if (keyCode == KeyEvent.VK_DOWN) {snake.moveDown(flag);}switch(snake.headDirection) {case Direction.RIGHT:snake.moveRight(flag);break;case Direction.LEFT:snake.moveLeft(flag);break;case Direction.UP:snake.moveUp(flag);break;case Direction.DOWN:snake.moveDown(flag);break;}}@Overridepublic void renderUI(Graphics2D g2d) {grid.draw(g2d);snake.draw(g2d);apple.draw(g2d);}
}
public class SnakeGame {public static void main(String[] args) {Game.init("贪吃蛇", Config.SCREEN_WIDTH, Config.SCREEN_HEIGHT, new SnakeGameEngine());}
}
public class Snake {LinkedList<Node> snake;int headDirection = Direction.RIGHT;public Snake() {snake = new LinkedList<Node>();snake.add(new Node(6, 4));snake.addLast(new Node(5, 4));snake.addLast(new Node(4, 4));snake.addLast(new Node(3, 4));}public void moveRight(boolean flag) {if (headDirection == Direction.LEFT) {return;}headDirection = Direction.RIGHT;Node node = new Node(snake.getFirst().x + 1, snake.getFirst().y);snake.addFirst(node);if (flag == true) {} else {snake.removeLast();}}public void moveLeft(boolean flag) {if (headDirection == Direction.RIGHT) {return;}headDirection = Direction.LEFT;Node node = new Node(snake.getFirst().x - 1, snake.getFirst().y);snake.addFirst(node);if (flag == true) {} else {snake.removeLast();}}public void moveUp(boolean flag) {if (headDirection == Direction.DOWN) {return;}headDirection = Direction.UP;Node node = new Node(snake.getFirst().x, snake.getFirst().y - 1);snake.addFirst(node);if (flag == true) {} else {snake.removeLast();}}public void moveDown(boolean flag) {if (headDirection == Direction.UP) {return;}headDirection = Direction.DOWN;Node node = new Node(snake.getFirst().x, snake.getFirst().y + 1);snake.addFirst(node);if (flag == true) {} else {snake.removeLast();}}public boolean headHaveApple(Apple apple) {if ((snake.getFirst().x == apple.getX()) && (snake.getFirst().y == apple.getY())) {apple.generateNext();return true;} else {return false;}}public void draw(Graphics2D g2d) {//        for (Node node : snake) {//            node.draw(g2d);
//        }g2d.drawString("蛇的长度:" + snake.size(), 50, 50);for (int i = 0; i < snake.size(); i ++ ) {if (i == 0) {g2d.setColor(Color.GREEN);} else {g2d.setColor(Color.BLACK);}snake.get(i).draw(g2d);}}
}
public class Config {public static final boolean DEBUG_FLAG = false;public static final int SCREEN_WIDTH = 1000;public static final int SCREEN_HEIGHT = 900;public static final int GRID_SiZE = 20;public static final int COLOUM = SCREEN_WIDTH / GRID_SiZE;public static final int ROW = SCREEN_HEIGHT / GRID_SiZE;public static final int SLEEP_TIME = 50;
}
apublic class Grid {int x1;int y1;int x2;int y2;public void draw(Graphics2D g2d) {if (Config.DEBUG_FLAG == true) {for (int i = 0; i < Config.ROW; i ++ ) {g2d.drawLine(0, Config.GRID_SiZE * i, Config.SCREEN_WIDTH, Config.GRID_SiZE * i);}for (int i = 0; i < Config.COLOUM; i ++ ) {g2d.drawLine(Config.GRID_SiZE * i, 0, Config.GRID_SiZE * i,Config.SCREEN_HEIGHT);}}}
}
public class Node {int x;int y;public Node(int x, int y) {this.x = x;this.y = y;}public void draw(Graphics2D g2d) {g2d.fillRect(x * Config.GRID_SiZE, y * Config.GRID_SiZE, Config.GRID_SiZE,Config.GRID_SiZE);}
}
public class Direction {public static final int UP = 1;public static final int DOWN = 2;public static final int LEFT = 3;public static final int RIGHT = 4;
}
public class Apple {Random random = new Random();Node apple;public Apple() {apple = new Node(random.nextInt(Config.COLOUM), random.nextInt(Config.ROW));}public int getX() {return apple.x;}public int getY() {return apple.y;}public void draw(Graphics2D g2d) {g2d.setColor(Color.RED);apple.draw(g2d);g2d.setColor(Color.BLACK);}public void generateNext() {apple = new Node(random.nextInt(Config.COLOUM), random.nextInt(Config.ROW));}
}

最终效果:

做的很简易,还有很多不足:

蛇不能超过屏幕的范围

地图添加障碍物

添加游戏关卡,蛇移动的速度越来越快

等等…

JavaGUI简易版贪吃蛇小游戏相关推荐

  1. 简易贪吃蛇小游戏java版_用GUI实现java版贪吃蛇小游戏

    本文实例为大家分享了java版贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 项目结构 新建一个JFrame窗口,作为程序入口 public class GameStart{ public stat ...

  2. c语言小游戏 精简_一个简易的贪吃蛇小游戏C语言源码

    /* *程序名称:贪吃蛇v2.1 *程序描述:一个简易的贪吃蛇小游戏 *版本信息:v2.1 *v1.1版本更新:1:加入菜单选择项 *v1.2版本更新:1:修复菜单选择bug *v1.3班本更新:1: ...

  3. JAVA版贪吃蛇小游戏

    这是一篇关于JAVA的贪吃蛇游戏,源代码的部分在下面正文中介绍,图片和音频的部分都放在百度云盘,需要的自行下载. 文章目录 开发环境 一.下载方法 二.运行效果展示 三.项目结构以及主程序入口 1.项 ...

  4. 控制台版贪吃蛇小游戏 C语言

    写在前面 最近我们C语言的课设快开始了,开始前刚好有时间就写了一下C语言的贪吃蛇小游戏(单链表实现),包含了经典模式和无边界模式 ,网上查了设置颜色 和 改变光标位置 还有 用方向键控制 的函数,第一 ...

  5. 100行代码,使用 Pygame 制作一个贪吃蛇小游戏!

    作者 | 周萝卜 来源 | 萝卜大杂烩 相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了. 用到的 Pygame 函数 贪吃蛇小游戏用到的函数 功能 ...

  6. python贪吃蛇小游戏_python开发贪吃蛇小游戏

    3.概要设计 3.1 程序功能模块 由设计应解决的问题可知,本次的设计是使用用方向键来实现一个简易的贪吃蛇小游戏的程序,具体的功能模块如图3-1所示. 图3-1 程序功能模块 Fig.3-1 prog ...

  7. 【C++】经典项目控制台贪吃蛇小游戏详细教程

    [小游戏]贪吃蛇GreedySnake 本文将讲解如何使用c++面向对象方法编写控制台版贪吃蛇小游戏 项目github地址:游戏源码链接 游戏下载:GreedySnake 本人属初学者,水平所限,难免 ...

  8. C/C++制作简易版贪吃蛇游戏

    文章目录 C/C++制作简易版贪吃蛇游戏 一.开发环境 二.设计逻辑 三.代码块 3.1 使用initgraph()函数 3.2定义蛇和食物的结构体 3.3随机产生食物的坐标以及定义初始化的蛇的数据 ...

  9. 用Python做一个游戏——简易版贪吃蛇

    前言 今天,我来分享个中等级的简易版贪吃蛇,这次不是用turtle库,而是用pygame库和sys库. 1.导入库 我们需要把游戏所用的库导入进来: import pygame import sys ...

最新文章

  1. Tomcat一些小事
  2. python web框架django_Python Web应用框架 Django
  3. 百度地图 开发 乡镇级区域显示_Tableau导入乡镇级地图进行数据展示
  4. (37) BFC IFC GFC FFC概念
  5. Java 8 Optional 类 学习
  6. SQL Server - THROW字句对比RAISERROR子句
  7. c语言图形时钟编程,c语言程序+图形编程——打造简易的时钟
  8. flash网页播放器
  9. 精读FREE: Feature Refinement for Generalized Zero-Shot Learning
  10. 编程珠玑--粗略估算
  11. 从前端技术到体验科技(附演讲视频)
  12. C/C++实现双目矫正(不使用OpenCV内部函数)及矫正源码解析
  13. truffle unbox metacoin出现read ECONNRESET、ETIMEOUT、getaddrinfo ENOENT raw.githubusercontent.com问题
  14. 什么是 Batch normalization
  15. Jetty的安装、配置和使用(三种使用方式)
  16. Python基础(三)
  17. t420i升级固态硬盘提升_给电脑升级那些事,加一块希捷酷鱼120固态硬盘很畅快...
  18. 思科路由器常用接口说明
  19. postcss 插件_PostCSS深入研究:创建自己的插件
  20. HTTP协议之multipart/form-data请求分析

热门文章

  1. kolin协程讲解不错的几篇博客
  2. 我的世界java界面种子_我的世界:你玩过神奇的放大化种子吗?官方:这些东西非常吃资源...
  3. CISA资格认证的前世今生
  4. CBERS-04卫星全色与GF1_WFV多光谱数据融合测试
  5. 阿斯利康在京建立北部总部,深化在华全面战略布局
  6. 魔兽怀旧 核心数据人物基本数据分析,待续
  7. 一文告诉你如何用Bito AI提高开发效率
  8. 北交大研究生计算机专硕好考么,北京交通大学考研难度 北交的研究生好
  9. spring的自定义标签
  10. 单片机黑屏怎么回事儿_电脑黑屏-采用强制关机几次才能从新启动,怎么回事。...