Hints

Hints for C Programs
1、俄罗斯方块的基本方块由以下7种组成(也可以自行增加种类),可使用一个三维的数组来表示这七种基础方块。
Hints_第1张图片
2、#include “time.h”
库是C/C++中的日期和时间头文件。用于需要时间方面的函数。
用于生成随机数。
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之间随机生成的数字。
Hints_第2张图片
在俄罗斯方块大作业中,随机数可以用来随机输出一个基础的方块。

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);
}//

Hints_第3张图片

其中:
(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;
}

输出的结果如下
Hints_第4张图片

(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);

Hints_第5张图片
上图显示了光标是否隐藏以及设置光标厚度后的效果。

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);
}

你可能感兴趣的:(Hints)