专业的JAVA编程教程与资源

网站首页 > java教程 正文

拆解经典互联网游戏“贪吃蛇”的 Java 实现流程

temp10 2024-12-01 04:27:58 java教程 14 ℃ 0 评论

算法分析

(一)启动一个独立线程根据 direction 重绘面板实现蛇身移动效果,运行过程:

  1. 记录上次头部的坐标到 tempBody 中
  2. 根据方向修改头部坐标
  3. 重绘面板
  4. 判断头部坐标与食物坐标的关系,如果重合则蛇身增加,同时生成新的食物坐标,积分累加
  5. 判断与边缘的关系,如果重叠,则游戏结束
  6. 判断与 body 的关系,如果重叠,则说明碰到自己,游戏结束
  7. 休眠几十毫秒

(二)按键事件

拆解经典互联网游戏“贪吃蛇”的 Java 实现流程

  1. 方向键控制 direction ,只允许 90 度方向转换,不允许 180 度转换方向
  2. A 键控制开始游戏
  3. R 键控制重新开始游戏
  4. Esc 键控制退出游戏

(三)初始化

  1. 头部块
  2. 食物块
  3. 游戏区
  4. 积分区
  5. tempBody 初始值与头部一致

(四)移动后重绘方法

  1. 绘制背景图
  2. 绘制头部方块
  3. 回事食物方块
  4. 绘制得分
  5. 修正将 body 中的数据替换到 tempBody 除了第一个以外的数据处,得到完整的蛇身坐标
  6. 用 tempBody 修正 body 坐标数据,得到最终的数据
  7. 遍历 body 绘制蛇身方块

核心实现移动的代码

    //让蛇移动的线程
	public void move() {
		new Thread() {
			public void run() {
				while (true) {
					
					//O 是方向
					if (gameState == 1) {
						//记录此次移动前的头部坐标
						tempBody.get(0).x = head.x;
						tempBody.get(0).y = head.y;
						
						switch (direction) {
						case south:
							head.y = head.y + 10;
							break;
						case north:
							head.y = head.y - 10;
							break;
						case east:
							head.x = head.x + 10;
							break;
						case west:
							head.x = head.x - 10;
							break;
						}
						
						//重绘移动后的蛇身
						repaint();
						
						//吃到食物了
						if (head.x == food.x && head.y == food.y) {
							//身体长度加一个初始值为0的坐标
							tempBody.add(new Point(0,0));
							body.add(new Point(0,0));
							
							//得分加 10
							myScore = myScore + 10;
							System.out.println("Get the food ,new score is:"+myScore);
							
							//重新生成食物坐标
							food.x = random.nextInt(60) * 10;
							food.y = random.nextInt(56) * 10;
							
							//重绘
							repaint();
						}
						
						//碰到边缘
						if (head.x < 0 || head.y < 0 || head.x == 600 || head.y == 560) {
							gameState = -1;
							repaint();
							System.out.println("Game over because touch the edge.");
							break;
						}
						
						//碰到自己了
						for (int i = 0; i < body.size(); i++) {
							if (head.x == body.get(i).x && head.y == body.get(i).y) {
								gameState = -1;
								repaint();
								System.out.println("Game over because touch the body.");
								break;
							}
						}
					}
					
					try {
						Thread.sleep(140);
					} catch (InterruptedException e) {
						// TODO: handle exception
					}
				}
			}
		}.start();
	}

使用说明

  1. 创建一个 Java 工程,将 game 文件夹拷贝到 src 目录下。
  2. 执行 GameFrame 类。

这是一个已经发布在Github 上的 Java 小应用,感兴趣的同学可以私信我获取链接。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表