HX是人控制的蛇,@OO是电脑自动操控的蛇,在之前人控蛇和智能蛇 的基础上将它们融为一体,在一个屏幕上,就可以PVE了。
胜负条件可以有更多,限定时间或者到达指定长度。
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>
#define map_high 36
#define map_width 41
#define snake_head 'H'
#define snake_body 'X'
#define AIsnake_head '@'
#define AIsnake_body 'O'
#define snake_food '$'
#define wall_char '*'
#define blank_char ' '
struct SNAKE{
int x[100];
int y[100];
int lenth ;
};
struct SNAKE snake;
struct SNAKE AIsnake;
struct FOOD{
int x;
int y;
}food;
int gamerun = 1;
char construct = 'd';
int AIconstruct = 3;
int HaveFood = 0;
int speed = 400;
char map[map_high][map_width] = {
"****************************************",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"* *",
"****************************************" };
void PrintMap() {
int i=0;
system("cls");
for ( i=0; i<map_high; i++ ) {
printf("%s\n", map[i]);
}
}
void SpawnFood() {
food.x = rand() % (map_width - 3) + 1;
food.y = rand() % (map_high - 2) + 1;
while(map[food.y][food.x] != blank_char) {
food.x = rand() % (map_width - 3) + 1;
food.y = rand() % (map_high - 2) + 1;
}
map[food.y][food.x] = snake_food;
HaveFood = 1;
}
void InitGame() {
snake.x[1] = 1;
snake.y[1] = 1;
snake.x[0] = 2;
snake.y[0] = 1;
snake.lenth = 2;
map[snake.y[0]][snake.x[0]] = snake_head;
map[snake.y[1]][snake.x[1]] = snake_body;
AIsnake.x[1] = 10;
AIsnake.y[1] = 10;
AIsnake.x[0] = 11;
AIsnake.y[0] = 10;
AIsnake.lenth = 2;
map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_head;
map[AIsnake.y[1]][AIsnake.x[1]] = AIsnake_body;
gamerun = 1;
PrintMap();
}
void GameOver() {
gamerun = 0;
printf("GAME OVER\n");
}
void GameWin() {
gamerun = 0;
printf("YOU WIN\n");
}
void MoveSnake() {
if(kbhit()) {
while(kbhit()) construct = getch();
}
map[snake.y[snake.lenth-1]][snake.x[snake.lenth-1]] = blank_char;
map[snake.y[0]][snake.x[0]] = snake_body;
int i = 0;
for( i=snake.lenth-1; i; i-- ) {
snake.x[i] = snake.x[i-1];
snake.y[i] = snake.y[i-1];
}
switch(construct) {
case 'w': {snake.y[0]--;
break;
}
case 'a': {snake.x[0]--;
break;
}
case 's': {snake.y[0]++;
break;
}
case 'd': {snake.x[0]++;
break;
}
}
if(map[snake.y[0]][snake.x[0]] != blank_char && map[snake.y[0]][snake.x[0]] != snake_food ) {
GameOver();
}
if(map[snake.y[0]][snake.x[0]] == snake_food ) {
map[snake.y[0]][snake.x[0]] = snake_head;
HaveFood = 0;
snake.lenth++;
}
else map[snake.y[0]][snake.x[0]] = snake_head;
}
void AIMove() {
int CanMove[4] = {1,1,1,1};
if(map[AIsnake.y[0]][AIsnake.x[0]+1] != blank_char && map[AIsnake.y[0]][AIsnake.x[0]+1] != snake_food) CanMove[3] = 0;//right
if(map[AIsnake.y[0]][AIsnake.x[0]-1] != blank_char && map[AIsnake.y[0]][AIsnake.x[0]-1] != snake_food) CanMove[1] = 0;//left
if(map[AIsnake.y[0]-1][AIsnake.x[0]] != blank_char && map[AIsnake.y[0]-1][AIsnake.x[0]] != snake_food) CanMove[0] = 0;//up
if(map[AIsnake.y[0]+1][AIsnake.x[0]] != blank_char && map[AIsnake.y[0]+1][AIsnake.x[0]] != snake_food) CanMove[2] = 0;//down
if(food.x<=AIsnake.x[0] && food.y<AIsnake.y[0]) AIconstruct=0;
if(food.x<AIsnake.x[0] && food.y>=AIsnake.y[0]) AIconstruct=1;
if(food.x>=AIsnake.x[0] && food.y>AIsnake.y[0]) AIconstruct=2;
if(food.x>AIsnake.x[0] && food.y<=AIsnake.y[0]) AIconstruct=3;
while(!CanMove[AIconstruct]) AIconstruct = AIconstruct % 4 + 1;
map[AIsnake.y[AIsnake.lenth-1]][AIsnake.x[AIsnake.lenth-1]] = blank_char;
map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_body;
int i = 0;
for( i=AIsnake.lenth-1; i; i-- ) {
AIsnake.x[i] = AIsnake.x[i-1];
AIsnake.y[i] = AIsnake.y[i-1];
}
switch(AIconstruct) {
case 0: AIsnake.y[0]--; break;
case 1: AIsnake.x[0]--; break;
case 2: AIsnake.y[0]++; break;
case 3: AIsnake.x[0]++; break;
}
if(map[AIsnake.y[0]][AIsnake.x[0]] != blank_char && map[AIsnake.y[0]][AIsnake.x[0]] != snake_food ) {
GameWin();
}
if(map[AIsnake.y[0]][AIsnake.x[0]] == snake_food ) {
map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_head;
HaveFood = 0;
AIsnake.lenth++;
}
else map[AIsnake.y[0]][AIsnake.x[0]] = AIsnake_head;
}
void GetSpeed() {
speed = 400 - snake.lenth * 20;
}
int main() {
InitGame() ;
while (gamerun) {
PrintMap();
srand(time(NULL));
if(!HaveFood) SpawnFood ();
GetSpeed();
Sleep(speed);
MoveSnake();
AIMove();
}
return 0;
}