文档库 最新最全的文档下载
当前位置:文档库 › 基于JavaGUI的贪吃蛇游戏

基于JavaGUI的贪吃蛇游戏

基于JavaGUI的贪吃蛇游戏
基于JavaGUI的贪吃蛇游戏

开发背景

作为一个经典的游戏,贪吃蛇设计简单,实用和娱乐性高,是90后童年的美好回忆。对于贪吃蛇传统的玩法,大家众所周知,即:玩家通过控制游戏手柄上下左右四个方向控制蛇的前进方向,每当吃到一个东西就会增加相应的分数,蛇的身子会越吃越长,蛇身越长游戏的难度就越大,不能咬到自己的身体,也不能碰到墙壁,积累到一定分数就可以通过此关,进入到下一关。

需求分析

该次小游戏程序设计包含二维数组、方向键操作及图形化函数等方面知识。

具体需求概要如下:

1、游戏界面初始化,显示背景区域和活动区域

2、按方向键上下左右进行游戏的控制

3、当蛇头吃到食物时,蛇身长度加一,分数增加

4、当蛇头撞墙或者碰到自身时,游戏结束,显示“GAME OVER”和累加得分

里面存在的事物:地图、蛇、食物

游戏规则:

1.蛇初始化时是3个节点,一开始蛇是出现在地图中间位置的

2.蛇吃到食物会长一节

3.蛇咬到自己会死

4.蛇撞墙会死

5.食物随机生成的,食物不长在背景上,不长在蛇身上。

使用技术

本次课程使用JAVA来完成游戏的设计,使用二维数组存储背景信息,使用List存储蛇身信息,使用Swing完成图形界面化。

功能开发

概要设计

1、初始化模块:屏幕初始化,屏幕初始化用于显示游戏信息“贪吃蛇”。

2、游戏界面模块:设计边框和贪吃蛇活动区域

3、游戏运行模块:运用函数控制蛇长及吃食物关系,使用方向键控制方向。

4、判断模块:蛇头撞墙或者碰到自己身体,则游戏结束,显示分数

实现步骤

本节分为两个部分,一部分为核心逻辑,即算法处理逻辑;另一部分为界面搭建。游戏最核心的部分为算法逻辑部分。先讲算法逻辑,最后再进行界面的搭建。

第一部分分为几个小节

第二部分分为几个小节

创建工程

本次小游戏是一个单独的项目,所以需要创建单独的工程。

地图

首先定义地图的长宽,定义数组存放地图上的点

// 地图的宽(行)

public static final int width = 35;

// 地图的高(列)

public static final int heigth = 8;

//二维数组存放地图上的点

private char[][] background = new char[heigth][width];

我们需要的地图为:

所以需要初始化地图,四周为墙壁,中间为空白部分,供蛇移动。这里使用’*’代表墙壁,使用’ ’代表空白部分。边界值判定:二维数组的第一行和最后一行,其余行的第一列和最后一列均为墙壁。

初始化方法:

// 初始化地图

public void initBackground() {

for (int rows = 0; rows < background.length; rows++) {

for (int cols = 0; cols < background[rows].length; cols++) {

if (rows == 0 || rows == (heigth - 1) || cols == 0 || cols == (width - 1)) {

background[rows][cols] = '*';

} else {

background[rows][cols] = ' ';

}

}

}

}

展示,在控制台循环打印。showBackground方法:

public void showBackground() {

for (int rows = 0; rows < background.length; rows++) {

for (int cols = 0; cols < background[rows].length; cols++) {

System.out.print(background[rows][cols]);

}

System.out.println();

}

}

运行main方法,查看效果。

Main方法:

public static void main(String[] args) throws Exception {

SnakeGame snake = new SnakeGame();

snake.initBackground();

snake.showBackground();

}

控制台效果图:

前面已经初始化完成地图,然后进行蛇的初始化。

蛇的初始大小为3,一个蛇头两节身体。为位置位于屏幕的正中央。代码:// 集合保存节点信息

LinkedList snake = new LinkedList();

// 初始化蛇

public void initSnake() {

int x = width / 2;

int y = heigth / 2;

snake.add(new Point(x + 1, y));

snake.add(new Point(x, y));

snake.add(new Point(x - 1, y));

}

初始化蛇之后,要进行蛇的展示,蛇身用’#’,蛇头用’¥’表述。这里写showSnake方法。

// 显示蛇

public void showSnake() {

// 蛇头

Point head = snake.getFirst();

background[head.y][head.x] = '¥';

// 蛇身

for (int i = 1; i < snake.size(); i++) {

Point body = snake.get(i);

background[body.y][body.x] = '#';

}

}

修改main方法,将初始化蛇的方法和展示蛇的方法添加进main方法中:public static void main(String[] args) throws Exception {

SnakeGame snake = new SnakeGame();

snake.initBackground();

snake.initSnake();

snake.showSnake();

snake.showBackground();

}

运行main方法及效果图:

食物

蛇的食物时随机出现的,位置不在墙壁上。

写方法createFood,判断位置是否在墙上,不在则可以创建食物,在则重新随机。

//食物

Point food;

public void createFood() {

//食物随机,创建随机对象

Random ra = new Random();

while(true) {

int x = ra.nextInt(width);

int y = ra.nextInt(heigth);

if(background[y][x] != '*') {

food = new Point(x,y);

break;

}

}

}

显示食物,用’@’符号表示食物。

//显示食物

public void showFood() {

background[food.y][food.x] = '@';

}

main方法加入食物创建和显示食物方法:

public static void main(String[] args) throws Exception {

SnakeGame snake = new SnakeGame();

snake.initBackground();

snake.initSnake();

snake.showSnake();

//初始化食物

snake.createFood();

snake.showFood();

snake.showBackground();

}

运行main方法,查看效果:

多运行几次,可以看到食物时随机出现的。

移动与吃食物

蛇的移动分为四个方向,向上、向下、向左和向右。

移动的方式有两种,第一种,蛇的每一节都向前移动一格;第二种:添加蛇头,移除蛇尾。我们这里采用添加蛇头,移除蛇尾的方式。

向上的时候,纵坐标减一:

//向上移动

public void moveUp() {

//获取蛇头

Point head = snake.getFirst();

//添加新蛇头

snake.addFirst(new Point(head.x,head.y-1));

//删除蛇尾

snake.removeLast();

}

向下的时候,纵坐标加一:

//向下移动

public void moveDown() {

//获取蛇头

Point head = snake.getFirst();

//添加新蛇头

snake.addFirst(new Point(head.x,head.y+1));

//删除蛇尾

snake.removeLast();

}

向左的时候,横坐标减一:

//向左移动

public void moveLeft() {

//获取蛇头

Point head = snake.getFirst();

//添加新蛇头

snake.addFirst(new Point(head.x-1,head.y));

//删除蛇尾

snake.removeLast();

}

向右的时候,横坐标加一:

//向右移动

public void moveRight() {

//获取蛇头

Point head = snake.getFirst();

//添加新蛇头

snake.addFirst(new Point(head.x+1,head.y));

//删除蛇尾

snake.removeLast();

}

在移动时,记录一个方向,如果按下的是反向键,则不改变方向。

public static final int UP_DIRECTION = 1;

public static final int DOWN_DIRECTION = -1;

public static final int LEFT_DIRECTION = 2;

public static final int RIGHT_DIRECTION = -2;

//默认为向右

int currentDirection = -2;

//相反方向

public void changeDirection(int newDirection) {

//判断当前方向与所按方向是否相反

if(newDirection + currentDirection !=0) {

this.currentDirection = newDirection;

}

}

在移动的时候,要判读是否吃到食物。

public boolean eatFood() {

Point head = snake.getFirst();

//吃到食物

if(head.equals(food)) {

return true;

}

return false;

}

对移动进行优化,四个方法合并成一个:

public void move() {

if (!isGameOver) {

Point head = snake.getFirst();

// 蛇根据当前方向移动

switch (currentDirection) {

case UP_DIRECTION:

snake.addFirst(new Point(head.x, head.y - 1));

break;

case DOWN_DIRECTION:

snake.addFirst(new Point(head.x, head.y + 1));

break;

case RIGHT_DIRECTION:

snake.addFirst(new Point(head.x + 1, head.y));

break;

case LEFT_DIRECTION:

snake.addFirst(new Point(head.x - 1, head.y));

break;

default:

}

// 删除蛇尾

// 如果吃到食物。则不删除

if (!eatFood()) {

snake.removeLast();

} else {

// 新增食物

createFood();

}

isGameOver();

}

}

判断是否结束,如果撞墙则游戏结束;如果撞到自己则游戏结束。

//记录游戏是否结束

boolean isGameOver = false;

/**

* 判断游戏是否结束

*/

public void isGameOver() {

//撞墙

Point head = snake.getFirst();

if(background[head.y][head.x]=='*') {

isGameOver = true;

}

//撞自己

for (int i = 1; i < snake.size(); i++) {

Point body = snake.get(i);

if(body.equals(head)) {

isGameOver = true;

}

}

}

至此,核心逻辑就写完了。

界面

核心代码写完之后,就要写可见的代码了。

新创建一个类SnakeView继承JPanel类。覆写paint方法,用来画界面。在main方法中,定义窗口信息:

public static void main(String[] args) {

JFrame jf = new JFrame("贪吃蛇");

// 窗体居中

jf.setLocationRelativeTo(null);

// 设置窗口大小

jf.setSize(400, 400);

// 设置窗口大小固定

jf.setResizable(false);

// 点叉是结束进程

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗体

jf.setVisible(true);

}

运行查看效果:

一个400*400的窗口就出来了。

画地图,用灰色代表墙体,白色代表可移动空间。存放地图的数组改为boolean类型的二维数组,墙体为true,其余为false。

前面核心代码已经写了,这里只需要做一点改动即可。

// 地图的宽(行)

public static final int width = 20;

// 地图的高(列)

public static final int heigth = 20;

// 格子的大小

public static final int cellSize = 20;

// 地图

private boolean[][] background = new boolean[heigth][width];

// 初始化背景

public void initBackground() {

for (int rows = 0; rows < background.length; rows++) {

for (int cols = 0; cols < background[rows].length; cols++) {

if (rows == 0 || rows == (heigth - 1) || cols == 0 || cols == (width - 1)) {

background[rows][cols] = true;

}

}

}

}

在paint方法中进行界面的绘制:

// 画背景

public void showBackground(Graphics g) {

for (int rows = 0; rows < background.length; rows++) {

for (int cols = 0; cols < background[rows].length; cols++) {

if (background[rows][cols]) {

// 墙体

g.setColor(Color.GRAY);

} else {

g.setColor(Color.WHITE);

}

// 矩形

g.fill3DRect(cols * cellSize, rows * cellSize, cellSize, cellSize, true);

}

}

}

@Override

public void paint(Graphics g) {

showBackground(g);

}

在main方法中修改代码,加入创建的代码。

public static void main(String[] args) {

JFrame jf = new JFrame("贪吃蛇");

SnakeView snakeView = new SnakeView();

snakeView.initBackground();

jf.add(snakeView);

// 窗体居中

jf.setLocationRelativeTo(null);

// 设置大小

jf.setSize(snakeView.width * snakeView.cellSize + 15, snakeView.heigth * snakeView.cellSize + 40);

// 设置窗口大小固定

jf.setResizable(false);

// 点叉是结束进程

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗体

jf.setVisible(true);

}

运行main方法,效果如下

初始化蛇,画蛇,蛇头为红色,蛇身为绿色。

// 集合保存节点信息

LinkedList snake = new LinkedList();

// 初始化蛇

public void initSnake() {

int x = width / 2;

int y = heigth / 2;

snake.add(new Point(x + 1, y));

snake.add(new Point(x, y));

snake.add(new Point(x - 1, y));

}

public void showSnake(Graphics g) {

g.setColor(Color.GREEN);

for (int i = 1; i < snake.size(); i++) {

Point body = snake.get(i);

g.fill3DRect(body.x * cellSize, body.y * cellSize, cellSize, cellSize, true);

}

// 蛇头

Point head = snake.getFirst();

g.setColor(Color.RED);

g.fill3DRect(head.x * cellSize, head.y * cellSize, cellSize, cellSize, true);

}

修改main方法和paint方法

public static void main(String[] args) {

JFrame jf = new JFrame("贪吃蛇");

SnakeView snakeView = new SnakeView();

snakeView.initBackground();

snakeView.initSnake();

jf.add(snakeView);

// 窗体居中

jf.setLocationRelativeTo(null);

// 设置大小

jf.setSize(snakeView.width * snakeView.cellSize + 15, snakeView.heigth * snakeView.cellSize + 40);

// 设置窗口大小固定

jf.setResizable(false);

// 点叉是结束进程

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗体

jf.setVisible(true);

}

@Override

public void paint(Graphics g) {

// 画背景

showBackground(g);

// 画蛇

showSnake(g);

}

运行main方法,效果如图:

食物随机出现,不能出现在蛇身,也不能出现在墙上,作出了判断。食物的颜色设置为绿色。

// 食物

Point food;

public void createFood() {

// 食物随机,创建随机对象

Random ra = new Random();

while (true) {

int x = ra.nextInt(width);

int y = ra.nextInt(heigth);

// 判断是否在蛇身上

boolean flag = false;

for (int i = 0; i < snake.size(); i++) {

Point body = snake.get(i);

if ((body.x == x && body.y == y) || (background[y][x])) {

flag = true;

}

}

if (!flag) {

food = new Point(x, y);

break;

}

}

}

public void showFood(Graphics g){

// 渲染食物

g.setColor(Color.BLUE);

g.fill3DRect(food.x * cellSize, food.y * cellSize, cellSize, cellSize, true);

}

修改main方法和paint方法,运行看效果图:

public static void main(String[] args) {

JFrame jf = new JFrame("贪吃蛇");

SnakeView snakeView = new SnakeView();

snakeView.initBackground();

snakeView.initSnake();

snakeView.createFood();

jf.add(snakeView);

// 窗体居中

jf.setLocationRelativeTo(null);

// 设置大小

jf.setSize(snakeView.width * snakeView.cellSize + 15, snakeView.heigth * snakeView.cellSize + 40);

// 设置窗口大小固定

jf.setResizable(false);

// 点叉是结束进程

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗体

jf.setVisible(true);

}

@Override

public void paint(Graphics g) {

// 画背景

showBackground(g);

// 画蛇

showSnake(g);

showFood(g);

}

蛇移动:要使蛇能够移动,需要添加键盘监听事件,监听方向键,进行蛇的移动。需要定义蛇移动的方向,检测是否反向。

public static final int UP_DIRECTION = 1;

public static final int DOWN_DIRECTION = -1;

public static final int LEFT_DIRECTION = 2;

public static final int RIGHT_DIRECTION = -2;

int currentDirection = -2;

// 相反方向

public void changeDirection(int newDirection) {

// 判断当前方向与所按方向是否相反

if (newDirection + currentDirection != 0) {

this.currentDirection = newDirection;

}

}

public void move() {

Point head = snake.getFirst();

// 蛇根据当前方向移动

switch (currentDirection) {

case UP_DIRECTION:

snake.addFirst(new Point(head.x, head.y - 1));

break;

case DOWN_DIRECTION:

snake.addFirst(new Point(head.x, head.y + 1));

break;

case RIGHT_DIRECTION:

snake.addFirst(new Point(head.x + 1, head.y));

break;

case LEFT_DIRECTION:

snake.addFirst(new Point(head.x - 1, head.y));

break;

default:

}

// 删除蛇尾

snake.removeLast();

}

Main方法中添加监听,使用匿名内部类。移动完之后,要重新刷新界面,这里直接调用repaint 方法即可。

jf.addKeyListener(new KeyAdapter() {

@Override

public void keyPressed(KeyEvent e) {

int keyCode = e.getKeyCode();

switch (keyCode) {

case KeyEvent.VK_UP:

snakeView.changeDirection(UP_DIRECTION);

snakeView.move();

break;

case KeyEvent.VK_DOWN:

snakeView.changeDirection(DOWN_DIRECTION);

snakeView.move();

break;

case KeyEvent.VK_LEFT:

snakeView.changeDirection(LEFT_DIRECTION);

snakeView.move();

break;

case KeyEvent.VK_RIGHT:

snakeView.changeDirection(RIGHT_DIRECTION);

snakeView.move();

break;

default:

break;

}

snakeView.repaint();

}

});

吃食物:

// 吃食物

public boolean eatFood() {

Point head = snake.getFirst();

// 吃到食物

if (head.equals(food)) {

return true;

}

return false;

}

修改move方法,如果没有吃到食物,则不改变什么,如果吃到食物,则生成食物。

public void move() {

Point head = snake.getFirst();

// 蛇根据当前方向移动

switch (currentDirection) {

case UP_DIRECTION:

snake.addFirst(new Point(head.x, head.y - 1));

break;

case DOWN_DIRECTION:

snake.addFirst(new Point(head.x, head.y + 1));

break;

case RIGHT_DIRECTION:

snake.addFirst(new Point(head.x + 1, head.y));

break;

case LEFT_DIRECTION:

snake.addFirst(new Point(head.x - 1, head.y));

break;

default:

}

// 删除蛇尾

// 如果吃到食物。则不删除

if (!eatFood()) {

snake.removeLast();

} else {

// 新增食物

createFood();

}

}

判断死亡,如果装墙或者撞自己,则视为死亡。

// 记录游戏是否结束

boolean isGameOver = false;

/**

* 判断游戏是否结束

*/

public void isGameOver() {

// 撞墙

Point head = snake.getFirst();

if (background[head.y][head.x]) {

isGameOver = true;

}

// 撞自己

for (int i = 1; i < snake.size(); i++) {

Point body = snake.get(i);

if (body.equals(head)) {

isGameOver = true;

}

}

}

修改move方法,判断设置的全局唯一标识。

public void move() {

if (!isGameOver) {

Point head = snake.getFirst();

// 蛇根据当前方向移动

switch (currentDirection) {

case UP_DIRECTION:

snake.addFirst(new Point(head.x, head.y - 1));

break;

case DOWN_DIRECTION:

snake.addFirst(new Point(head.x, head.y + 1));

break;

case RIGHT_DIRECTION:

snake.addFirst(new Point(head.x + 1, head.y));

break;

case LEFT_DIRECTION:

snake.addFirst(new Point(head.x - 1, head.y));

break;

default:

}

// 删除蛇尾

// 如果吃到食物。则不删除

if (!eatFood()) {

snake.removeLast();

} else {

// 新增食物

createFood();

}

isGameOver();

}

}

当游戏结束时,要显示“GAME OVER”,修改paint方法,添加死亡的判断。

@Override

public void paint(Graphics g) {

// 画背景

showBackground(g);

// 画蛇

showSnake(g);

showFood(g);

if (isGameOver) {

g.setColor(Color.red);

g.setFont(new Font("TimesRoman", Font.PLAIN, 60));

g.drawString("GAME OVER", 35, 200);

}

}

不操作的时候自动移动:

需要实现Runnable接口,并且实现run方法,在run方法中,调用移动方法和重绘界面的方法。

@Override

public void run() {

while (!isGameOver) {

move();

repaint();

try {

Thread.sleep(500);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

repaint();

}

还需要修改main方法,启动线程

public static void main(String[] args) {

JFrame jf = new JFrame("贪吃蛇");

SnakeView snakeView = new SnakeView();

snakeView.initBackground();

snakeView.initSnake();

snakeView.createFood();

jf.add(snakeView);

// 窗体居中

jf.setLocationRelativeTo(null);

// 设置大小

jf.setSize(snakeView.width * snakeView.cellSize + 15, snakeView.heigth * snakeView.cellSize + 40);

// 设置窗口大小固定

jf.setResizable(false);

// 点叉是结束进程

jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// 显示窗体

jf.setVisible(true);

Thread t = new Thread(snakeView);

t.start();

jf.addKeyListener(new KeyAdapter() {

@Override

public void keyPressed(KeyEvent e) {

int keyCode = e.getKeyCode();

switch (keyCode) {

case KeyEvent.VK_UP:

snakeView.changeDirection(UP_DIRECTION);

snakeView.move();

break;

case KeyEvent.VK_DOWN:

snakeView.changeDirection(DOWN_DIRECTION);

snakeView.move();

break;

case KeyEvent.VK_LEFT:

snakeView.changeDirection(LEFT_DIRECTION);

snakeView.move();

break;

case KeyEvent.VK_RIGHT:

snakeView.changeDirection(RIGHT_DIRECTION);

snakeView.move();

break;

default:

break;

}

snakeView.repaint();

}

});

}

至此,贪吃蛇的基本功能就全部实现了。

测试

扩展功能

可以记录得分,查看排名。需要使用JDBC连接数据库。

可以设置选择自动移动的速度。

FLASH游戏之贪吃蛇游戏源代码

scorecommand("allowscale", "false"); fscommand("showmenu", "false"); loadedbytes=0; total=_root.getBytesTotal(); loadedbytes=_root.getBytesLoaded() if (loadedbytes==total){nextScene();} else{bfb=int((loadedbytes/total*100))+"%";} stop(); fscommand("allowscale", "false"); fscommand("showmenu", "false"); music=new Sound() music.attachSound("music"); music.stop() music.start(0,10000) musicstart=true onClipEvent(keyDown){ temp=Key.getCode(); if(!keyon){;} else if(game=="stop" and (temp==189 or temp==109)){ if (speed>1) { speed--; rate = speed;}} else if (game=="stop" and (temp==107 or temp==187)) { if (speed"start"){enter(); }else if(temp==Key.ENTER){ enter(); }else if (temp == Key.DOWN and y1>=0) { x1=0; y1 = 1; walk(); timestart() }else if (temp == Key.UP and y1<=0) { x1=0; y1 = -1; walk(); timestart() }else if (temp == Key.LEFT and x1<=0) {

汇编语言写的贪吃蛇小游戏源代码

DATA SEGMENT dw 0,0 snk db 1 blk db 32 food db 3 tal1 db 4 tal2 db 2 adrs db 5 len db ? pst db ? addrs dw ? frow db ? fcol db ? hwrt db ? gmov db 'game over press r to restart press q to quit $' score1 db 'score :$' score2 db ? score0 db 1 zero db 48 writer db 'Developer: Geniusdot $' email db ': geniusdotgmail.$' msg1 db 'The way to play the game:$' way db ' press w to up ,press s to down,press a to left,press d to right$' msg db 'Press any key(except a,s,d,w) to start$' DATA ENDS STACK SEGMENT stack db 200 dup(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK start: mov ax,data mov ds,ax mov ax,0 mov es,ax mov frow,10 mov fcol,6 mov dh,10 mov dl,26 mov ah,2

int 10h mov ah,9 lea dx,msg1 int 21h mov dh,11 mov dl,7 mov ah,2 mov bh,0 int 10h mov ah,9 lea dx,way int 21h mov dh,12 mov dl,20 mov ah,2 mov bh,0 int 10h mov ah,9 lea dx,msg int 21h mov ah,0 int 16h mov ah,6 mov al,0 mov ch,0 mov cl,0 mov dh,24 mov dl,79 mov bh,10 int 10h mov dh,0 mov dl,0 mov ah,2 mov bh,0 int 10h mov ah,9 lea dx,score1 int 21h mov dl,15 mov ah,2 mov bh,0 int 10h

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

HTML5 贪吃蛇游戏实现思路及源代码 点评:游戏难点是怎么模拟贪吃蛇的移动。如果只是一个方块的话显然很简单。但是当蛇的长度变长之后要怎么样控制,下面为大家简要介绍下具体的实现,感兴趣的朋友可以参考下,希望对大家有所帮助 游戏操作说明 通过方向键控制贪吃蛇上下左右移动。贪吃蛇吃到食物之后会变长一个长度。 游戏具体实现 游戏难点是怎么模拟贪吃蛇的移动。如果只是一个方块的话显然很简单。但是当蛇的长度变长之后要怎么样控制 每个方块的移动呢? 如果观察蛇的移动,可以发现,从蛇的头部到尾部,每个方块在下一时刻的位置就是它的前一个方块在当前时刻 的位置。因此我们需要做的只是控制贪吃蛇的头部的运动。其他部分的位置都可以依次类推。 另外一个值得注意的问题是 贪吃蛇吃下食物之后,新增加的方块应该放在哪个位置。 答案就是在下一时刻,新增加的方块应该出现在当前时刻的尾部位置。 因此,在吃下食物之后应该在更新蛇的每个位置之前,增加一个方块,并且将其位置设定在当前时刻的尾部位置。 然后在当前时刻更新出了新增方块之外的所有方块的位置 index.html snake.js 复制代码代码如下: var canvas; var ctx; var timer; //measures var x_cnt = 15; var y_cnt = 15;

var unit = 48; var box_x = 0; var box_y = 0; var box_width = 15 * unit; var box_height = 15 * unit; var bound_left = box_x; var bound_right = box_x + box_width; var bound_up = box_y; var bound_down = box_y + box_height; //images var image_sprite; //objects var snake; var food; var food_x; var food_y; //functions function Role(sx, sy, sw, sh, direction, status, speed, image, flag) { this.x = sx; this.y = sy; this.w = sw; this.h = sh; this.direction = direction; this.status = status; this.speed = speed; this.image = image; this.flag = flag; } function transfer(keyCode) { switch (keyCode) { case 37: return 1; case 38: return 3; case 39: return 2; case 40: return 0; } } function addFood()

贪吃蛇小游戏源代码

#include #include #include #include int head=3 ,tail=0; int main() { int i,j,k=0; int zuobiao[2][80]; long start; int direction=77; int gamespeed; int timeover; int change(char qipan[20][80],int zuobiao[2][80],char direction); zuobiao[0][tail]=1;zuobiao[1][tail]=1;zuobiao[0][1]=1;zuobiao[1][1]=2;zuobiao[0][2]=1;zuobiao[ 1][2]=3;zuobiao[0][head]=1;zuobiao[1][head]=4; /*处理棋盘*/ char qipan[20][80];//定义棋盘 for(i=0;i<20;i++) for(j=0;j<80;j++) qipan[i][j]=' ';//初始化棋盘 for(i=0;i<80;i++) qipan[0][i]='_'; for(i=0;i<20;i++) qipan[i][0]='|'; for(i=0;i<20;i++) qipan[i][79]='|'; for(i=0;i<80;i++) qipan[19][i]='_'; qipan[1][1]=qipan[1][2]=qipan[1][3]='*';//初始化蛇的位置 qipan[1][4]='#'; printf("This is a game of a SNAKE.\nGOOD LUCK TO YOU !\n"); printf("Input your game speed,please.(e.g.300)\n"); scanf("%d",&gamespeed); while(direction!='q') { system("cls"); for(i=0;i<20;i++)//打印出棋盘 for(j=0;j<80;j++) printf("%c",qipan[i][j]); timeover=1;

贪吃蛇游戏安卓源代码

附录1.SnakeView类 package com.example.android_snake.view; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.Timer; import java.util.TimerTask; import com.example.android_snake.R; import com.example.android_snake.food.Food; import com.example.android_snake.snake.Body; import com.example.android_snake.snake.Head; import com.example.android_snake.snake.Snake; import com.example.android_snake.snake.SnakeDirection; import com.example.android_snake.stone.Stone; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Paint.Style; import android.os.Handler; import android.util.DisplayMetrics; import android.view.Display; import android.view.MotionEvent; import android.view.View; import android.view.ViewManager; import android.view.WindowManager; import android.widget.Toast; public class SnakeView extends View { private Context context; private Bitmap headBitmap; private Bitmap bodyBitmap; private Bitmap foodBitmap; private Bitmap stoneBitmap; // 屏幕的高度和宽度 private int screenHeight; private int screenWidth; // 每个小格子的高度和宽度 private int eachHeight;

html5实现贪吃蛇源代码

Insert title here