用C程式碼寫貪吃蛇遊戲--用按鍵控制蛇移動
阿新 • • 發佈:2019-02-06
通過按鍵控制蛇的移動,首先需要讀取按鍵,通過按鍵來控制。
通過百度後得知用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