2024年俄罗斯方块实验报告_第1页
2024年俄罗斯方块实验报告_第2页
2024年俄罗斯方块实验报告_第3页
2024年俄罗斯方块实验报告_第4页
2024年俄罗斯方块实验报告_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

南京邮電大學通达學院算法与数据构造设计汇报(/第二學期)专业软件工程嵌入式學号姓名學号姓名學号姓名指导教師指导單位计算机學院计算机科學与技术系曰期-5-26评分细则评分项优秀良好中等差遵守机房规章制度上机時的体現學习态度程序准备状况程序设计能力团体合作精神課題功能实現实状况况算法设计合理性汇报書写认真程度内容详实程度验收答辩状况评分等级姓名(组長)姓名(组员1)姓名(组员2)姓名(组员3)简短评語指导教師签名曰期-5-27备注评分等级有五种:优秀、良好、中等、及格、不及格目录課題内容---------------------------------------1算法设计与分析---------------------------------1算法实現---------------------------------------9测试数据及成果分析----------------------------38调试過程中的問題------------------------------40總結------------------------------------------41

俄罗斯方块課題内容实現俄罗斯方块游戏。重要功能為游戏界面显示、上下左右键响应以及目前得分记录。通過该課題全面熟悉数组、字符串等的使用。掌握设计的基本措施及友好界面的设计。課題规定:游戏界面显示:下落方块和方块堆、左右移動、旋转、删除行等特效以及得分。動作选择:上下左右键對应于旋转、加速、左右移動的功能。得分记录判断:鉴定能否消除行、并记录得分總数等。扩展规定:顾客数据管理。游戏玩法:由小方块构成的不一样形状的板块陆续從屏幕上方落下来,玩家通過调整板块的位置和方向,使它們在屏幕底部拼出完整的一条或几条。這些完整的横条會随即消失,給新落下来的板块腾出空间,与此同步,玩家得到分数奖励。没有被消除掉的方块不停堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏結束。

基本规则

1、一种用于摆放小型正方形的平面虚拟場地,其原则大小:行宽為10,列高為20,以每個小正方形為單位。2、一组由4個小型正方形构成的规则图形,英文称為Tetromino,中文通称為方块共有7种,分别以S、Z、L、J、I、O、T這7個字母的形状来命名。

I:一次最多消除四层

J(左右):最多消除三层,或消除二层

L:最多消除三层,或消除二层

O:消除一至二层

S(左右):最多二层,轻易导致孔洞

Z(左右):最多二层,轻易导致孔洞

T:最多二层

(1)部分游戏有單格方块,可以穿透固定的方块抵达最下层空位。其他的改版中出現更多尤其的造型。

方块會從区域上方開始缓慢继续落下。

(2)玩家可以做的操作有:以90度為單位旋转方块,以格子為單位左右移動方块,让方块加速落下。

(3)方块移到区域最下方或是著地到其他方块上無法移動時,就會固定在该处,而新的方块出目前区域上方開始落下。

(4)當区域中某一列横向格子所有由方块填满,则该列會消失并成為玩家的得分。同步删除的列数越多,得分指数上升。

(5)當固定的方块堆到区域最上方而無法消除层数時,则游戏結束。

(6)一般来說,游戏還會提醒下一种要落下的方块,纯熟的玩家會计算到下一种方块,评估要怎样進行。由于游戏能不停進行下去對商业用游戏不太理想,因此一般還會伴随游戏的進行而加速提高难度。算法设计与分析I、俄罗斯方块游戏需要处理的問題包括

(1)、随机产生方块并自動下移

(2)、用键变体

(3)、用键和键左右移動方块,按Q退出,按space暂停

II、俄罗斯方块游戏需要设计的功能函数包括

(1)、申明俄罗斯方块的构造体

(2)、函数原型申明

(3)、制作游戏窗口

(4)、制作俄罗斯方块

(5)、判断与否可動、随机产生俄罗斯方块类型序号、判断与否满行并删除满行的俄罗斯方块(8)暂停,继续功能(9)新游戏创立(10)顾客的创立,分数顾客名的保留,查看分数TetrisScorePanelnameScoreTetrisScorePanelnameScoretetrisblokMemberstetrisblokMembersTetris类(重要类)该类包括措施,应為应用程序的主类。该类用来创立游戏的顾客界面,事件处理功能和menu餐單,顾客信息的存储。整個程序從该类的措施開始执行。组员变量:StringuserName;构造措施:TetrisuserName=JOptionPane.showInputDialog(null,"输入你的名字"); if(userName==null||userName.equals("")){ userName="無名氏"; }//假如没有命名就定义為無名氏内部类:Members,TetrisblockTetrisblok类:用来设计游戏界面。游戏界面显示在由Tetrisblok类创立的整個顾客界面的中(Center)区,游戏的即時分数、方块的效果图及方的预览功能都在整個类裏面实現。用来封装俄罗斯小方块。一种方块的属性是由方块1位置即x和y的坐標、颜色决定的。组员变量privateintblockType;Timertimer=null;privateintturnState;privateintx;privateinty;privateinti=0;intj=0;staticintscore=0;intflag=0;intdelay=1000;//定义已經放下的方块x=0-12,y=0-22;int[][]map=newint[14][24];//方块的形状第一组代表方块类型有S、Z、L、J、I、O、T7种第二组代表旋转几次第三四组為方块矩阵privatefinalintshapes[][][]组员措施:publicvoidnewblock()publicvoiddrawwall()publicvoidnewmap()publicvoidnewgame()publicvoidturn();publicvoidleft();publicvoidright();publicvoiddown();publicintblow(intx,inty,intblockType,intturnState);publicvoiddelline();publicintgameover(intx,inty);publicvoidadd(intx,inty,intblockType,intturnState);publicvoidpaintComponent(Graphicsg);publicvoidkeyPressed(KeyEvente);publicvoidkeyTyped(KeyEvente)Members类:用来创立io流,在D盘中查找username.txt文献,假如没有就创立。并且在username和score中间用:隔開,以便後来用split對其進行分割。组员变量:privateFileWriterfw=null;privateBufferedWriterbw=null;privateFileReaderfr=null;privateBufferedReaderbr=null; Tetristt=null; booleanvip=true;//假如有usernametxt這個文献的话就返回true并且容許查看分数判断与否有顾客已經创立了ArrayList<NameScore>al=newArrayList<NameScore>();组员措施:getMembers()saveMembers()getpaint()GetMembers()措施获取username.txt的File對象NameScore类:privateStringusername;privateStringscore;publicStringgetUsername(){publicStringgetUsername(){publicvoidsetUsername(Stringusername){publicStringgetScore(){每一种顾客的分数和姓名存到一种對象NameScore类。ScorePanel类;Vectorcol=null;Vectorrol=null;JTablejt;publicScorePanel(ArrayList<NameScore>al)throwsIOException{這個是用来接受Tetris类中传递過来的储存NameScore對象的ArrayList集合,然後把用迭代器将集合中的每一种對象的username和score取出来然後放到Vector中。然後添加到JTable中。三、算法实現 1.0Tetris类(重要类)Tetris类功能该类包括main措施,应為应用程序的主类。该类用来创立游戏的顾客界面,事件处理功能和menu餐單,顾客信息的存储。整個程序從该类的main措施開始执行。组员变量:StringuserName;构造措施:Tetris实目前初始化的時候進行弹框假如没有输入值则就将username命名為無名氏publicTetris()throwsIOException{ userName=JOptionPane.showInputDialog(null,"输入你的名字"); if(userName==null||userName.equals("")){ userName="無名氏"; }//假如没有命名就定义為無名氏 finalJMenuItempause;finalJMenuItemgoon;finalJMenuItemgetscore;finalJMenuItemexit;finalJMenuItemsaveexit;newgame.addActionListener(newActionListener(){菜單事件點击menuitem中的各個选项,會运行的函数pause.addActionListener(new菜單事件點击menuitem中的各個选项,會运行的函数goon.addActionListener(newActionListener(){getscore.addActionListener(newActionListener(){exit.addActionListener(newActionListener(){saveexit.addActionListener(newActionListener(){high.addActionListener(newActionListener()2.Tetrisblok类Tetrisblok类功能:用来设计游戏界面。游戏界面显示在由Tetrisblok类创立的整個顾客界面的中(Center)区,游戏的即時分数、方块的效果图及方的预览功能都在整個类裏面实現。用来封装俄罗斯小方块。实現创立新游戏,暂停,继续并且通過调用members类来实現顾客姓名,分数的存储,和记录的讀取。画出俄罗斯方块的形状和变形之後的形状是根据三维数组来的privatefinalintshapes[][][]=newint[][][]{{0,0,0,0, 1,1,1,1, 0,0,0,0, 0,0,0,0},{0,1,0,0,0,1,0,0, 0,1,0,0,0,1,0,0},{0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0}}這個只是一种形状和变换之後的形状{………}尚有s,z,j,l,t和方形Newblock()措施Newblock措施的功能這個措施是产生一种新的方块,并且判断游戏与否已經結束,假如游戏結束的话就弹出一种提醒框并且将Map清零blockType=(int)(Math.random()*1000)%7;turnState=(int)(Math.random()*1000)%4;x=4;y=0;if(gameover(x,y)==1){newmap();drawwall();score=0;JOptionPane.showMessageDialog(null,"GAMEOVER");}}Blow措施(判断方块的下一种動作与否合法)Blow措施功能for循环出所有4*4表格中的值,每當取到一种1的時候表达這是方块的构成元素之一,map[x+b+z][y+a]表达构成元素之一碰撞到障碍物的時候或者碰撞到墙壁的時候由于墙壁是2。返回1就是合法,返回0就是不合法publicintblow(intx,inty,intblockType,intturnState){for(inta=0;a<4;a++){for(intb=0;b<4;b++){if(((shapes[blockType][turnState][a*4+b]==1)&&(map[x+b+1][y+a]==1))||((shapes[blockType][turnState][a*4+b]==1)&&(map[x+b+1][y+a]==2))){return0;}}}return1;}Deline()措施Deline()措施功能判断每一行与否满行,满行的话就消行,消行就上让满行的上一行的每一种元素下移一行。publicvoiddelline(){intc=0;for(intb=0;b<23;b++){for(inta=0;a<13;a++){if(map[a][b]==1){c=c+1;if(c==11){score+=11;for(intd=b;d>0;d--){//這行是上面的那行下来需要消行上面的那行下来就嫩实現消行for(inte=0;e<12;e++){map[e][d]=map[e][d-1];}}}}}c=0;}}paintComponent(Graphicsg)措施:這個措施实現画笔的功能,将目前正在运行的方块和已經存在的画到panel中,并且显示已經得到的分数由于每個方块都是有一种具有16個元素的数组构成因此要從第一种元素開始查找到最终一种,假如有一种元素為1就表达這個位置是一种方块的构成。同样的固定的方块也是這样画出来的。super.paintComponent(g);//画目前方块for(j=0;j<16;j++){if(shapes[blockType][turnState][j]==1){g.fillRect((j%4+x+1)*15,(j/4+y)*15,15,15);}}//画已經固定的方块在這裏变成13列23行for(j=0;j<23;j++){for(i=0;i<13;i++){if(map[i][j]==1){g.fillRect(i*15,j*15,15,15);}if(map[i][j]==2){g.drawRect(i*15,j*15,15,15);}}}g.drawString("score="+score,200,10);//g.drawString("你的名字:"+newTetris().userName,200,30);g.drawString("抵制不良游戏,",200,80);g.drawString("拒绝盗版游戏。",200,100);g.drawString("注意自我保护,",200,120);g.drawString("谨防受骗上當。",200,140);g.drawString("适度游戏益脑,",200,160);g.drawString("沉迷游戏伤身。",200,180);g.drawString("合理安排時间,",200,200);g.drawString("享有健康生活。",200,220);}键盘事件當你按上下左右的時候回触发對应的事件publicvoidturn(){键盘事件當你按上下左右的時候回触发對应的事件publicvoidleft(){publicvoidright(){publicvoiddown(){add措施:add措施的功能:由于每個方块是由16個元素构成,16個元素又可以构成4行4列。從第一行開始,背面的每一列,假如map中在正在运行的方块的目前位置的x坐標+1是一种0的话,也就表达x的下一种位置不是墙或是已經形成的障碍物就让這個正在运行的方块成為下一种障碍物,也就是Map数组中對应位置的元素改為1publicvoidadd(intx,inty,intblockType,intturnState){ intj=0;for(inta=0;a<4;a++){for(intb=0;b<4;b++){if(map[x+b+1][y+a]==0){map[x+b+1][y+a]=shapes[blockType][turnState][j];};j++;}}}Members类;這個类重要是用来對顾客的名字和的分進行储存,和讀取,并且可以创立新的面板(得分面板)privateFileWriterfw=null;privateBufferedWriterbw=null;privateFileReaderfr=null;privateBufferedReaderbr=null;Tetristt=null;booleanvip=true;//假如有usernametxt這個文献的话就返回true并且容許查看分数判断与否有顾客已經创立了ArrayList<NameScore>al=newArrayList<NameScore>();//将每一种顾客對象存储到集合中saveMembers()措施储存顾客信息的方式使用io流在d盘中创立txt的文献,這個措施是创立file對象,假如d盘中没有txt文献就想创立。将顾客信息写在txt文献中并且将username和score之间用:分開為了之後的措施将他分開。并且在文献存在将FileWriter端口关闭。publicvoidsaveMembers()throwsIOException{ Stringusername=userName;//将外部类的username赋值給内部类username Tetrisbloktb=newTetrisblok();//這是存数据 Filefile=newFile("d:\\username.txt"); if(!file.exists()){ file.createNewFile(); } //intmap[][]=tb.map; fw=newFileWriter("d:\\username.txt",true); bw=newBufferedWriter(fw);// for(inti=0;i<map.length;i++){// for(intj=0;j<map[0].length;j++){// bw.write(map[i][j]+"\t");// }// bw.write("\r\n");// } bw.write(username+":"+tb.score+"\r\n");bw.close(); System.out.println(username+"分数是"+tb.score);}//显示讀取出的数组getMembers()措施:创立file對象获取txt文献,假如txt文献并不存在的话,就弹出一种窗口并且显示并没有任何顾客否则的话就获得bufferedwriter對象。并且讀取每一行的数据,readline是一次讀取一行,并且每次以字符串的形式返回這一行的数据。懂得讀取到null為止。得到的每一行数据用split措施進行分割,分割後的数据前面一种放在temp数组的第一种位置,第二個放在第二個位置中。然後将得到的数据分别存到NameScore對象中。NameScore每次while循环都會创立一次。publicvoidgetMembers()throwsIOException{ Filefile=newFile("d:\\username.txt"); if(!file.exists()){ JOptionPane.showMessageDialog(null,"尚未有任何顾客"); vip=false;//假如没有的话就返回false }else{ Stringline=null; fr=newFileReader("d:\\username.txt"); br=newBufferedReader(fr);// ("运行到這裏2"); while((line=br.readLine())!=null){//每次讀取一行同步以字符串的形式返回這一行的数据回這一直到null停止 NameScorens=newNameScore(); Stringtemp[]=line.split("\\:"); ns.setUsername(temp[0]);// (temp[0]); ns.setScore(temp[1]); al.add(ns);// ("line"+row+":"+line); } br.close(); }}Getpaint()措施Getpaint()措施功能得到jtable對象并且将其显示在一种新的jpanel中publicvoidgetpaint()throwsIOException{JPaneljp=newJPanel(); Vectorcol=newVector(); col.add("顾客名"); col.add("得分"); Vectorrow=newVector(); ScorePanelsp=newScorePanel(al); JTablejt=newJTable(sp); jp.add(jt); this.add(jp); this.setVisible(true); this.setSize(300,400);}}4.ScorePanel类Vectorcol=null;Vectorrol=null;JTablejt;ScorePanel类实現的功能這是一种带参的构造函数重要功能是将members类传递過来的arraylist<nameScore>集合進行处理,将集合用迭代器获取裏面的每一种對象,并将每一种對象中的username属性和score属性放置在vector中publicScorePanel(ArrayList<NameScore>al)throwsIOException{col=newVector();col.add("顾客名");col.add("分数");rol=newVector(); ArrayList<NameScore>all=al; Iterator<NameScore>it=all.iterator(); while(it.hasNext()){ Vectoruser=newVector(); NameScoreuserInfo=it.next();// (userInfo.getScore()+"dasda");// (userInfo.getUsername()+"dasda"); user.add(userInfo.getUsername()); user.add(userInfo.getScore());//到這個环节都是對的it.next()均有值 rol.add(user); } jt=newJTable(rol,col); }5.nameScore()类這個类重要就是储存顾客的姓名和對应的得分,每一种nameScore()类就封装一种顾客對象privateStringusername;privateStringscore;和這些变量的set和get措施publicStringgetUsername(){publicvoidsetUsername(Stringusername){publicStringgetScore(){publicvoidsetScore(Stringscore){测试数据及成果分析1.游戏的运行,与否會出現弹窗,初始界面。

2.點击“開始新游戏”,游戏与否刷新。

3.點击“暂停”,游戏与否暂停。

4.點击“加速”,游戏速度与否加紧。5.點击“減速”,游戏速度与否減少。6.分别按键盘上的“左”、“右”、“下”、“上”,方块与否左移、右移、下移、变形。7.當一层满了後来,与否消掉此层,与否會记录分数。8.當方块累积到最高點時,游戏与否會自動結束。9.點击“退出游戏”,游戏与否关闭。10.點击”保留并退出游戏”,游戏顾客信息与否會保留,游戏与否关闭11.點击”查看分数”,与否會出現新的jpanel框,并且裏面与否會显示已經存入的信息。游戏运行状况點击运行程序之後,游戏開始,上面两幅图就是游戏运行的画面超過边界游戏結束加速減速點击之後時间计時器重新工作即实現继续功能點击暂停時间计時器停止计時即实現暂停功能保留并退出然後d盘下面會有一种username.txt文献得到组员的姓名和分数點击”查看分数”會弹出来分数面板裏面显示已經保留過的顾客的名字和得分通過调试和修改,程序完全实現设计规定,成功模拟了俄罗斯方块的运行過程和游戏效果,只是界面略微简陋,但已從程序层面上实現了游戏,到达了這次实训的规定和目的。程序正常生成方块,根据速度值每隔一定期间自動下落,如有操作按键按下,根据按五、调试過程中的問題1.刚開始的時候在障碍物的問題上總是出現数组越界錯误2.俄罗斯方块的变形問題,不是顺時针变形,本来是方块数组的排序出現錯误2.在添加事件的時候點击新游戏分数不刷新,後来在tetris类中的newgame中添加了score=0之後处理了問題4.在实現加速和減速的問題上,一開始speed控制的是在時间间隔不变的状况下,变化方块每次跳動的距离,发現比较麻烦後来改用在每次跳動距离不变的状况下,变化事件发生的间隔,间隔越短就越快,不過只能不小于0并且不不小于15005.在點击暂停按钮之後然後點击新游戏會出現錯误6.在内部类调用外部类的变量的時候出現錯误;7.在程序刚開始运行的時候,弹出来的Input框,假如我没有進行任何处理的话,會报空指针异常虽然我在下面加上了假如username==null不過并没有运行,後来懂得本来在if选项中我的username.equal(“”)||username==null写颠倒過来了导致。8.在实現顾客信息管理的時候用的是io流储存,将每次输入的顾客名存在username的txt文献下面,假如没有這個文献的话要先创立。9.在對txt文本中的内容進行分割处

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论