`
MouseLearnJava
  • 浏览: 463838 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Swing贪吃蛇游戏(二):增加随机产生障碍物功能

阅读更多

在上一篇博文中,介绍了Swing贪吃蛇游戏基本功能的实现:

Swing贪吃蛇游戏(一):基本功能实现 >>>>  http://mouselearnjava.iteye.com/blog/1913290

本文在原有基本功能上增加随机产生障碍物的功能,增加些游戏的难度

随机产生障碍物的功能可以有多种实现,我们可以将分数的改变作为产生随机数的条件,比如

1. 分数每增加50分,在原有的基础上随机产生一个障碍物(不改变原来已经有的障碍物位置)
2. 分数每增加50分,以50的倍数作为产生随机障碍物的个数(比如N),重新生成N个随机障碍物。

两种实现都不难,但是第二种方式的实现对玩游戏来说难度会更大。比如产生8个随机障碍物,那么相对来讲蛇体已经很长,随机产生8个随机障碍物可能同时有多个出现在蛇头附近,更加容易撞到障碍物。

本文的实现采用了方案1.

那么,为了能够完成这个功能,我们需要做哪一些改动呢?

首先,增加一个障碍物类,用于记录障碍物信息。

package my.games.snake.model;

import java.awt.Graphics2D;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class Barriers implements Serializable {

	private static final long serialVersionUID = -7101579102934745505L;

	private List<Grid> barriersList = null;

	public Barriers() {
		barriersList = new ArrayList<Grid>();
	}

	public void draw(Graphics2D g2) {
		for (Grid grid : barriersList) {
			grid.draw(g2);
		}
	}

	/**
	 * @return the barriersList
	 */
	public List<Grid> getBarriersList() {
		return barriersList;
	}

	/**
	 * @param barriersList
	 *            the barriersList to set
	 */
	public void setBarriersList(List<Grid> barriersList) {
		this.barriersList = barriersList;
	}

}


其次,增加随机产生随机障碍物的代码。
,在SnakeGamePanel类中添加一些逻辑

public class SnakeGamePanel extends JPanel {

	/**
	 * 当分数是达到50的倍数的时,随机产生一个障碍物.
	 */
	private boolean isNeedToGenerateNewBarrier() {
		return score != 0 && score % 50 == 0 && needToGenerateBarrie;
	}

	/**
	 * 判断随机产生的位置是否与蛇体和食物冲突, 如果有冲突返回false,如果位置没有冲则返回true
	 */
	private boolean isBarrierAvailable(int x, int y) {
		for (Grid grid : snake.getList()) {
			if (x == grid.getX() && y == grid.getY()) {
				return false;
			}
		}
		if (food.getX() == x && food.getY() == y) {
			return false;
		}
		return true;
	}

	/**
	 * 随机产生一个障碍物
	 */
	private void generateBarrierByRandom() {
		Random r = new Random();
		int randomX = r.nextInt(SnakeGameConstant.GRID_COLUMN_NUMBER);
		int randomY = r.nextInt(SnakeGameConstant.GRID_ROW_NUMBER);

		if (isBarrierAvailable(randomX, randomY)) {
			barrier.getBarriersList().add(
					new Grid(randomX, randomY, Color.YELLOW));
			// 成功生成一个障碍物后,将needToGenerateBarrie标识为false
			needToGenerateBarrie = false;
		} else {
			generateBarrierByRandom();
		}
	}

}


最后,添加蛇体与障碍物碰撞的判断,修改游戏结束的判断条件。在SnakeGamePanel类中添加isSnakeHeadTouchBarrier方法,并将这个条件应用于judgeGameOver方法中。

public class SnakeGamePanel extends JPanel 
{
   	private boolean isSnakeHeadTouchBarrier() {
		Grid head = snake.getList().get(0);
		for (Grid grid : barrier.getBarriersList()) {
			if (head.getX() == grid.getX() && head.getY() == grid.getY()) {
				this.gameOverType = GameOverType.TOUCH_BARRIER;
				return true;
			}
		}

		return false;
	}

	private void judgeGameOver() {
		if (isSnakeHeadTouchEdge() || isSnakeHeadTouchBody()
				|| isSnakeHeadTouchBarrier()) {
			gameState = GameState.OVER;
			int result = JOptionPane.showConfirmDialog(frame,
					SnakeGameConstant.GAME_OVER, SnakeGameConstant.SNAKE_GAME,
					JOptionPane.YES_NO_OPTION);
			if (result == JOptionPane.YES_OPTION) {
				for (int i = SnakeGameConstant.LEFT; i <= SnakeGameConstant.RIGHT; i++) {
					for (int j = SnakeGameConstant.UP; j <= SnakeGameConstant.DOWN; j++) {
						flag[i][j] = 0;
					}
				}

				gameState = GameState.RUN;
				score = 0;
				init();
				timer.start();
			} else {
				System.exit(0);
			}
		}
	}
}



障碍物用黄颜色的块表示,效果如下:
1. 达到50分后,随机长生一个障碍物



2. 达到100分后,在原有基础上再随机长生一个障碍物



3. 达到150分后,在原有基础上再随机长生一个障碍物



详细代码请参考附件MySnakeGame.7z

后续的博文将添加如下功能:

(三)添加游戏进度的存储和读取
(四)完成游戏排行榜
... ...
  • 大小: 19.4 KB
  • 大小: 20.6 KB
  • 大小: 21.5 KB
1
7
分享到:
评论

相关推荐

    贪吃蛇游戏开发_增加障碍物石头

    在这个版本中,我们将在游戏中添加随机生成的障碍物——石头,增加了游戏的挑战性。 1. **Java基础**:在开始编写游戏代码之前,你需要熟悉Java语言的基本语法,包括类、对象、方法、循环、条件语句等。贪吃蛇游戏...

    java实现有障碍物的贪吃蛇游戏

    在本项目中,我们主要探讨的是如何使用Java编程语言实现一个具有障碍物的贪吃蛇游戏。这个项目不仅涵盖了基本的贪吃蛇游戏机制,还增加了关卡、速度控制和分数系统,使得游戏更具挑战性和趣味性。下面将详细介绍这个...

    Swing版贪吃蛇游戏

    Swing版贪吃蛇游戏是一款基于Java Swing图形用户界面库开发的经典小游戏,它不仅保留了传统贪吃蛇的基本玩法,还增加了许多现代化的功能,如进度保存与加载、得分排行榜和随机生成的障碍物等,提升了游戏的趣味性和...

    javaSwing做的贪吃蛇

    贪吃蛇游戏本身是一个流行的游戏概念,玩家控制一条不断增长的蛇在屏幕上移动,通过吃食物来增加长度,同时避免碰撞到自己的身体或边界。 首先,要理解Java Swing的基本结构。Swing提供了一系列的JComponent类,如...

    java开发的贪吃蛇小游戏(包含源码和音乐图片文件)多个关卡,有障碍物

    在贪吃蛇游戏中,障碍物可以是固定的墙壁或者随机生成的动态物体,蛇碰到障碍物会死亡,增加了游戏挑战性。 ### 7. 源码分析 项目提供的源码是学习和理解游戏机制的宝贵资源。通过阅读和分析源码,可以深入理解...

    贪吃蛇游戏

    - **障碍物**:加入可移动或固定的障碍物,增加游戏复杂性。 - **多人模式**:允许多个玩家在同一设备或网络上对战。 - **皮肤与音效**:为蛇和食物设计不同外观,添加背景音乐和音效提升游戏体验。 5. **学习...

    贪吃蛇游戏各种源码集合

    这个游戏的目标是控制一条不断增长的蛇,使其在有限的游戏区域内移动,同时避免碰到自身或其他障碍物。当蛇吃到食物时,它的身体会变长,增加了游戏的挑战性。 在这个“贪吃蛇游戏各种源码集合”中,你可能会发现...

    贪吃蛇游戏.zip

    3. **二维数组表示地图**:为了高效地管理蛇的位置和边界,游戏通常使用二维数组来表示游戏区域,数组的每个元素代表一个网格,0表示空地,非0表示障碍物(蛇身或边界)。 4. **用户输入处理**:游戏需要监听键盘...

    贪吃蛇游戏源代码

    贪吃蛇游戏通常会在一个二维平面上显示,我们可以使用二维数组来存储地图状态,其中每个元素代表一个格子,包含蛇的位置、食物的位置以及其他可能的障碍物。 1. **游戏逻辑**:贪吃蛇的移动逻辑需要处理两个关键...

    用java写的贪吃蛇游戏

    在这个贪吃蛇游戏中,`Frame`作为游戏的主窗口,承载着游戏的所有元素,如蛇、食物、障碍物等。开发者需要在`Frame`上绘制这些元素,并确保它们随着游戏的进行而动态更新。 游戏的核心是蛇的移动逻辑,这涉及到...

    贪吃蛇游戏开发_吃到石头死掉功能

    在这个“贪吃蛇游戏开发_吃到石头死掉功能”的主题中,我们将深入探讨如何在Java环境下,特别是在Eclipse集成开发环境中实现这一关键的游戏机制。 首先,我们需要了解游戏的基本架构。贪吃蛇游戏通常由以下几个核心...

    贪吃蛇游戏JAVA版

    碰撞检测则需要检查蛇的身体是否与自身或其他障碍物重合;当蛇吃到食物时,需要增加蛇的长度,并在屏幕上随机生成新的食物。 6. **数据结构**:在实现蛇的身体部分,可能会用到链表或数组列表来存储蛇的各个部分,...

    贪吃蛇升级版java语言开发

    贪吃蛇游戏是一款经典的休闲游戏,玩家需要控制一条蛇在屏幕上移动,通过吞噬食物来增长长度,同时避免碰撞到自身或其他障碍物。在这个升级版中,可能包含更多的特性、功能和挑战,使得游戏更具趣味性和挑战性。 一...

    Java实现“贪吃蛇”游戏

    此外,为了增加游戏的趣味性,还可以添加一些额外的功能,如增加速度、设置难度等级、添加障碍物等。这需要在模型中增加相应的逻辑,并同步更新视图。 总结来说,通过使用Java和MVC设计模式实现“贪吃蛇”游戏,...

    Java贪吃蛇

    - **挑战模式**:可能包含速度加快、障碍物等元素,增加游戏难度。 - **自定义模式**:允许玩家编辑地图,如设置边界大小、初始位置等,增加游戏的可玩性。 5. **文件处理** - **地图编辑**:自定义地图的保存和...

    java编程小游戏贪吃蛇

    - **碰撞检测**:检测蛇头是否与自身身体、边界或其他障碍物发生碰撞,若有则游戏结束。 - **分数计算**:每次吃到食物,蛇的长度增加,同时玩家得分增加。 7. **文件结构** 在提供的压缩包中,"Game_贪吃蛇....

    java贪吃蛇小游戏

    - 类与对象:贪吃蛇游戏中的主要实体,如蛇、食物、边界和游戏窗口,都可以通过Java类来表示,并创建相应的对象。 - 继承:蛇可能有不同的行为模式,可以设计一个基类Snake,然后通过继承创建不同类型的蛇,如普通...

    java编写闯关贪吃蛇

    2. **图形用户界面(GUI)**:贪吃蛇游戏通常需要一个窗口来显示游戏画面,Java提供了Swing或JavaFX库来创建GUI。开发者需要了解如何创建窗口、面板、按钮等组件,并进行布局管理。 3. **事件监听**:为了响应用户...

Global site tag (gtag.js) - Google Analytics