Young87

SmartCat's Blog

So happy to code my life!

游戏开发交流QQ群号60398951

当前位置:首页 >跨站数据测试

贪吃蛇贪吃蛇代码--c语言版 visual c++6.0打开


// 贪吃蛇大战2.cpp : Defines the entry point for the console application.
//

// 贪吃蛇大作战1.cpp : Defines the entry point for the console application.
//

// 贪吃蛇大作战.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "time.h"//随机数
#include "windows.h"//文字颜色、坐标位置
#include "stdlib.h"
#include "conio.h"//接受键盘的输入输出


//宏定义
#define U 1
#define D 2
#define L 3
#define R 4


//全局变量
typedef struct snake
{
	int x;
	int y;
	struct snake *next;
}snake;
int score=0,add=10;
int HighScore=0;
int status,sleeptime = 200;
snake *head,*food,*q;
int endgamestatus=0;//游戏结束的状态
HANDLE hOut;


/*********函数声明********/
void gotoxy(int x,int y);	//设置光标位置
int color(int c);			//设置文字颜色
void printsnake();			//蛇的字符画
void welcometogame();		//开始界面
void createMap();			//绘制地图
void scoreandtips();		//游戏界面右侧的得分和小提示
void initsnake();			//初始化蛇身,画蛇身
void createfood();			//创建并随机出现食物
int biteself();				//判断是否咬到了自己
void cantcrosswall();		//设置蛇撞墙的情况
void speedup();				//加速
void speeddown();			//减速
void snakemove();			//控制蛇的前进方向
void keyboardControl();		//控制键盘按键
void Lostdraw();			//游戏结束界面
void endgame();				//游戏结束
void choose();				//游戏失败之后的选择
void File_out();			//在文件中读取最高分
void File_in();				//储存最高分的文件
void explation();			//游戏说明



int color(int c)//设置文字颜色
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
	return 0;
}


void gotoxy(int x,int y)//获得控制台的坐标位置
{
	COORD c;
	c.X=x;
	c.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}


void printsnake() //绘制字符画 --蛇
{
    
	system("cls");//清屏

	gotoxy(35, 1);
	color(6);
	printf("/^\\/^\\");      //蛇眼睛

	gotoxy(34, 2);
	printf("|__|  O|");      //蛇眼睛

	gotoxy(33, 2);
	color(2);
	printf("_");

	gotoxy(25, 3);
	color(12);
	printf("\\/");      	//蛇信

	gotoxy(31, 3);
	color(2);
	printf("/");

	gotoxy(37, 3);
	color(6);
	printf(" \\_/");     	//蛇眼睛

	gotoxy(41, 3);
	color(10);
	printf(" \\");

	gotoxy(26, 4);
	color(12);
	printf("\\____");   	//舌头

	gotoxy(32, 4);
	printf("_________/");

	gotoxy(31, 4);
	color(2);
	printf("|");

	gotoxy(43, 4);
	color(10);
	printf("\\");

	gotoxy(32, 5);
	color(2);
	printf("\\_______");    //蛇嘴

	gotoxy(44, 5);
	color(10);
	printf("\\");

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

	gotoxy(38, 7);
	printf("/      /                   \\");

	gotoxy(37, 8);
	printf("/      /                    \\ \\");

	gotoxy(35, 9);
	printf("/      /                       \\ \\");

	gotoxy(34, 10);
	printf("/     /                          \\  \\");

	gotoxy(33, 11);
	printf("/     /             _----_         \\   \\");

	gotoxy(32, 12);
	printf("/     /           _-~      ~-_         |  |");

	gotoxy(31, 13);
	printf("(      (        _-~    _--_    ~-_     _/  |");

	gotoxy(32, 14);
	printf("\\     ~-____-~    _-~    ~-_    ~-_-~    /");

	gotoxy(33, 15);
	printf("~-_           _-~          ~-_       _-~");

	gotoxy(35, 16);
	printf("~--______-~                ~-___-~");

}

void welcometogame()//欢迎界面
{
	int n;
	int i,j=1;
	color(11);
	gotoxy(43,18);
	printf("贪 吃 蛇 大 作 战");
	color(14);
	for(i=20;i<=26;i++)
	{
		for(j=27;j<=74;j++)
		{
			gotoxy(j,i);
			if(i==20||i==26)
			{
				printf("-");
			}
			else if(j==27||j==74)
				printf("|");
		
		}
	}
	color(12);
	gotoxy(35,22);
	printf("1.开始游戏");
	gotoxy(55,22);
	printf("2.游戏说明");
	gotoxy(35,24);
	printf("3.退出游戏");

	color(3);
	gotoxy(29,27);
	printf("请选择[1 2 3]; [ ]\b\b");
	color(14);
	scanf("%d",&n);
	switch(n)
	{
	case 1:
		system("cls");
		createMap();
		initsnake();
		createfood();
		keyboardControl();
		break;
	case 2:
		explation();
		break;
	case 3:
		exit(0);
		break;
	}

}


void createMap()//绘制欢迎地图
{
	int i,j;
	for(i=0;i<58;i+=2)
	{
		gotoxy(i,0);
		color(5);
		printf("□");
		gotoxy(i,26);
		printf("□");
	}
	for(i=0;i<26;i++)
	{
		gotoxy(0,i);
		printf("□");
		gotoxy(56,i);
		printf("□");
	}
	for(i=2;i<56;i+=2)
	{
		for(j=1;j<26;j++)
		{
			gotoxy(i,j);
			color(3);
			printf("■\n\n");
		}
	}
}


void scoreandtips()//绘制游戏右边的东西
{
	File_out();
	color(11);
	gotoxy(64,4);
	printf("☆最高纪录☆:%d分",HighScore);
	color(14);
	gotoxy(64,8);
	printf("得分:%d",score);
	color(13);
	gotoxy(73,11);
	printf("小 提 示");
	color(6);
	gotoxy(60,13);
	printf("╬-------------------------------╬");
	gotoxy(60,25);
	printf("╬-------------------------------╬");
	color(3);
	gotoxy(64,14);
	printf("每个食物得分:%d分",add);
	gotoxy(64,16);
	printf("不能穿墙,不能咬到自己");
	gotoxy(64,18);
	printf("用↑ ↓ ← →分别控制蛇的移动");
	gotoxy(64,20);
	printf("F1 为加速,F2 为减速");
	gotoxy(64,22);
	printf("space;暂停游戏");
	gotoxy(64,24);
	printf("ESC : 退出游戏");
}


void File_out()//在文件中读取最高分
{
	FILE *fp;
	fp=fopen("save.txt","a+");
	fscanf(fp,"%d",&HighScore);
	fclose(fp);
}


void initsnake()//绘制蛇身
{
	snake *tail;
	int i;
	tail=(snake *)malloc(sizeof(snake));
	tail->x=24;
	tail->y=5;
	for(i=1;i<=4;i++)
	{
		head=(snake *)malloc(sizeof(snake));
		head->next=tail;
		head->x=24+2*i;
		head->y=5;
		tail=head;
	}
	while(tail!=NULL)
	{
		gotoxy(tail->x,tail->y);
		color(14);
		printf("★");
		tail=tail->next;
	}
}


void createfood()	//生成随机食物
{
	snake *food_1;
	srand((unsigned)time(NULL));
	food_1=(snake *)malloc(sizeof(snake));
	srand((unsigned)time(NULL));
	while((food_1->x%2)!=0)
	{
		food_1->x=rand()%52+2;
	}
	food_1->y=rand()%24+1;
	q=head;
	while(q->next== NULL)
	{
		if((q->x==food_1->x)&&(q->y==food_1->y))
		{
			free(food_1);
			createfood();
		}
		q=q->next;
	}
	gotoxy(food_1->x,food_1->y);
	food=food_1;
	color(12);
	printf("●");

}



int biteself()//判断是否撞到了自己
{
	snake *self;
	self=head->next;
	while(self!=NULL)
	{
		if(self->x==head->x&&self->y==head->y)
		{
			return 1;
		}
		self=self->next;
	}
	return 0;
}


void cantcrosswall(){
	if(head->x==0||head->x==56||head->y==0||head->y==26){//如果蛇头碰到了墙壁
		endgamestatus=1;//返回第一种情况
		endgame();//添加新的代码
	}
}


void speedup()//蛇加速前进
{
	if(sleeptime>=50)
	{
		sleeptime-=50;
		add+=2;
	}
}


void speeddown()//蛇减速前进
{
	if(sleeptime<350)
	{
		sleeptime+=50;
		add-=2;
		if(sleeptime==350)
		{
			add=1;
		}
	}
}


void snakemove()
{
	snake *nexthead;
	cantcrosswall();
	nexthead=(snake *)malloc(sizeof(snake));
	if(status==U)
	{
		nexthead->x=head->x;
		nexthead->y=head->y-1;
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x&&nexthead->y==food->y)
		{
			while(q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score=score+add;
			speedup();
			createfood();
		}
		else
		{
			while(q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}
	if(status==D)
	{
		nexthead->x=head->x;
		nexthead->y=head->y+1;
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x&&nexthead->y==food->y)
		{
			while(q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score=score+add;
			speedup();
			createfood();
		}
		else
		{
			while(q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}
	if(status==L)
	{
		nexthead->x=head->x-2;
		nexthead->y=head->y;
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x&&nexthead->y==food->y)
		{
			while(q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score=score+add;
			speedup();
			createfood();
		}
		else
		{
			while(q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}
	if(status==R)
	{
		nexthead->x=head->x+2;
		nexthead->y=head->y;
		nexthead->next=head;
		head=nexthead;
		q=head;
		if(nexthead->x==food->x&&nexthead->y==food->y)
		{
			while(q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			score=score+add;
			speedup();
			createfood();
		}
		else
		{
			while(q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("★");
				q=q->next;
			}
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);
			q->next=NULL;
		}
	}
	if(biteself()==1)
	{
		endgamestatus=2;
		endgame();
	}
}


void keyboardControl()
{
	status=R;
	while(1)
	{
		scoreandtips();
		if(GetAsyncKeyState(VK_UP)&&status!=D)
		{
			status=U;
		}
		else if(GetAsyncKeyState(VK_DOWN)&&status!=U)
		{
			status=D;
		}
		else if(GetAsyncKeyState(VK_LEFT)&&status!=R)
		{
			status=L;
		}
		else if(GetAsyncKeyState(VK_RIGHT)&&status!=L)
		{
			status=R;
		}
		if(GetAsyncKeyState(VK_SPACE))
		{
			while(1)
			{
				Sleep(300);
				if(GetAsyncKeyState(VK_SPACE))
				{
					break;
				}
			}
		}
		else if(GetAsyncKeyState(VK_ESCAPE))
		{
			endgamestatus=3;
			break;
		}
		else if(GetAsyncKeyState(VK_F1))
		{
			speedup();
		}
		else if(GetAsyncKeyState(VK_F2))
		{
			if(sleeptime<350)
			{
				sleeptime=sleeptime+30;
				add=add-2;
				if(sleeptime==350)
				{
					add=1;
				}
			}
		}
		Sleep(sleeptime);
		snakemove();
	}
}


void Lostdraw(){
	system("cls");
	int i;
	gotoxy(45,2);
	color(6);
	printf("\\\\\\|///");//小人的头发


	gotoxy(43,3);
	printf("\\\\");
	gotoxy(47,3);
	color(15);
	printf(".-.-");//眉毛


	gotoxy(54,3);
	color(6);
	printf("//");
	gotoxy(44,4);
	color(14);
	printf("(");//左耳


	gotoxy(47,4);
	color(15);
	printf(".@.@");//眼睛


	gotoxy(54,4);
	color(14);
	printf(")");//右耳


	gotoxy(17,5);
	color(11);
	printf("+-----------------------");//上边框


	gotoxy(35,5);
	color(14);
	printf("oOOo");//左手


	gotoxy(39,5);
	color(11);
	printf("----------");//上边框


	gotoxy(48,5);
	color(14);
	printf("(_)");//嘴

	gotoxy(51,5);

	gotoxy(61,5);
	color(14);
	printf("oOOo");//右手

	gotoxy(65,5);
	color(11);
	printf("-----------------------+");//上边框

	for(i=6;i<=19;i++){//竖边框
		gotoxy(17,i);
		printf("|");
		gotoxy(82,i);
		printf("|");
	}
	
	gotoxy(17,20);
	printf("+--------------------------------------");//上边框

	gotoxy(52,20);
	color(14);
	printf("☆☆☆”");


	gotoxy(60,20);
	color(11);
	printf("-------------------+");//下边框


}



void endgame(){
	
	system("cls");
	if(endgamestatus==1){//如果蛇撞到了墙
		Lostdraw();
		gotoxy(35,9);
		color(12);
		printf("对不起,您撞到墙了。游戏结束!");
	}
	else if(endgamestatus==2){//如果蛇咬到了自己
		Lostdraw();
		gotoxy(35,9);
		color(12);
		printf("对不起,您咬到自己了。游戏结束!");
	}
	else if(endgamestatus==3){//如果按ESC键退出
		Lostdraw();
		gotoxy(40,9);
		color(12);
		printf("您已经结束游戏了!");
	}
	gotoxy(43,12);
	color(13);
	printf("您的得分是 %d,score");
	if(score>=HighScore){//如果分数高于最高分
		color(10);
		gotoxy(33,16);
		printf("创纪录啦!最高分被你刷新了,真棒!!!");
		File_in();//把最高分写入文件
	}
	else{//如果分数低于最高分
		color(10);
		gotoxy(33,16);
		printf("继续努力吧 你离最高分还差 %d",HighScore-score);
	}
	choose();//边框下面的分支选项

}




void File_in(){//将最高分存储于文件中
	FILE *fp;
	fp=fopen("save.txt","w+");//以读写的方式建立一个名为save.txt的文件
	fprintf(fp,"%d",score);//把分数写进文件
	fclose(fp);//关闭文件
}


void choose(){
	int n;
	gotoxy(25,23);
	color(12);
	printf("我要重新玩一把 -------- 1");
	gotoxy(52,23);
	printf("不玩了,退出吧 -------- 2");
	gotoxy(46,25);
	color(11);
	printf("选择:");
	scanf("%d",&n);
	switch(n){
	case 1:
		system("cls");
		score=0;//分数归零
		sleeptime=200;//设定初始速度
		add=10;//使add设定未初值,吃一个食物得10分
		printsnake();//返回欢迎界面
		welcometogame();
		break;
	case 2:
		exit(0);//退出游戏
		break;
	default:
		gotoxy(35,27);
		color(12);
		printf("***您的输入有误,请重新输入***");
		system("pause>nul");//按任意键
		endgame();
		choose();
		break;
		
		}

}



void explation(){
		int i,j=1;
		system("cls");
		color(13);
		gotoxy(44,3);
		printf("游戏说明");
		color(2);
		for(i=6;i<=22;i++){
			for(j=20;j<=75;j++){
				gotoxy(j,i);
				if(i==6||i==22)
					printf("||");
				if(j==20||j==25) printf("||");
				}
			}
			color(3);
			gotoxy(30,8);
			printf("tip1:不能穿墙,不能咬到自己");
			color(10);
			gotoxy(30,11);
			printf("tips2:用↑↓←→分别控制蛇的移动");
			color(14);
			gotoxy(30,14);
			printf("tip3:F1为加速,F2为减速");
			color(11);
			gotoxy(30,17);
			printf("tip4:按空格键暂停游戏,在按空格键继续");
			color(4);
			gotoxy(30,20);
			printf("tip5:ESC:退出游戏。space:暂停游戏");
			getch();
			system("cls");
			printsnake();
			welcometogame();


}







int main()
{
	system("mode con cols=100 lines=30");
	printsnake();
	welcometogame();
	File_out();
	keyboardControl();
	endgame();
	return 0;
}

除特别声明,本站所有文章均为原创,如需转载请以超级链接形式注明出处:SmartCat's Blog

上一篇: 【联邦学习】综述《Advances and Open Problems in Federated Learning》论文结构

下一篇: PCB上10A的电流需要走多宽的线?需要几个过孔?

精华推荐