贪吃蛇入门
宏定义
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#define snakeMaxLength 20
#define snakeHead 'H'
#define snakeBody 'X'
#define blank ' '
#define wall '*'
#define snakeFood '$'
#define true 1
#define random(x) (rand()%x)
int snakeLength[1] = {5};
伪代码写出各个函数
// 如果 snakeHead 接触 snakeFood,snakeLength 加 1
void snakeGrow( char map[][12], int snakeX[], int snakeY[],int snakeLength[]) {
IF snakeHead 接触 snakeFood && snakeLength < snakeMaxLength
THEN snakeLength ++
}
// 在 blank 位置每隔 10s 随机产生 snakeFood
void putFood(char map[][12]) {
IF 程序运行每隔 10 秒
THEN IF 随机生成位置为 blank
THEN 生成 snakeFood
}
// 当 snakeHead 接触 snakeBody | wall 结束游戏
void gameOver(char map[][12], int snakeX[], int snakeY[]) {
IF snakeHead 接触 snakeBody || snakeHead 接触 wall
THEN PRINT "game over"
EXIT
}
int snake_move(char input, int snakeX[], int snakeY[], int snakeLength[], char map[][12]) {
SWITCH(输入)
CASE'A': 向左移动一步
CASE'D': 向右移动一步
CASE'W': 向上移动一步
CASW'S': 向下移动一步
}
逐步实现各个函数
void snakeGrow( char map[][12], int snakeX[], int snakeY[],int snakeLength[]) {
if(map[snakeX[0]][snakeY[0]] == '$' && snakeLength[0] <= snakeMaxLength) {
snakeX[snakeLength[0]] = snakeX[snakeLength[0]-1] - 1;
snakeY[snakeLength[0]] = snakeY[snakeLength[0]-1];
snakeLength[0] ++;
}
}
void putFood(char map[][12]) {
clock_t time;
time = clock();
if((time % 10) == 0) {
while(true) {
int foodX = random(11);
int foodY = random(11);
if( map[foodX][foodY] == blank) {
map[foodX][foodY] = snakeFood;
break;
}
}
}
}
void gameOver(char map[][12], int snakeX[], int snakeY[]) {
if(map[snakeX[0]][snakeY[0]] == snakeBody || map[snakeX[0]][snakeY[0]] == wall) {
printf("game over\n");
exit(0);
}
}
int snake_move(char input, int snakeX[], int snakeY[], int snakeLength[], char map[][12]) {
for(int i = (snakeLength[0] - 1); i > 0; i --) {
snakeX[i] = snakeX[i-1];
snakeY[i] = snakeY[i-1];
}
if(input == 'W')
snakeY[0] --;
else if(input == 'S')
snakeY[0] ++;
else if(input == 'A')
snakeX[0] --;
else if(input == 'D')
snakeX[0] ++;
for( int i = 1; i < 11; i ++) {
for( int j = 1; j < 11; j ++) {
if(map[i][j] != snakeFood)
map[i][j] = blank;
}
}
gameOver(map, snakeX, snakeY);
snakeGrow(map, snakeX, snakeY, snakeLength);
map[snakeX[0]][snakeY[0]] = snakeHead;
for( int i = 1; i < snakeLength[0]; i ++) {
map[snakeX[i]][snakeY[i]] = snakeBody;
}
putFood(map);
for(int i = 0; i < 12; i++) {
for(int j = 0; j < 12; j++) {
if( j == 11)
printf("%c\n",map[j][i]);
else
printf("%c",map[j][i]);
}
}
}
int main() {
char map[12][12] =
{"************",
"*XXXXH *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************"};
for(int i = 0; i < 12; i++) {
for(int j = 0; j < 12; j++) {
if( j == 11)
printf("%c\n",map[i][j]);
else
printf("%c",map[i][j]);
}
}
int snakeX[snakeMaxLength] = {5,4,3,2,1};
int snakeY[snakeMaxLength] = {1,1,1,1,1};
while(true) {
char input = 0;
scanf("%c\n",&input);
snake_move(input, snakeX, snakeY, snakeLength, map);
}
}
最终效果
![这里写图片描述](https://img-blog.csdn.net/20171227154954259?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYW5pbmVlZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)