当前位置:文档之家› java小游戏设计.docx

java小游戏设计.docx

文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.华北科技学院计算机学院综合性实验实验报告课程名称JAVA程序设计实验学期2014至2015学年第1学期学生所在院部计算机学院年级专业班级学生姓名学号任课教师实验成绩计算机学院制《 Java 程序设计》课程综合性实验报告开课实验室:基础四2016年 11 月 28日实验题目基于 java 的拼图游戏一、实验目的程序使用Eclipse 集成开发环境完成,熟悉并掌握在Eclipse 开发环境下编写Java 程序。

二、设备与环境硬件:多媒体计算机软件: Windows 系列操作系统、JDK 开发包、 Eclipse 开发环境三、实验内容及要求1.实验要求使用 Java swing 编程实现拼图游戏。

游戏功能是将一幅图片分割成5*5 的规则小图片,游戏开始时将25 个小图片随机摆放,玩家能够参考原图拼接出正确的图片。

游戏规则:在 25 个小图片中有一个为空白图片,玩家可以单击和空白小图片相邻的任一个小图片(上、下、左、右均可),即可将单击的小图片与空白小图片交换位置。

通过有限次的移动,即可将随机分布的小图片恢复成原图的样式。

2.实验内容( 1)java 源代码及其功能及主员函序号类名主要功能功1GreedSnake该类为程序入口,含有main 方法。

( 2)2SnakeControl实现控制运行等总体要求,实现方向键控制蛇的方向,空格键控制游戏暂停或继续,还有分数等。

代码该类实现蛇的结构和具体运动,如判断食物是否和3SnakeModel现如怎样被吃掉及判断后的动作。

① 程4Node该类实现组成蛇身的单位- 食物。

口主5SnakeView该类实现画板功能,用黑色画蛇身,红色画食物。

法://第一部分public class GreedSnake {//建立主类GreeSnakepublic static void main(String[] args) {SnakeModel model =new SnakeModel(20,30);//初始化蛇出现的位置SnakeControl control =new SnakeControl(model);SnakeView view =new SnakeView(model,control);//添加一个观察者,让 view 成为 model 的观察者model.addObserver(view);(new Thread(model)).start();}各类要成数的能:具体及实下:序入方}②实现对蛇身的控制要求://第二部分//游戏的 Model 类,负责所有游戏相关数据及运行class SnakeControl implements KeyListener{//SnakeControl实现接口KeyListener,键盘监听SnakeModel model;public SnakeControl(SnakeModel model){this. model= model;}public void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();if(model . running){//运行状态下,处理的按键switch(keyCode) {case KeyEvent.VK_UP :model.changeDirection(SnakeModel.UP);break;case KeyEvent.VK_DOWN:model.changeDirection(SnakeModel.DOWN);break;case KeyEvent.VK_LEFT :model.changeDirection(SnakeModel.LEFT );break;case KeyEvent.VK_RIGHT :model.changeDirection(SnakeModel.RIGHT );break;case KeyEvent.VK_ADD :case KeyEvent.model.speedUp();break;case KeyEvent.VK_SUBTRACT :case KeyEvent.model.speedDown();break;case KeyEvent.VK_SPACE :case KeyEvent.VK_P :model.changePauseState();// 暂停进入睡眠状态break;default:}}//任何情况下处理的按键,按键导致重新启动游戏if(keyCode == KeyEvent.VK_R ||keyCode == KeyEvent.VK_S ||keyCode == KeyEvent.VK_ENTER ) {model.reset();}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}}③实现蛇的结构和具体运动://第三部分@SuppressWarnings( “ unchecked ” )class SnakeModel extends Observable implements Runnable {//SnakeModel继承Observable类并且实现接口Runnable文档来源为 :从网络收集整理 .word版本可编辑 .欢迎下载支持 .ainfra[][]matrix;//指示位置上有没蛇体或食物LinkedList<Node>nodeArray=new LinkedList<Node>();// 蛇体Node food;int maxX ;int maxY ;int direction= 2;//蛇运行的方向ainfra running=false;//运行状态int timeInterval= 200;//时间间隔,毫秒doublespeedChangeRate= 0.75;// 每次得速度变化率ainfra paused=false;//暂停标志int score= 0;//得分int countMove= 0;//吃到食物前移动的次数//UP and DOWN should be even//RIGHT and LEFT should be oddpublic static final int UP=2;public static final int DOWN= 4;public static final int LEFT = 1;public static final int RIGHT = 3;public SnakeModel(int maxX,int maxY) {this. maxX = maxX;this. maxY = maxY;reset();}public void reset(){direction= SnakeModel.UP;// 蛇运行的方向timeInterval= 500;//时间间隔,毫秒paused=false;//暂停标志score= 0;//得分countMove= 0;//吃到食物前移动的次数// initial ainfr,全部清 0matrix=new ainfra[ maxX ][];for(int I=0;I<maxX ; ++i) {matrix[i] =new ainfra[ maxY ];Arrays.fill( matrix[i],false );}//initial the snake//初始化蛇体,如果横向位置超过20 个,长度为 10 ,否则为横向位置的一半int initArrayLength =maxX > 20 ? 10 :maxX / 2;nodeArray.clear();for( int I = 0; I < initArrayLength; ++i) {int x =maxX / 2 + I;//maxX被初始化为 20int y =maxY / 2;//maxY 被初始化为 30//nodeArray[x,y]: [10,15]-[11,15]-[12, 15]~~[20,15]// 默认的运行方向向上,所以游戏一开始nodeArray 就变为://[10, 14]-[10, 15]-[11, 15]-[12, 15]~~[19, 15]nodeArray.addLast(new Node(x, y));matrix [x][y] =true;}//创建食物food = createFood();matrix [ food . x ][ food . y ] =true ;}public void changeDirection(int newDirection) {//改变的方向不能与原来方向同向或反向if ( direction% 2 != newDirection % 2) {direction= newDirection;}}public ainfra moveOn() {Node n =nodeArray.getFirst();文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.int x = n.x ;int y = n.y ;//根据方向增减坐标值switch( direction) {case UP:y--;break ;case DOWN:y++;break ;case LEFT :x--;break ;case RIGHT :x++;break ;}//如果新坐标落在有效范围内,则进行处理if ((0 <= x && x <maxX ) && (0 <= y && y <maxY )) {if ( matrix [x][y]) {//如果新坐标的点上有东西(蛇体或者食物)if (x ==food . x && y ==food . y ) {//吃到食物,成功nodeArray.addFirst(food );//从蛇头赠长//分数规则,与移动改变方向的次数和速度两个元素有关int scoreGet = (10000–200 *countMove ) /timeInterval;score += scoreGet > 0 ? scoreGet : 10;countMove= 0;food = createFood();//创建新的食物matrix [ food . x ][ food . y ] =true ;//设置食物所在位置return true ;}else//吃到蛇体自身,失败return false ;}else {//如果新坐标的点上没有东西(蛇体),移动蛇体nodeArray.addFirst(new Node(x, y));matrix [x][y] =true ;n =nodeArray.removeLast();matrix [n. x ][n. y ] =false ;countMove ++;return true ;}}return false;//触到边线,失败}public void run() {//运行方法running=true;while(running) {try{Thread.sleep( timeInterval);}catch(Exception e) {break;}if(!paused) {if(moveOn()) {setChanged();// Model通知 View数据已经更新notifyObservers();}else{JoptionPane.showMessageDialog( null,“你输了”,“ Game Over” ,文档来源为 :从网络收集整理 .word 版本可编辑 .欢迎下载支持 .RMATION_MESSAGE );break;}}}running = false;}private Node createFood() {int x = 0;int y = 0;//随机获取一个有效区域内的与蛇体和食物不重叠的位置do {Random r =new Random();x = r.nextInt(maxX );y = r.nextInt(maxY );}while ( matrix[x][y]);return new Node(x, y);}public void ainfra() {timeInterval*= speedChangeRate;}public void speedDown() {timeInterval/=speedChangeRate;}public void changePauseState() {paused = ! paused ;}public String toString() {String result =“”;for ( int I = 0; I <nodeArray.size(); ++i) {Node n =nodeArray.get(i);result +=“ [“+ n.x +“ ,”+ n.y +“ ]”;}return result;}}④实现组成蛇身的单位- 食物://第四部分class Node {//Node子类int x ;int y ;Node( int x,int y) {this . x = x;this . y = y;}}⑤实现画板功能,黑色为蛇身,红色为食物:// 第五部分class SnakeView implements Observer {//SnakeView实现接口 ObserverSnakeControl control=null ;SnakeModel model=null;Jframe ainframe; //窗口Canvas paintCanvas; //图像背景Jlabel labelScore; //分数public static final int canvasWidth= 300;//窗口宽度public static final int canvasHeight= 300;//窗口高度}文档来源为 :从网络收集整理.word 版本可编辑 .欢迎下载支持.( 3)游戏运行结果如图:① 初始游戏界面及蛇出现的位置,最后三行英文字母为帮助菜单:②第一次吃到食物加10 分,增长 1 个食物的长度:③第二次吃到食物加14 分,蛇身增加 1 个食物的长度,两次加分说明游戏分数不仅和食物有关还和所走路径有关:④ 游戏失败两种情况:咬到蛇尾或者自身:四、实验结果及分析此处写自己通过学习本课程所得到的收获、感想以及对课程教学的看法等内容,要写自己的真实想法,不要写套话。

相关主题