java写俄罗斯方块难吗_用JAVA写的俄罗斯方块

业务需求->业务对象模型(对象关系)->数据建模->类的设计->概要编码->详细功能设计

基本规则:

1)俄罗斯方块都是由一个个Cell构成的:

行宽:10,列高:20,以每个小正方形为单位

2)其次,所有的俄罗斯方块都是一组由4个小型正方形组成的规则图形Tetromino

分别为:S、Z、L、J、I、O、T这几种

数据结构设计:

Cell     格子

|--     int row 行

|--     int col 列

|--     Image image 贴图

Tetromino     四格方块,有7个子类

|--     Cell[] cells     包含4个格子

Tetris     俄罗斯方块

|--     int score     分数

|--     int lines      行数

|--     Cell[][] wall = new Cell[20][10]     20*10的墙

|--     Tetromino tetromino     正在下落的方块

|--     Trtromino nextOne        下一个下落方块

其次是功能:

下落移动功能

旋转流程

定时自动下落

暂停

继续

结束游戏

算法设计:

4格方块的初始形态:I S Z J L T O

就在初始数据的数值状态设计

四格方块的下落计算: 就是将每个格子的row+1

四格子方块的左右移动计算:就是将每个格子的col+1或col-1

下落流程控制:控制方块下落与墙之间的控制关系

1) 如果"能够下落", 就下落一步

2) 否则就"着陆到墙里面"

3) 着落以后, "销毁充满的行", 并且记分

4) 检查游戏是否结束

5) 如果没有结束,还能玩,就生成下一个方块

分数计算

界面的绘制

键盘事件控制

旋转流程控制

加速下降流程控制

记分

开始流程控制(Timer)

主刷新(Timer)频率: 1/100 秒

0.5秒执行一次下落(是主刷新的50倍)

利用定时器定时的调用 下落流程

如果暂停时候, 就不执行下落流程来

实现过程:

1) 在Tetris类中添加属性 Timer, 用于启动主刷新频率

2) 在Tetris类中添加属性 level 是下落的间隔次数

如: 50 表示50次刷新以后,执行一次 下落, 如果减少,

加快下落

3)  在Tetris类中添加属性 stepIndex 是下落计数

每当 stepIndex % level == 0 时候 执行一次 下落

4) 在Tetris类中添加属性  pause 暂停执行状态控制

5) 在action() 方法添加主刷新Timer的启动

在主刷新中 添加代码 控制下落

绘制背景图片

1) 在Tetris类中声明静态变量 background

2) 使用静态代码块 加载磁盘文件到内存对象

将使用到 图片读取API: ImageIO

3) 在paint 方法中绘制背景图片

绘制 正在下落的方块

1) 先在action方法中生产 正在下落的方块和下一个方块

2) 在paint方法中调用 paintTetromino()方法

3) 在Tetris类中 增加paintTetromino()方法

将正在下落的4格方块的每个格子逐一绘制出来

使方块移动

1) 处理键盘事件(API), 获得用户何时按下 -> 

2) 当按下 -> 按键时候, 执行当前4格方块 向右移动 方法

3) 向右移动 方法 会改变当前4格方块的每个格子的列坐标

4) 调用继承于JPanel类的 repaint(), 这个方法会尽快的

调用 paint()

5) paint() 会根据当前数据(已经被右移动改变的数据)

绘制全部面板效果

以下是源码:

Cell.java(格子类)

1 packagecom.timmy.tetris;2 importjava.awt.Image;3 public classCell {4 /**

5 *一个格子6 */

7 private introw;8 private intcol;9 privateImage image;10 public Cell(int row,intcol,Image image){11 this.row =row;12 this.col =col;13 this.image =image;14 }15

16 //toString打印行列,方便调试

17 publicString toString(){18 return "["+row+","+col+"]";19 }20

21 public voiddrop(){22 row++;23 }24

25 public voidmoveLeft(){26 col--;27 }28

29 public voidmoveRight(){30 col++;31 }32

33

34 public void setRow(introw){35 this.row =row;36 }37

38 public intgetRow(){39 returnrow;40 }41 public intgetCol() {42 returncol;43 }44 public void setCol(intcol) {45 this.col =col;46 }47 publicImage getImage() {48 returnimage;49 }50 public voidsetImage(Image image) {51 this.image =image;52 }53 }

Tetromino.java(四格方块类)

1 packagecom.timmy.tetris;2 importjava.util.Random;3 //抽象类

4 public abstract classTetromino {5 /**

6 * 四格方块类7 */

8 //是留给子类的,所以用保护

9 protected Cell[] cells = new Cell[4];10 protected State[] states;//旋转状态

11

12 /**私有构造器ÿ

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值