1、2024/3/21科尔沁艺术职业学院毕业设计科尔沁艺术职业学院毕业设计 俄罗斯方块俄罗斯方块2024/3/22项目介绍项目介绍 设计目的设计目的主要培养使用主要培养使用Java语言进行语言进行GUI设计、图形设计、图形编程、多线程程序的开发、算法的实现思路编程、多线程程序的开发、算法的实现思路 2024/3/23基本要求基本要求 Java语言的基本语法;语言的基本语法;Java语言的面向对象概念;语言的面向对象概念;Java语言中的图形化界面设计(语言中的图形化界面设计(AWT、Swing););Java语言中的事件委托机制;语言中的事件委托机制;Java语言中的异常处理机制;语言中的异常处理
2、机制;Java语言中的集合框架;语言中的集合框架;2024/3/24功能模块功能模块图形化用户界面图形化用户界面(GUI)产生、绘制方块产生、绘制方块控制方块移动、旋转控制方块移动、旋转方块自动下落方块自动下落方块消除方块消除计分、排行榜计分、排行榜2024/3/25开发工具开发工具Eclipse的介绍、使用的介绍、使用项目的创建、应用程序的创建、类的创建项目的创建、应用程序的创建、类的创建GUI的设计的设计快捷键的使用快捷键的使用程序的编译、运行和调试程序的编译、运行和调试 2024/3/26界面实现界面实现 使用使用Eclipse编写一个图形化的用户界面,要编写一个图形化的用户界面,要求使
3、用所介绍到的图形组件,并进行合理布求使用所介绍到的图形组件,并进行合理布局局 2024/3/27界面实现界面实现2024/3/28图形、图像绘制图形、图像绘制AWT与与Swing在绘制图形、图像上的不同在绘制图形、图像上的不同 AWT绘图顺序:绘图顺序:repaint()update()paint()update()方法用于清除绘制区域方法用于清除绘制区域Swing绘图顺序:绘图顺序:repaint()paint()2024/3/29Java多线程程序设计多线程程序设计线程的概念:线程的概念:进程中单一而连续的控制流程进程中单一而连续的控制流程程序线程 1线程 2线程 3线程:单独的执行路径线
4、程:单独的执行路径2024/3/210Java多线程多线程多线程的优点多线程的优点线程所需的开销更少线程所需的开销更少在多任务中,各个进程需要分配它们自己独立的地址在多任务中,各个进程需要分配它们自己独立的地址空间空间多个线程可共享相同的地址空间并且共同分享同一个多个线程可共享相同的地址空间并且共同分享同一个进程进程进程间调用涉及的开销比线程间通信多进程间调用涉及的开销比线程间通信多线程间的切换成本比进程间切换成本低线程间的切换成本比进程间切换成本低2024/3/211Java多线程多线程线程的运行线程的运行使用使用 start()方法,如:方法,如:MyThread t=new MyThre
5、ad();t.start();在调用在调用 start()方法时,将创建一个新的控制线程,方法时,将创建一个新的控制线程,接着它将调用接着它将调用 run()方法。方法。run()方法中的代码定义执行线程所需的功能。方法中的代码定义执行线程所需的功能。2024/3/212Java多线程多线程线程的同步问题线程的同步问题有时两个或多个线程可能会试图同时访问一个资有时两个或多个线程可能会试图同时访问一个资源,源,例如,一个线程可能尝试从一个文件中读取例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数数据,而另一个线程则尝试在同一文件中修改数据据在此情况下,数据可能会变
6、得不一致在此情况下,数据可能会变得不一致为了确保在任何时间点一个共享的资源只被一个为了确保在任何时间点一个共享的资源只被一个线程使用,使用了线程使用,使用了“同步同步”2024/3/213Java多线程多线程wait-notify 机制机制 Java提供的一个精心设计的线程间通信机制,使提供的一个精心设计的线程间通信机制,使用用wait()、notify()和和notifyAll()方法;方法;这些方法是作为这些方法是作为 Object 类中的类中的 final 方法实现的,方法实现的,仅在仅在 synchronized 方法中才能被调用;方法中才能被调用;2024/3/214Java多线程多
7、线程wait-notify 机制机制 Java提供的一个精心设计的线程间通信机制,使提供的一个精心设计的线程间通信机制,使用用wait()、notify()和和notifyAll()方法;方法;这些方法是作为这些方法是作为 Object 类中的类中的 final 方法实现的,方法实现的,仅在仅在 synchronized 方法中才能被调用;方法中才能被调用;2024/3/215俄罗斯方块的构成:一共俄罗斯方块的构成:一共7种图形,每种图形种图形,每种图形由四个方块组成由四个方块组成田字型田字型一字型一字型土字型土字型正反正反L型型正反正反Z型型算法讲解算法讲解2024/3/216算法讲解算法讲
8、解Block类的定义类的定义class Blockpublic final static int pattern=0 x0f00,0 x4444,0 x0f00,0 x4444,/用十六进至用十六进至表示,本行表示长条四种状态表示,本行表示长条四种状态 0 x04e0,0 x0464,0 x00e4,0 x04c4,0 x4620,0 x6c00,0 x4620,0 x6c00,0 x2640,0 xc600,0 x2640,0 xc600,/0 x6220,0 x1700,0 x2230,0 x0740,/正正L0 x6440,0 x0e20,0 x44c0,0 x8e00,/反反L0 x0
9、660,0 x0660,0 x0660,0 x0660,/四方块四方块0 x0000;2024/3/217算法讲解算法讲解图形产生算法:图形产生算法:生成一个生成一个7以内的随机数,分别代表不同的图形以内的随机数,分别代表不同的图形int n=(int)(Math.random()*7);2024/3/218算法讲解算法讲解设置图形在预览区的位置,以土字型为例:设置图形在预览区的位置,以土字型为例:preGrid12=n+1;preGrid21=n+1;preGrid22=n+1;preGrid23=n+1;分别在预览区和游戏区绘制图形:分别在预览区和游戏区绘制图形:预览区绘制下一个图形:预览
10、区绘制下一个图形:Block preview游戏区绘制当前图形:游戏区绘制当前图形:Block current2024/3/219算法讲解算法讲解控制图形的下落:控制图形的下落:创建一个线程控制图形的下落,当图形落到底后就停创建一个线程控制图形的下落,当图形落到底后就停止止2024/3/220算法讲解算法讲解键盘按键的作用键盘按键的作用A、S、W、D键分别与键分别与、对应,实现对应,实现左移、加快下落、旋转、右移的功能左移、加快下落、旋转、右移的功能移动之前要判断是否可以移动移动之前要判断是否可以移动新位置仍在游戏区域内新位置仍在游戏区域内新位置没有其它方块新位置没有其它方块实现移动实现移动实
11、现旋转实现旋转2024/3/221算法讲解算法讲解键盘事件的监听和处理键盘事件的监听和处理 public void keyPressed(KeyEvent key)switch(key.getKeyCode()case KeyEvent.VK_A:case KeyEvent.VK_LEFT:/左移操作左移操作 break;2024/3/222算法讲解算法讲解移动之前的判断移动之前的判断声明声明boolean moveShape(Block from,Block to)新位置仍在游戏区域内:新位置仍在游戏区域内:if(!toi.isInRange(this)return false;新位置没有其
12、它方块:新位置没有其它方块:2024/3/223算法讲解算法讲解if(gridtoi.xtoi.y!=GamePanel.NoBlock)return false;2024/3/224算法讲解算法讲解如果是旋转如果是旋转public void leftTurn()if(assertValid(blockType,(turnState+1)%4,row,column)dispBlock(0);turnState=(turnState+1)%4;dispBlock(1);2024/3/225算法讲解算法讲解如果是移动如果是移动/方块左移方块左移public void leftMove()if(as
13、sertValid(blockType,turnState,row,column-1)dispBlock(0);column-;dispBlock(1);/方块右移方块右移public void rightMove()if(assertValid(blockType,turnState,row,column+1)dispBlock(0);column+;dispBlock(1);2024/3/226小结小结 对键盘事件进行监听并简单处理对键盘事件进行监听并简单处理;完成对图形是否可以移动进行判断的代码;完成对图形是否可以移动进行判断的代码;完成图形移动、旋转控制的算法代码完成图形移动、旋转控制
14、的算法代码;2024/3/227算法讲解算法讲解行消除的实现行消除的实现消除行;消除行;加分规则的定义;加分规则的定义;2024/3/228算法讲解算法讲解消除行:实质是将上一行的格子移动下来消除行:实质是将上一行的格子移动下来如果有方块的格子数量与列数相同,则删除之如果有方块的格子数量与列数相同,则删除之public void deleteFillLine()int fillLineNum=0;boolean isFill;for(int i=rowNum-1;i=0;i-)isFill=true;for(int j=0;j columnNum;j+)if(scrArrayij=0)isFi
15、ll=false;break;2024/3/229算法讲解算法讲解加分规则加分规则简单规则:每删除一行加一个固定分值(示例中是简单规则:每删除一行加一个固定分值(示例中是10分)分)复杂规则:复杂规则:图形每下落一行加若干分,视图形不同加不同分,图形每下落一行加若干分,视图形不同加不同分,如一字型相对加分比如一字型相对加分比Z字型少;字型少;同时消除二行的加分比单独消除一行同时消除二行的加分比单独消除一行2次要高,同次要高,同理一次性消除三行、四行的分数都要相应提高理一次性消除三行、四行的分数都要相应提高2024/3/230算法讲解算法讲解排行榜的实现想法排行榜的实现想法当游戏结束后,判断本次
16、成绩是否在前十名以内;当游戏结束后,判断本次成绩是否在前十名以内;如不是,则仅弹出游戏结束的对话框;如不是,则仅弹出游戏结束的对话框;如是,则先弹出游戏结束的对话框,并询问是否记录如是,则先弹出游戏结束的对话框,并询问是否记录成绩到排行榜;成绩到排行榜;如记录,则弹出排行榜窗体,允许用户输入名字,并如记录,则弹出排行榜窗体,允许用户输入名字,并将其按照排名顺序记录在相应文件中将其按照排名顺序记录在相应文件中2024/3/231算法讲解算法讲解前十名信前十名信息,包括息,包括玩家名字玩家名字和分数和分数用于保存用于保存新的记录新的记录用于退出用于退出窗体窗体用于玩家用于玩家输入姓名输入姓名202
17、4/3/232算法讲解算法讲解是否前十的算法是否前十的算法定义一个类定义一个类Recording,用于处理排名,用于处理排名声明一个方法:声明一个方法:static boolean isTopTen(int score)实现实现记录条数不足记录条数不足10条时条时超过超过10条时,再看是否比第十名高条时,再看是否比第十名高2024/3/233算法讲解算法讲解前十名的排序算法前十名的排序算法自定义一个比较器:自定义一个比较器:class RecordComparator implements Comparator重写方法:重写方法:public int compare(Object o1,Obj
18、ect o2)将所有排名读入到一个集合对象中将所有排名读入到一个集合对象中再使用再使用Collections类的静态方法类的静态方法sort()进行排序进行排序2024/3/234算法讲解算法讲解前十名记录的读写前十名记录的读写读:在读:在Recording类中定义如下方法类中定义如下方法 public static ArrayList readRecords()写:在写:在Recording类中定义如下方法类中定义如下方法 public static boolean writeRecord(String name,int score)注意:注意:写之前要排序写之前要排序记录文件中的格式自定义记录文件中的格式自定义2024/3/235完成完成完成排行榜窗体的设计完成排行榜窗体的设计;完成执行记录读、写、排序功能的类;完成执行记录读、写、排序功能的类;