指令接受
贪吃蛇代码(字符型动画)最重要的功能实现便是对于指令的接受,由于贪吃蛇游戏要求接受指令时按指令方向操作,未接受指令或等待指令时依照原方向移动,C语言及C++内一般多线程、阻塞非阻塞函数容易为初学者理解接受,笔者这里以非阻塞函数为例进行介绍
while(1)
{
if(kbhit()) //kbhit 非阻塞函数
{
foot_a=getch(); //使用 getch 函数获取键盘输入
if(foot_a==' ') v=1;
if(foot_a=='f') v=2; //速度输入
kz(); //指令计算
}
jy();
fx();
pd();
kzfood();
if(key)
{
cin>>ok;
break;
}
move();
Sleep((210-10*diff)/v); //速度计算
if(sum==10)
{
diff++;
break;
}
}
示例中通过对kbhit()非阻塞函数的IF取值,便能使代码实现键盘指令的是否接受判断。由于不论是否输入指令,小蛇的所有事件都还是要发生,所以仅在其内植入kz()函数,及指令的计算。
颜色
虽然我们的贪吃蛇代码是通过最底层的字符组成,但是通过特殊字符及颜色的调用,便能使原本黑白单调的动画变得有趣
void SetColor(unsigned short ForeColor) //调用颜色
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon, ForeColor );
}
光标函数
贪吃蛇代码实现中,我们可以发现其实是通过矩阵及对应数组的信息来实现的,如果通过输出数组来实现动画,那么会造成大量损耗,我们可以通过对于光标的控制来直接控制画面中的每一个点,达到减少损耗的目的,数组仅用于储存数据
void hide(int k) //隐藏显示光标
{
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
GetConsoleCursorInfo(hOut, &cci);
cci.bVisible = k;
SetConsoleCursorInfo(hOut, &cci);
}
void Goto(int x, int y) //光标移动
{
COORD coord;
coord.X = x*2;
coord.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}