#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define SNAKE_MAX_LENGTH 15
#define SNAKE_HEAD 'H'
#define SNAKE_BODY 'X'
#define BLANK_CELL ' '
#define WALL_CELL '*'
//snake stepping: dy = -1(up),1(down); dx = -1(left),1(right),0(no move)
void snakeMove(int, int);
//put a food randomized on a blank cell
void put_money(void);
//our cells of the grid
void output(void);
//outs when gameover
void gameover(void);
int pd();
//eat the food
void eat_money(int i, int j);
//are player win
int Are_you_win(void);
char map[12][13] =
{"************",
"*XXXXH *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"************"};
int snakeY[SNAKE_MAX_LENGTH] = {1, 2, 3, 4, 5};//蛇身和蛇头的坐标
int snakeX[SNAKE_MAX_LENGTH] = {1, 1, 1, 1, 1};
int snakeLength = 5;
int main() {
output();
int counter = 0;
while (pd()){
counter++;//计数器,运行5次放一次食物
if ((counter % 5) == 1) put_money();//放置食物
system("cls");//每一次清屏只剩下当前局面的矩阵
output();//输出字符矩阵
if (Are_you_win()) return 0;//如果赢了则退出
char ch;
scanf("%c", &ch);// ch=等待输入
char t = getchar();//将输入的回车符清掉
if (t != '\n') {
printf("Please input the right angle!\n");
while (t != '\n') {
t = getchar();
}
continue;
}
switch (ch) {
case 'A':// ‘A’:左前进一步
snakeMove(0, -1);
break;
case 'D' :// ‘D’:右前进一步
snakeMove(0, 1);
break;
case 'W':// ‘W’:上前进一步
snakeMove(-1, 0);
break;
case 'S':// ‘S’:下前进一步
snakeMove(1, 0);
break;
default:// END CASE
printf("Please input the right angle!\n");
}
}//END WHILE
gameover();//输出 Game Over!!!
}
int Are_you_win(void) {//判断玩家是否赢
int i, j;
for (i = 1; i <= 10; i++) {
for (j = 1; j <= 10; j++) {
if (map[i][j] != 'X'||map[i][j] != 'H') {
return 0;//如果玩家有一个格子未占满则没有赢
}
}
}
printf("You are winner!!!");//如果玩家的贪吃蛇将所有的格子均占满则赢
return 1;
}
void put_money(void) {
srand((unsigned)time(NULL));//随机函数的种子
int i = 0;
int j = 0;
int tot = 0;//用来计数,因为如果格子满了,那么就没有格子可以放食物了,那么下面循环会陷入死循环,避免这种情况发生
while (map[i][j] != ' '&&tot <= 100) {//随机生成食物的坐标
i = rand()%11 + 1;
j = rand()%11 + 1;
tot++;
}
if (map[i][j] == ' ') map[i][j] = '$';//用'$'来表示食物
}
int pd() {//whether snake head on wall & body
int i;
if (snakeX[snakeLength - 1] > 0 && snakeX[snakeLength - 1] < 11
&& snakeY[snakeLength - 1] > 0 && snakeY[snakeLength - 1] < 11) {
for (i = 0; i < snakeLength - 1; i++) {
if ((snakeX[snakeLength - 1] == snakeX[i]) && (snakeY[snakeLength - 1] == snakeY[i])) {
return 0;//snake head on body
}
}
return 1;//snake head on blank
} else return 0;//snake head on wall
}
void eat_money(int i, int j) {//蛇吃食物模块
int dx = i, dy = j, k;
map[snakeX[0]][snakeY[0]] = SNAKE_BODY;//蛇的最后一个坐标还是不变因为长长了
snakeLength++;//长度加一
map[snakeX[snakeLength - 2]][snakeY[snakeLength - 2]] = SNAKE_BODY;//原本是头的现在变成了身体
snakeX[snakeLength - 1] = snakeX[snakeLength - 2] + dx;
snakeY[snakeLength - 1] = snakeY[snakeLength - 2] + dy;//计算头坐标
map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD;//头坐标的map置为头
}
void snakeMove(int i, int j) {
if (map[snakeX[snakeLength - 1] + i][snakeY[snakeLength - 1] + j] == '$') {//碰到了食物
eat_money(i, j);
return;
}
int dx = i, dy = j, k;
map[snakeX[0]][snakeY[0]] = BLANK_CELL;//蛇前进了
for (k = 0; k <= snakeLength - 2; k++) {
snakeX[k] = snakeX[k + 1];
snakeY[k] = snakeY[k + 1];
map[snakeX[k]][snakeY[k]] = SNAKE_BODY;
}//蛇前进的坐标变化
snakeX[snakeLength - 1] += dx;
snakeY[snakeLength - 1] += dy;//蛇头的坐标变化
map[snakeX[snakeLength - 1]][snakeY[snakeLength - 1]] = SNAKE_HEAD;
}
void output(void) {//输出矩阵
int i, j;
for (i = 0; i <= 11; i++) {
for (j = 0; j <= 11; j++) {
printf("%c", map[i][j]);
}
printf("\n");
}
}
void gameover(void) {//游戏输了的结束语
printf("Game Over!!!\n");
}
字符游戏-智能蛇
最新推荐文章于 2019-10-13 19:53:12 发布