Java怎样实现俄罗斯方块游戏简单版(java,开发技术)

时间:2024-04-29 14:13:45 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

游戏页面效果如下:

Java怎样实现俄罗斯方块游戏简单版

俄罗斯方块游戏本身的逻辑:

俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌房子一样,各种各样的方地形状是不同的。但是,俄罗斯方块游戏的界面被等均的分为若干行和若干列,因此方块的本质就是占用了多少个单元。

首先来考虑一下数据的问题。对于界面来说,需要一个二维的 int 型数组,它保存着那些地方应该有着色,哪些没有;然后是方块本身,尽管它们的形状不统一,但是它们可以用一个4X4比例的方块所包围,因此用16个字节就可以把一个 方块的信息保存者,

注意:其实方块的数据也可以用int 数组表示,但是涉及到效率问题,用位操作比用普通的算术运算要快一点。

接下来思考一下动作具体有下面几点:

(1)方块的诞生。它的诞生是需要用随机原理的,另外,它如何初始化的被放置在游戏界面的顶部?

(2)方块是需要自动的往下掉的,它在掉的过程中,还需要判断它是否与周围的环境是否发生了冲突,能不能继续往下。

(3)方块本身还可以变形,变形以后的方块具有不同的数据,判断的方式又会不一样。(4)当用户一直按住s键的时候,方块还需要持续往下掉。

然后就是过程,玩家主要操作的地方有以下几个方面:

(1) 左右操作。需要监听KeyEvent,让方块左右移动,直到碰到边界。

(2) 变形操作。也要监听KeyEvent,让方块自动的变形。

(3) 下降操作。也要监听KeyEvent,让方块快速的下降。

至于游戏的结束,只有一种情况, 那就是诞生的方块出世就与其他方块冲突了。

源程序代码如下:注释详细

packagetetris;importjava.awt.BorderLayout;importjava.awt.Color;importjava.awt.GridLayout;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JPanel;importjavax.swing.JTextArea;importjavax.swing.JTextField;publicclassMainextendsJFrameimplementsKeyListener{privateJTextArea[][]grids;//把整个界面变为一个文本区域,整个游戏在里面进行privateintdata[][];//对于每个格子的数据,1代表有方块,0代表为空白区privateint[]allRect;//所有的方块类型,用16个字节来存储,俄罗斯方块图形都是在4*4格子里privateintrect;//当前游戏下落的方块类型;privateintx,y;//当前方块的坐标位置,x代表行,y代表列privateintscore=0;//记录当前游戏得分情况,每消一层得10分privateJLabellabel;//显示分数的标签privateJLabellabel1;//显示游戏是否结束privatebooleanrunning;//用于判断游戏是否结束/*无参构造函数*/publicMain(){grids=newJTextArea[26][12];//设置游戏区域行和列data=newint[26][12];//开辟data数组空间与游戏区域行和列一致allRect=newint[]{0x00cc,0x8888,0x000f,0x0c44,0x002e,0x088c,0x00e8,0x0c88,0x00e2,0x044c,0x008e,0x08c4,0x006c,0x04c8,0x00c6,0x08c8,0x004e,0x04c4,0x00e4};//19种方块形状,如0x00cc就是0000表示一个2*2的正方形方块//0000//1100//1100label=newJLabel("score:0");//此标签存放得分情况,初始化为0分label1=newJLabel("开始游戏");//此标签为提示游戏状态:开始还是结束running=false;//为标志变量,false为游戏结束,true为游戏正在进行init();//游戏界面初始化}/*游戏界面初始化函数*/publicvoidinit(){JPanelcenter=newJPanel();//此面板为游戏核心区域JPanelright=newJPanel();//此面板为游戏说明区域center.setLayout(newGridLayout(26,12,1,1));//给游戏核心区域划分行、列共26行,12列for(inti=0;i<grids.length;i++){//初始化面板for(intj=0;j<grids[i].length;j++){grids[i][j]=newJTextArea(20,20);grids[i][j].setBackground(Color.WHITE);grids[i][j].addKeyListener(this);//添加键盘监听事件//初始化游戏边界if(j==0||j==grids[i].length-1||i==grids.length-1){grids[i][j].setBackground(Color.PINK);data[i][j]=1;}grids[i][j].setEditable(false);//文本区域不可编辑center.add(grids[i][j]);//把文本区域添加到主面板上}}//初始化游戏说明面板right.setLayout(newGridLayout(4,1));right.add(newJLabel("a:leftd:right"));right.add(newJLabel("s:downw:change"));right.add(label);label1.setForeground(Color.RED);//设置标签内容为红色字体right.add(label1);//把主面板和说明面板添加到窗体中this.setLayout(newBorderLayout());this.add(center,BorderLayout.CENTER);this.add(right,BorderLayout.EAST);running=true;//初始化running状态为true,表示程序运行即游戏开始this.setSize(600,850);//设置窗体大小this.setVisible(true);//窗体可见this.setLocationRelativeTo(null);//设置窗体居中this.setResizable(false);//窗体大小不可改变this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//释放窗体}/*主函数*/publicstaticvoidmain(String[]args){Mainm=newMain();//创建Main对象,主要用于初始化数据m.go();//开始游戏}/*开始游戏*/publicvoidgo(){//开始游戏while(true){//游戏开始直到游戏失败才结束,否则一直执行if(running==false){//如果游戏失败break;}ranRect();//绘制下落方格形状start();//开始游戏}label1.setText("游戏结束!");//则游戏结束}/*绘制下落方格形状*/publicvoidranRect(){rect=allRect[(int)(Math.random()*19)];//随机生成方块类型(共7种,19个形状)}/*游戏开始函数*/publicvoidstart(){x=0;y=5;//初始化下落方块的位置for(inti=0;i<26;i++){//共26层,一层一层下落try{Thread.sleep(1000);//每层延时1秒if(canFall(x,y)==false){//如果不可以掉落saveData(x,y);//把此方块区域data[][]标志为1,表示有数据for(intk=x;k<x+4;k++){//循环遍历4层,看是否有哪一层都有方块的情况,以便消除那一行方格和统计得分intsum=0;for(intj=1;j<=10;j++){if(data[k][j]==1){sum++;}}if(sum==10){//如果k层都有方块,则消除k层方块removeRow(k);}}for(intj=1;j<=10;j++){//游戏最上面的4层不能有方块,否则游戏失败if(data[3][j]==1){running=false;break;}}break;}//如果可以掉落x++;//层加一fall(x,y);//掉下来一层}catch(InterruptedExceptione){e.printStackTrace();}}}/*判断正下落的方块是否可以下落*/publicbooleancanFall(intm,intn){inttemp=0x8000;//表示1000000000000000for(inti=0;i<4;i++){//循环遍历16个方格(4*4)for(intj=0;j<4;j++){if((temp&rect)!=0){//此处有方块时if(data[m+1][n]==1)//如果下一个地方有方块,则直接返回falsereturnfalse;}n++;//列加一temp>>=1;}m++;//下一行n=n-4;//回到首列}returntrue;//可以掉落返回true}/*把不可下降的方块的对应的data存储为1,表示此坐标有方块*/publicvoidsaveData(intm,intn){inttemp=0x8000;//表示1000000000000000for(inti=0;i<4;i++){//循环遍历16个方格(4*4)for(intj=0;j<4;j++){if((temp&rect)!=0){//此处有方块时data[m][n]=1;//data数组存放为1}n++;//下一列temp>>=1;}m++;//下一行n=n-4;//回到首列}}/*移除row行所有方块,以上的依次往下降*/publicvoidremoveRow(introw){for(inti=row;i>=1;i--){for(intj=1;j<=10;j++){data[i][j]=data[i-1][j];//}}reflesh();//刷新移除row行方块后的游戏主面板区域score+=10;//分数加10;label.setText("score:"+score);//显示得分}/*刷新移除row行方块后的游戏主面板区域*/publicvoidreflesh(){for(inti=1;i<25;i++){for(intj=1;j<11;j++){if(data[i][j]==1){//有方块的地方把方块设置为绿色grids[i][j].setBackground(Color.GREEN);}else{//无方块的地方把方块设置为白色grids[i][j].setBackground(Color.WHITE);}}}}/*方块掉落一层*/publicvoidfall(intm,intn){if(m>0)//方块下落一层时clear(m-1,n);//清除上一层有颜色的方块draw(m,n);//重新绘制方块图像}/*清除方块掉落之前有颜色的地方*/publicvoidclear(intm,intn){inttemp=0x8000;//表示1000000000000000for(inti=0;i<4;i++){//循环遍历16个方格(4*4)for(intj=0;j<4;j++){if((temp&rect)!=0){//此处有方块时grids[m][n].setBackground(Color.WHITE);//清除颜色,变为白色}n++;//下一列temp>>=1;}m++;//下一行n=n-4;//回到首列}}/*绘制掉落后方块图像*/publicvoiddraw(intm,intn){inttemp=0x8000;//表示1000000000000000for(inti=0;i<4;i++){//循环遍历16个方格(4*4)for(intj=0;j<4;j++){if((temp&rect)!=0){//此处有方块时grids[m][n].setBackground(Color.GREEN);//有方块的地方变为绿色}n++;//下一列temp>>=1;}m++;//下一行n=n-4;//回到首列}}@OverridepublicvoidkeyPressed(KeyEvente){}@OverridepublicvoidkeyReleased(KeyEvente){}@OverridepublicvoidkeyTyped(KeyEvente){if(e.getKeyChar()=='a'){//方格进行左移if(running==false){return;}if(y<=1)//碰到左边墙壁时return;inttemp=0x8000;//表示1000000000000000for(inti=x;i<x+4;i++){//循环遍历16个方格(4*4)for(intj=y;j<y+4;j++){if((rect&temp)!=0){//此处有方块时if(data[i][j-1]==1){//如果左移一格有方块时return;}}temp>>=1;}}clear(x,y);//可以进行左移操作时,清除左移前方块颜色y--;draw(x,y);//然后重新绘制左移后方块的图像}if(e.getKeyChar()=='d'){//方块进行右移操作if(running==false){return;}inttemp=0x8000;intm=x,n=y;intnum=7;for(inti=0;i<4;i++){for(intj=0;j<4;j++){if((temp&rect)!=0){if(n>num){num=n;}}temp>>=1;n++;}m++;n=n-4;}if(num>=10){return;}temp=0x8000;for(inti=x;i<x+4;i++){for(intj=y;j<y+4;j++){if((rect&temp)!=0){if(data[i][j+1]==1){return;}}temp>>=1;}}clear(x,y);//可以进行右移操作时,清除右移前方块颜色y++;draw(x,y);//然后重新绘制右移后方块的图像}if(e.getKeyChar()=='s'){//方块进行下移操作if(running==false){return;}if(canFall(x,y)==false){saveData(x,y);return;}clear(x,y);//可以进行下移操作时,清除下移前方块颜色x++;draw(x,y);//然后重新绘制下移后方块的图像}if(e.getKeyChar()=='w'){//改变方块形状if(running==false){return;}inti=0;for(i=0;i<allRect.length;i++){//循环遍历19个方块形状if(allRect[i]==rect)//找到下落的方块对应的形状,然后进行形状改变break;}if(i==0)//为正方形方块无需形状改变,为方块图形种类1return;clear(x,y);if(i==1||i==2){//为方块图形种类2rect=allRect[i==1?2:1];if(y>7)y=7;}if(i>=3&&i<=6){//为方块图形种类3rect=allRect[i+1>6?3:i+1];}if(i>=7&&i<=10){//为方块图形种类4rect=allRect[i+1>10?7:i+1];}if(i==11||i==12){//为方块图形种类5rect=allRect[i==11?12:11];}if(i==13||i==14){//为方块图形种类6rect=allRect[i==13?14:13];}if(i>=15&&i<=18){//为方块图形种类7rect=allRect[i+1>18?15:i+1];}draw(x,y);}}}
 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Java怎样实现俄罗斯方块游戏简单版的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:apache没有php.ini会怎么样下一篇:

3 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18