`
suky
  • 浏览: 146975 次
  • 性别: Icon_minigender_2
  • 来自: 厦门
社区版块
存档分类
最新评论

贪吃蛇游戏的实现

    博客分类:
  • J2ME
阅读更多

    最近刚学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_

    "Snake_snake_基于Qt5的贪吃蛇游戏实现_QT5_" 这个标题明确指出我们要讨论的是一个使用Qt5框架开发的贪吃蛇游戏项目。Qt5是一个跨平台的C++应用程序开发框架,特别适合创建图形用户界面(GUI)应用。贪吃蛇是一款...

    div偏移量控制,贪吃蛇游戏实现

    总结来说,“div偏移量控制,贪吃蛇游戏实现”涉及到HTML和CSS布局的运用,JavaScript的事件处理和动态更新,以及游戏设计的基本原理。通过理解和实践这个项目,开发者可以深化对前端开发技能的理解,并学习如何将...

    python代码学习贪吃蛇游戏实现

    python代码实现贪吃蛇小游戏,很好玩哦!!! from random import randrange # 导入随机函数 from freegames import vector,square # 导入向量函数与绘图函数 import turtle # 导入绘图海龟模块 turtle.onkey...

    基于SOPC架构的贪吃蛇游戏研究与设计实现

    除了硬件设计,软件开发也是贪吃蛇游戏实现的重要环节。论文给出了系统硬件平台结构及C程序流程图,展示了如何在SOPC架构下编写和优化游戏代码。这包括了游戏规则的设定、用户界面的设计、游戏状态的管理以及性能的...

    贪吃蛇游戏实现思路及源代码.docx

    本文将探讨如何使用HTML5来实现贪吃蛇游戏,并提供一部分源代码作为参考。 首先,贪吃蛇游戏的核心机制在于控制蛇的移动。游戏的操作通常是通过键盘上的方向键控制蛇的上下左右移动。当蛇吃到食物后,其长度会增加...

    基于linux系统开发的贪吃蛇游戏

    6、设计两人游戏模式,让屏幕上同时出现2个贪吃蛇,每个人通过实现双人贪吃蛇对战。 要求: 1、学习理解Linux 0.11内核通过tty0终端对键盘设备和显示设备控制原理。 2、制定合理游戏规则,保证游戏具有可玩性。 3、...

    c++代码贪吃蛇游戏直接复制到vc6.0编译器即可.docx

    C++ 贪吃蛇游戏实现技术要点 本文将对 C++ 贪吃蛇游戏的实现技术要点进行总结,包括游戏的设计思路、实现技术和代码解析。 游戏设计思路 贪吃蛇游戏是一种经典的游戏,游戏的设计思路主要包括以下几个方面: 1. ...

    基于MFC的贪吃蛇游戏的实现

    【基于MFC的贪吃蛇游戏的实现】是一款...总的来说,基于MFC的贪吃蛇游戏实现了经典游戏的重制,通过MFC库的优势,结合数据结构和算法,构建了一个具有用户交互性的游戏环境,让玩家在熟悉的游戏中体验到编程的魅力。

    基于 jquery 的 html 贪吃蛇 简单实现

    基于jQuery的HTML贪吃蛇游戏实现,巧妙地利用了HTML和CSS的特性,结合jQuery的便捷功能,将复杂的逻辑简化,使得游戏开发更加直观和高效。这种实现方式适合初学者理解游戏的基本机制,并学习使用jQuery进行动态网页...

    Python编写一个贪吃蛇游戏

    本项目名为"ytb_snake_py-master",显然是一个基于Python的贪吃蛇游戏实现,使用了Pygame库来构建游戏环境。Pygame是Python的一个模块,专为开发2D游戏设计,它提供了丰富的功能,包括图形绘制、音频处理和用户输入...

    贪吃蛇_贪吃蛇图片.ico_贪吃蛇游戏mfc_贪吃蛇_MFC_

    描述中提到“利用MFC创建的一个贪吃蛇游戏,仅供参考,谢谢支持”,这暗示了该项目是一个学习或示例性质的代码,可能包含了一个基本的贪吃蛇游戏实现,供开发者参考和学习MFC编程以及游戏开发的基础知识。...

    用Verilog编写的贪吃蛇游戏

    本文将深入探讨如何使用硬件描述语言Verilog,将贪吃蛇游戏实现在Altera公司的Cyclone II系列EP2C8 FPGA(Field-Programmable Gate Array)芯片上。 Verilog是一种广泛应用的硬件描述语言,它允许开发者用类似于...

    有计时功能的贪吃蛇 Java小游戏

    在编写贪吃蛇游戏时,主要会用到Java的Swing或JavaFX库来构建图形用户界面(GUI),以及线程控制来实现游戏循环。 1. **Swing或JavaFX库**:这两者都是Java提供的用于创建GUI的工具包。Swing是Java AWT的扩展,提供...

    毕业设计基于 java的贪吃蛇游戏的实现.7z

    毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计基于 java的贪吃蛇游戏的实现.7z毕业设计...

    易语言简易贪吃蛇游戏

    易语言简易贪吃蛇游戏实现了这一基本概念,通过源码控制蛇的行为和游戏状态。 1. **初始化蛇**:在游戏启动时,蛇的位置和长度需要被设定。通常,蛇会有一个初始长度,比如3个单元格,且处于屏幕中央。易语言源码中...

    js贪吃蛇游戏实现思路和

    综上所述,js贪吃蛇游戏实现不仅需要对JavaScript的基础知识有充分的了解,同时也要求对HTML5 Canvas的API有一定的掌握,并结合CSS进行游戏界面的设计。通过给出的源码和实现思路,开发者可以更深入地了解如何使用js...

    贪吃蛇小游戏贪吃蛇游戏

    以上是贪吃蛇游戏实现中涉及的主要编程知识点。在实际的源代码中,你可能会看到这些概念如何转化为具体的代码实现。通过分析和理解这些代码,你可以进一步巩固你的编程技能,并有可能在此基础上创建出更多有趣的变体...

    贪吃蛇游戏 精简版 实现基本功能

    贪吃蛇游戏 精简版 实现基本功能 贪吃蛇游戏 精简版 实现基本功能 贪吃蛇游戏 精简版 实现基本功能

    Java实现贪吃蛇小游戏.zip

    Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏 Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏Java实现贪吃蛇小游戏 Java实现贪吃蛇小游戏Java实现贪吃蛇小...

Global site tag (gtag.js) - Google Analytics