JAVA开放性实验报告贪吃蛇.docx
《JAVA开放性实验报告贪吃蛇.docx》由会员分享,可在线阅读,更多相关《JAVA开放性实验报告贪吃蛇.docx(21页珍藏版)》请在冰点文库上搜索。
![JAVA开放性实验报告贪吃蛇.docx](https://file1.bingdoc.com/fileroot1/2023-5/9/fe040eb3-7bdc-4aca-be6e-9274b262ea1f/fe040eb3-7bdc-4aca-be6e-9274b262ea1f1.gif)
JAVA开放性实验报告贪吃蛇
JAVA程序设计
开放性实验报告
专 业:
计算机科学与技术
班级:
2012级2班
学 号:
姓 名:
实验2贪吃蛇游戏设计(4学时)
1.实验内容
(1)创建软件主窗体和相关控制菜单;在窗体中以图形模拟蛇的形状,使用键盘控制图形在窗体中任意移动,模拟贪吃蛇的行为.
(2)在窗体中可以设置障碍或奖励物品,以达到游戏的娱乐性。
2.预习内容
JavaGUI编程;鼠标和键盘的事件处理;Java多媒体编程。
3.实验类型
综合性
4.实验目的
(1)了解JavaGUI编程特别是窗体,菜单;熟悉Java的事件委托处理机制,能完成鼠标和键盘的事件处理;
(2)熟悉Java中的多媒体技术如:
音频文件的播放控制,游戏中各种事件的音效添加。
熟悉Java中的绘图操作,可以使用绘图函数进行图形的绘制和重绘等基本操作;
(3)熟悉模块的划分及游戏控制类的编写,了解相关的游戏设计和实现模式;
(4)设计可视化界面,添加其他必要组件,对窗体进行相应的键盘事件处理,使蛇能移动,依据实验内容结合自己的设计想法,实现模拟贪吃蛇的游戏效果。
5.实验要求
依据实验内容,编写相关类,实现所需软件功能。
6.实验过程(分析设计、源文件、执行结果)
代码如下:
1、Node类
public class Node {
privateint x;
ﻩprivateint y;
publicNode(){
ﻩ
ﻩ}
public Node(intx,inty){
ﻩthis.x=x;
ﻩﻩthis.y=y;
ﻩ}
ﻩpublic int getX(){
returnx;
}
ﻩpublic voidsetX(intx){
ﻩﻩthis.x=x;
ﻩ}
ﻩpublic intgetY(){
ﻩreturny;
}
public void setY(int y){
ﻩﻩthis.y=y;
ﻩ}
ﻩpublicStringtoString(){//方便类型转换
ﻩﻩ//括号里不是String类型通过toString来转换,不然会输出一个地址
ﻩreturn"("+x+","+y+")";
ﻩ}
@Override
//伪代码可以理解为注释,重写:
下面的方法名是否在父类中存在,如果没有
ﻩ//的话会报错。
ﻩ//
ﻩpublicinthashCode(){//假设Node是list集合里面,只有把Node节点对象
//放在set集合时候写hashCode();
finalintprime=31;
ﻩintresult=1;
ﻩresult=prime*result+x;
result=prime*result+y;
returnresult;
ﻩﻩ
}
ﻩ@Override
//比较Node对象是否在同一坐标都要写上equals方法
public boolean equals(Objectobj){
ﻩﻩif(this==obj){
ﻩﻩreturntrue;
ﻩﻩ}
if(this==null){
ﻩreturnfalse;
ﻩ}
ﻩif(getClass()!
=obj.getClass())
ﻩﻩreturnfalse;
ﻩNode other=(Node)obj;
ﻩif(x!
=other.x){
ﻩﻩreturnfalse;
}
ﻩif(y!
=other.y){
ﻩﻩreturnfalse;
}
returntrue;
ﻩ
ﻩ}
}
2、Worm类
importjava.util.LinkedList;
publicclassWorm{
privateLinkedList<Node>worm=new LinkedList<Node>();
int dir;
publicstaticfinalint UP=-1;
ﻩpublicstaticfinalintDOWN=1;
publicstaticfinalintLEFT=-10;
public static finalintRIGHT = 10;
publicstaticfinal intROWS= 400;//ROWS行。
宽度范围,
publicstaticfinalint COLS =500;//COLS列。
长度范围
ﻩpublic Worm(){
getWorm().add(new Node(90, 90));//第90行90列,蛇扩大10倍
ﻩﻩgetWorm().add(newNode(80,90));
ﻩgetWorm().add(newNode(70, 90));
ﻩgetWorm().add(newNode(60,90));
ﻩgetWorm().add(newNode(50,90));
ﻩdir= RIGHT;
}
publicvoidstep(){//走一步
Nodehead=getWorm().get(0);// 找到头节点
intx =head.getX() +dir/10*10;//X,Y横坐标与纵坐标
ﻩint y =head.getY()+dir%10*10;
ﻩif(x > 0&& x0&&y< Worm.ROWS -30
&&!
getWorm().contains(newNode(x, y))) {//!
getWorm().contains(newNode(x,y))是否落到蛇身上
ﻩgetWorm().addFirst(newNode(x,y));
ﻩﻩgetWorm().removeLast();//删除
ﻩﻩ} else {
ﻩﻩdir=100;
ﻩﻩthrownewRuntimeException("你错了!
");
ﻩ}
ﻩ}
publicvoid step(intdir){//控制蛇走的方向
ﻩﻩthis.dir= dir;
ﻩstep();
}
public LinkedListgetLinkedListWorm(){
ﻩreturngetWorm();
ﻩ}
ﻩpublicStringtoString(){
returngetWorm().toString();//输出蛇
}
public LinkedListgetWorm() {
returnworm;
ﻩ}
ﻩpublic voidsetWorm(LinkedList worm){
this.worm=worm;
}
}
3、WormDemo类
importjava.awt.Cursor;
import java.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
import javax.swing.JFrame;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
publicclassWormDemoextendsJFrame{//
privateWormpanelpanel;
ﻩprivatestaticintdir;
ﻩpublicWormDemo(){
ﻩpanel=newWormpanel();//形成蛇的界面
ﻩadd(panel);//将蛇面板放到游戏里面去
ﻩsetTitle("贪吃蛇");//题目
ﻩsetSize(500+15,400+35);//大小
ﻩsetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口就是关闭程序
setCursor(newCursor(12));//定义鼠标属性
setVisible(true);//可视化为true
ﻩpanel.requestFocus();//面板后区信息焦点
ﻩsetLocationRelativeTo(null);//设置窗口组建定义的位置
this.setResizable(false);
ﻩ}
publicstaticvoidmain(String[] args){
finalWormDemowd=newWormDemo();//new一个自己创建的一个属性游戏窗口
ﻩ//设置一个监听
ﻩﻩJMenuBar jmb=newJMenuBar();//导包,然后设置
ﻩﻩwd.setJMenuBar(jmb);//往自己new的窗口加上监听
ﻩﻩJMenufm=new JMenu("选项");
ﻩﻩjmb.add(fm);
ﻩJMenuItemmi=newJMenuItem("重新再来");//
ﻩmi.addActionListener(newActionListener(){
ﻩﻩﻩpublicvoid actionPerformed(ActionEvente){
ﻩwd.panel.setWorm(newWorm());
ﻩﻩwd.panel.setN(10);
ﻩwd.panel.setFoods(wd.panel.initFoods(wd.panel.n));
wd.panel.setT(1000);
ﻩﻩwd.panel.repaint();//重新画
ﻩwd.repaint();
ﻩﻩ}
ﻩﻩﻩ
ﻩ});
ﻩfm.add(mi);
ﻩJMenuItemmi2=newJMenuItem("暂停");
ﻩﻩmi2.addActionListener(new ActionListener(){
ﻩpublic void actionPerformed(ActionEvente){
ﻩdir=wd.panel.getWorm().dir;
ﻩwd.panel.getWorm().dir=-100;
ﻩﻩ}
ﻩﻩ});
fm.add(mi2);
ﻩJMenuItemmi3=newJMenuItem("开始");
ﻩmi3.addActionListener(newActionListener(){
ﻩpublic void actionPerformed(ActionEvente){
ﻩ//dir=wd.panel.getWorm().dir;
ﻩﻩﻩwd.panel.getWorm().dir=dir;
ﻩ}
});
ﻩfm.add(mi3);
ﻩ
ﻩﻩ
}
}
4、Wormpanel类
importjava.awt.Color;
importjava.awt.Font;
importjava.awt.Graphics;
importjava.awt.event.KeyAdapter;
importjava.awt.event.KeyEvent;
importjava.awt.image.BufferedImage;
import java.io.IOException;
importjava.util.HashSet;
import java.util.Iterator;
importjava.util.Random;
importjava.util.Set;
importjavax.imageio.ImageIO;
import javax.swing.JPanel;
//JPanel
publicclass WormpanelextendsJPanel{//蛇的面板上有蛇,食物
privatestaticfinalString TOOL_TIP_TEXT_KEY_ERROR=null;
ﻩprivate Wormworm;
privateMoveListenerlistener=newMoveListener();//监听器
privateSet();//设置食物
publicintn=10;//个数
publicintt=1000;//时间
publicintgetN(){
ﻩreturnn;
}
public voidsetN(int n){
ﻩthis.n=n;
}
publicintgetT(){
ﻩreturnt;
}
publicvoidsetT(int t){
this.t=t;
}
publicvoid setFoods(Set<Node>foods){
this.foods=foods;
}
private Servicese=new Service();
public Wormpanel(){
setWorm(newWorm());//生成一条蛇
ﻩfoods=initFoods(n);//生成食物
addKeyListener(listener);//加上监听器,监听键盘
ﻩse.start();//启动线程
}
ﻩpublicSet initFoods(intn){
ﻩSetfoods=newHashSet();//食物也是
ﻩﻩRandomrandom=newRandom();
ﻩﻩfor(;;){
ﻩint x=random.nextInt(480)/10*10+10;
ﻩinty=random.nextInt(360)%10*10+10;
ﻩﻩﻩif(getWorm().getLinkedListWorm().contains(newNode(x,y))){//检查食物是否在蛇上
ﻩﻩcontinue;
ﻩ}
ﻩﻩfoods.add(newNode(x,y));
if(foods.size()==n){
ﻩﻩﻩbreak;
}
ﻩ
ﻩ}returnfoods;
}
ﻩ//加入背景图片
public staticBufferedImage image;
publicstatic BufferedImagegetImage(){
ﻩreturn image;
ﻩ}
publicstaticvoidsetImage(BufferedImageimage){
ﻩWormpanel.image=image;
}
//制作面板,形成面板的形式
ﻩpublic voidpaint(Graphicsg){
ﻩsuper.paint(g);
ﻩﻩthis.requestFocus();//设置接收信息
//this.setBackground(Color.blue);//背景色
try{
ﻩg.drawImage(ImageIO.read(Wormpanel.class.getResource("yy.jpg")), 0,0,null);
ﻩ}catch(IOExceptione){
ﻩﻩe.printStackTrace();
ﻩ}
ﻩﻩg.setColor(Color.gray);//画笔色
ﻩg.fill3DRect(0,0,502,10,false);
ﻩg.fill3DRect(500, 0,11,385, false);
g.fill3DRect(0,375,520,10,false);
ﻩg.fill3DRect(0,0,10,502,false);
for(inti=0;iﻩg.setColor(Color.cyan);//蓝绿色
g.fill3DRect(getWorm().getLinkedListWorm().get(i).getX(),
ﻩﻩﻩgetWorm().getLinkedListWorm().get(i).getY(),10,10,false);//虫子的一节
ﻩ}
if(foods.size()==0){
ﻩfoods=initFoods(++n);
ﻩt=t-200;
ﻩﻩ}
ﻩIteratorﻩﻩg.setColor(Color.GREEN);
ﻩwhile(food.hasNext()){
ﻩﻩﻩNodef=food.next();
ﻩﻩg.fill3DRect(f.getX(),f.getY(),10,10, false);
ﻩ}
ﻩﻩ
ﻩ}
ﻩ//画结束界面
ﻩpublic voidpaintEnd(Graphicsg){
ﻩﻩg.setColor(Color.red);//设置画笔颜色
ﻩg.setFont(newFont(TOOL_TIP_TEXT_KEY,ERROR,30));
ﻩg.clearRect(0,150,550,100);
ﻩg.setColor(Color.black);
ﻩg.fill3DRect(0,150,550, 100,false);
ﻩg.clearRect(150, 180,200, 40);
ﻩﻩg.setColor(Color.red);
ﻩg.drawString("youdie!
",150,200);
ﻩService.interrupted();//跳出线程
}
ﻩpublicWormgetWorm() {
ﻩreturnworm;
}
publicvoidsetWorm(Wormworm){
ﻩthis.worm=worm;
ﻩ}
ﻩclassMoveListenerextendsKeyAdapter{
ﻩintdir;//设置键盘监听器
ﻩ
ﻩﻩpublicvoidkeyPressed(KeyEvente){
ﻩﻩSystem.out.println("您按下的是:
"+e.getKeyChar());
ﻩswitch(e.getKeyCode()){
ﻩﻩﻩcaseKeyEvent.VK_UP:
ﻩﻩdir=Worm.UP;
ﻩbreak;
ﻩﻩﻩcase KeyEvent.VK_DOWN:
ﻩﻩdir=Worm.DOWN;
ﻩﻩﻩbreak;
ﻩcaseKeyEvent.VK_LEFT:
ﻩﻩdir=Worm.LEFT;
ﻩﻩﻩbreak;
ﻩcaseKeyEvent.VK_RIGHT:
ﻩﻩdir=Worm.RIGHT;
ﻩbreak;
ﻩﻩ}
ﻩﻩSystem.out.println(getWorm());
System.out.println("dir="+dir+",worm.dir="+getWorm());
ﻩstep(dir,getWorm());
ﻩﻩ}
ﻩ
}
class Service extendsThread{
publicvoidrun(){
try{
for(;;){
ﻩThread.sleep(t);
ﻩstep(getWorm().dir,getWorm());
ﻩﻩ}
ﻩ}catch(Exceptione){
ﻩﻩﻩe.printStackTrace();
ﻩ}
}
ﻩ}
publicvoid step(intdir,Wormworm){
ﻩif(dir+worm.dir==0){
ﻩpaintEnd(Wormpanel.this.getGraphics());
ﻩworm.dir=100;
ﻩreturn;
ﻩﻩ}
ﻩelse{
if(worm.dir==100){
ﻩpaintEnd(Wormpanel.this.getGraphics());
ﻩﻩreturn;
ﻩ}
ﻩif(worm.dir==-100){
return;
}
ﻩﻩNodehead=worm.getLinkedListWorm().get(0);
intx=head.getX()+dir/10*10;
ﻩint y=head.getY()+dir%10*10;
Node n=newNode(x,y);
if(foods.contains(n)&&!
worm.getLinkedListWorm().contains(n)){
ﻩﻩﻩfoods.remove(n);
worm.getLinkedListWorm().addFirst(n);
ﻩﻩﻩworm.dir=dir;
ﻩ
ﻩ}else{
ﻩtry{
ﻩﻩworm.step(dir);
ﻩ
ﻩﻩ}catch(Exceptione){
ﻩpaintEnd(Wormpanel.this.getGraphics());
ﻩﻩreturn;
ﻩ}
ﻩﻩ}
ﻩ}Wormpanel.this.repaint();
}
}
执行结果:
(1)游戏开始
(2)菜单栏
(3)结束
7.实验总结
在这次试验中主要是对Java中的知识进一步的熟悉,了解javaCUI编程特别是窗口、菜单,熟悉Java的事件委托处理机制,完成鼠标和键盘的事件处理,在编写游戏中要把游戏划分为几个模块,以及运用多个类完成,了解相关的游戏设计和实现模式,在编写过程中还要设计可视化界面,添加其他必要组件,对窗体进行相应的键盘事件处理,使蛇能移动,在这次试验中用到了Node类、Worm类、WormDemo类、WormPanel类进行实现各个功能,在编写的过程中对一些部分不是很了解,对一些知识掌握不是很透彻,在今后的学习中应多看书,多思考