RUSSIA RECT 全过程开发 开发讲师:龙博强.

Slides:



Advertisements
Similar presentations
3 的倍数的特征 的倍数有 : 。 5 的倍数有 : 。 既是 2 的倍数又是 5 的倍数有 : 。 12 , 18 , 20 , 48 , 60 , 72 , , 25 , 60 ,
Advertisements

Visual C++ 程序开发案例教学 教材案例9 俄罗斯方块.
UI(用户界面)集训班 Illustrator 高级班.
项目实战   --俄罗斯方块 主讲:贾宗维.
Arduino单片机—— 迷你游戏机 王睿涵 杨梦迪.
俄罗斯方块:注意观察游戏中用到的 数学的知识
Oracle数据库 Oracle 子程序.
第14章 c++中的代码重用.
在PHP和MYSQL中实现完美的中文显示
Kvm异步缺页中断 浙江大学计算机体系结构实验室 徐浩.
Hadoop I/O By ShiChaojie.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
6.4 Notification 通知栏.
Jul 2014 HEAT部署Hadoop集群
走进编程 程序的顺序结构(二).
辅导课程六.
绘制圆与多边形 椭圆形 绘制椭圆形的方法是 drawOval(x ,y , width , height), 绘制实心椭圆形的方法是
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第五讲 四则运算计算器(一) 精品教程《C#程序设计与应用(第2版)清华大学出版社 谭恒松 主编
第十章 IDL访问数据库 10.1 数据库与数据库访问 1、数据库 数据库中数据的组织由低到高分为四级:字段、记录、表、数据库四种。
《手把手教你学STM32》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司 淘宝店铺:
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
实习前你需要知道的 PRESENTED BY Yisa.
使用矩阵表示 最小生成树算法.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
宁波市高校慕课联盟课程 与 进行交互 Linux 系统管理.
程序设计工具实习 Software Program Tool
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第二章 登录UNIX操作系统.
专题作业.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
顺序表的删除.
第四章 四边形性质探索 第五节 梯形(第二课时)
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
VisComposer 2019/4/17.
实验四、TinyOS执行机制实验 一、实验目的 1、了解tinyos执行机制,实现程序异步处理的方法。
Cassandra应用及高性能客户端 董亚军 来自Newegg-NESC.
姚金宇 MIT SCHEME 使用说明 姚金宇
Aspect Oriented Programming
Lightweight Data-flow Analysis for Execution-driven Constraint Solving
本节内容 类成员的访问控制 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
_13简单的GDI绘图操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
LOGIX500软件入门 西安华光信息技术有限公司 2008年7月11日.
Chapter 18 使用GRASP的对象设计示例.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
Visual Basic程序设计 第13章 访问数据库
Touch Github = Touch the World
辅导课程十五.
北师大版四年级数学下册 图案欣赏 图案欣赏.
GIS基本功能 数据存储 与管理 数据采集 数据处理 与编辑 空间查询 空间查询 GIS能做什么? 与分析 叠加分析 缓冲区分析 网络分析
本节内容 Windows线程切换_时钟中断切换 视频提供:昆山滴水信息技术有限公司 官网地址: 论坛地址: QQ交流 :
_08文件操作 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
第六章 Excel的应用 五、EXCEL的数据库功能 1、Excel的数据库及其结构 2、Excel下的数据排序 (1)Excel的字段名行
_01自己实现简单的消息处理框架模型 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
第8章 创建与使用图块 将一个或多个单一的实体对象整合为一个对象,这个对象就是图块。图块中的各实体可以具有各自的图层、线性、颜色等特征。在应用时,图块作为一个独立的、完整的对象进行操作,可以根据需要按一定比例和角度将图块插入到需要的位置。 2019/6/30.
本节内容 如何调试驱动程序? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
使用说明书 网址: 贵阳学院智慧实验室管理平台 用户中心 使用说明书 网址:
FVX1100介绍 法视特(上海)图像科技有限公司 施 俊.
创建、启动和关闭Activity 本讲大纲: 1、创建Activity 2、配置Activity 3、启动和关闭Activity
位似.
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
任课教师:戴开宇 TA:时均帅、谭肖、王安华 程序设计B班 :20-16:50(90分钟)
第六讲 酒店客房管理系统(二) 教育部“十二五”职业教育国家规划教材
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
第三章 图形的平移与旋转.
《手把手教你学STM32-STemWin》 主讲人 :正点原子团队 硬件平台:正点原子STM32开发板 版权所有:广州市星翼电子科技有限公司
Presentation transcript:

RUSSIA RECT 全过程开发 开发讲师:龙博强

RUSSIA RECT 从什么地方入手

RUSSIA RECT 从什么地方入手 涉及的类

RUSSIA RECT 从什么地方入手 涉及的类 每个类中的方法

RUSSIA RECT 游戏的启动类 Main_MIDlet.class 紧接着我们最容易联系到的就是与显示相关的画板类

RUSSIA RECT 游戏的显示画板 GamePanel.class

void paint(Graphics g) RUSSIA RECT 游戏的显示画板 GamePanel.class void paint(Graphics g)

RUSSIA RECT 方块 Shape.class 既然是俄罗斯方块,那自然是要有方块的对象 那么方块类中都应该有什么方法呢?当然是应该存在方块移动

RUSSIA RECT 方块 Shape.class void moveDown()

void moveDown() void moveLeft() RUSSIA RECT 方块 Shape.class void moveDown() void moveLeft()

void moveDown() void moveLeft() void moveRight() RUSSIA RECT 方块 Shape.class void moveDown() void moveLeft() void moveRight() 方块有下,左,右的移动,而它是无法向上移动的,但是方块是有旋转的,所以向上键就应该承担旋转的功能

void moveDown() void moveLeft() void moveRight() RUSSIA RECT 方块 Shape.class void moveDown() void moveLeft() void moveRight() void rotate() 那么还需要什么方法呢? 是不是还需要将自己绘制出来呢?

RUSSIA RECT 方块 Shape.class void moveDown() void moveLeft() void moveRight() void rotate() void paint(Graphics g) 为什么不在GamePanle里绘制方块呢? 因为在绘制方块时,是需要知道方块的坐标等等相关信息的,那这些信息当然是在方块类自身中最容易得到。所以,绘制方块应该属于自己的功能。

RUSSIA RECT 方块 Shape.class void moveDown() void moveLeft() void moveRight() void rotate() void paint(Graphics g) 自动定时下移 不去动任务按键,方块仍然能够自动向下移动

RUSSIA RECT 图形工厂 ShapeFactory.class 在开发到一定规模时,往往需要将类与类之间的关系分融合理才能有效联系,方块类只是用于实现方块的逻辑与绘制的,并不实现自身生产方块的能力。这时我们定制一个图形工厂用于生产方块。

RUSSIA RECT 图形工厂 ShapeFactory.class Shape getShape() 方块落地后,就会成为障碍物,那么此时,我们就需要再创造一个类,名为Ground.class

RUSSIA RECT 障碍物类 Ground.class 这个类拥有什么方法呢? 它应该能够接收落地的方块,使它能够成为障碍的一部分

void accept(Shape shape) RUSSIA RECT 障碍物类 Ground.class void accept(Shape shape) 同样,它应该能够将自己显示出来

RUSSIA RECT 障碍物类 Ground.class void accept(Shape shape) void paint(Graphics g)

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel Shape Ground 这四个类应该说是平级关系,而它们之间又是如何沟通和联系呢? 首先我们看 GamePanel是用于绘制的总司令部 Ground

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel Shape 显示 Ground 那么图形工厂类是用来创造方块的 Ground

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 游戏过程中是要有用户按键的交互的 Ground

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 而且会有组织整体游戏的逻辑构架 Ground

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 还要分配绘制,以供界面显示 Ground

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 用户按键会直接控制方块的状态及位置 Ground 指配绘制

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 逻辑事件分管各个类之间的交互 Ground 指配绘制

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 Ground 指配绘制

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 Ground 指配绘制

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 指配绘制将所有需要显示的模块进行统一,然后指配显示类进行实现 Ground 指配绘制

RUSSIA RECT 类之间的关系 ShapeFactory GamePanel 生产 Shape 显示 Ground 处理按键事件 处理逻辑事件 显示 那么如此一来,我们就将最重要的中央管理类烘托出台 Ground 指配绘制

RUSSIA RECT 类之间的关系 Controller ShapeFactory GamePanel 生产 Shape 显示 处理按键事件 生产 Shape 处理逻辑事件 显示 Ground 指配绘制

RUSSIA RECT 不要和陌生人说话 图形定时下落,每下落一次后都需要生新显示 图形移动和变形后,也需要重新显示 而Shape类又不能直接操控Controller来通知GamePanle,怎么办呢? 那么我们就需要一种特殊的媒介来建立之间的联系

RUSSIA RECT 通过接口实现间接联系 Controller ShapeFactory GamePanel 生产 Shape 显示 处理按键事件 生产 Shape 处理逻辑事件 显示 通过这个接口连接Shape与Controller的关系 Ground 指配绘制 ShapeListener

RUSSIA RECT 通过接口实现间接联系 Controller ShapeFactory GamePanel 生产 Shape 显示 处理按键事件 生产 Shape 处理逻辑事件 显示 Ground 指配绘制 ShapeListener

RUSSIA RECT 项目启动 启动Eclipse,创造项目

RUSSIA RECT 项目启动 将所有涉及的类写出

RUSSIA RECT 项目启动 编写各类中的方法框架(Main_MIDlet.class)

RUSSIA RECT 项目启动 编写各类中的方法框架(Controller.class)

RUSSIA RECT 项目启动 编写各类中的方法框架(GamePanel.class)

RUSSIA RECT 项目启动 编写各类中的方法框架(Shape.class)

RUSSIA RECT 项目启动 编写各类中的方法框架(ShapeFactory.class)

RUSSIA RECT 项目启动 编写各类中的方法框架(Ground.class)

RUSSIA RECT 项目启动 编写各类中的方法框架(Ground.class)

RUSSIA RECT 项目启动 实现方块自动向下移动功能框架 1.内部类 2.继承线程接口 3.编写run()

RUSSIA RECT 项目启动 在GamePanel类中编写 方法 属性 完善paint()方法 public void display(Graphics g, Shape shape, Ground ground){} private Shape shape; private Ground ground;

RUSSIA RECT 项目启动 GamePanel.java

RUSSIA RECT 项目启动 在Controller中 加入属性

RUSSIA RECT 项目启动 在Controller中 构造方法实例化

RUSSIA RECT 项目启动 在Controller中 按键方法完善 上、下、 左、右 并与绘制连接

RUSSIA RECT 项目启动 在Controller中 继承接口ShapeListener实现方法并与绘制连接

public void addListener(ShapeListener listener) RUSSIA RECT 项目启动 在Shape中 增加方法,为实现下落移动绘制使用接口监听与 主控制类进行耦合 并增加属性,接收监听对象 在线程中加入方块下落绘制方法 编写Shape构造方法并启动线程 public void addListener(ShapeListener listener)

RUSSIA RECT 项目启动 Shape.java

RUSSIA RECT 项目启动 为实现Shape下落绘制显示,已经将Shape加入 监听能力,那么就需要修改图形工厂(ShapeFactory),让其Shape getShape()方法接收ShapeListener对象。

RUSSIA RECT 项目启动 现在就让我们回到控制台类(Controller),编写newGame()方法并生成一个Shape。 ?

RUSSIA RECT 项目启动 现在就让我们回到控制台类(Controller),编写newGame()方法并生成一个Shape。 ^.^

RUSSIA RECT 项目启动 框架搭建完毕 开始测试

RUSSIA RECT 项目启动 如何表示图形方块与障碍物

RUSSIA RECT 项目启动 可以用一个4×4的矩形方阵表示图形,并且具有多种形态

RUSSIA RECT 项目启动 可以用一个4×4的矩形方阵表示图形,并且具有多种形态 为什么要用4×4的矩形方阵?

RUSSIA RECT 项目启动 可以用一个4×4的矩形方阵表示图形,并且具有多种形态

RUSSIA RECT 项目启动 可以用一个4×4的矩形方阵表示图形,并且具有多种形态

RUSSIA RECT 项目启动 可以用一个4×4的矩形方阵表示图形,并且具有多种形态

RUSSIA RECT 项目启动 可以用一个4×4的矩形方阵表示图形,并且具有多种形态

RUSSIA RECT 项目启动 将图形与代码进行结合

RUSSIA RECT 项目启动 将图形与代码进行结合

RUSSIA RECT 项目启动 将图形与代码进行结合

RUSSIA RECT 项目启动 Shape类中应存有自身 状态并设置相应设置 方法 形态并设置相应设置

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的 决定方块种类

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的 决定方块种类

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的 决定方块种类 决定当前方块形态

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的 决定方块种类 决定当前方块形态

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的 决定方块种类 决定当前方块形态 决定当前方块形态具体信息

RUSSIA RECT 项目启动 方法的形态是由ShapeFactory决定的 决定方块种类 决定当前方块形态 决定当前方块形态具体信息

RUSSIA RECT 项目启动 在ShapeFactory->getShape()中 随机获取方块形态 设置方块形态 设置方块状态

RUSSIA RECT 项目启动 方块自身会向下移动,那么我们应该让方块身身保存位置信息

RUSSIA RECT 项目启动 方块自身会向下移动,那么我们应该让方块身身保存位置信息 用left代表方块与左边界的距离

RUSSIA RECT 项目启动 方块自身会向下移动,那么我们应该让方块身身保存位置信息 用left代表方块与左边界的距离 用top代表方块与上边界的距离

RUSSIA RECT 项目启动 方块自身会向下移动,那么我们应该让方块身身保存位置信息 用left代表方块与左边界的距离 用top代表方块与上边界的距离 图形移动就是改变left与top的值

RUSSIA RECT 项目启动 图形的绝对坐标与相对坐标

RUSSIA RECT 项目启动 编写Shape对应代码

RUSSIA RECT 项目启动 绘制方块。 主要思路是:将方阵中为1的地方画上矩形。

RUSSIA RECT 项目启动 绘制方块。 主要思路是:将方阵中为1的地方画上矩形。 图形中的格子在显示区域中的位置 X坐标: left + 格子的x相对坐标 Y坐标: top + 格子的y相对坐标 (相对坐标是格子在方阵中的坐标)

RUSSIA RECT 项目启动 图形绝对坐标和相对坐标。

RUSSIA RECT 项目启动 绘制格子的要素

RUSSIA RECT 项目启动 计算绘制格子 left

RUSSIA RECT 项目启动 编写绘制格子 循环一个矩阵 每个方块矩阵 是由4*4组成的

RUSSIA RECT 项目启动 判断矩阵中的格子是否需要绘制

RUSSIA RECT 项目启动 组合

RUSSIA RECT 项目启动 边界检测与障碍物生成 按键以后方块是否一定能移动或改变呢? 答案是:不一定

RUSSIA RECT 项目启动 边界检测与障碍物生成

RUSSIA RECT 项目启动 边界检测与障碍物生成 定义一个常量代表一行容纳的最大格子数 定义一个常量代表一列容纳的最大格子数

RUSSIA RECT 项目启动 边界检测与障碍物生成 在Shape中加入四个常量 在Shape中加入返回left,top信息方法

RUSSIA RECT 项目启动 在Ground类中 编写”是否能够 移动”方法 需要: 方块, 方块下一步要 做的状态

RUSSIA RECT 项目启动 在Shape中编写”获取是否有效方块方法”

RUSSIA RECT 项目启动 继承在Ground 类中完善isMoveable

RUSSIA RECT 项目启动 在Contorller中将isMoveable方法合理的安插进去 控制按键

RUSSIA RECT 项目启动 在Contorller中将isMoveable方法合理的安插进去 自动下落问题未被解决 解决方案:让方块线程停止 疑问: 方块线程在Shape类中,判断方块无法下落方法在Ground类中,两个类无法沟通,如何解决?

RUSSIA RECT 项目启动 在Contorller中将isMoveable方法合理的安插进去 自动下落问题未被解决 解决方案:让方块线程停止,方块生命结束 疑问: 方块线程在Shape类中,判断方块无法下落方法在Ground类中,两个类无法沟通,如何解决? 通过Controller,通过ShapeListener接口

RUSSIA RECT 项目启动 接口ShapeListener添加方法

RUSSIA RECT 项目启动 Controller类实现父类接口方法 ? ?

RUSSIA RECT 项目启动 Shape类实现方块线程控制

RUSSIA RECT 项目启动 多线程访问同一方法时,会出现数据异常问题

RUSSIA RECT 项目启动 多线程访问同一方法时,会出现数据异常问题 解决方案:

RUSSIA RECT 项目启动 多线程访问同一方法时,会出现数据异常问题 解决方案 互斥锁:保证共享数据操作的完整性。

RUSSIA RECT 项目启动 多线程访问同一方法时,会出现数据异常问题 解决方案 互斥锁:保证共享数据操作的完整性。 互斥锁标记:保证在任一时刻,只能有一个线程执 行该对象锁住的代码。

RUSSIA RECT 项目启动 多线程访问同一方法时,会出现数据异常问题 解决方案 互斥锁:保证共享数据操作的完整性。 互斥锁标记:保证在任一时刻,只能有一个线程执 行该对象锁住的代码。 Synchronized:关键字,用于标示出以某对象为”互斥锁”的代码或用于声明方法,表示整个方法为同步。

RUSSIA RECT 项目启动 我们的程序中哪个方法需要被同步呢?

RUSSIA RECT 项目启动 我们的程序中哪个方法需要被同步呢?

RUSSIA RECT 项目启动 我们的程序中哪个方法需要被同步呢?

RUSSIA RECT 项目启动 方块能否继续下落,由isShapeMoveable()决定 方块若不能继续下落需要做哪些事情?

RUSSIA RECT 项目启动 方块能否继续下落,由isShapeMoveable()决定 方块若不能继续下落需要做哪些事情? 1.将方块变为障碍物

RUSSIA RECT 项目启动 方块能否继续下落,由isShapeMoveable()决定 方块若不能继续下落需要做哪些事情? 1.将方块变为障碍物 2.生成新的方块

RUSSIA RECT 项目启动 方块能否继续下落,由isShapeMoveable()决定 方块若不能继续下落需要做哪些事情? 1.将方块变为障碍物 2.生成新的方块

RUSSIA RECT 项目启动 方块能否继续下落,由isShapeMoveable()决定 方块若不能继续下落需要做哪些事情? 1.将方块变为障碍物 2.生成新的方块

RUSSIA RECT 项目启动 方块能否继续下落,由isShapeMoveable()决定 方块若不能继续下落需要做哪些事情? 1.将方块变为障碍物 2.生成新的方块

RUSSIA RECT 项目启动 开始编写Ground中的accept()方法。 疑问:如何存储障碍物?

RUSSIA RECT 项目启动 开始编写Ground中的accept()方法。 疑问:如何存储障碍物? 分析:用一个和显示区域相对应的 二维数组 保 存障碍物的位置信息。

RUSSIA RECT 项目启动 开始编写Ground中的accept()方法。 疑问:如何存储障碍物? 分析:用一个和显示区域相对应的 二维数组 保 存障碍物的位置信息。 方案:数组中用1代表障碍物,0代表无障碍物。

RUSSIA RECT 项目启动 Ground.java 构造存入障碍物空间

RUSSIA RECT 项目启动 Ground.java 解决产生障碍物问题

RUSSIA RECT 项目启动 Ground.java 解决障碍物绘制问题

RUSSIA RECT 项目启动 Ground.java 解决方块碰到障碍物问题

RUSSIA RECT 项目启动 消行 分析:当一行中没有空白, 证明这一行是满行。

RUSSIA RECT 项目启动 消行 分析:当一行中没有 空白,证明这一行是满 行。

RUSSIA RECT 项目启动 消行 分析:当一行中没有 空白,证明这一行是满 行。 判断是否有满行 真正删除一行

RUSSIA RECT 项目启动 真正删除一行 从被删行以上所有行依次向下覆盖 最终,顶行一定是空行

RUSSIA RECT 项目启动 我们应该把它加到哪里? deleteFullLine()

RUSSIA RECT 项目启动 何时需要判断是否消行呢? 在产生障碍物时才有机会构成消行因素

RUSSIA RECT 项目启动 判断游戏是否结束 如果有的障碍物超出了上边界(容器满了),就是游戏结束

RUSSIA RECT 项目启动 判断游戏是否结束 如果有的障碍物超出了上边界(容器满了),就是游戏结束 如果第一行有障碍物,就是游戏结束

RUSSIA RECT 项目启动 判断游戏是否结束 因为是根据障碍物进行判断,所以要在在Ground中

RUSSIA RECT 项目启动 判断游戏是否结束 那又在何时调用isFull()方法呢?

RUSSIA RECT 项目启动 判断游戏是否结束 那又在何时调用isFull()方法呢?

RUSSIA RECT 项目启动 判断游戏是否结束 那又在何时调用isFull()方法呢? 如果一直产生新的图形,游戏就一直不会结束 所以要找到产生新图形的位置

RUSSIA RECT 项目启动 判断游戏是否结束 那又在何时调用isFull()方法呢? 如果一直产生新的图形,游戏就一直不会结束 所以要找到产生新图形的位置

RUSSIA RECT 项目启动 判断游戏是否结束 完善isShapemoveable方法

RUSSIA RECT 项目启动 完善游戏 用户控制方块下落也同样需要进行游戏结束判断

RUSSIA RECT 项目启动 出现BUG

RUSSIA RECT 项目启动 分析BUG 用户按下键,调用isShapeMoveable(A)当前A方块下移 A方块移动至底 =====同一时刻===== A方块线程每1秒调用一次listener.isShapeMoveable(Shape.this) Shape.this就是A 此时因为用户按下致使A方块已经变为障碍物,产生B方块 但A方块线程仍然未完毕,此时调用listener.isShapeMoveable(Shape.this) isShapeMoveable()会判断传来的Shape.this(A)已经是障碍物了 然后将this.shape作为障碍物处理,而此时的this.shape却是B

RUSSIA RECT 项目启动 解决BUG

RUSSIA RECT 项目启动 出现BUG 怎么没消掉??!!

RUSSIA RECT 项目启动 分析BUG 主要原因是由于Ground类中的判断满行。 比如y = =15,第15行满行了,则将15行消掉并且y— 而原先的14行也是满行,可将15行消掉后,原14行变为15行 而此时y == 14,已略过15行

RUSSIA RECT 项目启动 解决BUG

RUSSIA RECT 项目启动 向ShapeFactory.java中添加各种方块

RUSSIA RECT 项目结束向龙懂致敬