通过按键控制蛇的移动,首先需要读取按键,通过按键来控制。
通过百度后得知用kbhit();
用一小段代码进行测试:
一直输出Hello World,直到用户按Esc结束
#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int main(void)
{
char ch;
while(ch!=27)
{
printf("HelloWorld\n");
if(kbhit())
{
ch=getch();
}
}
printf("End!\n");
system("pause");
return 0;
}
kbhit()在执行时,检测是否有按键按下,有按下返回非0值,没有按下则返回0,是非阻塞函数;
不同于getch()的在执行时,检测按下什么键,如果不按键该函数不返回,也就不进行下一步操作,是阻塞函数。
显而易见,我们需要在蛇移动的时候进行控制。我们只需要通过控制蛇头的方向,蛇身依次而动就可以了。
实现逻辑:
1、加入按键控制
2、判断是否有按键
3、按照按键来进行移动
4、没有按键,按照固定方向移动
用w a s d 分别表示上左下右,完整代码及注释如下:
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include<conio.h>
#define SNAKELEN 10
#define SNAKEMAX 10
#define INITSNAKELEN 3
#define RIGHT 1
#define LEFT 2
#define DOWN 3
#define UP 4
COORD snakeBodyPosition[SNAKELEN];
void showSnake();
int snakeLen = 3;
void initSnake(COORD snakeHeadPosition )
{
int i = 0;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);//获取控制台
COORD tmp = snakeHeadPosition;
for(i = 0;i < INITSNAKELEN;i++)//打印蛇身
{
snakeBodyPosition[i] = tmp;
SetConsoleCursorPosition(hout,tmp);
printf("*");
tmp.X--;
}
snakeLen = INITSNAKELEN;
}
void move(int direction)
{
Sleep(100);
system("cls");
int i = 0;
for(i = 0;i < snakeLen - 1;i++)
{
snakeBodyPosition[snakeLen -1-i] = snakeBodyPosition[snakeLen - 2-i];
}
switch(direction)
{
case RIGHT:
{
snakeBodyPosition[0].X++;
break;
}
case LEFT:
{
snakeBodyPosition[0].X--;
break;
}
case DOWN:
{
snakeBodyPosition[0].Y++;
break;
}
case UP:
{
snakeBodyPosition[0].Y--;
break;
}
default:
{
break;
}
}
showSnake();
}
void showSnake()
{
int i = 0;
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
for(i = 0;i <snakeLen;i++)
{
SetConsoleCursorPosition(hout,snakeBodyPosition[i]);
printf("*");
}
}
void keyboard() //按键控制
{
char ch = 'd';
int direction = RIGHT; //前面宏定义RIGHT,UP等是int类型
while(1)
{
move(direction); //调用move函数
switch(ch)
{
case 'w':
{
direction = UP; //比如前面定义UP是4,这里把4赋值给direction
break;
}
case 'a':
{
direction = LEFT;
break;
}
case 's':
{
direction = DOWN;
break;
}
case 'd':
{
direction = RIGHT;
break;
}
default:
{
move(direction); //优化之后解决蛇按下除方向键外其他键或者不按键也能保持原来的移动方向
break;
}
}
if(kbhit()) //如果有按键
{
ch = getch(); //把getch获取到的按键赋值给ch
}
}
}
int main(int argc, char* argv[])
{
int i = 0;
COORD pos = {0,0};
initSnake(pos);
keyboard();
printf("\n");
return 0;
}
运行效果如下:
注意要在英文输入法下进行。
总结:
1、一段代码,从产生到最后完成,优化优化再优化
2、思考具体的问题时,一定要细致,尽可能多的解决bug

本文介绍了如何使用C语言编写贪吃蛇游戏,并通过按键控制蛇的移动。利用kbhit()函数检测按键,实现非阻塞控制。游戏逻辑包括按键判断、蛇的移动方向控制等,代码中w、a、s、d对应上下左右移动。在英文输入法下运行,优化代码以解决bug。
3459





