JAVA开放性实验报告贪吃蛇.docx

上传人:b****4 文档编号:6344693 上传时间:2023-05-09 格式:DOCX 页数:21 大小:48.67KB
下载 相关 举报
JAVA开放性实验报告贪吃蛇.docx_第1页
第1页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第2页
第2页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第3页
第3页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第4页
第4页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第5页
第5页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第6页
第6页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第7页
第7页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第8页
第8页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第9页
第9页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第10页
第10页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第11页
第11页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第12页
第12页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第13页
第13页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第14页
第14页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第15页
第15页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第16页
第16页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第17页
第17页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第18页
第18页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第19页
第19页 / 共21页
JAVA开放性实验报告贪吃蛇.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

JAVA开放性实验报告贪吃蛇.docx

《JAVA开放性实验报告贪吃蛇.docx》由会员分享,可在线阅读,更多相关《JAVA开放性实验报告贪吃蛇.docx(21页珍藏版)》请在冰点文库上搜索。

JAVA开放性实验报告贪吃蛇.docx

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类进行实现各个功能,在编写的过程中对一些部分不是很了解,对一些知识掌握不是很透彻,在今后的学习中应多看书,多思考

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2