c语言课程设计--贪吃蛇

闰土哈瑞特人

在这里插入图片描述

可以用dev直接运行哦
声音文件已被注释


#define _CRT_SECURE_NO_WARNINGS 1

//#include<graphics.h>
#include<stdio.h>
#include<stdlib.h>
#include <windows.h>
#include<algorithm>
#include<conio.h>
#include <ctime>
#include<iostream>
#include<vector>
#include <mmsystem.h>
#include <fstream>
#include<set>
#include<map>
#pragma comment(lib,"Winmm.lib")//播放音乐
using namespace std;

int RangeX = 6, RangeY = 6;
int Range_hight = 20, Range_width = 20;

void About_games();//关于游戏
void help();//游戏帮助
void start_game();//开始游戏
void point_rang();//积分排名
void mainmenu();//主菜单
void gotoxy(int x, int y);//空格数与换行数
void pause_game();//暂停游戏
void myPause(int tn);//延时关闭
void show(); //打印边界
void jixushow(); //打印边界
void print_Snake();//绘制字符画 --蛇
void Game_difficulty();//游戏难度
void background_musicss();//背景音乐
int setColor(int c);//自定义颜色
void game_over();//游戏结束
void background___musicss();//死亡音乐
void all_date(struct Snake* snake, struct Foodxy* food);//打印游戏过程的数据
void move_snake(struct Snake* snake);//蛇的移动
void get_food(struct Snake* snake, struct Foodxy* food);//普通食物生成
void get_tanchi(struct Snake* snake, struct Foodxy* food);//加成食物生成
void print_snake(struct Snake* snake);//打印蛇
void eat_tan(struct Snake* snake, struct Foodxy* food);//食物加成
void eat_food(struct Snake* snake, struct Foodxy* food);//吃食物
void update(struct Snake* snake);//数据初始化
void through_wall(struct Snake* snake, char ch);//穿墙
int if_die(struct Snake* snake);//判断蛇是否死


vector<pair<string, int >>aa;
map<int, string>qqqq;
multiset<string>bb;

int  i, j, p, q, temp, ppppp;
int fen;//分数
int earn;//额外分

int a[2];     //用于记住蛇尾坐标,其中a[0]、a[1]分别表示横、竖坐标
int ff;//退出游戏的标志量
int xx, yy;//继续后的食物坐标
int tan_x, tan_y;//贪吃的食物的坐标。
struct point {
    
     //积分结构
	char name[20];
	int fen;
} all_points[50];

/*bool cmp(point a, point b) {
    
     //自定义排序

	return a.fen > b.fen;
}*/

bool cmp(pair<string, int>a, pair<string, int>b) {
    
    
	return a.second > b.second;
}

struct Snake {
    
    //蛇的数据
	int x[100];
	int y[100];
	int food_count;
	int snake_length;
	int speed;
};

struct Foodxy {
    
    //食物坐标
	int x;
	int y;
};

void gotoxy(int x, int y) {
    
     //空格数与换行数
	COORD c;
	c.X = x;
	c.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

int setColor(int c) {
    
    
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);

	return 0;
}

//void background_musicss() {
    
    //背景音乐
//
//	mciSendString(TEXT("open E:\\贪吃蛇\\素材\\音乐.mp3 alias jpmusic"), NULL, 0, NULL);
//	mciSendString(TEXT("play jpmusic "), NULL, 0, NULL);
//
//}

//void background___musicss() {
    
    //死亡音乐
//
//	mciSendString(TEXT("open E:\\贪吃蛇\\素材\\死亡.mp3 alias jpmusic"), NULL, 0, NULL);
//
//	mciSendString(TEXT("play jpmusic"), NULL, 0, NULL);
//}

//void background_picturezhu() {
    
    //主界面图片
//
//	initgraph(922, 481);
//	IMAGE img_bk;
//	loadimage(&img_bk, _T("F:\\素材\\图片.jpg"));
//	putimage(0, 0, &img_bk); // 在坐标(0 , 0 )位置显示IMAGE 对象
//	_getch();
//	closegraph();
//
//}

void all_date(struct Snake* snake, struct Foodxy* food) {
    
    
	fen = 10 * snake->food_count + (400 - snake->speed) / 10;
	gotoxy(80, 5);
	printf("level : %d", snake->food_count / 5 + 1);    //打印游戏等级
	gotoxy(80, 8);
	printf("score : %d", fen + earn); //打印游戏得分
	//分数=10*snake+(300-speed)/10
	gotoxy(80, 11);
	printf("eat food : %d", snake->food_count);    //打印产生食物个数
	gotoxy(80, 14);
	printf("speed : %03dms", snake->speed);    //打印游戏速度
	gotoxy(80, 17);
	printf("foodX : %d", food->x);      //打印食物的横坐标
	gotoxy(80, 20);
	printf("foodY : %d", food->y);      //打印食物的竖坐标
	//printf("      x: %d y:  %d", snake->x[snake->snake_length - 1], snake->y[snake->snake_length - 1]+1000);



}


void move_snake(struct Snake* snake) {
    
     //蛇的移动
	gotoxy(snake->x[0], snake->y[0]);
	printf("  ");       /* 清除蛇尾*/
	for (i = 1; i < snake->snake_length; i++) {
    
    
		/* 后一节的坐标依次取代前一节的坐标 */
		snake->x[i - 1] = snake->x[i];
		snake->y[i - 1] = snake->y[i];
	}
}

//产生食物
void get_food(struct Snake* snake, struct Foodxy* food) {
    
    
	srand((unsigned)time(NULL));       //初始化随机数
	while (1) {
    
    
		/* 产生食物的条件:1.在游戏窗口内 2.不在蛇的身上 */
		food->x = rand() % 56;//得到食物的横坐标
		food->y = rand() % 24; //得到食物的竖坐标
		if (food->x <= 13 || food->y <= 5 || (food->x == tan_x && food->y == tan_y)) {
    
     //越界跳过
			continue;
		}
		if (snake->x[snake->snake_length - 1] % 2 != food->x % 2)continue;/******/
		for (i = 0; i < snake->snake_length; i++) {
    
    
			/* 判断食物是否在蛇的身上,如果在蛇身上,则重新产生;否则,打印蛇身 */
			if (food->x == snake->x[i] && food->y == snake->y[i]) {
    
    
				break;
			}
		}
		if (i == snake->snake_length) {
    
    
			xx = food->x;
			yy = food->y;
			gotoxy(food->x, food->y);
			setColor(15);
			printf("●");

			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
			                        FOREGROUND_BLUE);//字体颜色
			break;
		}
	}
}

void get_tanchi(struct Snake* snake, struct Foodxy* food) {
    
    

	srand((unsigned)time(NULL));       //初始化随机数
	while (1) {
    
    
		/* 产生食物的条件:1.在游戏窗口内 2.不在蛇的身上 */
		tan_x = rand() % 56 - 2;//得到食物的横坐标
		tan_y = rand() % 24 - 1; //得到食物的竖坐标
		if (tan_x <= 13 || tan_y <= 5 || (food->x == tan_x && food->y == tan_y)) {
    
     //越界跳过
			continue;
		}
		if (snake->x[snake->snake_length - 1] % 2 != tan_x % 2)continue;/******/
		for (i = 0; i < snake->snake_length; i++) {
    
    
			/* 判断食物是否在蛇的身上,如果在蛇身上,则重新产生;否则,打印蛇身 */
			if (tan_x == snake->x[i] && tan_y == snake->y[i]) {
    
    
				break;
			}
		}
		if (i == snake->snake_length) {
    
    

			gotoxy(tan_x, tan_y);
			setColor(6);
			printf("★");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
			                        FOREGROUND_BLUE);//字体颜色
			break;

		}
	}
}

void print_snake(struct Snake* snake) {
    
     //打印蛇
	for (i = 0; i < snake->snake_length; i++) {
    
    
		gotoxy(snake->x[i], snake->y[i]);
		if (i == 0) {
    
    
			//setColor(2);
			printf("○");//       //打印蛇尾
		} else if (i == snake->snake_length - 1) {
    
    
			//setColor(i % 16);
			printf("¤");//       //打印蛇头
		} else {
    
    
			//setColor(i % 16);
			printf("⊙"); //     //打印蛇身
		}
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
		                        FOREGROUND_BLUE);//字体颜色
	}
}

//吃加成
void eat_tan(struct Snake* snake, struct Foodxy* food) {
    
    

	if (snake->x[snake->snake_length - 1] == tan_x && snake->y[snake->snake_length - 1] == tan_y) {
    
    //贪吃食物的加成
		get_tanchi(snake, food);
		earn += 20;//20分。

	}

}
//吃食物
void eat_food(struct Snake* snake, struct Foodxy* food) {
    
    
	if (snake->x[snake->snake_length - 1] == food->x && snake->y[snake->snake_length - 1] == food->y) {
    
    
		/* 如果蛇头位置与食物位置相同,吃食物 */
		snake->snake_length++;      //吃一个食物,蛇身增长一节
		for (i = snake->snake_length - 1; i >= 1; i--) {
    
    
			/* 蛇后节坐标依次赋值给蛇前一节的坐标,依次得到蛇身及蛇头的坐标 */
			snake->x[i] = snake->x[i - 1];
			snake->y[i] = snake->y[i - 1];
		}
		snake->x[0] = a[0];      //得到蛇尾移动前的横坐标
		snake->y[0] = a[1];      //得到蛇尾移动前的竖坐标
		get_food(snake, food);    //重新产生食物
		snake->food_count++;       //食物的个数增1
		if (snake->food_count % 1 == 0) {
    
    
			/* 当蛇吃1个食物时,速度加快10毫秒 */
			if (snake->speed <= 30)
				snake->speed -= 3;
			else if (snake->speed <= 60)
				snake->speed -= 5;
			else snake->speed -= 10;
		}
	}

}

void update(struct Snake* snake) {
    
    //数据初始化
	snake->x[0] = 30 + 2;     //初始化蛇的横坐标
	snake->y[0] = 9 + 10 / 2;  //初始化蛇的竖坐标
	snake->speed = ppppp;      //初始化蛇的速度为ppppp
	snake->snake_length = 3;      //初始化蛇的长度为3//
	snake->food_count = 0;       //初始化蛇吃的个数为0
	fen = 0;
	earn = 0;
	for (i = 1; i < snake->snake_length; i++) {
    
    
		/* 依次得到蛇身、蛇头的坐标 */
		snake->x[i] = snake->x[i - 1] + 2;
		snake->y[i] = snake->y[i - 1];
	}
}

//穿墙
void through_wall(struct Snake* snake, char ch) {
    
    
	if (ch == 119 && snake->y[snake->snake_length - 1] == RangeY - 2) {
    
    
		snake->y[snake->snake_length - 1] = RangeY + Range_hight - 3; //如果蛇在上框且向上移动,穿墙
	}
	if (ch == 115 && snake->y[snake->snake_length - 1] == RangeY + Range_hight - 2) {
    
    
		snake->y[snake->snake_length - 1] = RangeY - 1;    //如果蛇在下框且向下移动,穿墙
	}
	if (ch == 97 && snake->x[snake->snake_length - 1] < RangeX + 7) {
    
    
		snake->x[snake->snake_length - 1] = RangeX + 2 * Range_width + 10; //如果蛇在左框且向左移动,穿墙
	}
	if (ch == 100 && snake->x[snake->snake_length - 1] > RangeX + Range_width + 30) {
    
    
		snake->x[snake->snake_length - 1] = 14;    //如果蛇在右框且向右移动,穿墙
	}
}

//判断蛇是否死
int if_die(struct Snake* snake) {
    
    
	/* 当蛇头碰到自身时,蛇死 ,返回值为0 */
	for (i = 0; i < snake->snake_length - 1; i++) {
    
    
		if (snake->x[snake->snake_length - 1] == snake->x[i] && snake->y[snake->snake_length - 1] == snake->y[i]) {
    
    
			return 0;
		}
	}
	return 1;
}

void show() {
    
    //打印边界

	gotoxy(12, 4);
	printf("╔");
	gotoxy(58, 4);
	printf("╗");
	gotoxy(12, 24);
	printf("╚");
	gotoxy(58, 24);
	printf("╝");

	for (int i = 13; i < 58; i++) {
    
    //
		Sleep(15);
		gotoxy(i, 4);
		printf("═");
		gotoxy(i, 24);
		printf("═");//
	}
	/*for (int i = 14; i < 58; i++) {
    
    //
		gotoxy(i, 24);
		printf("-");//
	}*/
	for (int i = 5; i < 24; i++) {
    
    
		Sleep(15);
		gotoxy(12, i);
		printf("║");
		gotoxy(58, i);
		printf("║");
	}
	/*for (int i = 5; i < 24; i++) {
    
    
	//	Sleep(50);
		gotoxy(58, i);
		printf("║");
	}*/

}

void jixushow() {
    
    //打印边界

	gotoxy(12, 4);
	printf("╔");
	gotoxy(58, 4);
	printf("╗");
	gotoxy(12, 24);
	printf("╚");
	gotoxy(58, 24);
	printf("╝");

	for (int i = 13; i < 58; i++) {
    
    //

		gotoxy(i, 4);
		printf("═");
		gotoxy(i, 24);
		printf("═");//
	}
	/*for (int i = 14; i < 58; i++) {
    
    //
		gotoxy(i, 24);
		printf("-");//
	}*/
	for (int i = 5; i < 24; i++) {
    
    

		gotoxy(12, i);
		printf("║");
		gotoxy(58, i);
		printf("║");
	}
	/*for (int i = 5; i < 24; i++) {
    
    
	//	Sleep(50);
		gotoxy(58, i);
		printf("║");
	}*/

}

void print_Snake() {
    
     //绘制字符画 --蛇
	//background_picturezhu();//背景图片

	system("cls");//清屏
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
	                        FOREGROUND_BLUE);//字体颜色
	gotoxy(40, 1);
	Sleep(950);
	setColor(6);
	printf("/^\\/^\\");      //蛇眼睛
	Sleep(50);

	gotoxy(39, 2);
	printf("|_O|  O|");      //蛇眼睛
	Sleep(50);

	gotoxy(38, 2);
	setColor(2);
	printf("_");
	Sleep(50);

	gotoxy(30, 3);
	setColor(2);
	printf("\\/");      	//蛇信
	Sleep(50);

	gotoxy(36, 3);
	setColor(2);
	printf("/");
	Sleep(50);

	gotoxy(42, 3);
	setColor(6);
	printf(" \\_/");     	//蛇眼睛
	Sleep(50);

	gotoxy(46, 3);
	setColor(10);
	printf(" \\");
	Sleep(50);

	gotoxy(31, 4);
	setColor(12);
	printf("\\____");   	//舌头
	Sleep(50);

	gotoxy(37, 4);
	printf("_________/");
	Sleep(50);

	gotoxy(36, 4);
	setColor(2);
	printf("|");
	Sleep(50);

	gotoxy(48, 4);
	setColor(10);
	printf("\\");
	Sleep(50);

	gotoxy(37, 5);
	setColor(2);
	printf("\\_______");    //蛇嘴
	Sleep(50);

	gotoxy(49, 5);
	setColor(6);
	printf("\\");
	Sleep(50);

	gotoxy(44, 6);
	printf("|     |                  \\");  //下面都是画蛇身
	Sleep(50);

	gotoxy(43, 7);
	printf("/      /                   \\");
	Sleep(50);

	gotoxy(42, 8);
	printf("/      /                    \\ \\");
	Sleep(50);

	gotoxy(40, 9);
	printf("/      /                       \\ \\");
	Sleep(50);

	gotoxy(39, 10);
	printf("/     /                          \\  \\");
	Sleep(50);

	gotoxy(38, 11);
	printf("/     /             _----_         \\   \\");
	Sleep(50);

	gotoxy(37, 12);
	printf("/     /           _-~      ~-_         |  |");
	Sleep(50);

	gotoxy(36, 13);
	printf("(      (        _-~    _--_    ~-_     _/  |");
	Sleep(50);

	gotoxy(37, 14);
	printf("\\     ~-____-~    _-~    ~-_    ~-_-~    /");
	Sleep(50);

	gotoxy(38, 15);
	printf("~-_           _-~          ~-_       _-~");
	Sleep(50);

	gotoxy(40, 16);
	printf("~--______-~                ~-___-~");
	Sleep(1000);

}
void start_game() {
    
    
	system("cls");
	char ch = 100;
	char CH = 100;
	struct Snake s, * snake = &s;      //定义蛇的结构体指针并指向蛇 的结构体
	struct Foodxy f, * foodxy = &f;
	show();//游戏范围
	update(snake);//数据初始化
	get_tanchi(snake, foodxy);//贪心食物随机生成。
	get_food(snake, foodxy);//食物的随机生成

	ff = 0;
	int suiji = 0;

	while (1) {
    
    
		suiji++;

		all_date(snake, foodxy);
		a[0] = snake->x[0];       //记住蛇尾的横坐标
		a[1] = snake->y[0];       //记住蛇尾的竖坐标
		j = 0;
		if (_kbhit()) {
    
    
			/* 判断是否按下键盘,如果按下,ch接收键盘输入 */
			ch = _getch();
			if (_kbhit()) {
    
    
				/* 如果快速按键盘,则加速 */
				Sleep(20);
				j = 1;
			}
		}
		//gotoxy(80, 22);
		//printf("%d    %d", abs(tan_x-snake->x[snake->snake_length - 1]), abs(tan_y-snake->y[snake->snake_length - 1]));
		if (abs(tan_x - snake->x[snake->snake_length - 1]) <= 8 && abs(tan_y - snake->y[snake->snake_length - 1]) <= 5) {
    
    
			//gotoxy(80, 22);
			//printf("%d    %d", snake->x[snake->snake_length - 1], snake->y[snake->snake_length - 1]);
			int tttttt;
			tttttt = rand() % 10;
			if (tttttt >= 5) {
    
    

				gotoxy(tan_x, tan_y);
				printf("  ");
				get_tanchi(snake, foodxy);

			}
		}



		switch (ch) {
    
    

			case 119: {
    
    
				/* 向上移动 */
				CH = 119;
				move_snake(snake);   //移动蛇
				snake->y[snake->snake_length - 1] -= 1; //蛇头的竖坐标向上移,即减1
				break;
			}
			case 115: {
    
    
				/* 向下移动 */
				CH = 115;
				move_snake(snake);   //移动蛇
				snake->y[snake->snake_length - 1] += 1; //蛇头的竖坐标向下移,即加1
				break;
			}
			case 97: {
    
    
				/* 向左移动 */
				CH = 97;
				move_snake(snake);   //移动蛇
				snake->x[snake->snake_length - 1] -= 2; //蛇头的横坐标向左移,即减2
				break;
			}
			case 100: {
    
    
				/* 向右移动 */
				CH = 100;
				move_snake(snake);   //移动蛇
				snake->x[snake->snake_length - 1] += 2; //蛇头的横坐标向右移,即加2
				break;
			}
			case 32: {
    
    
				pause_game();
				break;

			}
			default: {
    
    
				ch = CH;
				switch (ch) {
    
    
					case 119: {
    
    
						/* 向上移动 */
						CH = 119;
						move_snake(snake);   //移动蛇
						snake->y[snake->snake_length - 1] -= 1; //蛇头的竖坐标向上移,即减1
						break;
					}
					case 115: {
    
    
						/* 向下移动 */
						CH = 115;
						move_snake(snake);   //移动蛇
						snake->y[snake->snake_length - 1] += 1; //蛇头的竖坐标向下移,即加1
						break;
					}
					case 97: {
    
    
						/* 向左移动 */
						CH = 97;
						move_snake(snake);   //移动蛇
						snake->x[snake->snake_length - 1] -= 2; //蛇头的横坐标向左移,即减2
						break;
					}
					case 100: {
    
    
						/* 向右移动 */
						CH = 100;
						move_snake(snake);   //移动蛇
						snake->x[snake->snake_length - 1] += 2; //蛇头的横坐标向右移,即加2
						break;
					}
				}

				break;
			}


		}

		if (ff == 2)break;
		if (ff == 3)exit(0);
		if (ff == 1) {
    
    
			jixushow();
			gotoxy(xx, yy);
			setColor(15);
			printf("●");
			gotoxy(tan_x, tan_y);
			setColor(6);
			printf("★");
			SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
			                        FOREGROUND_BLUE);//字体颜色
			ch = CH;
			ff = 0;
		}
		through_wall(snake, ch);    //穿墙
		eat_tan(snake, foodxy); //吃加成
		eat_food(snake, foodxy);     //吃食物

		print_snake(snake);  //打印蛇
		if (if_die(snake) == 0) {
    
    
			/* 游戏结束条件:蛇碰到自身  */
			//mciSendString(TEXT("close jpmusic"), NULL, 0, NULL);//当前音乐关闭
			//background___musicss();//死亡音乐
			gotoxy(33, 14);
			printf("Game Over");
			Sleep(2000);
			game_over();
			system("cls");
			//	mciSendString(TEXT("close jpmusic"), NULL, 0, NULL);//当前音乐关闭
			//background_musicss();//背景音乐
			mainmenu();
			break;
		}
		if (j == 0) {
    
    
			Sleep(snake->speed);      //延迟时间
		} else {
    
    
			Sleep(10);
		}

	}




	if (ff == 2)
		mainmenu();




}


void Game_difficulty() {
    
    
	system("cls");
	gotoxy(48, 10);
	printf("难  度  选  择");
	gotoxy(50, 12);
	printf("1.我就玩玩");
	gotoxy(50, 14);
	printf("2.再快一点?");
	gotoxy(50, 16);
	printf("3.飞的感觉");
	gotoxy(86, 29);
	printf("请在输入法英文状态下开始游戏");
	gotoxy(0, 29);
	printf("你的选择:");
	char  n;
	cin >> n;

	switch (n) {
    
    
		case '1':
			system("cls");
			ppppp = 400;
			break;
		case '2':
			system("cls");
			ppppp = 200;
			break;
		case '3':
			system("cls");
			ppppp = 100;
			break;
		default:
			system("cls");
			Game_difficulty();
			break;
	}


}

void point_rang() {
    
    
	qqqq[1] = "Winner";
	//qqqq[2] = "2nd";
	//qqqq[3] = "3rd";
	//qqqq[4] = "4th";
	//qqqq[5] = "5th";
	//qqqq[6] = "6th";
	//qqqq[7] = "7th";
	//qqqq[8] = "8th";
	//qqqq[9] = "9th";
	//qqqq[10] = "10th";
	char aba[15][15] = {
    
     {
    
    " "},{
    
    "Winner"},{
    
    "2nd"},{
    
    "3rd"},{
    
    "4th"},{
    
    "5th"},{
    
    "6th"},{
    
    "7th"},{
    
    "8th"},{
    
    "9th"},{
    
    "10th"} };
	int i, j, k, l;
	system("cls");
	gotoxy(44, 2);
	printf("积  分   排   名  如  下:(前10)\n\n");
	gotoxy(33, 6);
	cout << "Ranking";
	gotoxy(50, 6);
	cout << "   Name" << "                " << "Score";
	aa.clear();
	ifstream in("数据.txt");
	if(in) {
    
    
		int tt;
		in >> tt;
		for (int i = 0; i < tt; i++) {
    
    
			int fenn;
			string ss;
			in >> ss >> fenn;

			aa.push_back(make_pair(ss, fenn));
		}
		in.close();
	}
	else{
    
    
		
		ofstream outstuf;
		outstuf.open("数据.txt");
		ofstream out("数据.txt");
		out<<0<<endl;
		out.close();
		
	}

	sort(aa.begin(), aa.end(), cmp);
	j = 8;
	int ii = 1;
	if (aa.size() == 0) {
    
    
		gotoxy(44, 15);
		setColor(4);
		printf("目前无人在榜,赶快上榜吧!!!");
	}
	for (auto& i : aa) {
    
    
		if (ii == 1)setColor(4);//积分排名颜色渐变
		else if (ii > 1 && ii <= 4)setColor(6);
		else if (ii > 4 && ii <= 7)setColor(14);
		else setColor(7);
		if (qqqq[ii] == "Winner") {
    
    

			gotoxy(37 - qqqq[ii].size() / 2, j);//居中
			cout << aba[ii++];
		} else {
    
    
			gotoxy(36 - qqqq[ii].size() / 2, j);//居中
			cout << aba[ii++];
		}

		gotoxy(55 - i.first.size() / 2, j);//居中
		cout << i.first;
		gotoxy(75 - (int)log10(i.second) / 2, j);//居中
		cout << i.second;
		j += 2;
		if (ii > 10)break;
	}
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
	                        FOREGROUND_BLUE);//颜色归位
	gotoxy(0, 29);
	printf("任意键返回:");
	/*int  m;
	scanf("%d",&m);
	switch(m) {
    
    
		case 1:
			system("cls");
			mainmenu();
			break;
	}*/
	char input;
	while (1) {
    
    
		if (_kbhit()) {
    
    
			system("cls");
			input = _getch();
			mainmenu();
			break;
		}
	}

}


void help() {
    
    
	system("cls");//清屏
	gotoxy(50, 4);
	printf("利用键盘控制小蛇的移动\n");
	gotoxy(49, 6);
	printf("通过吃到食物获得积分加成\n");
	gotoxy(53, 8);
	printf("附带提速效果\n");
	gotoxy(35, 10);
	printf("蛇在移动中只有碰到自己才会死亡,碰到墙壁会穿过继续进行");
	gotoxy(55, 12);
	printf("w     上");
	gotoxy(55, 14);
	printf("a     左");
	gotoxy(55, 16);
	printf("s     下");
	gotoxy(55, 18);
	printf("d     右");
	gotoxy(53, 20);
	printf("space   暂停");
	gotoxy(86, 29);
	printf("请在输入法英文状态下开始游戏");
	gotoxy(0, 29);
	printf("任意键返回:");
	char input;
	while (1) {
    
    

		if (_kbhit()) {
    
    
			system("cls");
			input = _getch();
			mainmenu();
			break;
		}
	}

}


void About_games() {
    
    
	system("cls");
	gotoxy(10, 3);
	printf("开发成员:");
	gotoxy(17, 5);
	printf("---------------------------------");
	gotoxy(17, 7);
	printf("-----------------------------");
	gotoxy(17, 9);
	printf("--------------------------------");
	gotoxy(55, 2);
	printf("4.26更新:游戏框架成型");

	gotoxy(55, 4);
	printf("5.31更新:加入核心代码");

	gotoxy(55, 6);
	printf("6.1更新:优化蛇穿墙的各种参数");

	gotoxy(55, 8);
	printf("6.3更新:优化食物随机出现的坐标,使蛇可以精确吃到食物");

	gotoxy(55, 10);
	printf("6.4更新:优化暂停过程中的无法再次调用函数的错误");

	gotoxy(55, 12);
	printf("6.4更新:增加积分排名的颜色变换并对蛇的速度进行优化");

	gotoxy(55, 14);
	printf("6.5更新:加入加成食物,加入蛇死亡音效");
	gotoxy(55, 16);
	printf("6.6更新:调整加成食物被吃几率,更加符合贪吃的定义");

	gotoxy(55, 18);
	printf("6.8更新:微调主页面内容位置,使其居中");

	gotoxy(55, 20);
	printf("6.9更新:调整只有空格会暂停其他的不会");
	
	gotoxy(55, 22);
	printf("6.23更新:自动创建本地txt");
	
	int m;
	gotoxy(0, 29);
	printf("任意键返回:");
	char input;
	while (1) {
    
    
		if (_kbhit()) {
    
    
			system("cls");
			input = _getch();
			mainmenu();
			break;
		}
	}
}


void pause_game() {
    
    //游戏暂停
	system("cls");
	gotoxy(50, 10);
	printf("1.继续游戏");
	gotoxy(50, 14);
	printf("2.返回主页面");
	gotoxy(50, 18);
	printf("3.退出游戏");
	gotoxy(0, 29);
	printf("你的选择:");
	char n;
	cin >> n;
	switch (n) {
    
    
		case '1':
			system("cls");
			ff = 1;
			//start_game();
			break;
		case '2':
			system("cls");
			ff = 2;
			mainmenu();
			break;
		case '3':
			system("cls");
			ff = 3;
			break;
	}
}

void game_over() {
    
    
	aa.clear();
	system("cls");
	gotoxy(50, 10);
	printf("很遗憾,游戏结束");
	gotoxy(20, 18);
	printf("您的得分是 :%d 分", fen + earn);
	gotoxy(20, 20);
	printf("请输入您的英文名字   ");
	string s;
	cin >> s;
	int tt;
	aa.push_back(make_pair(s, fen + earn));
	ifstream in("数据.txt");
	if(in) {
    
    
		in >> tt;
		for (int i = 0; i < tt; i++) {
    
    
			int fenn;
			string ss;
			in >> ss >> fenn;
			if (ss.size() == 0)continue;
			aa.push_back(make_pair(ss, fenn));
		}
		in.close();
		ofstream out("数据.txt");
		//sort(aa.begin(), aa.end(), cmp);
		out << tt + 1 << endl;
		for (auto& i : aa) {
    
    

			out << i.first;
			out << "             ";
			out << i.second << endl;
		}
		/*for (int i = 0; i < 10; i++) {
    
    
			out << i << endl;
		}*/
		out.close();
	}
	else{
    
    
		ofstream outstuf; 
		outstuf.open("数据.txt");
		ofstream out("数据.txt");
		out<<1<<endl;
		out<<s<<" "<<fen+earn<<endl;
		out.close();
		
	}


}

void mainmenu() {
    
     ////开始界面
	system("cls");

	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN |
	                        FOREGROUND_BLUE);//字体颜色
	gotoxy(48, 7);
	printf("贪       吃       蛇");
	Sleep(100);
	gotoxy(53, 10);
	printf("1.开始游戏");
	Sleep(100);
	gotoxy(53, 12);
	printf("2.游戏帮助");
	Sleep(100);
	gotoxy(53, 14);
	printf("3.关于游戏");
	Sleep(100);
	gotoxy(53, 16);
	printf("4.积分排名");
	Sleep(100);
	gotoxy(53, 18);
	printf("5.退出游戏");
	Sleep(100);
	gotoxy(0, 29);
	printf("你的选择:");
	char n;
	cin >> n;
	switch (n) {
    
    
		case '1':
			Game_difficulty();
			start_game();
			break;
		case '2':
			help();////帮助界面
			break;
		case '3':
			About_games();
			break;
		case '4':
			point_rang();////积分排名系统
			break;
		case '5':
			myPause(2);//延时2秒退出
			break;
		default:
			system("cls");
			mainmenu();
			break;
	}

}

void myPause(int tn) {
    
    //延时关闭
	system("cls");
	gotoxy(50, 14);
	printf("感谢您的使用");
	gotoxy(0, 29);
	{
    
    
		int t0 = time(NULL), last = t0, now = t0;
		tn += t0;
		int n = -2;
		gotoxy(n += 2, 29);
		cout << (tn - now);
		while ((now = time(NULL)) < tn)
			if (last != now) {
    
    
				gotoxy(n += 2, 29);
				cout << (tn - now);
				last = now;
			}

	}
	exit(0);

}


int main() {
    
    

	system("mode con cols=115  lines=30  ");//窗口大小

	//background_musicss();//背景音乐

	print_Snake();

	mainmenu();


	return 0;
}




猜你喜欢

转载自blog.csdn.net/qq_53950686/article/details/115262502