以上就是我测试的结果,能完成基本的功能。
//game.h
#ifndef __GAME_H__
#define __GAMAE_H__
#include
#include
#include
#include
#define ROWS 20
#define COLS 20
#define snake_length (20*20)
#define SLEEP 1000//屏幕每次刷新的时间。
typedef enum ch//方向的取值范围。
{
d,
a,
s,
w,
};
typedef struct
{
int x;
int y;
}coordinate;
struct FOOD
{
coordinate fd;//食物的坐标。
int flag;//用来判断食物是否被吃。
}food;//食物的信息。
struct SNAKE
{
coordinate snk[snake_length];//蛇身每一节的信息。
int n;//蛇身的节数。
char ch;//接受用户输入移动字符。
coordinate *head_snake;//蛇头指针
coordinate*tail_snake;//蛇尾指针
}snake;//蛇的信息
void show_borad(char arr[][COLS], int row, int col);//界面函数。
void snake_food(char arr[][COLS], int row, int col);//蛇的食物生成函数。
void init_borad(char arr[][COLS], int row, int col);//初始游戏信息。
int snake_break(char arr[][COLS], int row, int col);//判断玩家游戏是否结束。
void sanke_eat();//判断玩家是否吃到食物。
void sanke_move(char arr[][COLS],int n);//蛇的移动。
void snake_change();//用户控制函数。
#endif//__GAME_H__
//test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void show_borad(char arr[][COLS], int row, int col)
{
int i, j;
printf("**********************\n");
for (i = 0; i < col; i++)
{
printf("*");
for (j = 0; j < row; j++)
{
printf("%c", arr[i][j]);
}
printf("*");
printf("\n");
}
printf("**********************\n");
}
void init_borad(char arr[][COLS], int row, int col)
{
food.flag = 0;//表示食物已经被吃掉。
snake.snk[2].x = 4;
snake.snk[2].y = 6;
snake.snk[1].x = 5;
snake.snk[1].y = 6;
snake.snk[0].x = 6;
snake.snk[0].y = 6;//蛇每一节的坐标信息。
arr[snake.snk[0].y][snake.snk[0].x] = '*';//
arr[snake.snk[1].y][snake.snk[1].x] = '*';//
arr[snake.snk[2].y][snake.snk[2].x] = '*';//用*表示蛇的身体。
snake.head_snake = &snake.snk[0];//把第一节的信息交给蛇头指针管理。
snake.tail_snake = &snake.snk[2];//把第三节的信息交给蛇尾指针管理。
snake.n = 3;//蛇开始时设为三节。
snake.ch = d;//方向为右。
}
void snake_food(char arr[][COLS], int row, int col)
{
while (1)
{
food.fd.x = rand() % 14;//为食物生成随机x坐标。
food.fd.y = rand() % 14;//为食物生成随机y坐标。
if (arr[food.fd.y][food.fd.x] == ' ')
{
arr[food.fd.y][food.fd.x] = '*';
break;
}
}
food.flag = 1;
}
void sanke_eat()
{
if (((*snake.head_snake).x == food.fd.x) && ((*snake.head_snake).y == food.fd.y))
{
(snake.n)++;//吃到一个食物,蛇的身体加1。
food.flag = 0;
}
}
void sanke_move(char arr[][COLS], int n)
{
int j = 0;
arr[(*snake.tail_snake).y][(*snake.tail_snake).x] = ' ';//尾巴置空格。
for (j = n - 2; j >= 0; j--)
{
snake.snk[j+1] = snake.snk[j];//把蛇身前面的身体坐标赋值给后面的。
}
snake.tail_snake = &(snake.snk[n-1]);
switch (snake.ch)
{
case w://向上移动
(*snake.head_snake).y -= 1;
break;
case s://向下走
(*snake.head_snake).y += 1;
break;
case d://向右走
(*snake.head_snake).x += 1;
break;
case a://向左走。
(*snake.head_snake).x -= 1;
break;
}
arr[(*snake.head_snake).y][(*snake.head_snake).x] = '*';
}
void snake_change()//用于接受用户输入。
{
char move;
move = getchar();
switch (move)
{
case 'W':
case 'w':
if (snake.ch != s)
snake.ch = w;
break;
case 'S':
case 's':
if (snake.ch != w)
snake.ch = s;
break;
case 'D':
case 'd':
if (snake.ch != a)
snake.ch = d;
break;
case 'A':
case 'a':
if (snake.ch != d)
snake.ch = a;
break;
}
}
int snake_break(char arr[][COLS], int row, int col)
{
int j = 1;
for (j = 2; j < snake.n; j++)//判断蛇头坐标有没有跟第二节以后的蛇身的坐标重合。
{
if (((*snake.head_snake).x == snake.snk[j].x) && ((*snake.head_snake).y == snake.snk[j].y))
{
printf("你咬到自己了\n");
return 0;//咬到自己向主函数返回0,用于结束游戏。
}
}
if (((0 >(*snake.head_snake).x) || ((*snake.head_snake).x >= row)) || ((0 >(*snake.head_snake).y) || ((*snake.head_snake).y >= col)))//判断蛇头有没有越界。
{
printf("你撞墙了\n");
return 0;//咬到自己向主函数返回0,用于结束游戏。
}
return 1;//如果没有死亡,返回1继续游戏。
}
//game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include"game.h" void play() { int i = 0; int identifier = 1;//用接受snake_break()函数的返回值,判断玩家是否已经死亡。 srand((size_t)time(NULL)); char arr[ROWS][COLS];//蛇身数组。 memset(arr, ' ', sizeof(arr));//把数组内容置为空格。 init_borad(arr, ROWS, COLS);//初始游戏信息。 show_borad(arr, ROWS, COLS);//打印游戏信息。 while (1) { while (!_kbhit())//检查是否有键盘输入。 { if (food.flag== 0)//如果食物被吃,重新生成食物。 { snake_food(arr, ROWS, COLS);//食物生成函数。 } identifier = snake_break(arr, ROWS, COLS);//判断玩家是否死亡。 if (identifier==0)//判断游戏是否结束。 return; sanke_eat();//判断是否吃到食物。 if (snake.n == snake_length)//判断蛇身是不是充满整个空间。 { printf("你赢了\n"); return; } sanke_move(arr, snake.n);//蛇的移动 system("cls");//清除屏幕。 show_borad(arr, ROWS, COLS);//打印蛇的信息。 Sleep(SLEEP);//程序暂停SLLEEP毫秒后继续执行。 } snake_change();//接受用户输入 } } void mean() { printf("\n*******欢迎来到贪吃蛇游戏*****\n"); printf("******************************\n"); printf("*******play 1 exit 0**********\n"); printf("******************************\n"); } int main() { int input; do { mean(); scanf("%d", &input); switch (input) { case 1: play(); break; case 0: printf("游戏结束\n"); break; defalut: printf("选择错误,请重新选择"); break; } } while (input); system("pause"); return 0; }
初学者
,所以 以上代码还存在许多不足的地方。如果发现问题还希望不吝赐教
...
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
![大笑](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)