一、摘要
目的:做一个俄罗斯方块,能基本实现变换形态、方块颜色变化、行满消除。
二、过程
基于c语言写一个俄罗斯方块,由于本人比较菜,有借鉴别人的代码,下面是项目的一些代码和效果。
- 总体效果
- 代码注释
1. 主函数,开始是初始屏幕的设置,打印游戏界面的边框,游戏提示。BlockRand()函数随机产生一种形态的方块。
int main()
{
DeawMap();//画地图打印边框函数
code_y = rand() % 7 + 1;//在7种形态中产生1种形态赋值给code_y
while (1)
{
Return = BlockRand(code_y);//随机主方块生成
code_y = rand() % 7 + 1;
Show(code_y);// 显示游戏信息,下一个方块得分情况.
ShowBlock(&Return);//显示完整形态
}
system("pause>nul");
return 0;
}
2. 初始化界面,画地图,上下左右打印方块形成边界,其他为空格。
void DeawMap()
{
for (int i = 0; i < WIDTH; i++)PRINTF LINE //上边框
for (int i = 1; i < HEIGHT - 1; i++) //打印左右边框
{
for (int j = 0; j < WIDTH; j++)
{
if (j == 0 || j == WIDTH - 1)
{
PRINTF //打印方块的宏定义
if (j == WIDTH - 1)LINE
}
else EMPTY //打印空格的宏定义
}
}
for (int i = 0; i < WIDTH; i++)PRINTF LINE //下边框
system("color 03");//屏幕显示颜色
}
3.俄罗斯方块要随机产生一种形态的方块,主要用到了srand()函数是随机数发生器的初始化函数,srand和rand()配合使用产生伪随机数序列。
Tetris* BlockRand(int code_y)
{
srand((int)time(0));
Tetris* Block = (Tetris*)malloc(sizeof(Tetris)); //用malloc动态分配空间赋值给新指针
Block->x_1 = 8;
Block->y_1 = 4; //规定初始中心方块的坐标为(8,4)
Block->code = code_y;
if (Phead == NULL) Phead = Block; //用链表储存数据
else Pend->next = Block;
Block->next = NULL;
Pend = Block;
return Block;
}
4.按键响应,调用GetAsyncKeystate()函数对按键操作进行响应,就是调用GetAsyncKeystate函数得到某个按键的状态,判断返回值的最高位是不是1,如果是表示处于按下状态。
void JudgeDirection(Tetris** Block)
{
if (GetAsyncKeyState(VK_UP) && 0x8000)
{
form += 1;//按向上键方块形态改变一次
if (form == 4)
{
form = 0;//到第四次返回刚开始的形态
}
Form(&Return);
}
if (GetAsyncKeyState(VK_DOWN) && 0x8000)
{
//加速向下 时间加速
UP = 1;
}
if (GetAsyncKeyState(VK_LEFT) && 0x8000)
{
//向左移动
if (JudgeWall(&Return) != -1) Location_y(&Return, -1, 0, -1, 0, -1, 0, -1, 0);
}
if (GetAsyncKeyState(VK_RIGHT) && 0x8000)
{
//向右移动
if (JudgeWall(&Return) != -2) Location_y(&Return, 1, 0, 1, 0, 1, 0, 1, 0);
}
if (GetAsyncKeyState(VK_ESCAPE) && 0x0D)
{
MoveCursor(27, 15);
printf("游戏暂停");
//判断Esc
while (1)
{
if (GetAsyncKeyState(VK_ESCAPE) && 0x0D)
{
MoveCursor(27, 15);
printf(" ");
break;
}
}
}
}
5.设置方块颜色
void SetColour(int c)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);//API函数可以改变控制台颜色
}
屏幕颜色的符号常数表
符号常数 数值 含义 符号常数 数值 含义
BLACK 0 黑色 DARKGRAY 8 深灰
BLUE 1 兰色 LIGHTBLUE 9 深兰
GREEN 2 绿色 LIGHTGREEN 10 淡绿
CYAN 3 青色 LIGHTCYAN 11 淡青
RED 4 红色 LIGHTRED 12 淡红
MAGENTA 5 洋红 LIGHTMAGENTA 13 淡洋红
BROWN 6 棕色 YELLow 14 黄色
LIGHTGRAY 7 淡灰 WHITE 15 白色
本内容转载至:
http://blog.bools.cn/archives/581