一、必须基础知识
1、链表的增删改查
2、Linux多线程编程
3、Linux curses库的使用
二、核心思想
使用动画的思想,蛇每移动一次重新画一次游戏界面,然后覆盖上一次的游戏界面
void PrintMap()
因此有一个线程用于刷新地图
void* RefreshMap(void *arg)
{
usleep(SPEED);
while(1){
MoveSnake(key);
move(0,0);
PrintMap();
refresh();
usleep(SPEED);
}
}
三、获取按键输入
输入的按键只能是上下左右和回车,方向不能是当前的反方向,因此先用key_temp来或许输入,再跟上次的按键求和,如果和是两个相反方向的宏定义值之和,则证明输入为反向。
void* GetKey(void *arg)
{
int key_temp;
while(1)
{
key_temp=getch();
if(key_temp != KEY_UP && key_temp != KEY_DOWN
&& key_temp != KEY_LEFT && key_temp != KEY_RIGHT
&& key_temp != 012)
{
continue;
}
if((key_last+key_temp == KEY_UP + KEY_DOWN) || (key_last+key_temp == KEY_LEFT + KEY_RIGHT)){
continue;
}
if(key_temp == 012){
continueFlag = 1;
continue;
}
key = key_temp ;
key_last = key ;
}
}
四、蛇移动
根据当前key值确定移动方向,并判断是否吃到食物和撞墙
五、蛇撞墙后的花里胡哨画面
void dieMap()
{
int line;
int col;
move(0,0);
for(line=0;line<22;line++){
if(line == 0 || line == 21){
for(col=0;col<20;col++){
printw("--");
}
}
else{
for(col=0;col<21;col++){
if(col == 0 || col ==20){
printw("|");
}
else{
printw(" ");
}
}
}
printw("\n");
}
move(10,20-strlen("Snake die!!! Snake die!!!")/2);
printw("Snake die!!! Snake die!!!");
move(11,20-strlen("please press Enter to continu!!!")/2);
printw("please press Enter to continue!!!");
move(22,0);
refresh();
}