Java写俄罗斯方块,了解一下

article/2025/11/2 11:06:23

Java俄罗斯方块目录:

  1. Java俄罗斯方块 ---(一)游戏场景篇
  2. Java俄罗斯方块 ---(二)游戏操作与逻辑篇
  3. Java写俄罗斯方块(完整版)

简要分析:

俄罗斯方块的规则在这里就不细说了,大家都知道,控制方块的移动,到底即停,当方块能填满一行时,便消除那一行的方块,并计分...

我们将用Swing来完成整个游戏的制作。

首先我们来看看游戏运行时的图片。

 

(游戏图片 )

 

上图是游戏制作过程中我截的一张图片,从上图中,我们可以把游戏分为多个区域:

1)正在下落的四格方块

2)下一个下落的四格方块

3)游戏有一个主场景区,即左边的网格线区域

4)计分区,暂时还没绘制

根据俄罗斯方块的规则,我们知道,一个四格方块,是可以左右和往下移动的,并且还能变换形状。

然后我们在来看一张图片:

 

(经典俄罗斯方块的方块形状)

 

从上图我们可以看出来,每个方块都由四个小方格通过不同的排列组成,并且,我们可以把游戏主场景区想象成用二维数组来表示的区域,事实上,确实是用二维数组来制作游戏主区域。

在这里,我们暂且把这个区域称为------墙(Wall)

把每个小方格称为------单元格(Cell)

每个不同的形状其实就是4个单元格按不同顺序组合而来,所以,我们可以用不同的坐标来表示不同的形状。

我们可以根据四格方块的不同形状,给他们一个名字:I,T,L,J,S,Z,O

所以,在这里我们用面向对象的思想,分别定义Cell类,和七个四格方块类。

Cell()类:

    共同特征:行号,列号,图片

    共同行为:向左,向右,向下移动,提供JavaBean相关规范,JavaBean规范就是程序员在定义类时,默认遵守的一种规范如:

  1.     添加两个构造器,无参,全参
  2. 属性一般都是私有化(封装)
  3. 提供公有(public)的get/set方法
  4. 重写toString()方法,toString方法默认返回地址信息,重写后用来描述属性的信息
  5. 重写equals方法和hashCode方法
import java.awt.image.BufferedImage;/** 俄罗斯方块中的最小单位:方格(细胞)* 特征(属性):* 		row--行号* 		col--列号* 		image--对应的图片*  行为(方法)*  	left()*  	right()*  	drop()*/
public class Cell {private int row;private int col;private BufferedImage image;@Overridepublic String toString() {return "(" + row + ", " + col + ")";}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}public BufferedImage getImage() {return image;}public void setImage(BufferedImage image) {this.image = image;}public Cell() {}public Cell(int row, int col, BufferedImage image) {this.row = row;this.col = col;this.image = image;}/*向左移动*/public void left() {col--;}/*向右移动*/public void right() {col++;}/*向下移动*/public void drop() {row++;}
}

 

根据每个四格方块的共性,即移动等。我们可以让七个四格方块继承一个父类------Tetromino类,用于描述四格方块的行为,左移,右移,下落,生成一个方块。

 

Tetromino()类代码:

共同特征:cells--四个小方块(用数组表示)--权限修饰词protected

共同行为:向左,向右,向下移动,提供JavaBean规范

添加randomOne()方法---用来随机生成一个四格方块

import java.util.Arrays;/** 四格方块* 属性:* 		--cells----四个方块* 行为:* 		moveLeft()* 		moveRight()* 		softDrop()*/
public class Tetromino {protected Cell[] cells=new Cell[4];/*四格方块向左移动* 实际上:就是每个方块向左移动*//*四格方块向左移动*/public void moveLeft() {for(Cell c:cells)c.left();}/*四格方块向右移动*/public void moveRight() {for(Cell c:cells)c.right();}/*四格方块向下移动*/public void softDrop() {for(Cell c:cells)c.drop();}@Overridepublic String toString() {return "[" + Arrays.toString(cells) + "]";}/*随机生成一个四格方块*/public static Tetromino randomOne() {Tetromino t = null;int num=(int)(Math.random()*7);//random的范围是0.00-0.99(即包含0不包含1)switch (num) {case 0:t=new T();break;case 1:t=new O();break;case 2:t=new I();break;case 3:t=new J();break;case 4:t=new L();break;case 5:t=new S();break;case 6:t=new Z();break;}return t;}
}

 

然后在创建7个小方块的类,来继承Tetromino类,也就是把他们的共同点写到一个父类中,子类在描述各自的特性。

 

根据父类Tetromino,定义出七种子类,给属性赋具体元素。

L类代码:

public class L extends Tetromino{/** 提供构造器进行初始化* L型的四格方块的位置*/public L() {cells[0]=new Cell(0,4,Tetris.L);cells[1]=new Cell(0,3,Tetris.L);cells[2]=new Cell(0,5,Tetris.L);cells[3]=new Cell(1,3,Tetris.L);}
}

其他6个按照方块所在的坐标编写,点击查看坐标,这样一来,便写好了最基本的类。

然后在创建一个主类,这个类就是游戏的入口,也是游戏的所有逻辑所在。

Tetris类代码:

提供静态属性,加载静态资源,游戏图片,场景等--静态代码块

 

  1. 面板会自动调用绘制方法paint(Graphics g)
  2. 重写paint方法,绘制图片背景,绘制网格和嵌入墙中的方块。
  3. 绘制网格和嵌入墙中的方块。paintWall(Graphics g)
        提供属性wall---是一个Cell类型的二维数组,20行,10列
        属性CELL_SIZE---一个方块的宽度
  4. 提供属性
        currentOne---正在下落的四格方块
        nextOne---下一个将要下落的四格方块
  5. 提供绘制正在下落的方块的方法
        paintCurrentOne(Graphics g)
        在重写的paint方法中取调用
  6. 编写start()方法,用于封装游戏主要逻辑
import java.awt.Graphics;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;/** 俄罗斯方块的主类:* 前提:必须是一块面板Jpanel,可以嵌入窗口* 面板上自带一个画笔,有一个功能:自动绘制* 其实是调用了JPanel里的paint()方法* * * (1)加载静态资源*/
public class Tetris extends JPanel{/*属性:正在下落的四格方块*/private Tetromino currentOne = Tetromino.randomOne();/*属性:将要下落的四格方块*/private Tetromino nextOne = Tetromino.randomOne();/*属性:墙,20行 10列的 表格  宽度为26*/private Cell[][] wall=new Cell[20][10];private static final int CELL_SIZE=26;//载入方块图片public static  BufferedImage T;public static  BufferedImage I;public static  BufferedImage O;public static  BufferedImage J;public static  BufferedImage L;public static  BufferedImage S;public static  BufferedImage Z;public static  BufferedImage background;public static  BufferedImage gameover;static {try {/** getResource(String url)* url:加载图片的路径* 相对位置是同包下*/T = ImageIO.read(Tetris.class.getResource("T.png"));I = ImageIO.read(Tetris.class.getResource("I.png"));O = ImageIO.read(Tetris.class.getResource("O.png"));J = ImageIO.read(Tetris.class.getResource("J.png"));L = ImageIO.read(Tetris.class.getResource("L.png"));S = ImageIO.read(Tetris.class.getResource("S.png"));Z = ImageIO.read(Tetris.class.getResource("Z.png"));background = ImageIO.read(Tetris.class.getResource("tetris.png"));gameover = ImageIO.read(Tetris.class.getResource("game-over.png"));} catch (Exception e) {e.printStackTrace();}}/** 重写JPanel类中的paint(Graphics g)方法* */public void paint(Graphics g) {//绘制背景/** g:画笔* g.drawImage(image,x,y,null)* image:绘制的图片* x:开始绘制的横坐标* y:开始绘制的纵坐标*/g.drawImage(background, 0,0, null);//平移坐标轴g.translate(15, 15);//绘制墙paintWall(g);//绘制正在下落的四格方块paintCurrentOne(g);//绘制下一个将要下落的四格方块paintNextOne(g);}/** 绘制下一个将要下落的四格方块* 绘制到面板的右上角的相应区域* @param g*/public void paintNextOne(Graphics g) {//获取nextOne对象的四个元素Cell[] cells = nextOne.cells;for(Cell c:cells) {//获取每一个元素的行号和列号int row = c.getRow();int col = c.getCol();//横坐标int x = col*CELL_SIZE+260;//纵坐标int y = row*CELL_SIZE+26;g.drawImage(c.getImage(),x,y,null);}}/*绘制正在下落的四格方块* 取出数组的元素* 绘制元素的图片* 横坐标x* 纵坐标y */public void paintCurrentOne(Graphics g){Cell[] cells = currentOne.cells;for(Cell c:cells){int x = c.getCol()*CELL_SIZE;int y = c.getRow()*CELL_SIZE;g.drawImage(c.getImage(),x,y,null);}}public void paintWall(Graphics a) {//外层循环控制行数for(int i=0;i<20;i++){//内层循环控制列数for(int j=0;j<10;j++){int x = j*CELL_SIZE;int y = i*CELL_SIZE;			Cell cell=wall[i][j];if(cell==null){a.drawRect(x, y, CELL_SIZE, CELL_SIZE);}else{a.drawImage(cell.getImage(),x,y,null);}}}}/** 封装了游戏的主要逻辑*/public void start() {//开启键盘监听事件KeyListener l = new KeyAdapter() {/** KeyPressed()* 是键盘按钮 按下去所调用的方法*/@Overridepublic void keyPressed(KeyEvent e) {// 获取一下键子的代号int code = e.getKeyCode();switch (code) {case KeyEvent.VK_DOWN:softDropAction();break;case KeyEvent.VK_LEFT:moveLeftAction();break;case KeyEvent.VK_RIGHT:moveRightAction();break;case KeyEvent.VK_UP:break;default:break;}//按一次重新绘制一次repaint();}};//面板添加监听事件对象this.addKeyListener(l);//面板对象设置成焦点this.requestFocus();while(true) {/** 当程序运行到此,会进入睡眠状态,* 睡眠时间为300毫秒,单位为毫秒* 300毫秒后,会自动执行后续代码*/try {Thread.sleep(300);} catch (InterruptedException e) {// 抓取打断异常e.printStackTrace();}if(canDrop()) {currentOne.softDrop();}else {landToWall();//将下一个下落的四格方块赋值给正在下落的变量currentOne = nextOne;nextOne = Tetromino.randomOne();}/** 下落之后,要重新进行绘制,才会看到下落后的位置* repaint方法,也是JPanel类中提供的* 此方法中调用了paint方法*/repaint();elimination();}}/** 使用Right键控制四格方块右移*/public void moveRightAction() {currentOne.moveRight();if(outOfBounds()||coincide())currentOne.moveLeft();}/** 使用Left键控制四格方块左移*/public void moveLeftAction() {currentOne.moveLeft();if(outOfBounds()||coincide()) {currentOne.moveRight();}}private boolean coincide() {Cell[] cells = currentOne.cells;for(Cell c:cells) {int row = c.getRow();int col = c.getCol();if(wall[row][col]!=null)return true;}return false;}public boolean outOfBounds() {Cell[] cells = currentOne.cells;for(Cell c:cells) {int col = c.getCol();if(col<0||col>9)return true;}return false;}/** 使用Down键控制四格方块的下落*/public void softDropAction() {if(canDrop()) {currentOne.softDrop();}else {landToWall();currentOne = nextOne;nextOne = Tetromino.randomOne();}}public boolean canDrop() {Cell[] cells = currentOne.cells;/* * */for(Cell c:cells) {/* 获取每个元素的行号,列号* 判断:* 只要有一个元素的下一行上有方块* 或者只要有一个元素到达最后一行* 就不能再下落了*/int row = c.getRow();int col = c.getCol();if (row==19) {//判断是否到达底部return false;}else if(wall[row+1][col]!=null) {//判断下方是否有方块return false;}}return true;}/** 当不能再下落时,需要将四格方块嵌入到墙中* 也就是存储到二维数组中相应的位置上*/public void landToWall() {Cell[] cells = currentOne.cells;for(Cell c:cells) {//获取最终的行号和列号int row = c.getRow();int col = c.getCol();wall[row][col] = c;}}/*启动游戏的入口  游戏开始*/public static void main(String[] args) {//1:创建一个窗口对象JFrame frame=new JFrame("玩玩俄罗斯方块");//创建游戏界面,即画板(面板)Tetris panel = new Tetris();//将面板嵌入窗口frame.add(panel);//2:设置为可见frame.setVisible(true);//3:设置窗口的尺寸frame.setSize(535, 595);//4:设置窗口居中frame.setLocationRelativeTo(null);//5:设置窗口关闭,即程序中止frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//游戏的主要逻辑封装在start方法中panel.start();}
}

http://chatgpt.dhexx.cn/article/PPBJ1Zs6.shtml

相关文章

Java游戏开发 —— 俄罗斯方块

引言&#xff1a; 俄罗斯方块的代码实现很简单&#xff0c;很有意思&#xff01; 思路&#xff1a; 1、创建主窗口&#xff0c;加载菜单及游戏面板。 2、在游戏面板中初始化各种参数&#xff0c;并建立各种功能组件。 3、利用paint()函数开始画方块。 4、游戏结束&#xff0c;…

Java俄罗斯方块,老程序员花了一个周末,连接中学年代!

Java俄罗斯方块&#xff0c;老程序员花了一个周末&#xff0c;连接中学年代&#xff01; 热门专栏推荐 【1】Java小游戏&#xff08;俄罗斯方块、飞机大战、植物大战僵尸等&#xff09; 【2】JavaWeb项目实战&#xff08;图书管理、在线考试、宿舍管理等&#xff09; 【3】Jav…

软件设计实战:基于Java的俄罗斯方块游戏【完整版】

个人简介 &#x1f468;&#x1f3fb;‍&#x1f4bb;个人主页&#xff1a;陈橘又青 &#x1f3c3;&#x1f3fb;‍♂️博客记录心情&#xff0c;代码编写人生。 &#x1f31f;如果文章对你有用&#xff0c;麻烦关注点赞收藏走一波&#xff0c;感谢支持&#xff01; &#x1f3…

Java实现游戏开发《俄罗斯方块》

一、用Java实现俄罗斯方块游戏&#xff1a; 1、效果图&#xff0c;如下图所示&#xff1a; 7种形态的第一种形态, 如下所示&#xff1a;分布是 &#xff1a;|、S、Z、J、O、L、T; 0 1 0 0 0 1 1 0 1 1 0 0 0 1 0 0 1 1 0 0 1 0 0 0 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 0 1 0 0 1…

俄罗斯方块游戏的设计与实现(Java+Swing+Eclipse)

目录 基于Java的俄罗斯方块游戏的设计与实现 I 摘 要 I Based on the design and implementation of Java game Tetris II Abstract II 1 绪论 1 1.1程序开发背景及意义 1 1.2开发技术概述 2 1.3俄罗斯方块游戏的研究现状 2 1.3.1 国内外研究现状 2 1.3.2 文献综述 3 2相关技术…

【Java小游戏】俄罗斯方块

文章目录 规则准备工作编写小方块类编写四方格父类创建7种不同的形状编写俄罗斯方块主类初始化7种形状 随机生成四方格创建游戏场景绘制游戏绘制游戏背景绘制游戏主区域绘制正在下落的四方格绘制下一个下落的四方格绘制游戏得分绘制游戏状态 编写游戏逻辑判断方块是否出界判断方…

Java实现俄罗斯方块小游戏。(附完整源代码)

大家好&#xff0c;我是百思不得小赵。 创作时间&#xff1a;2022 年 5 月 12 日 博客主页&#xff1a; &#x1f50d;点此进入博客主页 —— 新时代的农民工 &#x1f64a; —— 换一种思维逻辑去看待这个世界 &#x1f440; 今天是加入CSDN的第1167天。觉得有帮助麻烦&#x…

Java实现俄罗斯方块游戏(简单版)

游戏页面效果如下&#xff1a; 俄罗斯方块游戏本身的逻辑&#xff1a; 俄罗斯方块游戏的逻辑是比较简单的。它就类似于堆砌房子一样&#xff0c;各种各样的方地形状是不同的。但是&#xff0c;俄罗斯方块游戏的界面被等均的分为若干行和若干列&#xff0c;因此方块的本质就是占…

vs2019功能介绍_MFC界面库BCGControlBar v30.0新功能详解:支持VS 2019

亲爱的BCGSoft用户&#xff0c;我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.0正式发布&#xff01;新版本添加了对Visual Studio 2019的支持等。接下来几篇文章将对这个版本的新功能一一进行介绍&#xff0c;让您对BCG这个控件有一个全新的认…

MFC界面库BCGControlBar v32.0 - 网格、报表控件升级

亲爱的BCGSoft用户&#xff0c;我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v32.0正式发布&#xff01;新版本支持Windows 11、增强功能区简化模式、改进控件外观等&#xff0c;以及其他新功能和改进。需要最新版的可以点击这里【BCG下载】 BCGC…

MFC扩展库BCGControlBar :网格和报告控件

BCGControlBar ("Business Components Gallery ControlBar")是MFC扩展库&#xff0c;使您可以创建具有完全自定义选项&#xff08;功能区、可自定义工具栏、菜单等&#xff09;以及一组专业设计的丰富Microsoft Office和Microsoft Visual Studio的应用程序 GUI控件&a…

MFC界面库之BCGControlers使用

觉得默认的MFC实在是太丑了,想要用一下扩展的界面库.网上查了些资料.不过在这里我还是小结一下使用的过程吧! 1.当然是安装文件了,在上一步不用多勾选,直接按照默认的就可以了...但是要注意一定要以管理员身份运行BCGCBProBuildWizard.exe否则没有办法通过...... 2.配置lib文件…

MFC界面控件BCGControlBar v33.3 - 编辑控件功能升级

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版和BCGSuite for MFC v33.3已正式发布了&#xff0c;该版本包含了增强的Ribbon自定义、新的…

MFC界面美化

排列整齐 基于MFC编写GUI代码时&#xff0c;界面美化最基本的部分就是排列整齐&#xff0c;如果是用Visual Studio 2015 IDE 开发&#xff0c;那就十分方便了&#xff0c;在快捷功能框即有相关按钮&#xff0c;这和Qt的控件调整有些类似&#xff0c;可以有效减少我们在布局上耗…

MFC界面库BCGControlBar v30.0新功能详解:支持VS 2019

亲爱的BCGSoft用户&#xff0c;我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v30.0正式发布&#xff01;新版本添加了对Visual Studio 2019的支持等。接下来几篇文章将对这个版本的新功能一一进行介绍&#xff0c;让您对BCG这个控件有一个全新的认…

VS2017 MFC使用Skin++界面库实例(最简单的方法为自己的MFC程序换肤)

MFC的界面太丑了&#xff0c;又不想学界面设计&#xff0c;找了好多资源&#xff0c;要么各种各样的错误对于我这样的小白来说很难解决&#xff0c;要么就是使用起来太复杂&#xff0c;暂时也没有太多时间去研究&#xff0c;后来终于找到了VS2017也能用&#xff0c;简单方便的S…

MFC界面库BCGControlBar v33.0 - 全新升级Ribbon Bar、工具栏等

亲爱的BCGSoft用户&#xff0c;我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v33.0正式发布&#xff01;此版本包括对每个显示器 DPI 感知的支持、改进的信息框和桌面警报控件、主题编辑框气球工具提示和其他新功能和改进。需要最新版的可以点击这…

MFC界面库BCGControlBar的介绍

英文原文&#xff1a; http://www.bcgsoft.com/bcgcontrolbarpro.htm BCGControlBar是MFC的一个扩展库其英文全称是"Business Components Gallery ControlBar"&#xff0c;它允许你去创建像完全自定义的像Microsoft Office 2000/XP/2003/2007/2010/2013 and Visua…

MFC界面库BCGControlBar v32.2 - Ribbon Bar功能增强

亲爱的BCGSoft用户&#xff0c;我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v32.2正式发布&#xff01;新版本改进的功能区和框架标题命令搜索、带有可选复选框的网格日期选择器、带有标签的功能区滑块等&#xff0c;需要最新版的可以点击这里【B…

MFC界面库BCGControlBar v32.0 - 支持Windows 11

亲爱的BCGSoft用户&#xff0c;我们非常高兴地宣布BCGControlBar Professional for MFC和BCGSuite for MFC v32.0正式发布&#xff01;新版本支持Windows 11、增强功能区简化模式、改进控件外观等&#xff0c;以及其他新功能和改进。需要最新版的可以点击这里【BCG下载】 BCGC…