最近刚学J2ME,今天写了个贪吃蛇的游戏,下面提供游戏机制及源代码。
【游戏机制】:玩家控制由多个矩形组成的蛇,通过按键控制蛇的移动。指定按键功能:
2 up
4 left
6 right
8 down
随机显示食物的位置,当蛇头碰到食物时,将身体节点加1,食物消失。用户不做按键,蛇自动按照当前方向向前移动。
【游戏算法】:
1、将窗口按照16*16划分成多个网格
2、实现一个蛇头的按键控制
3、通过线程让蛇头自动移动
4、在窗口中随机出现可吃的食物小块 16的倍数
5、实现方块和可以吃的食物小块的碰撞检测
6、将蛇的身体各块定义为Vector,每个块是一个对象
Node{
int x,
int y,
int nextDir;//下一步要移动的方向
}
7、判定死亡
【游戏源代码】:
import java.util.Random;
import java.util.Vector;
import javax.microedition.lcdui.*;
public class SnakeCanvas extends Canvas {
// 方向标识
private static final int SNAKE_UP = 1;
private static final int SNAKE_DOWN = 2;
private static final int SNAKE_LEFT = 3;
private static final int SNAKE_RIGHT = 4;
private static final int SNAKE_STOP = -1;
private static final int SNAKE_OVER = -2;
private class Node {
int x;
int y;
int nextDir;
}
private Node head;
private Node eat;
private Random r1;// 随机对象
private int screenW;
private int screenH;
private Vector allBody;// 蛇身体
public SnakeCanvas() {
r1 = new Random();
screenW = this.getWidth();
screenH = this.getHeight();
head = new Node();
head.x = r1.nextInt(screenW / 2);// 产生一个0-screenW/2的随机数
head.y = r1.nextInt(screenH / 2);
head.x = head.x / 16 * 16;// 确保16的倍数
head.y = head.y / 16 * 16;
head.nextDir = SNAKE_STOP;// 停止
allBody = new Vector();
eat = new Node();
eat.x = r1.nextInt(screenW / 2);
eat.y = r1.nextInt(screenH / 2);
eat.x = eat.x / 16 * 16;
eat.y = eat.y / 16 * 16;
startGrame();// 开始游戏
}
/** 移动头部* */
public void moveHead() {
switch (head.nextDir) {
case SnakeCanvas.SNAKE_UP:
head.y -= 16;
break;
case SnakeCanvas.SNAKE_LEFT:
head.x -= 16;
break;
case SnakeCanvas.SNAKE_RIGHT:
head.x += 16;
break;
case SnakeCanvas.SNAKE_DOWN:
head.y += 16;
break;
}
}
/** 检测碰撞* */
public void checkEat() {
if (head.x == eat.x && head.y == eat.y) {// 吃上
// 1. 添加到蛇身体的向量中
Node no = new Node();
Node addNode = null;// 准备插入位置
if (allBody.size() == 0) {// 插到头部
addNode = head;
} else {
addNode = (Node) allBody.elementAt(allBody.size() - 1);// 插到最后一个节点
}
no.nextDir = addNode.nextDir;
switch (addNode.nextDir) {
case SnakeCanvas.SNAKE_UP:
no.x = addNode.x;
no.y = addNode.y + 16;
break;
case SnakeCanvas.SNAKE_LEFT:
no.x = addNode.x + 16;
no.y = addNode.y;
break;
case SnakeCanvas.SNAKE_RIGHT:
no.x = addNode.x - 16;
no.y = addNode.y;
break;
case SnakeCanvas.SNAKE_DOWN:
no.x = addNode.x;
no.y = addNode.y - 16;
break;
}
this.allBody.addElement(no);
// 2. 可以吃的小块随机产生
eat.x = r1.nextInt(screenW / 2);
eat.y = r1.nextInt(screenH / 2);
eat.x = eat.x / 16 * 16;
eat.y = eat.y / 16 * 16;
} else if (head.x < 0 || head.x > this.screenW || head.y < 0
|| head.y > this.screenH) {// 死亡检测:碰到墙
head.nextDir = SnakeCanvas.SNAKE_OVER;
} else if (allBody.size() > 0) {// 死亡检测:是否有尾巴
for (int i = 0; i < allBody.size(); i++) {
Node point = (Node) allBody.elementAt(i);
if (head.x == point.x && head.y == point.y) {// 碰到尾巴
head.nextDir = SnakeCanvas.SNAKE_OVER;
}
}
}
}
/** 移动所有蛇的身体* */
public void moveAllNode() {
int dir = head.nextDir;// 记录上一节点的方向,初始为:当前蛇头方向
int tmp = 0;
for (int i = 0; i < allBody.size(); i++) {
Node now = (Node) allBody.elementAt(i);
switch (now.nextDir) {
case SnakeCanvas.SNAKE_UP:
now.y -= 16;
break;
case SnakeCanvas.SNAKE_LEFT:
now.x -= 16;
break;
case SnakeCanvas.SNAKE_RIGHT:
now.x += 16;
break;
case SnakeCanvas.SNAKE_DOWN:
now.y += 16;
break;
}
tmp = now.nextDir;
now.nextDir = dir;
dir = tmp;
}
}
/** 实现游戏中的蛇头的自动移动* */
public void startGrame() {
// 规划线程要执行的任务
Thread t = new Thread() {
public void run() {
while (true) {
// 1. 移动蛇头
moveHead();
// 2. 移动所有蛇的身体
moveAllNode();
// 3. 碰撞检测
checkEat();
// 4. 重新绘制屏幕
repaint();
// 5. 休息
try {
Thread.sleep(800);
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
};
if (SnakeCanvas.SNAKE_OVER == head.nextDir) {// 死亡
t.interrupt();
} else {
t.start();
}
}
protected void paint(Graphics g) {
// 画背景
g.setColor(255, 255, 255);
g.fillRect(0, 0, screenW, screenH);
// 画蛇头
g.setColor(0, 0, 0);
g.fillRect(head.x, head.y, 16, 16);
// 画身体
g.setColor(0, 255, 0);
for (int i = 0; i < allBody.size(); i++) {
Node now = (Node) allBody.elementAt(i);// 获取第i个节点
g.fillRect(now.x, now.y, 16, 16);
}
// 画可以吃的小块
g.setColor(255, 0, 0);
g.fillRect(eat.x, eat.y, 16, 16);
if (SnakeCanvas.SNAKE_OVER == head.nextDir) {// 死亡
Font overFont = g.getFont();
int fontH = overFont.getHeight();
int fontW = overFont.stringWidth("Game Over!");
g.drawString("Game Over!", (screenW - fontW) / 2,
(screenH - fontH) / 2, g.TOP | g.LEFT);
}
}
// 相应按键功能( 移动交给线程完成,所以按键只需要控制 下一步移动的方向,就可以了)
public void keyPressed(int n) {
switch (n) {
case Canvas.KEY_NUM2:
head.nextDir = SnakeCanvas.SNAKE_UP;
break;
case Canvas.KEY_NUM4:
head.nextDir = SnakeCanvas.SNAKE_LEFT;
break;
case Canvas.KEY_NUM1:
head.nextDir = SnakeCanvas.SNAKE_LEFT;
break;
case Canvas.KEY_NUM6:
head.nextDir = SnakeCanvas.SNAKE_RIGHT;
break;
case Canvas.KEY_NUM8:
head.nextDir = SnakeCanvas.SNAKE_DOWN;
break;
}
this.repaint();
}
public void keyReleased(int n) {
}
public void keyRepeated(int n) {
}
}
//创建游戏入口类
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class AppMain extends MIDlet {
protected void startApp() throws MIDletStateChangeException {
SnakeCanvas mc = new SnakeCanvas();
Display.getDisplay(this).setCurrent(mc);
}
protected void destroyApp(boolean arg0) throws MIDletStateChangeException {
// TODO 自动生成方法存根
}
protected void pauseApp() {
// TODO 自动生成方法存根
}
}
分享到:
相关推荐
基于linux0.11内核 修改内核代码在控制台实现贪吃蛇游戏
"Snake_snake_基于Qt5的贪吃蛇游戏实现_QT5_" 这个标题明确指出我们要讨论的是一个使用Qt5框架开发的贪吃蛇游戏项目。Qt5是一个跨平台的C++应用程序开发框架,特别适合创建图形用户界面(GUI)应用。贪吃蛇是一款...
总结来说,“div偏移量控制,贪吃蛇游戏实现”涉及到HTML和CSS布局的运用,JavaScript的事件处理和动态更新,以及游戏设计的基本原理。通过理解和实践这个项目,开发者可以深化对前端开发技能的理解,并学习如何将...
python代码实现贪吃蛇小游戏,很好玩哦!!! from random import randrange # 导入随机函数 from freegames import vector,square # 导入向量函数与绘图函数 import turtle # 导入绘图海龟模块 turtle.onkey...
除了硬件设计,软件开发也是贪吃蛇游戏实现的重要环节。论文给出了系统硬件平台结构及C程序流程图,展示了如何在SOPC架构下编写和优化游戏代码。这包括了游戏规则的设定、用户界面的设计、游戏状态的管理以及性能的...
本文将探讨如何使用HTML5来实现贪吃蛇游戏,并提供一部分源代码作为参考。 首先,贪吃蛇游戏的核心机制在于控制蛇的移动。游戏的操作通常是通过键盘上的方向键控制蛇的上下左右移动。当蛇吃到食物后,其长度会增加...
6、设计两人游戏模式,让屏幕上同时出现2个贪吃蛇,每个人通过实现双人贪吃蛇对战。 要求: 1、学习理解Linux 0.11内核通过tty0终端对键盘设备和显示设备控制原理。 2、制定合理游戏规则,保证游戏具有可玩性。 3、...
C++ 贪吃蛇游戏实现技术要点 本文将对 C++ 贪吃蛇游戏的实现技术要点进行总结,包括游戏的设计思路、实现技术和代码解析。 游戏设计思路 贪吃蛇游戏是一种经典的游戏,游戏的设计思路主要包括以下几个方面: 1. ...
【基于MFC的贪吃蛇游戏的实现】是一款...总的来说,基于MFC的贪吃蛇游戏实现了经典游戏的重制,通过MFC库的优势,结合数据结构和算法,构建了一个具有用户交互性的游戏环境,让玩家在熟悉的游戏中体验到编程的魅力。
基于jQuery的HTML贪吃蛇游戏实现,巧妙地利用了HTML和CSS的特性,结合jQuery的便捷功能,将复杂的逻辑简化,使得游戏开发更加直观和高效。这种实现方式适合初学者理解游戏的基本机制,并学习使用jQuery进行动态网页...
本项目名为"ytb_snake_py-master",显然是一个基于Python的贪吃蛇游戏实现,使用了Pygame库来构建游戏环境。Pygame是Python的一个模块,专为开发2D游戏设计,它提供了丰富的功能,包括图形绘制、音频处理和用户输入...
描述中提到“利用MFC创建的一个贪吃蛇游戏,仅供参考,谢谢支持”,这暗示了该项目是一个学习或示例性质的代码,可能包含了一个基本的贪吃蛇游戏实现,供开发者参考和学习MFC编程以及游戏开发的基础知识。...
本文将深入探讨如何使用硬件描述语言Verilog,将贪吃蛇游戏实现在Altera公司的Cyclone II系列EP2C8 FPGA(Field-Programmable Gate Array)芯片上。 Verilog是一种广泛应用的硬件描述语言,它允许开发者用类似于...
在编写贪吃蛇游戏时,主要会用到Java的Swing或JavaFX库来构建图形用户界面(GUI),以及线程控制来实现游戏循环。 1. **Swing或JavaFX库**:这两者都是Java提供的用于创建GUI的工具包。Swing是Java AWT的扩展,提供...
毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计...
易语言简易贪吃蛇游戏实现了这一基本概念,通过源码控制蛇的行为和游戏状态。 1. **初始化蛇**:在游戏启动时,蛇的位置和长度需要被设定。通常,蛇会有一个初始长度,比如3个单元格,且处于屏幕中央。易语言源码中...
综上所述,js贪吃蛇游戏实现不仅需要对JavaScript的基础知识有充分的了解,同时也要求对HTML5 Canvas的API有一定的掌握,并结合CSS进行游戏界面的设计。通过给出的源码和实现思路,开发者可以更深入地了解如何使用js...
以上是贪吃蛇游戏实现中涉及的主要编程知识点。在实际的源代码中,你可能会看到这些概念如何转化为具体的代码实现。通过分析和理解这些代码,你可以进一步巩固你的编程技能,并有可能在此基础上创建出更多有趣的变体...
贪吃蛇游戏 精简版 实现基本功能 贪吃蛇游戏 精简版 实现基本功能 贪吃蛇游戏 精简版 实现基本功能
Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏 Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏 Java实现贪吃蛇小游戏Java实现贪吃蛇小...