课程设计如果不会没思路可以在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();
}