《结对-贪吃蛇-结对项目总结》

一. 项目背景:

“贪吃蛇”是一款经典的游戏,他因操作简单,娱乐性强而广受欢迎。本文基于Java技术,开发一个操作简单,功能较全的“贪吃蛇”游戏。

二。功能说明

1.使用上下左右四个按键对贪吃蛇进行控制,让贪吃蛇吃到食物,并且不能碰到自身和墙壁。

2.每吃到一个食物,蛇身会增长一个单位

3.初始场景随机出现食物,当食物被吃掉后,再次生成食物。

4.有计分机制,每吃到一个食物,增加一个分值。

三。设计思路

 

这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块。

四。技术要点

1.蛇身的处理

2.蛇身运动的处理

3.食物的产生

4.吃到食物,碰墙壁,碰自身的处理。

5.绘图

五。系统设计难点及解决办法

1.这个程序的关键是表示蛇的图形以及蛇的移动。用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块。移动时必须从蛇头开始,所以蛇不能向相反方向移动,也就是蛇尾不能改作蛇头。如果不按任何键,蛇自行在当前方向上前移,当游戏者按了有效的方向键后,蛇头朝着指定的方向移动,一步移动一节身体,所以当按了有效的方向键后,先确定蛇头的位置,然后蛇身体随着蛇头移动,图形的实现是从蛇头的新位置开始画出蛇,这时原来蛇的位置和新蛇的位置差一个单位,所以看起来蛇会多一节身体,所以将蛇的最后一节用背景色覆盖。食物的出现和消失也是画矩形块和覆盖矩形块

2.检测蛇有无撞到食物、围墙或是自己的身体。当蛇开始移动之后,需要判断蛇头要移动到的新的位置的情况,然后根据新位置是空白、食物、围墙还是蛇的身体来做出相应的操作。

3.事物的随机产生。当食物被吃掉后,要在场景中重新随机产生。

六。不足之处

本想着实现众多小功能:如“奖励模式”、“变速调节”、“食物的累加”等等。空有想法却未曾实现。

七。编程过程的问题:

  在使用枚举类-Enum时,发生JDK版本识别的错误,Enum需要5.0以上的版本。解决办法在eclectic中,选择1.7以上,如图:

八。部分源码

 主类——Yard.java

  

import java.awt.Color;

import java.awt.Font;

import java.awt.Frame;

import java.awt.Graphics;

import java.awt.Image;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

public class Yard extends Frame {

 

PaintThread paintThread = new PaintThread();

private boolean gameOver = false; //游戏是否结束

 

/**

* 行数

*/

public static final int ROWS = 30; //行数

public static final int COLS = 30; //列数

public static final int BLOCK_SIZE = 15; //小格尺寸

 

private Font fontGameOver = new Font("宋体", Font.BOLD, 50);

 

private int score = 0;

 

Snake s = new Snake(this);

Egg e = new Egg();

 

Image offScreenImage = null;

public void paint(Graphics g) {

Color c = g.getColor();

g.setColor(Color.GRAY);

g.fillRect(0, 0, COLS * BLOCK_SIZE, ROWS * BLOCK_SIZE);

g.setColor(Color.DARK_GRAY);

//画出横线

for(int i=1; i<ROWS; i++) {

g.drawLine(0, BLOCK_SIZE * i, COLS * BLOCK_SIZE, BLOCK_SIZE * i);

}

for(int i=1; i<COLS; i++) {

g.drawLine(BLOCK_SIZE * i, 0, BLOCK_SIZE * i, BLOCK_SIZE * ROWS);

}

g.setColor(Color.YELLOW);

g.drawString("score:" + score, 10, 60);

if(gameOver) {

g.setFont(fontGameOver);

g.drawString("游戏结束", 120, 180);

paintThread.pause();

}

g.setColor(c);

s.eat(e);

e.draw(g);

s.draw(g);

}

蛇身的类——Snake.java

  

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.awt.event.KeyEvent;

public class Snake {

private Node head = null;

private Node tail = null;

private int size = 0;

 

private Node n = new Node(20, 30, Dir.L);

private Yard y;

 

public Snake(Yard y) {

head = n;

tail = n;

size = 1;

this.y = y;

}

 

public void addToTail() {

Node node = null;

switch(tail.dir) {

case L :

node = new Node(tail.row, tail.col + 1, tail.dir);

break;

case U :

node = new Node(tail.row + 1, tail.col, tail.dir);

break;

case R :

node = new Node(tail.row, tail.col - 1, tail.dir);

break;

case D :

node = new Node(tail.row - 1, tail.col, tail.dir);

break;

}

tail.next = node;

node.prev = tail;

tail = node;

size ++;

}

private void checkDead() {

if(head.row < 2 || head.col < 0 || head.row > Yard.ROWS || head.col > Yard.COLS)  {

y.stop();

}

for(Node n = head.next; n != null; n = n.next) {

if(head.row == n.row && head.col == n.col) {

y.stop();

}

}

食物——Egg.java

  

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

import java.util.Random;

public class Egg {

int row, col;

int w = Yard.BLOCK_SIZE;

int h = Yard.BLOCK_SIZE;

private static Random r = new Random();

private Color color = Color.GREEN;

 

public Egg(int row, int col) {

this.row = row;

this.col = col;

}

public Egg() {

this(r.nextInt(Yard.ROWS-2) + 2, r.nextInt(Yard.COLS));

}

 

public void reAppear() {

this.row = r.nextInt(Yard.ROWS-2) + 2;

this.col = r.nextInt(Yard.COLS);

}

 

public Rectangle getRect() {

return new Rectangle(Yard.BLOCK_SIZE * col, Yard.BLOCK_SIZE * row, w, h);

}

移动类——Dir.java

  

/**

 * 代表蛇的运行方向

 * @author Administrator

 *

 */

public enum Dir {

L, U, R, D

}

九。程序运行截图:

 

posted @ 2017-11-01 14:28  Among  阅读(353)  评论(0编辑  收藏  举报