JAVA开放性实验报告贪吃蛇.docx
- 文档编号:11472592
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:21
- 大小:48.67KB
JAVA开放性实验报告贪吃蛇.docx
《JAVA开放性实验报告贪吃蛇.docx》由会员分享,可在线阅读,更多相关《JAVA开放性实验报告贪吃蛇.docx(21页珍藏版)》请在冰豆网上搜索。
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&& x
&&!
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 LinkedList
ﻩreturngetWorm();
ﻩ}
ﻩpublicStringtoString(){
returngetWorm().toString();//输出蛇
}
public LinkedList
returnworm;
ﻩ}
ﻩpublic voidsetWorm(LinkedList
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
ﻩSet
ﻩﻩ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类进行实现各个功能,在编写的过程中对一些部分不是很了解,对一些知识掌握不是很透彻,在今后的学习中应多看书,多思考
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- JAVA 开放性 实验 报告 贪吃
![提示](https://static.bdocx.com/images/bang_tan.gif)