java实现俄罗斯方块

1、问题描述:

俄罗斯方块屏幕中央有一个矩形容器,程序刚开始时是空的;当鼠标单击“开始”菜单时,矩形容器内从上向下随机出现俄罗斯方块的部件。通过键盘上的左右键分别左右移动部件(一个单位),向上键顺时针旋转90度。当部件到达容器底部或已停止的部件上时,停止;当容器的同一行被部件填满时,该行消失。其他行依次向下移动。

2、设计要求:

要求设计程序输出如下:

  1. 屏幕中央有一个矩形容器,选择“开始”菜单,俄罗斯方块的部件随机产生并在容器中从上向下下落。
  2. 有七种标准俄罗斯方块部件,并随着键盘上的左右键分别左右移动,随着键盘上的向上键分别顺时针旋转90度。
  3. 当部件到达容器底部或已停止的部件上时,停止;当同一行部件完整拼接上时,该行消失,其他行向下移动,在适 当位置显示当前累计分。
  4. 当部件总行数超过矩形容器高度时,提示“游戏失败”信息并停止。

3、问题分析:

  1. 七种标准俄罗斯方块部件的建立和存储:
    每一种俄罗斯方块部件都进行拆分成一个个方块,选定一个方块作为中心点,该方块的存储坐标为(0,0),其余的方块以中心点为标准存储坐标,把这个部件的各个方块的坐标存储到一个自定义类 B l o c k s Blocks Blocks B l o c k s Blocks Blocks类把各个坐标存储到 P o i n t Point Point对象中),再把所有7种部件的 B l o c k s Blocks Blocks对象存储到 B l o c k s Blocks Blocks数组中备用。

  2. 俄罗斯方块部件的控制:
    首先用 j a v a . a w t java.awt java.awt包下的画笔 G r a p h i c s Graphics Graphics根据该俄罗斯方块部件的各个方块的 P o i n t Point Point对象画在面板上;对于部件的左右向下移动,设置鼠标监听器和键盘监听器,监听获取偏移量,使部件整体移动,在重新画在面板上,而对于部件的自动掉落用无限循环的线程执行不断画即可;对于部件的旋转,根据三角函数可以得出一个公式,部件经过90°旋转,坐标x标变为原来y坐标的负值(即-y),坐标y变为原来x坐标的x值,因此,旋转只需要根据公式改变该部件各个方块的坐标,再重新画在面板上即可。当然还要注意边界问题,旋转之前先检测是否越界,才决定能否旋转,不止是边界还有相邻的方块不能重叠,所有旋转前还需要检测是否和其他部件重叠再决定是否旋转。

  3. 俄罗斯方块的计分和结束:
    保存以前的俄罗斯方块部件采用的二维数组存储。在面板对应的位置有部件存在则在二维数组对应的位置的值设为对应部件的编号,反之为0,每重画一次面板都会先访问这个二维数组再根据偏移量,画出这一次之前的所有方块部件和画这次的方块部件;主要一行都有方块则得分,即二维数组中只要有一(多)行都是非0值就得分并消除这一行(也可以多行),消除的方法是把数组的值整体移动到下一(多)行,再重画;结束就是二维数组只要有一列都是非0值则游戏结束,此时的得分就是你最终的分数。

  4. 俄罗斯方块的登录和荣誉榜
    本项目运用到了轻量级数据库 s p l i t e splite splite,玩家可以注册登录用户,不登陆就开始游戏的玩家默认为未知玩家;登录页面首先会检测当前的昵称是否有存在,要是存在当前昵称,则输入密码登录,反之注册;玩家进行游戏直到游戏结束的最终得分会根据你的当前用户然后把存到数据库中,然后用画笔画在荣誉榜上;荣誉榜会取数据库中的分数前四名进行展示;为了不出现多用户的冲突需要用到 s y n c h r o n i z e d synchronized synchronized同步。

  5. 俄罗斯方块的下一个展示和游戏暂停与继续
    游戏的下一个展示就是把下一个俄罗斯方块部件准备好再画再提示区;游戏的暂停就是让线程不做任何操作,继续就是恢复该项目的“游戏中”的状态。

4、概要设计

在这里插入图片描述
在这里插入图片描述

  1. 用了MVC架构
  2. 用了三种设计模式
    1)模板方法模式 I m a g e B u t t o n ImageButton ImageButton
    2)单例模式 A l e r t D i a l o g AlertDialog AlertDialog
    3)策略模式 C h a n g e r Changer Changer
  3. s p l i t e splite splite数据库

5、详细设计

controller

在这里插入图片描述

1)Operation

俄罗斯方块部件的操作(左、右、下、旋转、开始游戏和登录)

2)OpButton

按键的监听实现

3)AutoDown

俄罗斯方块部件的自动下落

4)GameMain

主函数,对俄罗斯方块运行的初始化,线程的运行


Model

在这里插入图片描述

1)GameData

旋转时条件的检测,保存之前的俄罗斯方块部件,边界移动限制,消除行的检测和实现

2)PlayData

数据库splite的连接,数据的读写,游戏用户的昵称、密码和分数存储,分数的取出

3)Blocks

俄罗斯方块各个部件的存储数据结构


view

在这里插入图片描述

1)LoginChange

登录注册弹窗页面的设置,登录和注册的状态

2)OverChange

游戏结束的弹窗页面设置

3)MainWin

主页面的游戏区、荣誉榜、提示区、得分区和控制区以及各个按钮的设置

4)AlertDialog

登录注册弹窗页面的开启关闭控制,游戏结束提示弹窗页面开启关闭控制

5)StaticPanel

主页面的渲染

6)ScoreNext

提示区的实现

7)GamePanel

游戏区俄罗斯方块的绘制

8)PlayerPanel

荣誉榜数据的绘制

9)ImgButton

按钮的美化

6、运行演示

1、数据库 p l a y e r player player p l a y e r s players players
在这里插入图片描述

2、俄罗斯方块的部件可以用鼠标控制也可以用键盘控制
鼠标控制:开始按钮上的四个按键
键盘控制:左键右键控制左右、下键控制向下、上键控制旋转
在这里插入图片描述

3、点击登录按钮
在这里插入图片描述

4、登录界面
在这里插入图片描述

5、注册玩家1
在这里插入图片描述

6、表 p l a y e r s players players数据
在这里插入图片描述

7、结束游戏,玩家1分数为0
在这里插入图片描述

8、荣誉榜取表分数前四名玩家信息
在这里插入图片描述

9、点击登录按钮
在这里插入图片描述

10、密码错误
在这里插入图片描述

11、重新开始游戏
在这里插入图片描述

12、暂停后可继续
在这里插入图片描述

13、消除一行,现在分数为10
在这里插入图片描述

14、游戏结束,玩家1分数为10
在这里插入图片描述

15、荣誉榜刷新
在这里插入图片描述

16、注册玩家2
在这里插入图片描述

17、
在这里插入图片描述

18、游戏结束,玩家2分数为20
在这里插入图片描述

19、数据库更新
在这里插入图片描述

20、荣誉榜更新
在这里插入图片描述

Supongo que te gusta

Origin blog.csdn.net/weixin_45920385/article/details/122265260
Recomendado
Clasificación