简易版贪吃蛇小游戏。

以上就是我测试的结果,能完成基本的功能。

//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; } 
         
       
      
      
     
     
    
    
   
   
初学者 大笑,所以 以上代码还存在许多不足的地方。如果发现问题还希望不吝赐教 大笑 大笑...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值