OOP面向对象编程之俄罗斯方块项目实现过程

这是用纯java编译的俄罗斯方块,讲这个游戏的是达内的刘苍松老师,苍老师讲课我们学生都比较喜欢,下面我把当时的做这个游戏学习笔记分享给大家,先看下游戏截图:

 

 

重点学习笔记:

Tetris 俄罗斯方块
Tetromino 四格方块

业务需求(清晰明确) -> 业务对象模型(理清对象关系)->
数据建模(用数据表达对象,和对象的关系)-> 类的设计->
概要编码(语法知识)-> 详细功能设计(语法知识)->


1 明确业务需求
  用自然语言,将业务功能描述清楚

俄罗斯方块的基本规则:
1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:
行宽为10,列高为20,以每个小正方形为单位。
2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,
中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的
形状来命名。
I:一次最多消除四层
J(左右):最多消除三层,或消除二层
L:最多消除三层,或消除二层
O:消除一至二层
S(左右):最多二层,容易造成孔洞
Z (左右):最多二层,容易造成孔洞
T:最多二层

(1)玩家操作有:旋转方块,以格子为单位左右移动方块,
让方块加速落下。
(2)方块移到区域最下方或是着地到其他方块上无法移动时,
就会固定在该处,而新的方块出现在区域上方开始落下。
(3)当区域中某一列横向格子全部由方块填满,则该列会消
失并成为玩家的得分。同时删除的列数越多,得分指数上升。
(4)当固定的方块堆到区域最上方而无法消除层数时,则游
戏结束。
(6)一般来说,游戏还会提示下一个要落下的方块,熟练的
玩家会计算到下一个方块,评估要如何进行。由于游戏能不断
进行下去对商业用游戏不太理想,所以一般还会随着游戏的进
行而加速提高难度。
(7)预先设置的随机发生器不断地输出单个方块到场地顶部


2 业务分析
  找到有哪些业务对象根据图片的分析
 
  tetris(俄罗斯方块)
    |-- score 累计分数
    |-- lines 销毁的行数
    |-- wall(墙 20行X10列)
    |    |-- 20row(行)
    |         |-- 10 col cell(列)
    |-- tetromino 正在下落的(4格方块,有7种形态)
    |      |-- 4 cell
    |-- nextOne 下一个准备下落的方块
           |-- 4 cell

3 数据模型, 一切业务对象转换为数字表示 
  场地按照行列划分为 20×10格子
   格子有属性row, col, color
  
  
4 类的数据结构设计
 package com.tarena.tetris
 
   Cell 格子
     |-- int row 行
     |-- int col 列
     |-- Image image 贴图
  
   Tetromino 四格方块 有7个子类
     |-- Cell[] cells 包含4个格子
         
   Tetris 俄罗斯方块 继承于 JPanel
     |-- int score
     |-- int lines
     |-- Cell[][] wall = new Cell[20][10]
     |-- Tetromino tetromino
     |-- Tetromino nextOne

随机生产4格方块: 使用简单工厂方法模式.

绘制软件的界面

    
5 数据的初始化(构造器)

6 详细功能设计(动作, 方法)
 
  右移动流程设计
   1) 先向右移动一步
   2) 检查是否移出边界(子功能/子方法)
   3) 如果移出边界, 再向左移动一步
   4) 重写绘制界面
   实现:
   在Tetris类中添加方法 moveRightAction() 因为Tetris
   包含 需要用到数据, 如墙的边界.
  
   检查是否移出边界(子功能/子方法)
   outOfBounds()
  
  下落功能设计
  (1) 获取键盘事件: 绑定在下箭头按下时候执行下落动作
     利用Java Swing 提供的键盘监听器API来处理.
    
  (2) 在4格方块上添加下落动作(方法), 利用算法实现方块位置
    的变化(row 和 col 的变化)
   
  (3) 调用界面的重绘方法, 按照新数据(变化以后的行列数据)
    重新绘制界面 repaint(), repaint()会尽快调用paint方法
 
  1) 完善是下落流程控制
    边界检查, 着陆到墙上, 消除满行并记分, 游戏结束检查
    重合检查
  
   下落流程功能描述:
   1) 如果能够下落(canDrop())就下落一步
   2) 如果不能下落就着陆到墙中(landToWall())
   3) 着陆以后要消除(destroyLines())满行并且记分
   4) 游戏结束检查
   5) 生成下一个方块
      
  下落功能: Tetris类中添加方法: softDropAction()
    if(canDrop()){
     tetromino.softDrop();
    }else{
     landToWall();
     destroyLines();
     checkGameOver();
     tetromino = nextOne;
     nextOne = randomOne();
    }
 
  加速落下
   
  2) 旋转流程实现
   1) 处理键盘事件
   2) 执行旋转流程
     流程包括, 先旋转,
     检测是否出界和重合
     转回去.
    
   详细设计: 在 Tetromino 类上添加
      rotateRight()
      rotateLeft()
     
   在Tetris 上添加 rotateRightAction()
  
   
  3) 开始流程 Tetris 上添加startAction()
    3.1) 清空墙
    3.2) 清理分数
    3.3) 初始化方块
    3.4) 初始结束状态
 3.5) 启动定时器 执行下落流程
    
  4) 暂停流程 Tetris 上添加pauseAction()
    4.1) 取消定时器
    4.2) 设置暂停状态
 
  5) 继续流程 Tetris 上添加continueAction()
    5.1) 取消暂停状态
    5.2) 启动定时器
 
  6) 检查结束游戏流程 Tetris 上添加checkGameOver()
    6.1) 检查是否结束
    6.2) 如果结束就取消定时器
    6.3) 设置结束状态
 
  7) 游戏状态显示 更新paintScore()
   7.1) 根据暂停状态显示 继续/暂停
   7.2) 根据结束状态, 显示结束状态. 

7 界面绘制(利用Java Swing API实现)
  根据数据,绘制界面
  如:
    创建墙的数据, 再绘制墙
    有正在下落的方块对象, 才能绘制 下落的方块

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值