本文代码来源于B站:尚学堂

博主也在此基础上有些改动,添加了一点提示标签和窗口

本文实现的功能有:

1、 初始化游戏窗口

2、初始化游戏的界面

3、初始化游戏的说明面板

4、随机生成下落方块

5、方块下落速度变化

6、判断方块是否可以下落

7、移除某一行方块上面的方块后让上面的方块掉落

8、刷新移除某一行方块后的界面

9、清除方块

10、绘制方块

11、键盘控制方块的移动、变形和快速下落

12、游戏的暂停功能

13、游戏结束后,弹出窗口提示并显示最终分数

三小时纯手工打造,具体实现代码:

import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;public class start extends JFrame implements KeyListener {public static void main(String[] args) throws Exception {//   SwingUtilities.invokeLater(start::initWindow);start t=new start();t.game_begin();}//游戏的行数为26,列数为12private static final int game_x=26;private static final int game_y=12;//文本域数组JTextArea[][] text;//二维数组int [][] data;//显示游戏状态的标签JLabel Label1;//显示游戏分数的标签JLabel Label;//提示暂停键的标签JLabel label;//用于判断游戏是否结束boolean isrunning;//用于存储所有方块的数组int [] allRect;//用于存储当前方块的变量int rect;//线程的休眠时间int time=1000;//表示方块坐标int x,y;//该变量用于计算得分int score=0;//定义一个标志变量,判断游戏是否暂停boolean game_pause=false;//定义一个变量,用于记录按下暂停的次数int pause=0;public void initWindow(){//设置窗口大小this.setSize(600,850);//设置窗口是否可见this.setVisible(true);//设置窗口居中this.setLocationRelativeTo(null);//设置释放窗体this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体大小不可变this.setResizable(false);//设置标题this.setTitle("俄罗斯方块");}public start(){text=new JTextArea[game_x][game_y];data=new int[game_x][game_y];//初始化游戏状态的标签Label1 =new JLabel("游戏状态:正在游戏中!");//初始化游戏分数的标签Label=new JLabel("游戏得分:0");//初始化提示标签label=new JLabel("按下s键,即可暂停游戏!");initGamePanel();initExplainPanel();initWindow();//初始化游戏开始的标志isrunning=true;//初始化存放方块的数组allRect =new int[]{0x00cc,0x8888,0x000f,0x888f,0xf888,0xf111,0x111f,0x0eee,0xffff,0x0008,0x0888,0x000e,0x0088,0x000c,0x08c8,0x00e4,0x04c4,0x004e,0x08c4,0x006c,0x04c8,0x00c6};}//初始化游戏界面public void initGamePanel(){JPanel game_main=new JPanel();game_main.setLayout(new GridLayout(game_x,game_y,1,1));for (int i = 0; i < text.length; i++) {for (int j = 0; j < text[i].length; j++) {//设置文本域的行列数text[i][j]=new JTextArea(game_x,game_y);//设置文本域的背景颜色text[i][j].setBackground(Color.WHITE);//白色//添加键盘监听事件text[i][j].addKeyListener(this);//初始化游戏边界if(j==0 || j==text[i].length-1 || i==text.length-1){text[i][j].setBackground(Color.BLACK);//设置为黑色,这里看个人喜好设置data[i][j]=1;//表示这里有方块}//设置文本域不可编辑text[i][j].setEditable(false);//文本区域添加到主面板上去game_main.add(text[i][j]);}}//将主面板添加到窗口中this.setLayout(new BorderLayout());this.add(game_main,BorderLayout.CENTER);//把游戏区域添加到窗口的中间}//初始化游戏的说明界面public void initExplainPanel(){//创建游戏的左说明面板JPanel explain_left=new JPanel();//创建游戏的右说明面板JPanel explain_right=new JPanel();//初始化格式布局explain_left.setLayout(new GridLayout(4,1));explain_right.setLayout(new GridLayout(3,1));//在左说明面板,添加说明文字explain_left.add(new JLabel("按空格键,方块变形"));explain_left.add(new JLabel("按左箭头,方块左移"));explain_left.add(new JLabel("按右箭头,方块右移"));explain_left.add(new JLabel("按下箭头,方块下落"));//设置游戏标签的内容为红色字体Label1.setForeground(Color.RED);//将游戏状态和得分、提示添加到右面板上explain_right.add(label);explain_right.add(Label);explain_right.add(Label1);//将左说明面板添加到窗口左侧this.add(explain_left,BorderLayout.WEST);//将右说明面板添加到窗口右侧this.add(explain_right,BorderLayout.EAST);}//开始游戏的方法public void game_begin() throws Exception {while (true){//判断游戏是否结束if(!isrunning){break;}//进行游戏game_run();}//在标签位置显示游戏结束Label1.setText("游戏状态:游戏结束!");
//弹出窗口提示JOptionPane.showMessageDialog(null, "游戏结束!最终得分:"+score);}//随机生成下落方块形状的方法public void ranRect(){Random random=new Random();rect=allRect[random.nextInt(22)];}//游戏运行的方法public void game_run() throws Exception {ranRect();//方块下落位置x=0;y=5;for (int i = 0; i < game_x; i++) {Thread.sleep(time);if (game_pause) {i--;} else {//判断方块是否可以下落if (!canFall(x, y)) {//将data变成1,表示有方块占用changData(x, y);//循环遍历4层,看是否有行可以消除for (int j = x; j < x + 4; j++) {int sum = 0;for (int k = 1; k <= (game_y - 2); k++) {if (data[j][k] == 1) {sum++;}}//判断是否有一行可以被消除if (sum == (game_y - 2)) {//消除J这一行removeRow(j);}}//判断游戏是否失败for (int j = 1; j < (game_y - 2); j++) {if (data[3][j] == 1) {isrunning = false;break;}}break;//方块无法下落,我们应该重新生成一个方块,并重新遍历26层} else {//方块可以下落,层数加一x++;//方块下落一格fall(x, y);}}}}//判断方块是否可以继续下落的方法public boolean canFall(int m,int n){//定义一个变量int temp=0x8000;//遍历4*4方格for (int i = 0; i <4 ; i++) {for (int j = 0; j < 4; j++) {if((temp & rect)!=0){//判断该位置的下一行是否有方块if(data[m+1][n]==1){return false;}}n++;temp >>=1;//右移一位}m++;n=n-4;//让n回归首列}//循环结束,可以下落return true;}//改变不可下降的方块对应的区域的值的方法public void changData(int m,int n){//定义一个变量int temp=0x8000;//遍历整个4*4的方块for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if((temp & rect)!=0){data[m][n]=1;}n++;temp >>=1;//右移一位}m++;n=n-4;}}//移除某一行的所有方块,并让上面的方块掉落的方法public void removeRow(int row){int temp=100;for (int i = row; i >=1 ; i--) {for (int j = 1; j <=(game_y-2) ; j++) {//进行覆盖data[i][j]=data[i-1][j];}}//刷新游戏区域reflesh(row);//方块加速if(time>temp){time-=temp;}//每消除一行,得分加100score+=temp;//显示变化后的分数Label.setText("游戏得分:"+score);}//刷新移除某一行后的游戏界面的方法public void reflesh(int row){//遍历row上面的游戏区域for (int i = row; i >=1 ; i--) {for (int j = 1; j <=(game_y-2) ; j++) {if(data[i][j]==1){//如果是方块,将方块设置为蓝色text[i][j].setBackground(Color.BLUE);}else{//如果不是方块,说明是游戏的背景区域text[i][j].setBackground(Color.WHITE);//设置为白色}}}}//方块向下掉落一层的方法public void fall(int m,int n){if(m>0){//清除上一层方块clear(m-1,n);}//重新绘制方块draw(m,n);}//清除方块掉落后,上一层有颜色的地方的方法public void clear(int m,int n){//定义一个变量int temp=0x8000;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if ((temp & rect) != 0) {text[m][n].setBackground(Color.WHITE);//将其设置成背景颜色,相当于消除}n++;temp >>=1;//右移一位}m++;n=n-4;}}//重新绘制掉落后的方块的方法public void draw(int m,int n){//定义一个变量int temp=0x8000;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if((temp & rect)!=0){text[m][n].setBackground(Color.BLUE);//设置成之前的方块颜色}n++;temp >>=1;//右移一位}m++;n=n-4;}}@Overridepublic void keyTyped(KeyEvent e) {//控制游戏暂停if(e.getKeyChar()=='s'){//如果按下s,则游戏暂停//判断游戏是否结束if(!isrunning){return;}pause++;//判断是按下一次,暂停游戏if(pause==1){game_pause=true;Label1.setText("游戏状态:暂停中!");}//判断是按下两次,继续游戏if(pause==2){game_pause=false;pause=0;//重置暂停次数Label1.setText("游戏状态:正在游戏中!");}}//控制方块进行变形if(e.getKeyChar()==KeyEvent.VK_SPACE){//判断游戏是否结束if(!isrunning){return;}//判断游戏是否暂停if(game_pause){return;}//定义变量,存储目前方块的索引int old;for (old = 0; old < allRect.length; old++) {//判断是否是当前方块if(rect==allRect[old]){break;}}//定义变量,存储变形后的方块int next;//判断是完整方块if(old==0||old==7||old==8||old==9){return;}//清除当前方块clear(x,y);if(old==1||old==2){next=allRect[old==1?2:1];//如果可以变形if(canTurn(next,x,y)){rect=next;}}if(old>=3&&old<=6){next=allRect[old+1>6?3:old+1];if(canTurn(next,x,y)){rect=next;}}if(old==10||old==11){next=allRect[old==10?11:10];if(canTurn(next,x,y)){rect=next;}}if(old==12||old==13){next=allRect[old==12?13:12];if(canTurn(next,x,y)){rect=next;}}if(old>=14&&old<=17){next=allRect[old+1>17?14:old+1];if(canTurn(next,x,y)){rect=next;}}if(old==18||old==19){next=allRect[old==18?19:18];if(canTurn(next,x,y)){rect=next;}}if(old==20||old==21){next=allRect[old==20?21:20];if(canTurn(next,x,y)){rect=next;}}//重新绘制变形后的方块draw(x,y);}}public boolean canTurn(int a,int m,int n){//创建变量int temp=0x8000;//遍历整个方块for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if ((temp & rect) != 0) {if(data[m][n]==1){return false;}}n++;temp >>=1;}m++;n=n-4;}//可以变形return true;}@Overridepublic void keyPressed(KeyEvent e) {//方块进行左移if(e.getKeyCode()==37){//左箭头对应的数值为37//判断游戏是否结束if(!isrunning){return;}//判断游戏是否暂停if(game_pause){return;}//方块是否碰到左墙壁if(y<=1){return;}//方块的左边是否有方块int temp=0x8000;for (int i = x; i <x+4 ; i++) {for (int j = y; j <y+4 ; j++) {if((temp & rect)!=0){if(data[i][j-1]==1){return;}}temp >>=1;}}//清除目前方块clear(x,y);y--;//向左移动draw(x,y);//重新绘制出向左移动后的方块}//方块进行右移if(e.getKeyCode()==39) {//右箭头对应的数值为39//判断游戏是否结束if(!isrunning){return;}//判断游戏是否暂停if(game_pause){return;}int temp=0x8000;int m=x;int n=y;//存储最右边的坐标值int num=1;for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {if ((temp & rect) != 0) {if(n>num){num=n;}}n++;temp >>=1;}m++;n=n-4;}//判断是否碰到右墙壁if(num>=(game_y-2)){return;}//判断方块右移途中是否碰到其他方块temp=0x8000;for (int i = x; i <x+4 ; i++) {for (int j = y; j < y + 4; j++) {if ((temp & rect) != 0) {if(data[i][j+1]==1){return;}}temp>>=1;}}//清除当前方块clear(x,y);y++;//右移一位draw(x,y);//重新绘制出向右移动后的方块}//方块进行下落if(e.getKeyCode()==40) {//下箭头对应的数值为40//判断游戏是否结束if (!isrunning) {return;}//判断游戏是否暂停if(game_pause){return;}//判断方块是否可以下落if(!canFall(x,y)){return;}//清除当前方块clear(x,y);//改变方块坐标x++;draw(x,y);//重新绘制出向右移动后的方块}}@Overridepublic void keyReleased(KeyEvent e) {}
}

其中的方块数组中的数字意义:

运行后结果:

JAVA实现经典游戏俄罗斯方块相关推荐

  1. Java语言实现经典游戏俄罗斯方块

    使用Java语言编写的经典游戏俄罗斯方块,能够调整游戏难度.加快下落速度.左右旋转方块等全部功能.(代码已集成在一个class内,如下所示,点击即可运行.内容水平有限,欢迎指正批评.) 演示视频 ht ...

  2. 【教程+源码】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏

    在飞翔的小鸟游戏中,玩家只需通过点击方向键操纵让小鸟避开绿色管道等障碍物即可继续前进.如果小鸟碰到管道,游戏立即结束. 那么如何用Java编写一款属于自己的飞翔的小鸟游戏呢?其过程并不复杂,本课程详细 ...

  3. 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目

    开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...

  4. 【java毕业设计】基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码)——俄罗斯方块游戏

    基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+swing+Eclipse的俄罗斯方块游戏GUI设计与实现,文章末尾 ...

  5. 【源码+图片素材+详细教程】Java游戏开发_Java开发经典游戏飞翔的小鸟_飞扬的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java课程设计项目

    课程目标: 1.通过本课程的学习巩固Java的相关基础知识,例如循环判断,数组和集合的使用,对象的继承,接口的实现,窗口的创建,事件监听,图形绘制. 2.完成小鸟的移动,管道自动生成.碰撞死亡,计分系 ...

  6. c语言经典案例 俄罗斯方块,C语言实现俄罗斯方块经典游戏课程设计

    C语言实现俄罗斯方块经典游戏课程设计 计算机实习报告 一.功能说明 1.1总体功能说明 本工程用C++语言实现了俄罗斯方块经典游戏. 俄罗斯方块游戏特点:俄罗斯方块的基本规则是通过键盘控制移动.旋转和 ...

  7. cocos creator经典游戏英文版《俄罗斯方块》源码H5+安卓+IOS三端源码

    cocos creator2.2.2经典游戏英文版<俄罗斯方块>源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整 ...

  8. Java Swing 经典小游戏《飞机大战》———— (四)碰撞检测 游戏状态与得分 玩家升级

    前期回顾 Java Swing 经典小游戏<飞机大战>---- (一)获取素材,创建窗口,添加滚动背景,双缓冲 Java Swing 经典小游戏<飞机大战>---- (二)玩家 ...

  9. 俄罗斯方块经典游戏——JS实现

    俄罗斯经典游戏--JS实现 想着做一个前端网页游戏,就找了一个经典小游戏俄罗斯方块.游戏的逻辑实现可以用好多种语言C ,C++,JS.因为想要运用自己上半年学过的东西实现,就选择了JS. 开发软件和前 ...

  10. java制作扫雷游戏中埋雷的难点_Java 实现经典扫雷游戏

    最后一次更新于 2019/07/08 效果演示图 Java 实现经典扫雷游戏 本扫雷游戏有以下功能: 如果点中炸弹会显示炸弹. 玩家左键点击方块能显示该方块周围会出现几个炸弹,如果不存在炸弹的话扫描范 ...

最新文章

  1. 图上的对抗与攻击精选论文列表(​2021相关论文一览)
  2. R开发(part8)--应用R语言中的函数环境空间
  3. 数学和计算机的应用视频教学反思,数学多媒体教学反思.doc
  4. 信息学奥赛一本通 1942:【08NOIP普及组】ISBN号码 | OpenJudge NOI 1.7 29:ISBN号码 | 洛谷 P1055 [NOIP2008 普及组] ISBN 号码
  5. 46 SD配置-销售凭证设置-分配状态参数文件到项目类型
  6. H264 编码+打包+解码相关知识
  7. mysql如何建立索引workbench_MySQL数据库中如何正确的理解与使用索引?
  8. Spring Cloud 是什么
  9. 去除迅雷5.9主界面广告
  10. semantic ui中文文档_一起学Vue:UI框架(element-ui)
  11. MongoDB数据库的索引操作(转)
  12. mysql 优化 (1)
  13. 团队建立伊始的混沌状态(Thinking in CTO)
  14. 注册表REG文件编写大全
  15. 丽台显卡测试软件,丽台Quadro FX4600专业显卡试用评测
  16. 2022年Google play admob AdSense 第三方收款指南
  17. ESP8266-天猫精灵(智能家居)
  18. eclipse使用技巧整理
  19. 【转】我的第一次和最后一次 Hackathon 经历
  20. AOA(Angle of Arrival,到达角)定位算法及其误差分析的原理和MATLAB仿真

热门文章

  1. 安装oracle客户端此先决条件,xp系统下oracle 11g客户端安装先决条件检查全部失败...
  2. Problem G: 切煎饼
  3. 纯平显示器_绿色计算:切换到液晶纯平显示器
  4. python数码时钟代码_micro:bit 编程模拟时钟表盘
  5. 微电子电路——PMOS网表详解
  6. PHP程序提示验证码错误的问题(输入了正确的验证码)
  7. 鹏城实验室“鲲鹏”人才引育计划(2022-2025年)
  8. python微博情感分析,Python情感分析:鹿晗的粉丝们究竟原谅他了吗?
  9. [周更]5.unity3D 三体运动(简易版)
  10. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(一)推荐系统概述...