文档库 最新最全的文档下载
当前位置:文档库 › java贪吃蛇

java贪吃蛇

java贪吃蛇
java贪吃蛇

《Java程序设计》课程期末作业

题目游戏开发--贪吃蛇

学院计算机学院

专业计算机科学与技术

班别13级(2)班

学号31130058

姓名

2015年11月28日

一、课程题目

题目:编程实现贪吃蛇游戏。

二、题目分析与设计

1 开发环境

本次程序游戏的开发环境是win8+Eclipse。程序包名为com.sunway.src.在该包下包含了Node类,Snake类,Barrier类,DrawPanel类和Food类,main类。

2 程序运行功能

1)游戏随机产生食物;

2)当蛇吃到食物时,蛇身加长,分数相应的增加;

3)当蛇咬到自己或者撞到障碍物时,提示游戏结束并给出游戏得分;

4)通过键盘方向键可以控制蛇的移动;

5)可以通过选择速度的快慢来玩该游戏

6)通过choices中的restar来重新开始游戏

7)通过open中的stop来暂停游戏

3 游戏运行流程图如下:

本次实验的小游戏标题就简单给了程序的名字:Snake,游戏的布局主要采取的是BorderLayout进行布局。

menu = new JMenuBar();

menu2 = new JMenu("open");

menuI1 = new JMenuItem("start");

menuI2 = new JMenuItem("stop");

menuI3 = new JMenuItem("back");

//实现了open的内容

menuXian = new JMenu("choices");

menuRe = new JMenuItem("restart");

menuItem = new JMenu("speed");

m1 = new JMenuItem("low");

m2 = new JMenuItem("fast");

//实现了choices的内容

游戏的运行区域用Canvas画布实现,位于游戏BorderLayout布局的中部。

三、实验截图

四、源代码

/**

*这个是障碍类

*/

package com.sunway;

import java.awt.Color;

import java.awt.Graphics;

import java.util.ArrayList;

import java.util.List;

public class Barrier {

int x;

int y;

static List barrierList = new ArrayList(); //这里用于给障碍类设置要画出来的node

public Barrier(int x,int y){

this.x = x;

this.y = y;

barrierList.add(new Node(x,y));

barrierList.add(new Node(x,y+10));

barrierList.add(new Node(x+10,y+10));

}

public void draw(Graphics g){ //这个方法用于将障碍类画出来

g.setColor(Color.black);

for(Node n: barrierList){

g.fillRect(n.x, n.y, 10, 10);

}

}

}

package com.sunway;

import java.awt.Color;

import java.awt.Graphics;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

public class DrawPanel extends JPanel implements Runnable{

public Snake s ;

public Food d ;

public Barrier barrier;

public static int count = 0;

// public Thread t = new Thread(this);

//这里开始启动两个线程,一个是负责贪吃蛇的不断重画,一个是负责当贪吃蛇迟到食物的时候,令count++,记录吃到的食物的个数

public DrawPanel(final Snake s,final Food d,final Barrier barrier){ this.s = s;

this.d = d;

this.barrier = barrier;

Thread t = new Thread(this);

t.start();

Thread t2 = new Thread(new Runnable(){

public void run(){

while(true){

if(s.eat(d)) count++;

}

}

});

t2.start();

}

//这个方法在于当你调用repaint方法时,repaint会调用update方法,update方法实际调用的就是这个paintComponent方法

public void paintComponent(Graphics g){

//System.out.println("1");

g.setColor(this.getBackground());

g.fillRect(0, 0, 500, 500);

g.setColor(Color.black);

g.drawString("you have eat: " + count, 30, 30);

s.draw(g);

d.draw(g);

barrier.draw(g);

}

public void run(){

int temp;

while(true){

//here to give the time for refreshing the snake's state

try{

Thread.sleep(10);

}catch(Exception e){

e.printStackTrace();

}

while(s.isLive == true&& s.dead() == false ){

//在这里根据蛇的方向然后控制它的位置的变化,通过一个死循坏,使得每当蛇的位置变化一次,便重新画一次,看起来就像是蛇在不断移动switch(s.direction){

case "left" :{

temp = s.nodeList.get(0).x;

for(int i = s.nodeList.size()-2;i >= 0;i--){

s.nodeList.get(i+1).x = s.nodeList.get(i).x;

s.nodeList.get(i+1).y = s.nodeList.get(i).y;

}

s.nodeList.get(0).x = temp - 10;//这里是重新更新了头结点的位置

System.out.println("left");

//here to judge it it is longer than border,如果越界的话,就停止循坏,并弹出一个指示框表示你输了

if(s.nodeList.get(0).x < 0 || s.nodeList.get(0).x > 500 || s.nodeList.get(0).y < 0 ||s.nodeList.get(0).y > 500){

JOptionPane.showMessageDialog(null, "you are lost!");

s.isLive = false;

}

break;

}

case "right" :{

temp = s.nodeList.get(0).x;

for(int i = s.nodeList.size()-2;i >= 0;i--){

s.nodeList.get(i+1).x = s.nodeList.get(i).x;

s.nodeList.get(i+1).y = s.nodeList.get(i).y;

}

s.nodeList.get(0).x = temp + 10;

if(s.nodeList.get(0).x < 0 || s.nodeList.get(0).x > 500 || s.nodeList.get(0).y < 0 ||s.nodeList.get(0).y > 500){

JOptionPane.showMessageDialog(null, "you are lost!");

s.isLive = false;

}

break;

}

case "up":{

temp = s.nodeList.get(0).y;

for(int i = s.nodeList.size()-2;i >= 0;i--){

s.nodeList.get(i+1).x = s.nodeList.get(i).x;

s.nodeList.get(i+1).y = s.nodeList.get(i).y;

}

s.nodeList.get(0).y = temp - 10;

if(s.nodeList.get(0).x < 0 || s.nodeList.get(0).x > 500 || s.nodeList.get(0).y < 0 ||s.nodeList.get(0).y > 500){

JOptionPane.showMessageDialog(null, "you are lost!");

s.isLive=false;

}

break;

}

case "down":{

temp = s.nodeList.get(0).y;

for(int i = s.nodeList.size()-2;i >= 0;i--){

s.nodeList.get(i+1).x = s.nodeList.get(i).x;

s.nodeList.get(i+1).y = s.nodeList.get(i).y;

}

s.nodeList.get(0).y = temp + 10;

if(s.nodeList.get(0).x < 0 || s.nodeList.get(0).x > 500 || s.nodeList.get(0).y < 0 ||s.nodeList.get(0).y > 500){

JOptionPane.showMessageDialog(null, "you are lost!");

s.isLive = false;

}

break;

}

case "stay":{ //这个stay放行用于停止蛇的移动

System.out.println("fffffff1");

break;

}

//let the thread stop to repaint

}

repaint();

//这里的sleep方法主要是在于因为线程是在调用一个死循环,所以是无线运行的,那么在每次重画之前,让这个线程睡眠一定时间,再次重画,那么配合人涉及图像到大脑反应的时间,就会看起来像是在不断移动

//并且通过睡眠时间控制贪吃蛇的速度

try{

Thread.sleep(s.speed);

}catch(Exception e){

e.printStackTrace();

}

}

}

}

}

package com.sunway;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Rectangle;

public class Food {

private final int WIDTH = 10;//食物的大小

private final int HEIGHT = 10;

int x; //食物的坐标

int y;

public Food(int x,int y){

this.x = x;

this.y = y;

}

//get the rectangle so that you can answer the food public Rectangle getRect(){

return new Rectangle(x,y,WIDTH,HEIGHT);

}

//the method to draw

public void draw(Graphics g){

g.setColor(Color.green);

g.fillRect(x, y, WIDTH, HEIGHT);

}

}

package com.sunway;

import java.awt.Graphics;

import java.awt.Rectangle;

//node类,贪吃蛇,食物和障碍都是用点格这个类构成

public class Node {

//the constant

private final int WIDTH = 10;

private final int HEIGHT = 10;

int x;

int y;

public Node(int x,int y){

this.x = x;

this.y = y;

}

//here to get the rectangle to intersect the food public Rectangle getRect(){

return new Rectangle(x,y,WIDTH,HEIGHT);

}

//the method to draw the node

public void paint(Graphics g){

g.fillRect(x, y, WIDTH,HEIGHT);

}

}

package com.sunway;

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.List;

import java.util.Random;

import javax.swing.JOptionPane;

//贪吃蛇这个类

public class Snake {

private final int WIDTH = 10;

private final int HEIGHT = 10;

long speed = 300; //这是表示蛇的速度

boolean isLive ; //这是表示蛇是否还活着

String direction = "stay"; //蛇的初始方向

List nodeList ;//用于构造蛇的nodelist

public Snake(List nodeList){

this.nodeList = nodeList;

//this.addKeyListener(this);

}

//初始化蛇的坐标

public void initial(){

for(int i = 0;i < 5;i ++){

Node n = new Node(100 + 10*i,100);

this.nodeList.add(n);

}

isLive = true;

}

//the method to eat the food

public boolean eat(Food food){

if(nodeList.get(0).getRect().intersects(food.getRect()))

{

System.out.println(1);

//here to change the node's number and

//record the number of food which is eaten

food.x = new Random().nextInt(400);

food.y = new Random().nextInt(400);

//nodeList.add(new Node(nodeList.get(nodeList.size()-1).x + 10,nodeList.get(nodeList.size()-1).y));

switch(direction){

case "left":{

int xLast = nodeList.get(nodeList.size()-1).x;

int yLast = nodeList.get(nodeList.size()-1).y;

nodeList.add(new Node(xLast+10,yLast));

break;

}

case "right":{

int xLast = nodeList.get(nodeList.size()-1).x;

int yLast = nodeList.get(nodeList.size()-1).y;

nodeList.add(new Node(xLast-10,yLast));

break;

}

case "up" :{

int xLast = nodeList.get(nodeList.size()-1).x;

int yLast = nodeList.get(nodeList.size()-1).y;

nodeList.add(new Node(xLast,yLast+10));

break;

}

case "down":{

int xLast = nodeList.get(nodeList.size()-1).x;

int yLast = nodeList.get(nodeList.size()-1).y;

nodeList.add(new Node(xLast,yLast-10));

break;

}

}

return true;

}

else return false;

}

//the method to draw

public void draw(Graphics g){

g.setColor(Color.blue);

for(Node node : nodeList){

g.fillRect(node.x,node.y, WIDTH, HEIGHT);

}

}

//here should change the x and y with the direction

/*public void changeLocation(String direction,List nodeList){ switch(direction){

case "left" :{

for()

}

case "right" :{}

case "up":{}

case "down":{}

}

}

*/

//the method to dead

public boolean dead(){

Node n = nodeList.get(0);

//System.out.println("fdfa");

//System.out.println("dead");

//here it is the way to dead by hit itself

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

if(n.x == nodeList.get(i).x && n.y == nodeList.get(i).y){ JOptionPane.showMessageDialog(null, "you are lost!");

this.isLive = false;

//System.out.println(true);

return true;

}

}

//here it is the way to dead by hit the barrier

for(Node node : Barrier.barrierList){

if(nodeList.get(0).x == node.x && nodeList.get(0).y == node.y){

JOptionPane.showMessageDialog(null, "you are lost!");

System.out.println("54545");

this.isLive = false;

System.out.println(true+"2");

return true;

}

//System.out.println("2");

//System.out.println(false);

return false;

}

}

package com.sunway;

import java.awt.BorderLayout;

import https://www.wendangku.net/doc/ed18171671.html,ponent;

import java.awt.Menu;

import java.awt.MenuBar;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.LinkedList;

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JMenuItem;

public class test {

private static DrawPanel drawPanel;

private static JMenuItem menuI1;

private static JMenuItem menuI2;//this button is to stop the snake private static JMenuItem menuI3;//this button is to back up the snake private static JMenu menu2;

private static JFrame frame;

private static Snake s;

//private static Barrier barrier;

private static JMenuBar menu;

private static JMenu menuXian;

private static JMenu menuItem;

private static JMenuItem m1;

private static JMenuItem m2;

private static JMenuItem menuRe;

private static String state; //here to restore the state before stoping

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

frame = new JFrame();

s = new Snake(new LinkedList());

s.initial(); // initial the nodeList

Food d = new Food(10,10); // the first position

Barrier barrier = new Barrier(200,30);//here construct the barrier

drawPanel = new DrawPanel(s, d,barrier);

menu = new JMenuBar();

//open那个menu以及其内容

menu2 = new JMenu("open");

menuI1 = new JMenuItem("start");

menuI2 = new JMenuItem("stop");

menuI3 = new JMenuItem("back");

//choices那个menu以及其内容

menuXian = new JMenu("choices");

menuRe = new JMenuItem("restart");

menuItem = new JMenu("speed");

m1 = new JMenuItem("low");

m2 = new JMenuItem("fast");

frame.setFocusable(true);

System.out.println("3");

create(frame);

}

public static void create(final JFrame frame){

/* 这段是为了初始化框架

*/

frame.setSize(500,500);

frame.setTitle("snake");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.setLayout(new BorderLayout());

frame.getContentPane().add(drawPanel,BorderLayout.CENTER);

/* 这段是为了初始化框架

*/

/* 这里是将menu的子项加进去menu中*/

menu2.add(menuI1);

menu2.add(menuI2);

menu2.add(menuI3);

//frame.setJMenuBar(menu);

menuXian.add(menuItem);

menuXian.add(menuRe);

menuItem.add(m1);

menuItem.add(m2);

//menuItem.add(menuRe);

menu.add(menuXian);

menu.add(menu2);

/* 这里是将menu的子项加进去menu中

*/

frame.getContentPane().add(menu,BorderLayout.NORTH);

/* here the key control */ //这里是加入键盘控制

frame.addKeyListener(new KeyListener(){

@Override

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

System.out.println("143432");

}

@Override

public void keyPressed(KeyEvent e) {

// TODO Auto-generated method stub

System.out.println("1");

switch(e.getKeyCode()){

case KeyEvent.VK_RIGHT:{

s.direction = "right";

//System.out.println("rigg");

break;

}

case KeyEvent.VK_LEFT:{

s.direction = "left";

break;

用Java编写的贪吃蛇代码 下面是我用java编写的一个贪吃蛇游戏源代码.我个人是比较喜欢玩游戏的,所以学习编程二年多了,很想做个游戏程序,由于能力有限,一直没能做好,后来突然看同学在手机上玩“贪吃蛇”,故想做出来,其一是因为此游戏界面容易设计,算法也比较简单,今天我就把我程序的代码和算法介绍一下,顺便把程序界面皮肤设计说一下...... 程序中一个关于游戏信息的类如下,由于类的说明在程序中写的很清楚了,就不再多解释了:#include "time.h" //方向定义 const CPoint UP(CPoint(0,-1)); const CPoint DOWN(CPoint(0,1)); const CPoint LEFT(CPoint(-1,0)); const CPoint RIGHT(CPoint(1,0)); //速度快慢定义 const int HIGH = 75; const int NORMAL = 180; const int SLOW = 300; const int MAX = 80; //表示转向数 const int LENGTH = 10; class GameMsg { public: GameMsg(void) : m_icon(0)

{ InitGame(); } void InitGame(int up = VK_UP, int down = VK_DOWN, int left = VK_LEFT, int right = VK_RIGHT) { srand((unsigned)time(NULL)); m_gameSpeed = NORMAL; m_speedNum = 2; m_snakeNum = 4; for(int i=0; i

系统描述 (1) 1.1本设计的目的和意义 (1) 1.2设计的主要内容 (1) 1.3设计要达到的目标 (2) 1.4设计需要实现的功能和目标 (2) 1.5游戏设计环境 (2) 二分析与设计 (3) 2.1 游戏处理流程 (3) 2.2需求分析 (4) 2.3功能模块设计 (4) 2.4详细设计 (8) 三系统测试 (19) 四心得体会 (21) 五参考文献 (22) 六附录 (24)

基于Java的游戏“贪吃蛇”的设计和实现 内容提要: “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术和JBuilder开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,六个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软 件开发流程的目的。 一系统描述 1.1本设计的目的和意义 贪吃蛇游戏一款非常经典的手机游戏,因为它比较简单有趣,无论老少都比较适合。贪吃蛇的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。 贪吃蛇游戏的设计比较复杂,它涉及面广、牵涉方面多,如果不好好考虑和设计,将难以成功开发出这个游戏。在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。 正是因为如此,本次毕业设计的目的在于学习Java程序设计基本技术,学习用JBuilder开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握JBuilder环境的使用方法,培养起初步的项目分析能力和程序设计能力。 1.2设计的主要内容 贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现开始、暂停、退出等功能。

J a v a贪吃蛇报告 Revised final draft November 26, 2020

《Java高级编程》课程报告 第xx小组:贪吃蛇游戏项目 小组成员及分工 一、实验环境 操作系统:Windows 7 编程环境:Eclipse、JDK 二、实验内容与完成情况 (主要介绍项目总体功能分析与说明。) 贪吃蛇小游戏的JAVA程序是利用上↑、下↓、左←、右→方向键来改变蛇的运动方向,按空键暂停游戏,按enter键重新开始。长按某个方向键后,蛇的运动速度会加快,在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常进行游戏。以不同的速度和不同方向吃到食物所获得的分数也不相同。 窗口功能说明:设计了三个窗口,分别是游戏主窗口,主菜单窗口,模式选择窗口。菜单栏分别为:游戏菜单(重新开始)和帮助菜单以及返回(返回主菜单)。其中,按返回菜单按钮后会显示主菜单,其包括游戏开始、设置、退出游戏三项按钮选择;如果按

“设置”按钮会进入“模式选择”窗口。而模式选择窗口菜单包括了初级、中级、高级、返回按钮。 1、功能1(主菜单窗口) (1)主菜单窗口主要是提供“游戏开始”、“设置”和“退出”按钮。“游戏开始”按钮按下后会进入“游戏主窗口”开始游戏;“设置”按钮是调用 “模式选择”窗口对游戏贪吃蛇的速度进行设置;“退出”按钮按下则会 直接退出游戏。 (2)功能1实现的流程图 实现的效果图如下: (3)功能1(主菜单窗口)代码: package Swing; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; import ; public class setMenu extends JFrame { private int speed1 = 200; public static int speed = 200; // static int speed = 20; private JPanel contentPane; /** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { setMenu frame = new setMenu(speed); frame.SsetMenu(frame); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); }

辅助类 Coordinate.java 复制代码 package com.nn.util; /** *坐标点 */ public class Coordinate { public int x; public int y; public Coordinate(int newX, int newY) { x = newX; y = newY; } public boolean equals(Coordinate other) { if (x == other.x && y == other.y) { return true; }

return false; } @Override public String toString() { return "Coordinate: [" + x + "," + y + "]"; } } 复制代码 接口Direction 复制代码 package com.nn.entity; public interface Direction { public class Dir{ public static final int UP = 1; public static final int DOWN = 2; public static final int LEFT = 3;

public static final int RIGHT = 4; } } 复制代码 实体类Snake.java 复制代码 package com.nn.entity; import java.util.ArrayList; import com.nn.entity.Direction.Dir; import com.nn.util.Coordinate; public class Snake{ //小方块x坐标 private int x; //小方块y坐标

1设计目的 1.1背景 近年来,Java作为一种新的编程语言,以其简单性、可移植性和平台无关性等优点,得到了广泛地应用,特别是Java与万维网的完美结合,使其成为网络编程和嵌入式编程领域的首选编程语言。JBuilder是Borland公司用于快速开发Java应用的一款优秀的集成开发环境,它以其友好的开发界面、强大的组件支持等优点,得到广大程序员的接受和认可。 “贪吃蛇”游戏是一个经典的游戏,它因操作简单、娱乐性强而广受欢迎。本文基于Java技术和JBuilder开发环境,开发了一个操作简单、界面美观、功能较齐全的“贪吃蛇”游戏。整个游戏程序分为二个功能模块,六个类模块,实现了游戏的开始、暂停、结束。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。 本文在介绍Java相关技术和国内外发展现状的基础上,对“贪吃蛇”游戏的整个生命周期的各个开发阶段进行了详细地介绍。首先,分析了开发本游戏软件的可行性,重点分析本设计所采用的技术的可行性。其次,从游戏主界面等几方面,分析了本游戏的功能需求;从可使用性和安全性方面分析了属性需求。然后,进行了游戏的概要设计和详细设计,这也是本文的重点。概要设计给出二个功能模块的主框架以及六个类模块的函数调用关系;详细设计介绍了Java2标准运行环境的配置,重点给出各个类模块的程序流程图以及UML图,列表介绍了各个类包含的变量、使用的方法,展示了游戏的界面。为了保证程序代码的正确性和功能实现的可靠性,本文还介绍了游戏软件的程序调试过程和功能测试结果。 1.2目标 本软件是针对贪吃蛇小游戏的JAVA程序,利用方向键来改变蛇的运行方向,空格键暂停或继续游戏,并在随机的地方产生食物,吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。 2 总体设计 2.1 设计思路 本系统主要是完成贪吃蛇游戏的基本操作。用户可以自己练习和娱乐。本系统需要满足以下几点要求: (1) 利用方向键来改变蛇的运行方向。 (2) 空格键暂停或继续游戏,并在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。 2.2 设计说明 本系统共包括1个java源文件和7个类文件。

前言 Java最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景。于是改造了Oak,以“Java”的名称正式发布。 Java 编程语言的风格十分接近C、C++语言。Java是一个纯的面向对象的程序设计语言,它继承了 C++ 语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java SE 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。但在J2SE 1.4.2 发布后,Java 的执行速度有了大幅提升。 与传统程序不同,Sun 公司在推出 Java 之际就将其作为一种开放的技术。全球数以万计的 Java 开发公司被要求所设计的 Java 软件必须相互兼容。“Java 语言靠群体的力量而非公司的力量”是 Sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。 Sun 公司对 Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。

开发背景 作为一个经典的游戏,贪吃蛇设计简单,实用和娱乐性高,是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 {

姓名:XXXXXX 学号:XXXXXX

目录 1 引言 (5) 1.1 编写目的 (5) 1.2 项目背景 (5) 1.3 开发工具和语言 (6) 1.4 术语说明 (6) 1.4.1 数据结构 (6) 1.4.2 类 (6) 2 概要设计 (7) 2.1 目标 (7) 2.2 运行环境 (8) 2.3 总体设计 (8) 2.3.1 游戏设计思路 (8) 2.3.2 算法中的基本概念 (9) 2.3.3 游戏结构 (9) 2.3.4 游戏整体流程 (9) 3 数据结构设计 (10) 3.1 蛇、石头、食物的表示 (10) 3.2 蛇的移动 (10) 3.3 存储蛇身的数据结构 (11)

3.5 如何显示蛇身 (11) 3.6 蛇身的移动方向 (12) 3.7 吃到食物判定 (12) 4 类的设计 (12) 4.1 设计 (12) 4.1.1 GamePanel类 (12) 4.1.2 Snake类 (13) 4.1.3 Food类 (13) 4.1.4 Ground类 (13) 4.1.5 Controller类 (13) 4.1.6 Mouse类 (13) 4.2 通过事件监听建立联系 (13) 5 详细设计 (13) 5.1 controller包 (14) 5.1.1 Controller类 (14) 5.2 mouse包 (14) 5.2.1 Mouse类 (14) 5.3 entities包 (15)

5.3.2 Ground类 (15) 5.3.3 Snake类 (16) 5.4 game包 (17) 5.4.1 Game类 (17) 5.5 listener包 (17) 5.5.1 Snakelistener类 (17) 5.6 util包 (17) 5.6.1 Global类 (17) 5.7 view包 (17) 5.7.1 GamePanel类 (17) 5.8 sound包 (18) 5.8.1 Sound类 (18) 6 UI设计 (18)

Java课程设计之贪吃蛇 安阳工学院计算机学院 JAVA课程设计报告 专业班级: 学生姓名: 学生学号: 小组成员: 指导教师姓名: 宋强 目录 一选题目的与系统概述 (1) 1.1选题目的 (1) 1.2系统概述.................................................................................1 二系统可行性分析与相关技术背景分析 (2) 2.1系统可行性分析 (2) 2.2相关技术背景分析.....................................................................2 三系统设计与关键技术 (3) 3.1系统设计 (3) 3.2关键技术.................................................................................5 四系统测试与操作实施方法.........................................................9 五系统设计总结与回顾 (11) 六参考文献 (12) 一、选题目的与系统概述 1.1 选题目的 贪吃蛇游戏是一款非常经典的游戏,因为它比较简单有趣,无论老少都比较适合。贪吃蛇的设计对每一个Java语言设计者进行语言提高和进阶都是一个很好的锻炼机会。

在这个游戏的设计中,牵涉到图形界面的显示与更新、数据的收集与更新,并且在这个游戏的开发中,还要应用类的继承机制以及一些设计模式。因此,如何设计和开发好这个贪吃蛇游戏,对于提高Java开发水平和系统的设计能力有极大的帮助。在设计开发过程中,需要处理好各个类之间的继承关系,还要处理各个类相应的封装,并且还要协调好各个模块之间的逻辑依赖关系和数据通信关系。 正是因为如此,本次设计的目的在于学习Java程序设计基本技术,学习用Netbeans开发Java程序的相关技术,熟悉游戏“贪吃蛇”的需求,熟悉项目开发的完整过程。学会怎样进行一个项目的需求分析、概要设计、详细设计等软件开发过程,熟练地掌握Java程序设计的基本技术和方法,熟练地掌握Netbeans环境的使用方法,培养起初步的项目分析能力和程序设计能力。 1.2 系统概述 1.2.1 设计的主要内容 贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。可实现开始、暂停、改变速度,更换颜色等功能。 1.2.2 设计要达到的目标 本次设计要达到的目标分别从以下模块进行阐述: 游戏主界面模块: 游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏场景、状态栏、颜色设置、网格模式、及相关提示信息等。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。 游戏控制模块: 这个模块是游戏的中心环节,主要完成控制游戏的开始、暂停等功能。为了能

JAVA设计贪吃蛇游戏 1.课程设计目的 《JA V A程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节是必不可少的一个重要环节。本课程的程序设计专题实际是计算机相关专业学生学习完《JAVA程序设计》课程后,进行的一次全面的综合训练,JA V A程序设计的设计目的是加深对理论教学内容的理解和掌握,使学生较系统地掌握程序设计及其在网络开发中的广泛应用,基本方法及技巧,为学生综合运用所学知识,利用软件工程为基础进行软件开发、并在实践应用方面打下一定基础。 2.设计方案论证 2.1设计思路 贪吃蛇游戏设计与实现,主要分为以下二个模块:游戏主界面模块和游戏控制模块。在此只实现游戏的游戏主界面模块、游戏控制模块。并且只是实现移动速度、暂停、重新开始等功能。 游戏主界面模块: 游戏的主界面是进入游戏后,能够给玩家第一感官的部分,主要包括游戏图形区域界面、游戏的速度选择更新界面、新生方块的预览、游戏速度控制按钮、暂停游戏按钮、重新开始游戏按钮以及游戏排行榜按钮。从很大程度上决定了玩家对游戏的兴趣问题,因此,游戏的主界面应该力求美观,爽心悦目。 游戏控制模块: 这个模块是游戏的中心环节,主要完成控制游戏的速度、暂停、重新开始等功能。为了能够给玩家一个很好的游戏环境,这部分应该做到易懂、易操作。 本设计所开发的是基于Java的一个贪吃蛇游戏软件,主要实现游戏的速度控制、游戏的暂停、游戏的退出等功能,分为: 游戏主界面模块、游戏控制模块以二个模块。 性能: 本软件在设计方面本着方便、实用及娱乐性高的宗旨,在对界面进行设计的过程中,始终坚持清晰明了,在性能方面能够实现效率高,不易出错等优点。

import java.awt.Color; import java.awt.Graphics; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.JCheckBoxMenuItem; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.KeyStroke; public class 贪吃蛇extends JFrame implements ActionListener, KeyListener,Runnable { /**

* */ private static final long serialVersionUID = 1L; private JMenuBar menuBar; private JMenu youXiMenu,nanDuMenu,fenShuMenu,guanYuMenu; private JMenuItem kaiShiYouXi,exitItem,zuoZheItem,fenShuItem; private JCheckBoxMenuItem cJianDan,cPuTong,cKunNan; private int length = 6; private Toolkit toolkit; private int i,x,y,z,objectX,objectY,object=0,growth=0,time;//bojectX,Y private int m[]=new int[50]; private int n[]=new int[50]; private Thread she = null; private int life=0; private int foods = 0; private int fenshu=0;

课程设计说明书 课程名称:Java语言程序设计 设计题目:学生成绩管理系统 院系:计算机科学与信息工程学院 学生姓名:肖文 学号:14031010141 专业班级:计算机科学与技术(14嵌入) 指导教师:张阳 2015 年12月27 日

课程设计任务书 设计题目贪吃蛇小游戏程序 学生姓名肖文所在院系计科专业、年级、班14计科嵌入 设计要求: 1. 贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松 各种压力的目的。 2. 游戏可以进行升级,也就是增加吃食物的难度,以便使大家更有挑战性,不觉得 太无趣。 3. 游戏界面大小可以任意指定,数据从文件读入。 4. 利用swing实现良好的GUI界面。 学生应完成的工作: 1. 贪食蛇的前移算法主要是蛇身结点前移,后面的覆盖前面的蛇身结点。依靠的调 用编写的成员方法实现。 2. 在贪吃蛇中蛇头来控制蛇的移动方向,依靠的调用编写的成员方法实现。 3. 要求用户界面采用图形用户界面,影响方向键的控制。 4. 重复的调用paint()函数来实现对界面的重绘和食物的重置。 5. 源程序中要有充分的注释,报告中要有详细的流程图。 6. 运行的结果以及图形用户界面要进行屏幕拷贝,插入报告中。 幕拷贝,插入报告中。 参考文献阅读: 1. 《Java语言程序设计》(美)Y·Daniel Liang 机械工业出版社 2. 赵毅主编.跨平台程序设计语言——Java.西安:西安电子科技大学出版社,2006 3. 王路群.Java高级程序设计.北京:中国水利水电出版社,2006 工作计划: 1,12月21日,选择该课题,然后分析结构。 2,12月21日至25日开始编写各个模块。 3,12月28日至29日,对设计的系统进行测试以及进行修改。 4,12月30日,贪吃蛇完成。 任务下达日期:2015 年12月10 日 任务完成日期:2015 年12月24 日 指导教师(签名):学生(签名):

项目效果图: 源代码: import java.awt.Color; import java.awt.Container; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import https://www.wendangku.net/doc/ed18171671.html,ponentAdapter; import https://www.wendangku.net/doc/ed18171671.html,ponentEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.Rectangle2D; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.*; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; /* author: 蒋冰*/

贪吃蛇源代码 将Location、LocationRO、SnakeFrame、SnakeModel、SnakePanel放到命名为snake的文件夹里,主函数MainApp放到外面运行主函数即可实现。 主函数 package snake; import javax.swing.*; import snake.*; public class MainApp { public static void main(String[] args) { JFrame.setDefaultLookAndFeelDecorated(true); SnakeFrame frame=new SnakeFrame(); frame.setSize(350,350); frame.setResizable(false); frame.setLocation(330,220); frame.setTitle("贪吃蛇"); frame.setVisible(true); } } package snake; public class Location { private int x; private int y; Location(int x,int y){ this.x=x; this.y=y; } int getX(){ return x; } int getY(){ return y; } void setX(int x){ this.x=x; }

void setY(int y){ this.y=y; } public boolean equalOrRev(Location e){ return ((e.getX()==getX())&&(e.getY()==getY())) ||((e.getX()==getX())&&(e.getY()==-1*getY())) ||((e.getX()==-1*getX())&&(e.getY()==getY())); } public boolean equals(Location e){ return(e.getX()==getX())&&(e.getY()==getY()); } public boolean reverse(Location e){ return ((e.getX()==getX())&&(e.getY()==-1*getY())) ||((e.getX()==-1*getX())&&(e.getY()==getY())); } } package snake; public class LocationRO{ private int x; private int y; LocationRO(int x,int y){ this.x=x; this.y=y; } int getX(){ return x; } int getY(){ return y; } public boolean equalOrRev(LocationRO e){ return ((e.getX()==getX())&&(e.getY()==getY())) ||((e.getX()==getX())&&(e.getY()==-1*getY())) ||((e.getX()==-1*getX())&&(e.getY()==getY())); } public boolean equals(LocationRO e){ return(e.getX()==getX())&&(e.getY()==getY()); }

贪吃蛇:看了传智博客的视频整理出来的代码Snake类 package snake; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.util.HashSet; import java.util.LinkedList; import java.util.Set; public class Snake { //定义方向的常量 public static final int UP=-1; public static final int DOWN=1; public static final int LEFT=2; public static final int RIGHT=-2; private int oldDirection,newDirection; private Point oldTail; private boolean life; private LinkedList body=new LinkedList(); //蛇的坐标 private Set listener=new HashSet(); //蛇没身体要初始化 public Snake(){ init(); } public void init(){ //显示区最中间点 int x=Global.WIDTH/2; int y=Global.HEIGHT/2; //初始化身体节点 for(int i=0;i<3;i++){ //添加节点 body.addLast(new Point(x--,y));//蛇头在右边默认方向为右 oldDirection=newDirection=RIGHT;

一、功能简介 可以通过面板上的按钮和键盘上的“+”,“-”实现加速,减速。 可以通过面板上的按钮和键盘上的“r“来实现重新开始游戏。 可以在面板上通过复选框选择游戏模式(挑战模式,普通模式)。 二、运行结果截图

二、代码 1、地图 package snake; importjava.io.BufferedReader; importjava.io.File; importjava.io.FileNotFoundException; import java.io.FileReader;//读取字符文件类FileReader importjava.io.IOException; public class map {

int[][] map=new int[20][20]; intsnakeX,snakeY; intfoodX,foodY; public map(int level){ String filepath="mapc/"+level+".txt"; File file = new File(filepath); FileReaderfr = null;//利用FileReader流来读取一个文件中的数据 BufferedReaderbr = null;//字符读到缓存里 try { fr = new FileReader(file); br = new BufferedReader(fr); for (inti = 0; i< 20; i++){ String line = br.readLine();//以行为单位,一次读一行利用BufferedReader的readLine,读取分行文本 byte[] point = line.getBytes();//将字符串转换为字节数组 for (int j = 0; j < 20; j++) { map[i][j] = point[j] - 48;// 根据ASCall码表要减掉30H(十进制的48) if(map[i][j]==3){ snakeX=i; snakeY=j; } if(map[i][j]==5){ foodX=i; foodY=j; } } } } catch (FileNotFoundException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch (IOException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch(NullPointerException e){ e.printStackTrace();//深层次的输出异常调用的流程 } finally { if (br == null){ try{

前言 Java 最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹 钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun 放弃了该项计划。就在Oak 几近失败之时,随着互联网的发展,Sun 看到了Oak 在计算机网络上的广阔应用前景。于是改造了Oak,以“Java”的名称正式发布。 Java 编程语言的风格十分接近C、C++语言。Java 是一个纯的面向对象的程序设 计语言,它继承了C++ 语言面向对象技术的核心。Java 舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载( operator overloading )、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在Java SE 1.5 版本中,Java 又引入了泛型编程( Generic Programming )、类型安全的枚举、不定长参数和自动装/ 拆箱等语言特性。 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码( bytecode ),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。不过,每次的编译执行需要消耗一定的时间,这同时也在一定程度上降低了Java 程序的运行效率。但在J2SE 1.4.2 发布后,Java 的执行速度有了大幅提升。 与传统程序不同,Sun 公司在推出Java 之际就将其作为一种开放的技术。全球数以万计的Java 开发公司被要求所设计的Java 软件必须相互兼容。“ Java 语言靠群体的力量而非公司的力量”是Sun 公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。 Sun 公司对Java 编程语言的解释是:Java 编程语言是个简单、面向对象、分布式、解释性、健 壮、安全与系统无关、可移植、高性能、多线程和动态的语言。 正文 1.1 课程设计目的 《JAVA 程序设计》是计算机相关专业的必修专业基础课程,其实践性、应用性很强。实践教学环节

第一章绪论 开发的背景 随着科技的发展,现在手机的功能已不仅仅是简单的打接电话、收发短信了。更多的手机用户希望在工作、学习之余通过方便灵巧可随身携带的仪器休闲娱乐。因此,为了迎合众多用户的需求并适应现在手机的规模,我们开发出一套适合各阶层人士的具有很强的娱乐性和交互性的贪吃蛇小游戏。 贪吃蛇,之所以取这样的名字,去用意还是很明显的.贪吃蛇其实并不贪,它是人不断向前追求的象征.就像现代的人只有不断努力向前才能得到自己想要的。而食物也是随机出现的,就像现在社会存在的机会,而我们只有找好自己的目标才能成功。 虽然现在市面上存在着各种各样的游戏版本,可是贪吃蛇其市场还是相当大的。因为它的特殊在于它能吸引人更深入,爱不释手.随着游戏速度不断加快,其刺激性也更强。可以说该游戏的优势在于它的简单易行,不论是手机,还是小游戏机,都能很快顺利的运行。对于在外忙碌的人,不可能花费大量时间在娱乐上,大型游戏是行不通的。这样的小游戏刚好迎合了他们的需求。 开发的目的 在如今社会,人们的工作学习压力逐渐增大,生活节奏逐渐加快,大多数人没有足够的时间去休闲娱乐,放松自己。这款小型的手机游戏,可以让我们随时随地都能享受游戏,。让我们从繁重的日常生活中解脱出来。 游戏的主界面应该力求美观,爽心悦目,以提高玩家对游戏的兴趣。游戏的控制模块应该做到易懂、易操作,以给玩家一个很好的游戏环境。 开发的意义 通过这个游戏可以使玩贪吃蛇的人感到心情轻松,愉悦。使心情得以舒畅,让工作的压力可以得到缓解。给大家一个愉悦的游戏环境。

开发工具简介 Sun Microsystems公司在推出Java语言的同时,推出了一套开发工具JDK。Sun提供的基于字符模式的Java开发工具包JDK: Java开发工具(JDK)是许多Java专家最初使用的开发环境。Java是平台无关的语言是指用Java写的应用程序不用修改就可在不同的软硬件平台上运行。 Java源程序编写借助于记事本,Editpuls,UltraEdit等第三方编辑工具。 所有的Java文件编辑、编译、调试、解释运行都是通过使用字符命令来执行操作。JDK由一个标准类库和一组建立,测试及建立文档的Java实用程序组成。其核心Java API是一些预定义的类库,开发人员需要用这些类来访问Java语言的功能。JDK 是整个Java的核心,包括了Java运行环境(Java RuntimeEnvirnment),一堆Java工具和Java基础的类库。不论什么Java应用服务器实质都是内置了某个版本的JDK。因此掌握JDK是学好Java的第一步。 JDK里面是java类库和java的语言规范,它提供的是无论你用何种开发软件写java程序都必须用到的类库和java语言规范.没有jdk,你的java程序根本就不能用。 最主流的JDK是Sun公司发布的JDK,除了Sun之外,还有很多公司和组织都开发了自己的JDK,例如IBM 公司开发的JDK,BEA公司的Jrocket,还有GNU组织开发的JDK等等。其中IBM的JDK包含的JVM(Java Virtual Machine)运行效率要比SunJDK包含的JVM高出许多。而专门运行在x86平台的Jrocket在服务端运行效率也要比SunJDK好很多。但不管怎么说,我们还是需要先把Sun JDK掌握好。 第二章需求分析 需求分析 本游戏主要是完成贪吃蛇游戏的基本操作。本游戏需要满足以下几点要求: (1) 利用方向键来改变蛇的运行方向。 (2) 在随机的地方产生食物。 (3) 吃到食物就变成新的蛇体,碰到壁或自身则游戏结束,否则正常运行。 可行性分析 贪吃蛇游戏是一种简单的大众的游戏,自从计算机实现以来,深受广大电脑玩家的喜爱,做一个简单的贪吃蛇小游戏。 贪吃蛇的核心算法是如何实现移动和吃掉食物,在没有碰到食物的时候,把当前运动方向上的下个节

相关文档