作业帮 > 字数作文 > 教育资讯

俄罗斯方块

来源:学生作业帮助网 编辑:作业帮 时间:2024/09/27 07:17:23 字数作文
俄罗斯方块字数作文

篇一:俄罗斯方块游戏设计

韶关学院

专业核心技能训练VI

(论文)

俄罗斯方块游戏设计

摘要:该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以

通过键盘控制在游戏区中堆积软件随机提供的7种类型方块,在游戏区堆满一行后,自动消除并记分。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级跟高级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。

关键词:方块;视窗操作系统;游戏;速度;分数 1. 前言

随着社会发展,人类的生产、生活越来越离不开信息。谁拥有了更多更有效的信息,谁就将在竞争中处于有利地位。信息产业正在成为一个国家的支柱。只有拥有了先进的数据库技术,才能有效地管理好浩如烟海的数据,并从中提取出对自己有用的信息来加以利用。

作为计算机应用的一部分,使用计算机对信息进行管理,具有手工管理所无法比拟的优点.例如:检索迅速、查找方便、可靠性高、存储量大、保密性好、寿命长、成本低等。这些优点能够极大地提高管理的效率,也是正规化管理,与世界接轨的重要条件。

在下面的各章中我们将以开发一个俄罗斯方块游戏为例,谈谈其开发过程和所涉及到的问题及解决方法。

2. 需求分析

2.1系统概述 2.1.1概述

该游戏软件在Windows系统为玩家提供传统俄罗斯方块游戏的基本功能,玩家可以通过键盘控制在游戏区中堆积软件随机提供的由四个小方块不同组合的7种类型不同颜色的方块,每个小方格的颜色也是随机的,并且在整个下落的过程中,其颜色也呈动态变化。游戏过程中,每在游戏区堆满一行后,自动消除并记分。同时消去的行数越多,那一次性所加的分数也就越多。一行是100,两行是300,三行是600,四行是1000分。为了得到更多的分,那么我们游戏者就要想办法一次尽可能多的消去方块。当游戏区不能再堆积新来的方块时,游戏结束。游戏设定3个级别,初级,中级和高级,级别越高,方块下降的速度越快、难度越大,玩家可以根据自己的需要自由设定初始游戏级别,达到最高级别时不再增加。游戏以最终玩家获得的分数来判断玩家水平的高低。游戏为对战型俄罗斯方块,玩家依靠自己消层和使用道具来打击对手。当玩家游戏池中的砖块累积到顶端时游戏失败。

2.2系统运行环境 2.2.1运行环境

(1)硬件环境。本系统适用于那种Inter386以上计算机,内存容量为128M,应配备,键盘,鼠标,显示器等外部设备。

(2)软件环境。本系统的设计采用Visual C++6.0编写。在Windows XP SP2环境下测试通过

(3)本游戏软件在Windows平台下都可以运行。 2.3功能需求描述 2.3.1功能需求

这是一次尝试,一个比较成功的设计,其精彩的算法与漂亮的程序结构足以让人兴奋了。

这个游戏,不仅可以满足游戏爱好者对游戏的要求,同时我们增加了美观因素,让游戏有一个比较美观的界面,满足我们游戏爱好者的视觉要求。 这有别于常规的俄罗斯方块算法,游戏中,玩家依靠自己消层来得分。当玩家游戏池中的砖块累积到顶端时游戏失败。

3. 总体设计

3.1开发与设计的总体思想 3.1.1屏幕的组成

一个游戏一定要有一个界面供游戏者对游戏控制。

这个界面中要包含让游戏者更加清楚游戏状态的信息,比如,一个方块在下落过程中,它的位置如何,形状是怎么样的,要如何放置这个方块,以及下一个方块是什么形状,这样关系着游戏者要如何放置方块,让整体有个更加的布局,有利于游戏的进行。屏幕由20行13列的网格组成;其中0~2行:初始的形状将在这里形成然后下落,这三行用户不可见;3~19区域;20,其标记已到屏幕底部。在界面的右边就是相关的游戏信息,级别控制,开始游戏控制,背景色的选择,当前方块的坐标,组型,颜色及类型(ZZ表示)以及目前的得分情况,下一个预览方块,鼠标控制信息(变形,左移,右移和加速下落),收埋信息(分别向上,下,左和右收埋,及结束游戏收埋,这时将显示版权信息)。

3.1.2形状的组成

每一种形状都是由四个方块组成,比如■■■■由四个方块横向排列而成

3.1.3形状的统一

■■■■等共19种形状(旋转前后的形状归为不同的形状),虽然在玩游戏时我们会去将各种不同的形状有个不同的命名(比如“条子”,“方块”等),但在设计游戏是它们却是统一的,它们都是“形状”。这一点是游戏成功的基础。

为了使各种不同的形状达到统一的设计,我设计了如下解决方案:将形状始终放在4×4的格子中,以该4×4格子的第一个格子为“基础点”,只要给出组成形状的四个块相对于该基础点的相对坐标。

★□□□ ★为基础点,形状各块的相对坐标是相对于这个基础点的 □□□□ □□□□ □□□□

那么■■■■在其中就如图:其四个方块相对于基础点的网格坐标就为 (0,2)(1,2)(2,2)(3,2) □□□□ □□□□

■■■■ 02122232 □□□□

我们将用一个int[8]记录下这四个相对坐标值 同理: □□□□ □□□□ ■■□□

■■□□ 02120313

这样,我们只要知道某个形状的相对坐标值数组,就可以轻松地求出它的各方块的排列方式,也就是其形状(样子)。

3.1.4移动与旋转的统一

从上面我们可以看出形状的移动可以这样来实现: 移动基础点的网格坐标,然后组成形状的四个方块按照其与基础点坐标的相对值而改变网格坐标,则表现为移动。

旋转与移动的原理一样:设旋转前的形状为ZZ = 0,旋转后的形状为ZZ=1,组成形状A的四个方块按照B(而不是按照A)的相对于基础点坐标的相对值而改变网格坐标,则表现为旋转。比如: □□□□ □□□□

■■■■ 02122232 □□□□

移动: 设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。如果其向左移动一格,那么它的基础了坐标gX-=1; gY=gY; 其各方块移动后坐标 (gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。

旋转:设其基础点网格坐标为(gX,gY),其各方块当前坐标(gX+0,gY+2), (gX+1,gY+2), (gX+3,gY+2), (gX+3,gY+2)。如果其旋转一次,旋转后的形状如图: □■□□

□■□□ 10111213 □■□□ □■□□

那么其旋转后的各方块坐标 (gX+1,gY+0), (gX+1,gY+1), (gX+1,gY+2), (gX+1,gY+3) 如果我们将各形状编号,比如■■■■编号0,其旋转90度以后的形状为编号1 那么0旋转目标为1,1的旋转目标为0 所以所有形状便得到了统一,如图形状

□□□□ □■□□ □□□□ □■□□ ■■■■ □■□□ □□□□ □■□□

□□□□ □□□□ □□□□ □□□□ ■□□□ □□□□ ■■□□ □□■□ ■□□□ ■■■□ □■□□ ■■■□ ■■□□ ■□□□ □■□□ □□□□

□□□□ □□□□ ■■□□ ■■□□

□□□□ □□□□ □■□□ ■■□□ ■■□□ □■■□ ■□□□ □□□□

□□□□ □□□□ □□□□ □□□□ □■□□ ■□□□ □■■□ □□□□ □■□□ ■■■□ □■□□ ■■■□ ■■□□ □□□□ □■□□ □□■□

□□□□ □□□□ ■□□□ □■■□ ■■□□ ■■□□ □■□□ □□□□

□□□□ □□□□ □□□□ □□□□ □■□□ □■□□ □□□□ □■□□ ■■■□ □■■□ ■■■□ ■■□□ □□□□ □■□□ □■□□ □■□□

4. 概要设计

4.1数据流图

据流图是对系统数据流向的一种描述,并从本质上让程序的使用者,大致了解系统的使用方法。本俄罗斯游戏的大致流程图如下:

篇二:俄罗斯方块

河南城建学院

《JAVA基础》课程设计

设计说明书

课程名称: 《JAVA基础》课程设计

设计题目:

指导教师: 陈红军 崔雪冰

班 级: 学 号:

学生姓名: 同组人员:

计算机科学与工程学院

2015年1月9日

目 录

第1章 选 题 ............................................................................................................................... 2

1.1 题目背景 ............................................................................................................................... 2

1.2系统实现的具体分工 ........................................................................................................... 3

1.2.1 选题 ............................................................................................................................. 3

1.2.2 团队分工 ..................................................................................................................... 3

1.3开发环境 ............................................................................................................................... 3

第2章 设计内容 ........................................................................................................................... 3

2.1实现功能 ............................................................................................................................... 3

2.2 概要设计(涉及类的框图) ............................................................................................... 5

2.3 界面设计 ............................................................................................................................... 6

第3章 系统实现 ......................................................................................................................... 11

3.1 涉及知识点 ......................................................................................................................... 11

3.2 系统运行(主要运行界面抓图) ..................................................................................... 12

3.3 源程序清单(关键代码) ................................................................................................. 12

第4章 测试与实验结果 ............................................................................................................. 22

第5章 结束语 ............................................................................................................................. 23

参考文献 ....................................................................................................................................... 24

第1章 选 题

1.1 题目背景

本题目将设计一个俄罗斯方块。它是一款风靡全球的电视游戏机游戏和掌上游戏机游戏,由俄罗斯人阿列克谢.帕基特诺夫发明,由此得名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除满行得分。由于上手简单、老少皆宜,从而家喻户晓,风靡世界。其主要运用的设计方法有:

(1)游戏主方法的设计

在主方法中首先为ERS_Block 建立一个对象ers且将游戏的界面命名为 “俄罗斯方块游戏”,然后为框架添加了一个窗口事件类WindowListener监听器。

(2)游戏信息窗体的设计

在本游戏右边信息窗口中设计了分数、级数2个标签和对应的2个文本框以及开始游戏、提高等级、降低等级、游戏暂停和退出游戏五个命令按钮。

(3)方块形状与画方块的设计

在Block这个类首先定义一个二维数组pattern[][]存储方块的不同形状,并用16进制表示其中一共包含了7种不同的形状的方块图形,分别是‘一’字形,“Z”字形,反“Z”字形,“L”字形,反“L”字形,田字形以及“T”字形,每种形状的方块可以以90度为单位发生翻转形成反向的方块图形。

(4)满行删除方法的设计

设计成功的俄罗斯方块游戏,必须要达到在方块满行的实现消去满行的功能,在这里利用设计的deleteFullLine()方法来实现此功能,并在此同时实现分数的增加。

(5)方块翻转的设计

在Block类中定义一个无返回值的方法leftTurn( )实现方块的翻转,在leftTurn( )方法体中使用if条件判断,在条件当中调用判断是否正确的方法assertValid( ),在此方法中包含了四个参数分别为方块类型,方块的翻转状态以及方块的横坐标和纵坐标。

(6)方块移动的设计

在此功能中实现产生的每个的方块的移动的方法分为左移、右移和下落三种方法,在leftMov( )方法体中使用if条件判断,在条件当中调用判断是否正确的方法assertValid( ),在此方法中包含了四个参数分别为方块类型,方块的翻转状态以及方块的横坐标和纵坐标。

(7)实现按钮功能方法的设计

按钮功能的方法的实现首先定义一个方法actionPerformed(),在方法体内定义一个switch分支结构选择执行相应的功能,用case进行选择。

1.2系统实现的具体分工

1.2.1 选题

在个人电脑日益普及的今天,一些有趣的桌面游戏已经成为人们在使用计算机进行工作或学习之余休闲娱乐的首选,而俄罗斯方块游戏是人们最熟悉的小游戏之一,它以其趣味性强,易上手等诸多特点得到了大众的认可,因此开发此游戏软件可满足人们的一些娱乐需求。

此俄罗斯方块游戏可以为用户提供一个可在普通个人电脑上运行的,界面美观的,易于控制的俄罗斯方块游戏。

1.2.2 团队分工

表1.1 项目分工一览表

1.3开发环境

编程工具:JDK+ECLIPSE(+MySQL)

计算机:PC

操作系统:Microsoft Windows 7.0

第2章 设计内容

2.1实现功能

(1)显示游戏的方块形状

游戏玩家打开游戏界面,点击开始游戏,便会在游戏整个界面的左面依次显示不同

形状的方块。

图一:俄罗斯方块类型图

(2)显示方块的移动

游戏玩家可根据自己的想法,来改变游戏界面上方出现的方块的位置,使其达到满行消除的结果

图二:俄罗斯方块状态图

篇三:俄罗斯方块

俄罗斯方块代码:

package com.tarena.tetris;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.util.Arrays;

import java.util.Timer;

import java.util.TimerTask;

import javax.imageio.ImageIO;

import javax.swing.JFrame;

import javax.swing.JPanel;

/**

* 俄罗斯方块

*/

public class Tetris extends JPanel {

private int score;// 分数

private int lines;// 销毁的行数

private Cell[][] wall;// 背景墙

private Tetromino tetromino;// 正在下落的四格方块

private Tetromino nextOne;// 下一个四格方块

/** 背景图片 */

private static BufferedImage background;

private static BufferedImage overImage;

public static BufferedImage T;

public static BufferedImage S;

public static BufferedImage I;

public static BufferedImage L;

public static BufferedImage J;

public static BufferedImage O;

public static BufferedImage Z;

public static final int ROWS = 20;// 背景墙的行数

public static final int COLS = 10;// 背景墙的列数

// 将图片素材, 复制到 com.tarena.tetris包中.

/** 使用静态代码块加载静态的图片 */

static {

try {

// Tetris.class的同一个包中找 "tetris.png"

background = ImageIO.read(Tetris.class.getResource("tetris.png"));

overImage = ImageIO.read(Tetris.class.getResource("GAMEOVER.png")); T = ImageIO.read(Tetris.class.getResource("T.png"));

I = ImageIO.read(Tetris.class.getResource("I.png"));

S = ImageIO.read(Tetris.class.getResource("S.png"));

Z = ImageIO.read(Tetris.class.getResource("Z.png"));

J = ImageIO.read(Tetris.class.getResource("J.png"));

L = ImageIO.read(Tetris.class.getResource("L.png"));

O = ImageIO.read(Tetris.class.getResource("O.png"));

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* JPanel paint() paint画 重写 paint() 修改原有的绘制方法

**/

@Override

public void paint(Graphics g) {

// 画背景, 画墙, 画正在下落的方块 画下一个方块...

g.drawImage(background, 0, 0, null);

g.translate(15, 15);// 坐标系平移

paintWall(g);// 画墙

paintTetromino(g);// 绘制正在下落的方块

paintNextOne(g);//绘制下一个要下落的方块

paintScore(g);//绘制分数

if (gameOver) {

g.drawImage(overImage, 0, 0, null);

}

}

/** 在Tetris 添加启动方法 action() */

public void action() {

wall = new Cell[ROWS][COLS];

startAction();

//wall[2][2] = new Cell(2, 2, T);

tetromino = Tetromino.randomOne();

nextOne = Tetromino.randomOne();

// 处理键盘按下事件, 在按下按键时候执行下落方法

KeyAdapter l = new KeyAdapter() {

@Override

// key 按键 Pressed按下了

public void keyPressed(KeyEvent e) {

int key = e.getKeyCode();// [c]

if (key == KeyEvent.VK_Q) {//Q表示退出

System.exit(0);// 结束Java进程

}

if (gameOver) {

if (key == KeyEvent.VK_S) {//S表示开始

startAction();

repaint();

}

return;

}

if (pause) {// pause = true

if (key == KeyEvent.VK_C) {//C表示继续 continueAction();

repaint();

}

return;

}

switch (key) {

case KeyEvent.VK_DOWN://向下箭头表示下落 softDropAction();

break;

case KeyEvent.VK_RIGHT://向右箭头表示右移 moveRightAction();

break;

case KeyEvent.VK_LEFT://向左箭头表示左移 moveLeftAction();

break;

case KeyEvent.VK_SPACE://空格键表示自由下落 hardDropAction();

break;

case KeyEvent.VK_UP://向上箭头表示右旋转 rotateRightAction();

break;

case KeyEvent.VK_P://按键盘上的P表示暂停 pauseAction();

break;

}

repaint();// 再画一次!

}

};

// 下落流程: 监听键盘事件->如果下箭头按下-> // 执行下落算法tetromino.softDrop()->

// 修改每个格子对象的数据->调用repaint()->

// 尽快调用paint()->paint方法会根据当前的数据 // 重新绘制界面 -> 看到移动以后的方块了

// 绑定事件到当前面板

this.requestFocus();

this.addKeyListener(l);

}

public static final int FONT_COLOR = 0x667799;

public static final int FONT_SIZE = 30;

/**

* 绘制分数

* @param g

*/

private void paintScore(Graphics g) {

int x = 290;

int y = 160;

g.setColor(new Color(FONT_COLOR));

Font font = g.getFont();// 取得g当前字体

font = new Font(font.getName(), font.getStyle(), FONT_SIZE); g.setFont(font);// 更改了g的字体

String str = "SCORE:" + score;

g.drawString(str, x, y);

y += 56;

str = "LINES:" + lines;

g.drawString(str, x, y);

y += 56;

str = "[P]Pause";

if (pause) {

str = "[C]Continue";

}

if (gameOver) {

str = "[S]Start!";

}

g.drawString(str, x, y);

}

/**

* 绘制下一个要下落的方块

*

* @param g

*/

private void paintNextOne(Graphics g) { if (nextOne == null) {

return;

}

// 将每个格子的row,col 换算为x,y 然后贴图 Cell[] cells = nextOne.cells;

for (int i = 0; i < cells.length; i++) {

// i = 0 1 2 3

Cell cell = cells[i];

// cell 每个格子

int x = (cell.getCol() + 10) * CELL_SIZE; int y = (cell.getRow() + 1) * CELL_SIZE;

g.drawImage(cell.getImage(), x - 1, y - 1, null); }

}

/**

* 绘制正在下落的方块

*

* @param g

*/

public void paintTetromino(Graphics g) { if (tetromino == null) {

return;

}

// 将每个格子的row,col 换算为x,y 然后贴图 Cell[] cells = tetromino.cells;

for (int i = 0; i < cells.length; i++) {

// i = 0 1 2 3

Cell cell = cells[i];

// cell 每个格子

int x = cell.getCol() * CELL_SIZE; int y = cell.getRow() * CELL_SIZE;

g.drawImage(cell.getImage(), x - 1, y - 1, null); }

}

public static final int CELL_SIZE = 26;

/** 画墙 */

private void paintWall(Graphics g) {

篇四:Unity 3D俄罗斯方块

Unity 3D俄罗斯方块

学习unity也有一段时间了,从一开始的懵懵懂懂到现在的学有所小成,心里挺是高兴的,不过目前还是处于初学者阶段,很多东西还等着自己去发掘去学习。

最近做了一个3D俄罗斯方块小游戏作为练手,花了有两个多星期吧,感觉话费太多时间了,中间不断地修改实现的方法,但确实让自己学到很多东西,可能对有些人来说,俄罗斯方块根本算不上什么,不过对于初学者来说,练手还是能学到很多东西的,好了,废话不多说,接下来说说我如何完成的吧,先贴上最终的效果图--

来自狗刨学习网

其实对于3D的俄罗斯方块,我觉得可以用多种方法实现的,一开始,我尝试用unity

提供的碰撞机制去做这个游戏,结果问题一个个接踵而来,解决了一个又出现了另一个,最后只能上网找教程,网上是有网友实现了的,有一种unity实现方法是直接用GUI,把button当作方块,虽然也能做出很好的效果,但是我觉得这样就不算3D了吧。

另外我还找到一份代码,它实现了真正意义上的3d俄罗斯方块,不过它是JS写的,我试着看了一下代码,然后自己用C#写了一个自己的,看代码里面的注释,应该是外国的,看完它的代码,着实让我学到很多东西,我之前想通过真正的碰撞去完成这个游戏,结果问题多多,但是网上的这份代码提出了一种很聪明的解决方法,用两个布尔类型的数组分别存放已经固定下来的方块和正在掉落的方块,通过判断下落方块下一个位置对应坐标的布尔值的真假,为真则停止下落,固定位置。

另外可以将边界对应的值设为真,从而方块在碰到边界无法继续运动。在检测满一行方块消除的时候也相当的方便,可以直接对布尔数组进行操作。这种思维让我恍然大悟,才发现自己真的是有待提高啊。

好了,开始动手,首先你需要一个正方体模型,它的边界需要经过一些处理,在多个相连的时候才能显现出接痕,这个我自己用Maya做了一个,很简单的。然后导入模型的FBX文件到你的项目中。

接着创建一个新场景,在场景中创建边界,如效果图中所示,用unity自带的Cube就

可以了,改一下一些参数就可以有图中的效果,当然你也可以自己制作边界物体。设置左边界x坐标为3,右边界为14,这不是硬性规定说得设置成这样的,这不过是方便我编写代码而已,哦,另外,由于方块的最大size是4,所以我两边都留出了4个位置,中间10个位置是方块可以放置的地方,底边界放置在0位置。

创建一个空物体对象命名为Manager,并为其创建一个绑定脚本Manager.cs,接着一一创建对应方块的空对象,对其各自命名,注意,之前我导入的正方体只是方块的组成单体,不同形状的方块需要四个正方体拼接在一起,正常俄罗斯方块游戏中有7种方块,将这七个空物体对象创建为Prefab,一一对应命名,再接着为方块创建绑定脚本,这里,我只需要一个脚本文件,即7种方块都绑定同一个脚本。

我试过各自做出七个不同的模型,结果,很麻烦,由于模型是一个整体,消除部分是一个问题,然后我还要写七个脚本对应不同的方块,其实有很多东西是一样的,这简直就是浪费时间和资源。

然后我发现了网上代码中用了一种和巧妙的方法,在绑定的脚本中,设置一个公有的字符串数组,值只有0和1,显示出方块的形状,比如直方块,即4个正方体直线连接在一起,这是我们需要填上字符串数组的size为4,然后string[1]的值为“1111”,其余都为0,大家应该都明白了吧,一个方块,算上周围的空的地方围成一个正方体,必须是正方体,不然旋转之后,你的数据没办法修改。

在Manager中创建一个公有的GameObject数组,然后把7种方块对应的Prefab拖拽到数组里面,Manager随机生成方块,绑定方块的脚本根据字符串数组组合正方体。这一步算是最重要的吧,根据字符串数组计算组成方块各正方体的位置,一开始就是因为老是弄错正方体的位置所以除了点问题,还有就是旋转轴心,轴心错了也会让你接下来的步骤漏洞百出。

首先,在之前我们创建方块空对象物体的时候,坐标都是为(0, 0, 0)的,就以这个作为轴心点坐标,如果size是奇数的话,那么处于围绕方块大正方体中间的那个正方体的中心就是轴心坐标,如果size为偶数的话,大正方体的中心便为轴心,以轴心坐标确定各个正方体的位置,这是相当重要的。注意,各个正方体在方块中的坐标不同于在世界坐标中的坐标,轴心坐标即方块在世界坐标系中的坐标,找对了轴心才能正确算出各个正方体在世界坐标系中的坐标。

1.

2.

3.

4.

5.

6. for(int y=0;y

childSize, childSize - y, 0), Quaternion.identity);

7. cube.parent = transform;

8.

9. }

10. }

11. }

根据字符串数组中?1?对应的x,y与参照值做运算便可以计算出其位置了。

接着便是计算各正方体在世界坐标系中的x坐标,即方块在世界坐标中的坐标减去(size-1)*0.5,求出方块外围正方体左上角的第一个正方体的x坐标,同样道理,这个应该不难理解,其y坐标为已知,可根据它来确定方块的起始下落位置,参考值也是(size-1)*0.5。哦,起始下落位置的设置也是有规律的,当size为偶数时,坐标必须是符合规定范围内的一个整数加0.5,如果是奇数的话,中心正方体的坐标可作为方块的起始坐标。

当方块旋转时,判断其是否可以旋转(边界等),可以旋转,则要变换方块对应的布尔数组,跟着相同方向旋转数组即可。

当方块停止下落时,销毁方块,同时将记录下来的各个正方体的坐标对应的产生正方体,这一步是为了接下来方便销毁满一行的正方体,修改对应的整个区域的布尔数组,上文提到的。判断是否满一行也很简单,同一个y坐标,连续十个x坐标对应的布尔值为真即销毁正一行的正方体,然后大于y的正方体集体下落一个单位,再继续检测。

以上已经完成游戏的大半部分了,也算是解决了一个技术难点吧,接着是运行,本实现方法用yield来实现游戏一帧一帧的动画,初开始接触这个东西,只是普通的认为它就是一个延缓暂停的机制。最近才知道其真正的用法。这里我们需要在Start函数中执行我们要的操作,然后游戏就可以如我们所期望的那样运作了。其实,用Update函数也是可以实现的,可能会麻烦一点,用yield反而比较简便。

在while(true)循环里面使用yield,满足特定条件时跳出循环,注意,请务必设置一个跳出的特定条件,而且是程序会最终执行到那一步的,不然,程序会陷入死循环。

另外,在有些时候延缓执行或者整个程序进入等待,这里需要特别注意一下,因为yield毕竟不能像update函数那样,在一帧一帧里实现你要的效果,稍微错漏某个地方都会让你的游戏没法像预期那样运行,可以自己尝试着在代码中修改让后运行,根据结果的不同可更清楚地认识了解yield的用法。还有就是yield的用法在JS与C#中大为不同,这是需要注意的,在把JS代码重写成C#代码的时候需要特别注意这一点。

大概就这么多吧,这里附上两个代码资源,一个JS版的,一个C#版,可根据自己的语言喜好选择,不过JS代码中有些东西跟上述的不符,不过大概原理是一样的。

声明:这篇文档时来自于【狗刨学习网】社区,是网友发布的Unity3D学习文章,如果有什么内容侵犯了你的相关权益,请与官方沟通,我们会即时处理。

篇五:俄罗斯方块

1.2.1 系统需求分析

1)游戏方块的预览功能

当游戏运行后并在底部出现一个游戏方块时,必须在预览界面中出现下一个方块,这样便于玩家提前进行控制处理。因为在该游戏中共有19种方块,所以在方块预览区内要显示随机生成的游戏方块。

2)游戏方块的控制功能

游戏玩家可以对出现的方块进行移动处理,分别实现左移、右移、快速下移、自由下落和行满自动消除功能的效果。

3)更新游戏显示

当在游戏中移动方块时,需要先消除先前的游戏方块,然后在新坐标位置重新绘制?a href="http://www.zw2.cn/zhuanti/guanyuluzuowen/" target="_blank" class="keylink">路娇椤?/p>

4)游戏速度设置和分数更新

通过游戏分数能够实现对行数的划分,例如,可以设置消除完整的一行为10分。当达到一定数量后,需要给游戏者进行等级上的升级。当玩家级别升高后,方块的下落速度将加快,从而游戏的难度就相应地提高了。

5)系统帮助

游戏玩家进入游戏系统后,通过帮助了解游戏的操作提示。

一个俄罗斯方块游戏的基本功能也就上述5条了,当然现实中的游戏产品更加复杂,但其基本的功能都是大同小异的。

1.2.2 结构规划

现在开始步入结构规划阶段。为了加深印象,我做了一个模块结构图,如图1-3所示。

2 需求分析

2.1 游戏需求

随机给出不同的形状(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型)下落填充给定的区域,若填满一条便消掉,记分,当达到一定的分数时,过关,设置六关,每关方块下落的速度不同,若在游戏中各形状填满了给定区域,为输者。游戏功能要求如下:

游戏界面需求:良好的用户界面,有关数显示和分数显示。让方块在一定的区域内运动和变形,该区域用一种颜色表明,既用一种颜色作为背景,最好设为黑色。还需用另一种颜色把黑色围起来,宽度适中,要实现美感。

游戏形状(方块)需求:良好的方块形状设计,绘制七种常见的基本图形(长条形、Z字形、反Z形、田字形、7字形、反7形、T字型),各个方块要能实现它的变形,可设为顺时针或逆时针变形,一般为逆时针。

键盘处理事件:方块下落时,可通过键盘方向键(上、下、左、右键)对该方块进行向上(变形),向下(加速)、向左、向右移动。

显示需求:当不同的方块填满一行时可以消行,剩余方块向下移动并统计分数。当达到一定的分数时过关。设置六关,每关方块下落的速度不同。

2.2 软硬件需求

操作系统 Windows98/me/2000/XP/2003

内存容量 64MB

显卡要求 8M

声卡要求 支持DirectX 8.0 音效卡

交互工具 键盘/鼠标

CPU 奔腾133以上

光驱 8倍速以上

硬盘空间 400MB

显示器 VGA以上显示器

开发软件 Java可视化编程3.0以上版本

2.3 接口控制

本软件需求通过键盘进行操作,在Windows的操作系统下,利用键盘的上、下、左、右键对方块进行移动变形,要使用键盘的接口事件。

3 概要设计

3.1 定义方块的数据结构

对于方块在某一瞬间的位置标识,我们采用一个4×2的小数组标识出来,即用4个存储单位空间存储当前下坠物的每一子块的位置,也就是说,用4个存储单位空间存储当前下坠物的每一子块的位置来对整个下坠物件的位置进行标识,而每个存储空间的大小就是一个典的坐标值(x,y),而每个方块按照从左到右的方式进行编号,并且在编号过程中对于同一列的方块实行从上到下进行编号 [2] 。 图3.1 方块编号

ActiveStatus[0][0]和ActiveStatus[0][1]则是第0号方块的横坐标x和纵坐标y ;ActiveStatus[2][0]和ActiveStatus[2][1]则是第2号方块的横坐标x和纵坐标y。

3.2 游戏设计分析

有前面的功能描述可知,我先虚拟出俄罗斯方块游戏的类对象,并抽象出核心的数据属性和操作方法等,然后再作细化,最后将整个虚拟类的外壳脱掉,再移植到视图类中去,其实现如下:

CRectGameView : public CView

{

//内部存取数据结构

int m_stateMap[MAX_ROW][MAX_COL];

//初始化操作

GameInitnal(); //游戏的初始化

//用于判断数据相关状态的操作

IsLeftLimit(); //下坠物件是否可向左移动

IsRightLitmit(); //

IsBottom(); //是否已经到达了底部

IsGameEnd(); //是否游戏已经结束

//方块物件下坠过程中的操作

RectChange(); //下坠物件变形

RectDown(); //下坠物件正常下落

RectArrow(); //下坠物件方向移动(左,右,下加速)

//状态控制操作

GameStart(); //游戏开始

GamePause(); //游戏暂停

GameEnd(); //游戏结束

}

通过上面的代码可以看出,在虚拟类中抽象出了核心的内部数据和一些基本的操作函数。对于操作函数,可以把它们分为内部实现的基本核心操作(如判断操作)以及明显提供给外部使用的整体模块外部操作(如状态控制操作)。而内部的基本操作又可以分为判断操作和执行操作这样两种类型[3]。

图3.1 正常流程的设计

图3.2 中断流程的设计

4 详细设计

4.1 总体设计

序号 方法名 作用

1 Main() 定义窗口

2 Rectview() 创建变量

3 Gamestart() 游戏开始

4 DrawGame() 游戏界面初始化

5 RectDown() 当前方块下降

6 invalidatecurrent () 刷新指定区域

7 OnTimer () 承担所有驱动

8 GamePaush () 游戏暂停

9 OnDraw () 绘制屏幕

10 IsBottom() 处理到达后的图形,进行加分,满行判断及消行处理等 11 KeyDown() 控制按键信息

12 Rectchange() 控制图形变化

13 GameEnd () 游戏结束

表4.1 涉及函数

图4.1 程序运行调用图

4.2 创建界面的主框架

首先建立一个项目工程,名为skyblue_Rect,并在AppWizard的架构选择过程中选择单文档方式,其他保持默认选项。其项目的架构类视图信息如图所示: 在构架类视图中是MFC基本架构组合:App(应用程序)类、Document(文档)类、View(视图)类、Frame(框架)类和用于提示关于作者的对话框CAboutDlg类,至于COptionDlg类是用作俄罗斯方块参数选择的对话框类对象

图 4.2 主框架图

4.3 正常流程的设计

(1)定时制机制

从分析游戏的特性可以知道,定时器的产生与生效应该在游戏开始的时候,而在游戏暂停或者游戏结束时则将已经设定的定时器失效/销亡(对于暂停的情况,使它销亡,当游戏从暂停状态又进入游戏状态时候,则重新创建一个定时器并激活它的运作),所以分别在游戏的开始函数、暂停函数已经结束函数中实现定时器的激活与去激活工作。这里,先在资源编辑器菜单资源里面添加三个菜单选项,分别是游戏的“开始”、“暂停”、和“结束”,然后利用ClassWizard直接在视图类对象Cskyblue_RectView中为它们添加空白的处理函数,具体如表2所示。 表 4.3 菜单选项功能对应表

菜单选项名称 快捷键 资源ID 响应处理函数

开始游戏 &S ID_GAME_START OnGameStart()

暂停游戏 &P ID_GAME_PAISH OnGamePaush()

结束游戏 &E ID_GAME_END OnGameEnd()

俄罗斯方块

(2)定时处理

经过定时器的设置后,这里通过利用ClassWizard跳到定时器到时候的处理函数OnTimer()去实现,当固定时间片间隔到达后,先检测当前下坠物是否已经到达了底部,不是则进行RectDown()下坠物向下移动一个单位的操作,是则到底后产生一个新的“下一个下坠物”,并代替旧的,将原先旧的“下一个下坠物”用作当前激活状态下正在使用的下坠物,并对使用后的一些状态进行检测:是否马上到达底部,使则进行销行操作

;是否在到达底部的同时到达游戏区域的顶部,从而判定游戏是否因违规而结束。

图 4.3 装载方块

视图类创建了m_icurrentStatus和m_inextStatus两个成员变量来记录下坠物的类型,共有七种形状,并从7种方块中随机抽取图形。而m_currentRect除了记录下坠物的类型外,还需记录其当前的变形状态,最多用两位表示,第1位用作类型标识(1~7),第2位用作同种类型的不同表现方式,最多有4种状态(1~4)。 在产生新的下一个下坠物前,需要先将当前状态物的记录和旧的下一个下坠物保存下来,然后用随机函数Random()产生一个最大值不大于指定值的随机正整数,将这个新生成的正整数用作新的“下一个下坠物”的形状值。

(3)底部到达的判断与销行的实现

图4.4 处理方块到达图

将新的下坠物放置到游戏区域中去,这时可能出现马上到达底部的情况,因此需要对它进行判断,如果是到达底部,则进行销行处理,并且修改相应的数据状态。而判断是否已经到达了底部,可以通过当前下坠物件所对应的接触面的方块位置为被占用状态(MAP_STATE_NOT_EMPTY=1)来确定,利用数组InterFace[74][4]记录1~7种下坠物的1~4种形态的接触面信息。

统计分数:在消行处理里面有一个专门用来统计消行数的变量,然后根据变量的值决定分数的多少,程序统计分数是:消一行得100分,同时消2行得400分,销掉x行,则分数为:x*(x*100)。如果总分数达到过关条件就过关,改变游戏速度,游戏初始化,开启新的一关,然后再加载方块。没有达到过关分数或者没有满行,则加载下一个方块继续游戏。

图 4.5 判断满行及销行图

检测游戏区域中的所有行,,并对每行的所有纵列状态进行检测,如果其中有一列是空闲状态则不可以销行。如果可以销行的话,将增加单位分数,并且将该行清空,再将该行上面的所有物件都向下偏移一个单位,以填充该行的空缺。

例销行与积分

if (m_isBottom)

{

//判断是否已得分

for (i=0;i

{

字数作文