- 浏览: 465997 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
在上一篇博文中,介绍了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
后续的博文将添加如下功能:
(三)添加游戏进度的存储和读取
(四)完成游戏排行榜
... ...
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 900面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6728本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2212本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1739尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2166正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3748本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3173题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8749EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3327题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6700面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9846Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1418个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7397for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4137本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2899本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
在这个版本中,我们将在游戏中添加随机生成的障碍物——石头,增加了游戏的挑战性。 1. **Java基础**:在开始编写游戏代码之前,你需要熟悉Java语言的基本语法,包括类、对象、方法、循环、条件语句等。贪吃蛇游戏...
在本项目中,我们主要探讨的是如何使用Java编程语言实现一个具有障碍物的贪吃蛇游戏。这个项目不仅涵盖了基本的贪吃蛇游戏机制,还增加了关卡、速度控制和分数系统,使得游戏更具挑战性和趣味性。下面将详细介绍这个...
Swing版贪吃蛇游戏是一款基于Java Swing图形用户界面库开发的经典小游戏,它不仅保留了传统贪吃蛇的基本玩法,还增加了许多现代化的功能,如进度保存与加载、得分排行榜和随机生成的障碍物等,提升了游戏的趣味性和...
贪吃蛇游戏本身是一个流行的游戏概念,玩家控制一条不断增长的蛇在屏幕上移动,通过吃食物来增加长度,同时避免碰撞到自己的身体或边界。 首先,要理解Java Swing的基本结构。Swing提供了一系列的JComponent类,如...
在贪吃蛇游戏中,障碍物可以是固定的墙壁或者随机生成的动态物体,蛇碰到障碍物会死亡,增加了游戏挑战性。 ### 7. 源码分析 项目提供的源码是学习和理解游戏机制的宝贵资源。通过阅读和分析源码,可以深入理解...
- **障碍物**:加入可移动或固定的障碍物,增加游戏复杂性。 - **多人模式**:允许多个玩家在同一设备或网络上对战。 - **皮肤与音效**:为蛇和食物设计不同外观,添加背景音乐和音效提升游戏体验。 5. **学习...
这个游戏的目标是控制一条不断增长的蛇,使其在有限的游戏区域内移动,同时避免碰到自身或其他障碍物。当蛇吃到食物时,它的身体会变长,增加了游戏的挑战性。 在这个“贪吃蛇游戏各种源码集合”中,你可能会发现...
3. **二维数组表示地图**:为了高效地管理蛇的位置和边界,游戏通常使用二维数组来表示游戏区域,数组的每个元素代表一个网格,0表示空地,非0表示障碍物(蛇身或边界)。 4. **用户输入处理**:游戏需要监听键盘...
贪吃蛇游戏通常会在一个二维平面上显示,我们可以使用二维数组来存储地图状态,其中每个元素代表一个格子,包含蛇的位置、食物的位置以及其他可能的障碍物。 1. **游戏逻辑**:贪吃蛇的移动逻辑需要处理两个关键...
在这个贪吃蛇游戏中,`Frame`作为游戏的主窗口,承载着游戏的所有元素,如蛇、食物、障碍物等。开发者需要在`Frame`上绘制这些元素,并确保它们随着游戏的进行而动态更新。 游戏的核心是蛇的移动逻辑,这涉及到...
在这个“贪吃蛇游戏开发_吃到石头死掉功能”的主题中,我们将深入探讨如何在Java环境下,特别是在Eclipse集成开发环境中实现这一关键的游戏机制。 首先,我们需要了解游戏的基本架构。贪吃蛇游戏通常由以下几个核心...
碰撞检测则需要检查蛇的身体是否与自身或其他障碍物重合;当蛇吃到食物时,需要增加蛇的长度,并在屏幕上随机生成新的食物。 6. **数据结构**:在实现蛇的身体部分,可能会用到链表或数组列表来存储蛇的各个部分,...
贪吃蛇游戏是一款经典的休闲游戏,玩家需要控制一条蛇在屏幕上移动,通过吞噬食物来增长长度,同时避免碰撞到自身或其他障碍物。在这个升级版中,可能包含更多的特性、功能和挑战,使得游戏更具趣味性和挑战性。 一...
此外,为了增加游戏的趣味性,还可以添加一些额外的功能,如增加速度、设置难度等级、添加障碍物等。这需要在模型中增加相应的逻辑,并同步更新视图。 总结来说,通过使用Java和MVC设计模式实现“贪吃蛇”游戏,...
- **挑战模式**:可能包含速度加快、障碍物等元素,增加游戏难度。 - **自定义模式**:允许玩家编辑地图,如设置边界大小、初始位置等,增加游戏的可玩性。 5. **文件处理** - **地图编辑**:自定义地图的保存和...
- **碰撞检测**:检测蛇头是否与自身身体、边界或其他障碍物发生碰撞,若有则游戏结束。 - **分数计算**:每次吃到食物,蛇的长度增加,同时玩家得分增加。 7. **文件结构** 在提供的压缩包中,"Game_贪吃蛇....
- 类与对象:贪吃蛇游戏中的主要实体,如蛇、食物、边界和游戏窗口,都可以通过Java类来表示,并创建相应的对象。 - 继承:蛇可能有不同的行为模式,可以设计一个基类Snake,然后通过继承创建不同类型的蛇,如普通...
2. **图形用户界面(GUI)**:贪吃蛇游戏通常需要一个窗口来显示游戏画面,Java提供了Swing或JavaFX库来创建GUI。开发者需要了解如何创建窗口、面板、按钮等组件,并进行布局管理。 3. **事件监听**:为了响应用户...