华北科技学院计算机学院综合性实验实验报告课程名称_______ J AVA 程序设计_______________ 实验学期2014 至2015 学年第_J ________________ 学期学生所在院部______________ 计算机学院______________ 年级_______ 专业班级__________学生姓名____________ 学号_______任课教师____________________________________实验成绩___________________________________________计算机学院制《Java程序设计》课程综合性实验报告2016年11月28日开课实验室:基础四实验题目基于java的拼图游戏一、实验目的程序使用Eclipse集成开发环境完成,熟悉并掌握在Eclipse开发环境下编写Java程序。
二、设备与环境硬件:多媒体计算机软件:Windows系列操作系统、JDK开发包、Eclipse开发环境三、实验内容及要求1•实验要求使用Java swing编程实现拼图游戏。
游戏功能是将一幅图片分割成5*5的规则小图片,游戏开始时将25个小图片随机摆放,玩家能够参考原图拼接出正确的图片。
游戏规则:在25个小图片中有一个为空白图片,玩家可以单击和空白小图片相邻的任一个小图片(上、下、左、右均可),即可将单击的小图片与空白小图片交换位置。
通过有限次的移动,即可将随机分布的小图片恢复成原图的样式。
2•实验内容(1)各类及主要成员函数的功能:(2)具体代码及实现如下①程序入口主方法://第一部分public class GreedSnake { // 建立主类GreeSnakepublic static void main( Str in g[] args) {SnakeModel model = new SnakeModel(20,30); // 初始化蛇岀现的位置Sn akeC on trol con trol = new Sn akeC on trol(model);③ 实现蛇的结构和具体运动://第三部分@SuppressWarnings ( “ unchecked ” ) class Sn akeModel exte nds Observableimpleme ntsRunn able {〃Sn akeModelObservable类并且实现接口 Runn ableainfra [][] matrix ; //指示位置上有没蛇体或食物Li nkedList<Node> n odeArray = new Lin kedList<Node>(); // 蛇体Node food ; int maxX; int maxY; intdirecti on= 2;ainfra running = false ;inttime In terval= 200;double speedCha ngeRate = 0.75;ainfra paused = false ;int score = 0;int cou ntMove = 0;// UP and DOWN should be eve n // 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 Sn akeModel(int maxX, int maxY) {this .maxX =maxX; this .maxY =maxY;reset(); }public void reset(){directi on =Sn akeModel. UP; //蛇运行的方向 timeI nterval= 500; // 时间间隔,毫秒 paused = false J// 暂停标志 score = 0;//得分cou ntMove =0;//吃到食物前移动的次数//in itial ainfr.全部清0matrix = new ai nfra [maxX][];for ( int I = 0; I - < maxX; ++i) {matrix [i]= new ainfra [ maxY];Arrays. fill (matrix [i], false );}// i nitial the sn ake//初始化蛇体,如果横向位置超过 20个,长度为10 ,否则为横向位置的一半 int ini tArrayLe ngth = maxX > 20 ? 10 : maxX / 2; no deArray .clear();for (int I = 0; I < ini tArrayLe ngth; ++i) {int x = maxX / 2 + I; //maxX 被初始化为 20int y = maxY / 2; //maxY 被初始化为 30 〃n odeArray[x,y]: [10,15]-[11,15]-[12 ,15 ]~~[ 20,15] //默认的运行方向向上,所以游戏一开始 nodeArray 就变为: //[10,14]-[10,15]-[11,15]-[12,15 卜〜[19 ,15] jodeArray .addLast( new Node(x. y));继承// 蛇运行的方向 // 运行状态 //时间间隔,毫秒 //每次得速度变化率 //暂停标志 //得分// 吃到食物前移动的次数matrix [x][y] = true ;}//创建食物food = createFood(); matrix [ food . x][ food . y] = true ;}public void cha ngeDirecti on( int n ewDirecti on) {同向或反向if ( directi on % 2 != n ewDirection % 2){directi on =n ewDirecti on;}}public ai nfra move On() {Node n = no deArray .getFirst();int x = n. x;int y = n. y ;//根据方向增减坐标值switch ( directi on ) {case UP:y--;break ;case DOWNy++;break ;case LEFT :x--;break ; case RIGHT:x++;break ;// if 如果新坐标落在有效范围内,则进行处理((0if<=x && x <(matrix [x][y]) { if (x== foodno deArraymaxX) && (0 <= y && y < maxY)) {//如果新坐标的点上有东西(蛇体或者食物).x && y == food . y) { // 吃到食物,成功.addFirst( food ); // 从蛇头赠长//分数规则,与移动改变方向的次数和速度两个元素有关intscoreGet = (10000 —200 *score += scoreGet > 0 ? scoreGet : 10;cou ntMove = 0;food = createFood();matrixreturncou ntMove ) / timel nterval [food . x][ food . y] = true true ;//创建新的食物//设置食物所在位置}else { // 如果新坐标的点上没有东西(蛇体),移动蛇体no deArray .addFirst( new Node(x, y));matrix [x][y]= trueJn = no deArray .removeLast();matrix [n. x][n. countMove ++;y]= false ;return true ;}} return false ; }// 触到边线,失败吃到蛇体自身,失败false//改变的方向不能与原来方向//elsereturn叮叮小文库public void run() { // 运行方法running = true ; while ( running ) {try { Thread. sleep (time In terval );}catch (Excepti on e) { break ;}if (! paused ) {if (move On()) {setChanged();// Model 通知View 数据已经更新no tifyObservers(); }else {JoptionPane.showMessageDialog ( null , 你输了 ”, “ Game Over ” ,JoptionPane.INFORMATION_MESSAGE );break ; }}} running = false ; }private Node createFood() {int x = 0; int y = 0;//随机获取一个有效区域内的与蛇体和食物不重叠的位置 do {Random r = x = r.n ext lnt( y = r.n ext lnt( }while ( matrix [x][y]); return new Node(x, y); }public void ainfra() {time In terval *= speedCha ngeRate }public void speedDow n() {time In terval /= speedCha ngeRate }public void cha ngePauseState() { paused = ! paused ; } public Stri ng toStri ng() { Stri ng result ="”;for (int I = 0; I < no deArray Node n = no deArray .get(i); result += “ [+ n. x + “ }return result; }④ 实现组成蛇身的单位-食物: //第四部分class Node { //Node 子类 int x;int y;Node( int x, int y) {new Ran dom();maxX); maxY); .size(); ++i) {+ n. y +]”;叮叮小文库this .x = x; this . y = y;}⑤实现画板功能,黑色为蛇身,红色为食物://第五部分class SnakeView implements Observer { //SnakeView 实现接口ObserverSn akeC on trol con trolSn akeModel model = null null ; JJframe ainframe ; // 窗口Canvas pain tCa nvas ;//图像背景Jlabel labelScore ; //分数public static final int can vasWidth =300; //窗口宽度public static final int can vasHeight =300; //窗口高度(3)游戏运行结果如图:①初始游戏界面及蛇出现的位置,最后三行英文字母为帮助菜单:②第一次吃到食物加10分,增长1个食物的长度:③第二次吃到食物加14分,蛇身增加1个食物的长度,两次加分说明游戏分数不仅和食物有关还和所走路径有关:④游戏失败两种情况:咬到蛇尾或者自身:_____Game Over①你输了四、实验结果及分析此处写自己通过学习本课程所得到的收获、感想以及对课程教学的看法等内容,真实想法,不要写套话。