前言
《俄罗斯方块》是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。
《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
一、设计思路
1.1、利用二维数组构造出各种方块样式如下:
注意:这里还需构造各式方块的不同状态
L型方块:
int shape[5][5]={
0,0,0,0,0
0,0,1,0,0
0,0,1,0,0
0,0,1,1,1
}
1.2、利用easyX对窗口中游戏区和得分区的版块进行设计。
确定窗口大小,以及矩形大小和各顶点x,y坐标,可以构建出以上版块
1.3、定义一个大的二维数组用于存放方块。
1.4、限制方块在大数组中能存放的宽度和高度,根据游戏区范围设定。
规定单个小方框块的size后限制visit数组的有效宽度和高度。实现出一下样子:
1.5、设计功能模块:实现按方向键上键改变方块的形状,按方向键下键加速下落。
1.6、游戏规则实现
利用循环语句和条件语句遍历和判断游戏区中是否满足一行方块,满足则消除,上行如果有方块则上行数组数据下移,遍历方式采用自下而上,顶部方块超出游戏区则游戏结束。
二、代码区
2.1头文件
#pragma once
#include<graphics.h>
#define WIDTH 550 //窗口 宽
#define HIGHT 600 //窗口 高
#define BLOCK_COUNT 5 //方块种类
#define BLOCK_WIDTH 4 //方块数组 列
#define BLOCK_HEIGHT 4 //方块数组 行
#define UNIT_SIZE 20 //小方块大小
#define BLOCK_INITX 390 //下一次方快位置 x坐标
#define BLOCK_INITY 100 //下一次方块位置 y坐标
#define START_X 130 //方块起始位置 x坐标
#define START_Y 30 //方块起始位置 y坐标
#define RANGE_X 26 //游戏区范围 行
#define RANGE_Y 13 //游戏区范围 列
//控制热键
#define KEY_UP 72
#define KEY_RIGHT 77
#define KEY_LEFT 75
#define KEY_DOWN 80
#define KEY_SPACE 32
#define RAPID 50 //加速
//边界判定
#define isValid(num) num < 0 && num >= 13
typedef enum block_dir_t
{
BLOCK_UP,
BLOCK_RIGHT,
BLOCK_DOWN,
BLOCK_LEFT
};
typedef enum move_dir_t
{
MOVE_DOWN,
MOVE_LEFT,
MOVE_RIGHT
};
LOGFONT blockWord;
LOGFONT Word;
int speed = 500;
int Score = 0;
int Rank = 1;
int NextIndex = -1;
int BlockIndex = -1;
int visit[30][15];
int color[30][15];
int minX = 30;
int minY = 30;
int index = 1;
int allRow;
char str[16];
int blockColor[BLOCK_COUNT] = {
GREEN,CYAN,MAGENTA,BROWN,YELLOW
};
int block[BLOCK_COUNT * 4][BLOCK_HEIGHT][BLOCK_WIDTH] = {
// | 型
{
0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0 },
{
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0 },
{
0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0 },
{
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,0,0,0 },
// Z 型
{
0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0 },
{
0,0,1,0,
0,1,1,0,
0,1,0,0,
0,0,0,0 },
{
0,0,0,0,
1,1,0,0,
0,1,1,0,
0,0,0,0 },
{
0,0,1,0,
0,1,1,0,
0,1,0,0,
0,0,0,0 },
//T 型
{
0,0,0,0,
0,1,0,0,
1,1,1,0,
0,0,0,0 },
{
0,1,0,0,
0,1,1,0,
0,1,0,0,
0,0,0,0 },
{
0,0,0,0,
1,1,1,0,
0,1,0,0,
0,0,0,0