Hints for C Programs
1、俄罗斯方块的基本方块由以下7种组成(也可以自行增加种类),可使用一个三维的数组来表示这七种基础方块。
2、#include “time.h”
用于生成随机数。
srand函数随机数发生器的初始化函数,一般初始化代码如下:
srand(time(0));
使用的时候应用rand()函数,一般用当前日历时间初始化随机数种子,这样每次执行代码都可以产生不同的随机数。
生成随机数代码示例如下,这里是随机生成10个0-99之间的数字的代码:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
int main(void)
{
int i;
srand(time(0));
printf("Ten random numbers from 0 to 99\n\n");
for(i=0; i<10; i++)
printf("%d\n", rand() % 100);
return 0;
}
输出结果如下,即10个0-99之间随机生成的数字。
在俄罗斯方块大作业中,随机数可以用来随机输出一个基础的方块。
3、#include “windows.h” --------------Windows编程介绍
句柄: HANDLE
句柄是整个Windows编程的基础。一个句柄是指使用的一个唯一的整数值,即一个4字节(64位程序中为8字节)长的数值,来标识应用程序中的不同对象和同类中的不同的实例,诸如,一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等。应用程序能够通过句柄访问相应的对象的信息,但是句柄不是指针,程序不能利用句柄来直接阅读文件中的信息。如果句柄不在I/O文件中,它是毫无用处的。 句柄是Windows用来标志应用程序中建立的或是使用的唯一整数,Windows大量使用了句柄来标识对象。因此在Windows编程中,句柄通常通过GetStdHandle函数初始化。
GetStdHandle函数是一个Windows API函数。它用于从一个特定的标准设备(标准输入、标准输出或标准错误)中取得一个句柄(用来标识不同设备的数值)。可以嵌套使用。
在俄罗斯方块问题中,句柄用于设置光标的位置。
以下函数可用于帮助设置光标的位置以及初始化句柄:
#include "windows.h"
HANDLE g_hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
void SetCursor(COORD cd)
{
SetConsoleCursorPosition(g_hOutput, cd);
}
void SetCursor(int x, int y)
{
COORD cd = {x, y};
SetCursor(cd);
}
通过SetCursor函数可以控制光标的位置,从而设计游戏的窗体以及输出的得分、等级等
const int height=20;
const int width=10;
const int SysAlign= width*2+4 + 3;
const int NextLine=2;
const int ScoreLine=8;
const int LevelLine=14;
void drawboarder(int x,int y,int h,int w) //画出下图所示的虚线框
{
for(int i = 0; i < w; i++)
{
SetCursor(x + 2*i + 2, y);
printf("©¨");
SetCursor(x + 2*i + 2, y + h+1);
printf("©¨");
}
for(int i = 0; i < h; i++)
{
SetCursor(x, y + i + 1);
printf("©ª");
SetCursor(x + w*2+2, y + i + 1);
printf("©ª");
}
SetCursor(x, y);
printf("©°");
SetCursor(x, y + h+1);
printf("©¸");
SetCursor(x + w*2+2, y);
printf("©´");
SetCursor(x + w*2+2, y + h+1);
printf("©¼");
}//draw the frame
void drawsys() //显示出右侧文字信息
{
SetCursor(SysAlign,NextLine);
puts("NEXT");
SetCursor(SysAlign,ScoreLine);
puts("SCORE");
SetCursor(SysAlign,ScoreLine+1);
printf("%d",score);
SetCursor(SysAlign,LevelLine);
puts("LEVEL");
SetCursor(SysAlign,LevelLine+1);
printf("%d",level);
}//
其中:
(1) COORD 变量是Windows API定义的一种结构,表示一个字符在控制台屏幕上的坐标。其定义为:
typedef struct _COORD {
SHORT X; // horizontal coordinate
SHORT Y; // vertical coordinate
} COORD;
(2) SetConsoleCursorPosition(g_hOutput, cd);用于控制光标的位置,
(3) SetConsoleTextAttribute(g_hOutput, WORD wAttributes); 用于控制输出字体的颜色,
示例代码如下:
#include
#include
int main()
{
HANDLE hOut;
COORD pos={0,0};
int i;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hOut,FOREGROUND_RED|FOREGROUND_GREEN);//控制输出的颜色
for(i=0;i<20;i++)
{
pos.X=i;
pos.Y=i;
SetConsoleCursorPosition(hOut,pos);//控制输出的位置
printf("%d%d:HelloWorld!\n",pos.X,pos.Y);
getchar();
}
return 0;
}
(4)CONSOLE_CURSOR_INFO cursor_info 用于控制光标的可见度和厚度
CONSOLE_CURSOR_INFO cursor_info;
cursor_info.bVisible = FALSE; //显示为光标不可见
cursor_info.dwSize = 100; //光标可见比厚度,光标可见比厚度为100时会充满整个方格
SetConsoleCursorInfo(g_hOutput, &cursor_info);
4、控制方块下降的速度
俄罗斯方块问题实现方块下降的方法通常是将之前的方块清除,并在下方一格生成相同的方块。通过time.h的clock()函数来控制方块停留的时间。
5、通过键盘控制方块移动和旋转
GetAsyncKeyState(int nVirtKey):确定用户当前是否按下了键盘上的一个键的函数。如果按下,则返回一个True值
GetAsyncKeyState(VK_UP):通过键盘的“上”键控制,如果按下“上”键,则返回值最高位为1
GetAsyncKeyState(VK_DOWN):通过键盘的“下”键控制,如果按下“下”键,则返回值最高位为1
GetAsyncKeyState(VK_LEFT):通过键盘的“左”键控制,如果按下“左”键,则返回值最高位为1
GetAsyncKeyState(VK_RIGHT):通过键盘的“右”键控制,如果按下“右”键,则返回值最高位为1
GetAsyncKeyState(VK_SPACE):通过键盘的“空格”键控制,如果按下“空格”键,则返回值最高位为1
使用例:
if (GetAsyncKeyState(VK_UP))
{
cubeRotate();
}
if (GetAsyncKeyState(VK_LEFT))
{
cubePosChange(-1,0);
}
if (GetAsyncKeyState(VK_RIGHT))
{
cubePosChange(1,0);
}