您当前的位置: 首页 >  游戏

跋扈洋

暂无认证

  • 8浏览

    0关注

    221博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

贪吃蛇小游戏程序(C语言)

跋扈洋 发布时间:2019-08-11 12:54:57 ,浏览量:8

这次来分享一个我写的贪吃蛇小游戏程序(C语言)

最近暑假无事开始用C语言写一些小游戏小游戏程序,这个贪吃蛇当然是经典中的经典,所以先开始写。

文件引用
#include//输入输出
#include//用于获取随机数
#include//控制DOS界面
#include//定义了一些宏和通用工具函数
#include  //     接收键盘输入输出
函数声明
    /**************************函数声明***************************/
    
  void gotoxy(int x,int y);			//设置光标位置
int  color(int c);					//更改文字颜色
void printsnake();					//字符画--蛇
void welcome();						//开始界面
void createMap();					//绘制地图
void scoreandtips();				//游戏界面右侧的积分和小提示
void initsnake();					//初始化蛇身,花蛇身
void createfood();					//创建并随机出现食物
int  biteself();					//判断是否咬到自己
void cantcrosswall();				//设置蛇撞到墙的情况
void speedup();						//加速
void speeddown();					//减速
void snakemove();					//控制蛇前进方向
void keyjianpan();					//控制键盘按键
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()
{
	int i,j=10;
    gotoxy(37,21);
	color(14);
	printf("	张	洋	贪	吃	蛇\n						欢	迎	你!");
	gotoxy(19-1,9);
	color(12);
	printf("张洋");
	gotoxy(23-1,9);
	color(12);
	printf("张洋");	
	gotoxy(27-1,9);
	color(12);
	printf("张洋");	
	gotoxy(27-1,11);
	color(12);
	printf("张洋");
	gotoxy(19-1,13);
	color(12);
	printf("张洋");
	gotoxy(23-1,13);
	color(12);
	printf("张洋");	
	gotoxy(27-1,13);
	color(12);
	printf("张洋");	
	for(i=20;ix&&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为蛇身上的一个节点
    	self=head->next;							//self是蛇头之外的蛇身上的节点
    	while(self!=NULL)
    	{
    		if (self->x==head->x&&self->y==head->y)   //如果self和蛇头上的节点重合
    		{
    			return 1;    						  //返回1
    		}
    		self=self->next;    					 //循环蛇上的每一个节点
    	}
    	return 0;
    }
    /************判断蛇是否撞到墙******************/
    void cantcrosswall()
    {
    	if (head->x==0||head->x==56||head->y==0||head->y==26)//如果蛇头碰到了墙壁
    	{
    		endgamestatus=1;    					  //返回第一种情况
    	}
    }
    /*******************设置蛇加速前进**********/
    void speedup()
    {
    	if (sleeptime>=50)  						 //如果时间间隔大于等于50
    	{
    		sleeptime=sleeptime-10;  				 //时间间隔减10
		     add=add+2;                               //每吃一次食物的得分加2
    		if(sleeptime==320)
    		{
    			add=2;                                //防止减到1之后再加回来有错
    		}
    	}
    }
    /*******************设置蛇减速前进************/
    void speeddown()
    {
    	if (sleeptimex=head->x;    //向上前进时,x坐标不变,y坐标-1
		nexthead->y=head->y-1;
		nexthead->next=head;
		q=head;                //指针q指向蛇头
		//如果下一个有食物,下一个位置的坐标和食物的坐标相同
		if (nexthead->x==food->x&&nexthead->y==food->y)
		{
			while (q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //原来食物的位置,从▼变成⊕
				q=q->next;       //指针q指向的蛇身的下一位也执行循环里的操作
			}
			score=score+add;      //吃了一个食物,在总分上加上食物的分
			speedup();
			createfood();         //创建食物
		}
		else
		{
			while (q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //蛇正常往前走,输出当前位置的蛇身
				q=q->next;       //继续输出整个蛇身
				
			}
			//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);     //进行输出▼之后,释放指向下一位的指针
			q->next=NULL;     //指针下一位指向空
		}
	}
	///
	if (status==S)                 
	{
		nexthead->x=head->x;    //向上前进时,x坐标不变,y坐标+1
		nexthead->y=head->y+1;
		nexthead->next=head;
		q=head;                //指针q指向蛇头
		//如果下一个有食物,下一个位置的坐标和食物的坐标相同
		if (nexthead->x==food->x&&nexthead->y==food->y)
		{
			while (q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //原来食物的位置,从▼变成⊕
				q=q->next;       //指针q指向的蛇身的下一位也执行循环里的操作
			}
			score=score+add;      //吃了一个食物,在总分上加上食物的分
			speedup();
			createfood();         //创建食物
		}
		else
		{
			while (q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //蛇正常往前走,输出当前位置的蛇身
				q=q->next;       //继续输出整个蛇身
				
			}
			//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);     //进行输出▼之后,释放指向下一位的指针
			q->next=NULL;     //指针下一位指向空
		}
	}
	/
	if (status==A)
	{
		nexthead->x=head->x-2;    //向左前进时,x坐标向左移动-2,y坐标不变
		nexthead->y=head->y;
		nexthead->next=head;
		q=head;                //指针q指向蛇头
		//如果下一个有食物,下一个位置的坐标和食物的坐标相同
		if (nexthead->x==food->x&&nexthead->y==food->y)
		{
			while (q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //原来食物的位置,从▼变成⊕
				q=q->next;       //指针q指向的蛇身的下一位也执行循环里的操作
			}
			score=score+add;      //吃了一个食物,在总分上加上食物的分
			speedup();
			createfood();         //创建食物
		}
		else
		{
			while (q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //蛇正常往前走,输出当前位置的蛇身
				q=q->next;       //继续输出整个蛇身
				
			}
			//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);     //进行输出▼之后,释放指向下一位的指针
			q->next=NULL;     //指针下一位指向空
		}
	}
	/
	if (status==D)
	{
		nexthead->x=head->x+2;    //向右前进时,x坐标向左移动+2,y坐标不变
		nexthead->y=head->y;
		nexthead->next=head;
		q=head;                //指针q指向蛇头
		//如果下一个有食物,下一个位置的坐标和食物的坐标相同
		if (nexthead->x==food->x&&nexthead->y==food->y)
		{
			while (q!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //原来食物的位置,从▼变成⊕
				q=q->next;       //指针q指向的蛇身的下一位也执行循环里的操作
			}
			score=score+add;      //吃了一个食物,在总分上加上食物的分
			speedup();
			createfood();         //创建食物
		}
		else
		{
			while (q->next->next!=NULL)
			{
				gotoxy(q->x,q->y);
				color(14);
				printf("⊕");    //蛇正常往前走,输出当前位置的蛇身
				q=q->next;       //继续输出整个蛇身
				
			}
			//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
			gotoxy(q->next->x,q->next->y);
			color(3);
			printf("■");
			free(q->next);     //进行输出▼之后,释放指向下一位的指针
			q->next=NULL;     //指针下一位指向空
		}
	}
	if (biteself()==1)			//判断是否会咬到自己
	{
		endgamestatus=2;
	}
}
/******************************* 键盘 ************************************/
void key()
{
	status=R;					//初始蛇向右移动 
	while (1)
	{
		scoreandtips();           //游戏界面右侧的得分和小提醒
//GetAsyncKeyState函数 用来判断函数调用时指定虚拟键的状态
		if (GetAsyncKeyState(VK_UP)&&status!=S)
		{
			status=W;      //如果蛇不是向下前进的时候,按向上键,执行向上前进操作
		}
		else if (GetAsyncKeyState(VK_DOWN)&&status!=W)
		{
			status=S;      //如果蛇不是向上前进的时候,按向下键,执行向下前进操作
		}
		else if (GetAsyncKeyState(VK_LEFT)&&status!=D)
		{
			status=A;      //如果蛇不是向右前进的时候,按向左键,执行向左前进操作
		}
		else if (GetAsyncKeyState(VK_RIGHT)&&status!=A)
		{
			status=D;      //如果蛇不是向左前进的时候,按向右键,执行向右前进操作
		}
		if (GetAsyncKeyState(VK_SPACE))     //按下暂停键,执行pause暂停函数
		{
			while (1)
			{
	//Sleep()函数,头文件#include 另进程暂停,直到达到里面设定参数的时间
				Sleep(300);
				if (GetAsyncKeyState(VK_SPACE))  //按下空格键暂停
				{
					break;
				}
			}
		}
		else if (GetAsyncKeyState(VK_ESCAPE))
		{
			endgamestatus=3;   //按ESC,直接到结束界面
			break;
		}
		else if (GetAsyncKeyState(VK_F1))   //按F1,加速
		{
			speedup();
		}
		else if (GetAsyncKeyState(VK_F2))   //按F2,减速
		{
			if (sleeptime            
关注
打赏
1663745539
查看更多评论
0.0547s