俄罗斯方块游戏界面的设计与实现
- 格式:doc
- 大小:123.50 KB
- 文档页数:5
7 俄罗斯方块游戏界面的设计与实现
实验目的:
(1) 理解Windows API应用程序接口,并学会使用
(2) 掌握利用API函数控制光标在控制台移动的方法
(3) 掌握C程序的基本结构,编写规范的程序
(4) 掌握循环结构的程序设计方法
(5) 掌握全局变量的定义和使用
实验内容:
综合应用所学知识,设计俄罗斯方块游戏的界面,如下图1所示:
图1 俄罗斯方块游戏界面
游戏界面分为两大区域:游戏区域和信息提示区域。其中:
游戏区域高度为20个单位,宽度为10个单位,为该区域绘制边框时,上下边框使用
“┅”,左右边框“┇”,四角的边框分别使用“┏”、“┓”、“┗”、“┛”进行绘制。
信息提示区域高度为20个单位,宽度为4个单位。除了边框外,还有三个信息,即
“NEXT”、“SCORE”、“LEVEL”。他们分别表示下一个要下落方块的类型、玩家当前得分
和等级。这三个提示文字分别在该区域的第2、8、14行显示,并在每一行空一个字符位置
处显示。
一般情况下,控制台的光标是随着输入/输出向后移动的,而利用Windows API函数,
可以将光标移动到控制台的任意位置,这里介绍一下移动光标的方法。
#include
#include
HANDLE g_hOutput; //声明一个句柄
void MySetCursor(int x, int y) //自定义的光标定位函数
{
COORD cd = {x, y}; //定义坐标
//调用Windows API中设置光标位置的函数,传入句柄和位置信息做参数
SetConsoleCursorPosition(g_hOutput, cd);
}
void main()
{
//通过调用Windows API函数返回一个标准输出的句柄,并为句柄变量赋值
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
MySetCursor(2, 3); //将光标定位到标准输出的第3行第2列的位置
printf("World!");
MySetCursor(0, 0); //将光标定位到标准输出的第0行第0列的位置
printf("Hello");
}
输出结果为:
图2 输出结果图
实现俄罗斯方块游戏界面的源代码如下:
#include
#include
#include
#include
#define HEIGHT 20 //定义游戏区域高度
#define WIDTH 10 //定义游戏区域宽度
const int SysAlign= WIDTH*2+4 + 3; //提示文字起始水平坐标
const int NextLine=2; //“NEXT”所在垂直坐标
const int ScoreLine=8; //“SCORE”所在垂直坐标
const int LevelLine=14; //“Level”所在垂直坐标
int iScore, iLevel; //玩家的即时得分,等级
HANDLE g_hOutput; //声明一个句柄
void MySetCursor(int x, int y) //本游戏中适用的光标定位函数
{
COORD cd = {x, y};
//调用Windows API中设置光标位置的函数,传入句柄和位置信息做参数
SetConsoleCursorPosition(g_hOutput, cd);
}
//注意:一个"┅"占2个字符宽度
void DrawBoarder(int x, int y, int h, int w)
{
int i;
for (i=0;i
MySetCursor(x+2*i+2, y); //依次定位上边线边框位置的坐标
printf("┅");
MySetCursor(x+2*i+2, y+h+1); //依次定位下边线边框位置的坐标
printf("┅");
}
for (i=0; i
MySetCursor(x, y+i+1); //依次定位左边线边框位置的坐标
printf("┇");
MySetCursor(x+w*2+2, y+i+1); //依次定位右边线边框位置的坐标
printf("┇");
}
MySetCursor(x, y); //定位左上角边框位置坐标
printf("┏");
MySetCursor(x, y+h+1); //定位左下角边框位置坐标
printf("┗");
MySetCursor(x+w*2+2, y); //定位右上角边框位置坐标
printf("┓");
MySetCursor(x+w*2+2, y+h+1); //定位右下角边框位置坐标
printf("┛");
}
void DrawSystemInfo()
{
MySetCursor(SysAlign, NextLine); //定位“NEXT”所在位置坐标
puts("NEXT");
MySetCursor(SysAlign, ScoreLine); //定位“SCORE”所在位置坐标
puts("SCORE");
MySetCursor(SysAlign,ScoreLine+1); //定位玩家得分信息所在位置坐标
printf("%d",iScore);
MySetCursor(SysAlign, LevelLine); //定位“LEVEL”所在位置坐标
puts("LEVEL");
MySetCursor(SysAlign, LevelLine+1); //定位玩家等级信息所在位置坐标
printf("%d", iLevel);
}
void Init()
{
CONSOLE_CURSOR_INFO cursor_info; //设置光标隐藏
cursor_info.bVisible = FALSE;
cursor_info.dwSize = 100;
SetConsoleCursorInfo(g_hOutput, &cursor_info); //调用WindowsApi
iScore=0; iLevel=1; //玩家的初始得分为0,初始等级为1级
DrawBoarder(0,0,HEIGHT,WIDTH); //绘制游戏区域边框
DrawBoarder(WIDTH*2+4,0,HEIGHT,4); //绘制信息提示区域边框
DrawSystemInfo();
}
void Run()
{
system("cls"); //清空屏幕
Init(); //调用初始化函数
}
int main()
{
//通过Windows API函数获得一个标准输出的句柄为句柄变量赋值
g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
Run();
return 0;
}