贪吃蛇游戏C语言Visual Studio实现(个人设计)

课程设计如果不会没思路可以在b站上边看视频边写。我写的代码在最后把有些的for循环该为了while循环,为了避免查重。

代码如下


#include<stdio.h>
#include<graphics.h>
#include<conio.h>    //用于键盘输入
#include<stdlib.h>   //用于生成随机数种子
#define SNAKE_MAX 500
#define sleep_    150 //速度

int x = 0;//全局变量表示第几个被创建的用户

struct Snake;//定义蛇的结构体
struct Food;//定义食物的结构体
enum DIR;//枚举 表示蛇的方向
void Gameinit();//游戏的初始化
void GameDraw();//给背景和蛇上色
void snakeMove();//移动蛇
void keyControl();//通过键盘输入移动方向
void EatFood();
int Menu();
void Select();
int Snakedie();
void adduser();
void sortfile();
void readfile();
void Game();

int main()//主函数在这!!!!!!!!
{
	Select();
	return 0;
}
/*知识点:结构体,循环,函数,数组,easyx*/
struct user //用户结构体
{
	char name[50];
	int score = -1;//看有没有被注册,同时记录分数
}people[100];
struct user name1[100];

struct Snake//定义蛇的结构体 .........................................
{
	int size;//蛇的长度,后面还会用长度表示分数
	int dir;//方向
	int speed;//蛇的速度
	POINT coor[SNAKE_MAX];//POINT是一个有x和y的结构体
}snake;
//定义食物的结构体......................................................
struct Food
{
	int r;        //食物半径
	bool flag;    //食物是否被吃
	DWORD color;  //食物颜色
	int x;
	int y;
}food;
enum DIR//枚举 表示蛇的方向.................................................
{
	UP,
	DOWN,
	LEFT,
	RIGHT,
};
//数据初始化
void Gameinit()//游戏的初始化........................................................ 
{
	//init初始化graph图形窗口
	initgraph(640, 480);
	//设置一个随机数种子,GetTickCount()获取从开机到现在的毫秒数
	srand(GetTickCount());
	//rand()产生一个随机数,需要设置随机数种子,一般设置时间为种子
	food.x = rand() % 640;
	food.y = rand() % 480;
	food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
	food.r = rand() % 10 + 5;
	food.flag = true;
	//初始化蛇
	snake.speed = 10;
	snake.size = 3;
	snake.dir = RIGHT;
	int i = 0;
	while (i < snake.size)
	{
		snake.coor[i].x = 40 - 10 * i;
		snake.coor[i].y = 10;
		i++;
	}


}
void GameDraw()//给背景和蛇上色........................................
{
	int i;
	//双缓冲绘图
	BeginBatchDraw();
	//设置背景颜色
	setbkcolor(RGB(28, 145, 118));
	//绘制蛇
	cleardevice();
	setfillcolor(RED);//蛇的颜色
	i = 0;
	while (i < snake.size)
	{
		solidcircle(snake.coor[i].x, snake.coor[i].y, 5);//半径为5的圆
		setfillcolor(RGB(rand() % 256, rand() % 256, rand() % 256));//蛇的颜色
		i++;
	}
	//绘制食物
	if (food.flag != 0)
	{
		solidcircle(food.x, food.y, food.r);
	}
	EndBatchDraw();


}
//移动蛇.........................................................................................
void snakeMove()
{
	//身体跟着蛇头动
	int i = snake.size - 1;
	while (i > 0)
	{
		snake.coor[i] = snake.coor[i - 1];
		i--;
	}
	//蛇头的移动
	switch (snake.dir)
	{
	case  UP:
		snake.coor[0].y -= snake.speed;
		break;
	case  DOWN:
		snake.coor[0].y += snake.speed;
		break;
	case  LEFT:
		snake.coor[0].x -= snake.speed;
		break;
	case  RIGHT:
		snake.coor[0].x += snake.speed;
		break;
	}




}
//通过键盘输入移动反向.........................................................................................
void keyControl()
{
	if (_kbhit())//判断有没有按键,如果有案件就返回真,否则返回假
	{
		switch (_getch())
		{
		case 'W':
		case 'w':
		case 72:
			if (snake.dir != DOWN)
			{
				snake.dir = UP;
			}
			break;
		case  's':
		case  'S':
		case  80:
			if (snake.dir != UP)
			{
				snake.dir = DOWN;
			}
			break;
		case 'a':
		case 'A':
		case 75:
			if (snake.dir != RIGHT)
			{
				snake.dir = LEFT;
			}
			break;
		case 'd':
		case 'D':
		case 77:
			if (snake.dir != LEFT)
			{
				snake.dir = RIGHT;
			}

			break;
		case ' ':
			while (1)
			{
				if (_getch() == ' ')
					return;
			}
			break;
		}
	}
}
void EatFood()
{
	if (food.flag && snake.coor[0].x >= food.x - food.r && snake.coor[0].x <= food.x + food.r
		&& snake.coor[0].y >= food.y - food.r && snake.coor[0].y <= food.y + food.r)
	{
		food.flag = false;
		snake.size++;
	}
	if (food.flag == 0)
	{
		food.x = rand() % 640;
		food.y = rand() % 480;
		food.color = RGB(rand() % 256, rand() % 256, rand() % 256);
		food.r = rand() % 10 + 5;
		food.flag = true;
	}

}
int Menu()
{
	int m;
	printf("************************************************************************************************************************\n");
	printf("************************************************************************************************************************\n");
	printf("*********************************************欢迎来到贪吃蛇游戏*********************************************************\n");
	printf("************************************************************************************************************************\n");
	printf("***********       1.开始游戏                 ******************            游戏规则                   ******************\n");
	printf("***********       2.创建用户                 ******************         按“w”“s”“a”“d”可以上  ******************\n");
	printf("***********       3.查看排名                 ******************         下左右移动蛇,蛇吃到果实加10  ******************\n");
	printf("***********       4.结束游戏                 ******************         分,吃到墙壁或自己游戏结束。  ******************\n");
	printf("***********                                  ******************        “s”键可以暂停游戏            ******************\n");
	printf("************************************************************************************************************************\n");
	printf("\n请输入您的选择:\n");
	scanf_s("%d", &m);
	return  m;
}
void Game()
//游戏进行部分..........................
{
	Gameinit();
	for (; 52;)
	{
		GameDraw();
		snakeMove();
		keyControl();
		EatFood();
		if (Snakedie() == 1)//蛇如果死亡,游戏结束
		{
			Sleep(1000);//蛇死之后暂停1秒再跳出界面
			break;
		}
		Sleep(sleep_);//控制快慢
	}
	closegraph();
	printf("                                                                                  \n");
	printf("**********************************************************************************\n");
	printf("**********************——游戏结束了——******************************************\n");
	printf("**********************************************************************************\n");
	printf("                   您的最终得分是:                                               \n");
	printf("                        %d  分                                                    \n", (((snake.size) - 3) * 10));
	people[x].score = (((snake.size) - 3) * 10);
}
void Select()//四选一
{
	int m;
	switch (Menu())
	{
	case  1:
		Game();
		break;
	case  2:
		adduser();
		break;
	case  3:
		sortfile();
		break;
	case  4:
		exit(0);
		break;

	}
	printf("\n请输入任意数后可以返回菜单:\n");
	scanf_s("%d", &m);
	Select();
}
int Snakedie()//蛇死亡
{
	int s = 0;
	for (int i = 1; i < snake.size; i++)//撞自己
	{
		if (snake.coor[0].x == snake.coor[i].x && snake.coor[0].y == snake.coor[i].y)
		{
			s = 1;
			break;
		}
	}
	if (snake.coor[0].x + 10 <= 0 || snake.coor[0].x - 10 >= 640 || snake.coor[0].y + 10 < 0 || snake.coor[0].y - 10 >= 480)//撞墙
	{
		s = 1;
	}
	if (s == 0)
		return 0;
	if (s == 1)
		return 1;
}
void  readfile()//读取文件
{
	FILE* fp = fopen("abc.txt", "r");
	if (fp == NULL)
	{
		printf("文件没有被打开!!!!!");
	}
	int j = 1;
	while (!feof(fp))//判断文件是否结束
	{
		fscanf(fp, "%s%d", &people[j].name, &people[j].score);
		j++;
	}
	fclose(fp);
}

//排序输出
void sortfile()
{
	readfile();
	int i, sco[50] = { 0 };
	char abcd[50];
	int j = 1;
	while (people[j].score != -1)
	{
		sco[j] = people[j].score;
		strcpy(name1[j].name, people[j].name);
		j++;
	}
	for (int j = 1; people[j].score != -1; j++)
	{
		for (int k = j + 1; people[k].score != -1; k++)
		{
			if (sco[j] < sco[k])
			{
				strcpy(abcd, name1[j].name);
				strcpy(name1[j].name, name1[k].name);
				strcpy(name1[k].name, abcd);
				i = sco[j];
				sco[j] = sco[k];
				sco[k] = i;
			}
		}
	}
	printf("\n名次                   用户名                 用户得分\n\n");
	j = 1;
	while (people[j].score != -1)
	{
		printf("%2d\t\t\t%s\t\t\t%d\n\n", j, name1[j].name, sco[j]);
		j++;
	}
}
//创建用户
void adduser()
{
	int j = 1;
	while (people[j].score != -1)
	{
		x = j;
		j++;
	}

	x++;
	system("cls");
	printf("请输入你的用户名(英文字母或数字):");
	scanf("%s", people[x].name);
	printf("    创建用户成功!!!!   ");
	people[x].score = 0;
	Game();
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值