大一学年完成的java小游戏——俄罗斯方块,实现功能如下:
一、游戏背景
(一)欢迎界面
在游戏窗口弹出前创立一个欢迎界面的对话框,并为此窗口设置背景图片和开始按钮,主要使用JDialog类、JButton类及JPanel类和JLabel类,创建出图片标签,将按钮放在图片标签上,最后将标签放在创建的面板上,将面板添加到窗口中,实现面版层次的组合。
(背景图片及开始按钮的添加代码如下:)
(二)游戏窗口
定义Tereris类继承使用JFrame类的创建窗口的方法 initWindow,设置窗口的属性等,窗口大小设置为600*850,标题为“趣味俄罗斯方块游戏”,窗口位置为居中,窗口大小设置不可变。
(三)背景方格
使用JPanel类创建对象初始化游戏面板:设置背景方格为30行15列,为背景方格添加文本域和键盘监听事件,方格颜色为白色,游戏边界。在困难模式下,背景方格中会随机产生不能被消除的方块为固定障碍物。
(对游戏面板划分背景方格的代码如下:)
(四)背景音乐
背景音乐主要使用音频输入流AudioInputStream来读取wave.格式的音频并通过Clip接口实现播放,背景音乐的播放与暂停均作为单独函数以便在游戏暂停、继续和游戏停止时实现相应的播放和暂停效果。
(背景音乐的播放和暂停代码如下:)
(五)说明面板
1、创建说明面板:创建JPanel对象即左说明面板,设置左说明面板的行数列数为24行1列,在说明面板中添加游戏说明:
按空格键,方格变形
按左箭头,方格左移
按右箭头,方格右移
按下箭头,方格下移(即加速)
-
添加游戏状态说明、游戏分数说明,设置游戏状态、游戏分数的字体颜色为蓝色,将左说明面板添加到游戏窗口中。
-
交互式设计:在左说明面板添加了普通模式、困难模式、游戏暂停(继续)和音乐开启和关闭、退出游戏按钮,采取了由一个焦点连接的键盘按键和鼠标按钮的设计对俄罗斯方块的旋转变形、游戏模式的选择和游戏状态的改变进行控制。注意:由于javaGUI界面的监听KeyListener接口的焦点问题,添加按钮之后默认按钮为焦点。因此,键盘的控制需要先用鼠标点击游戏窗口申请焦点,每次点击按钮之后也需要点击窗口重新申请,申请一次即可连续使用键盘控制。
(六)障碍物
方格由于触碰底部边框或其他方格而停止移动后成为障碍物,形成障碍物之后,将方格对应的背景方格的文本域数字改为1(默认为零),并将背景方格更改为方块颜色。
(七)障碍物的消除
规定当背景方格中障碍物填满整行时,将此行的背景方格消除,上方障碍物按行下落覆盖。即将该行背景方格及以上行方格的文本数字改为上一行的方格的数字,并对该行及以上行按照数字重新涂色。
二、俄罗斯方块
(一)方块绘制
1、方块形状的设计及绘制原理:通过十六进制的数字来设计出4*4的16宫格,通过16宫格中每一位数字(0或1)来对方格进行涂色,将1的方格涂为蓝色,用一维数组存储22种已设计的方块形状(即相应的16进制数字),使用Random类来随机出方块的索引,绘制出对应的方块。
(二)方块下移原理
设置方块下移的初始位置,即16宫格中第一个方格的位置坐标,先判断是否可以下落,即是否触碰障碍物,若可以下落,则每隔一定时间对代表方块的16宫格进行颜色清除(变为白色),再根据下移一行后的方块坐标,遍历16宫格和对应的背景方格重新绘制出方块。
(三)方块移动速度控制
方块下移速度由线程休眠时间控制,可以解释为更新方块的时间间隔,对方块下移速度的控制也为对线程休眠时间的控制。
(四)键盘控制方块的左右移动、向下加速移动
左移则遍历16宫格中的每一个方格,将数字为1的方格左边的背景方格的文本更改为1,全部更改后,进行方格的清除和重新绘制,右移、下移原理同上。
(五)键盘控制方块的变形(即旋转)
键盘监听到“space”即将方块进行旋转,旋转原理为当前方块索引值的更改,根据当前方块旋转后的形状进行分类讨论,将旋转后对应的方块的索引值赋值给当前方块,再按索引对应的方块形状对16宫格进行清除和重新绘制。
(六)方块停止移动
遍历16宫格中的每一个方块,判断其对应的背景方格下面的一行的方块是否为障碍物,若为障碍物则将对应的背景方格改为1并重新绘制16宫格对应的背景方格。同时重新生成方块并且下落。
三、游戏状态
(一)开始游戏
变量isrunning用来判断游戏是否结束,设立永真循环,若游戏为非结束状态,继续运行游戏。
(二)暂停游戏(继续游戏)
设置布尔类型的变量game_pause,若键盘监听到暂停键或动作监听按下“游戏暂停(继续)”按钮就更改一次game_pause的值(继续游戏也即监听到两次)。
(三)困难模式
当点击困难模式的按钮时会在游戏面板上随机生成几个不可被消除的固定障碍物,这些障碍物会阻挡方块的下落,同时也会加快方块下落的速度,让玩家的思考时间减少,从而提高游戏的难度。
(四)游戏结束
当背景方格中第三行出现文本为1的方格时,将isrunning的值改为false,此时跳出游戏开始的永真循环,游戏结束。
(五)再来一局
当游戏结束之后会弹出一个再来一局的界面,此时玩家可自行选择重新进行游戏和退出游戏,若玩家选择重新进行游戏,玩家重玩一局时可刷新自己的最高分记录。
四、游戏分数
(一)消除加分机制(详见上障碍物消除)
当满足障碍物可消除时,游戏分数增加100分,相应的方块下落速度增加即减少线程休眠时间time。
(二)最高分机制
当玩家没有退出游戏,而是在游戏结束后选择再来一局时,玩家可多次进行游戏且之前的产生的最终游戏分数最高者保存到最高分里面。