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

贪吃蛇代码–c语言版 visual c++6.0打开#include”stdafx.h”#include<stdio.h>#include<time.h>#include<windows.h>#include<stdlib.h>#include<conio.h>#defineU1#defineD2#defineL3#defineR4//蛇的状态U:上D:下L:左R:右typedefstructsnak

大家好,又见面了,我是你们的朋友全栈君。

#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 //蛇的状态 U:上 D:下 L:左 R:右 
typedef struct snake               //蛇身的一个节点 
{ 
   
	int x;                        //节点的x坐标 
	int y;                        //节点的y坐标
	struct snake *next;           //蛇身的下一个节点 
 }snake;
 int score=0,add=10;              //总得分和每吃一次食物的得分 
 int highscore=0;                 //最高分 
 int status,sleeptime=200;        //蛇前进状态,每次运行的时间间隔 
 snake *head,*food;               //蛇头指针,食物指针 
 snake *q;                        //遍历蛇时用的指针 
 int endgamestatus=0;             //游戏结束时的状态 
 HANDLE hOut;                      //控制台句柄 
 void gotoxy(int x,int y);
 int color(int c);
 void printsnake();
 void wlcome();
 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();
 main()
 { 
    
    system("mode con cols=100 lines=30");
    printsnake();
    wlcome();
    file_out();
    keyboardcontrol();
    endgame();
 }
 void gotoxy(int x,int y)//设置光标位置 
 { 
   COORD c;
  c.X=x;
  c.Y=y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); //定位光标的位置 
   }
 int color(int c)//设置颜色 
 { 
   
 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
 return 0;
  } 
 void printsnake()//打印字符蛇 
 { 
   
 	gotoxy(2,5);
	color(3);
	printf("姓名:张小艾");
	
	gotoxy(2,6);
	color(3);
	printf("学号:1910101099");  
	
	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 wlcome()//欢迎界面 
 { 
   int n;
 int i,j=1;
 gotoxy(43,18);
 color(11);
 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.退出游戏");
	gotoxy(29,27);
	color(3);
	printf("请选择1 2 3\n");
	color(14);
	scanf("%d",&n);
	switch(n)
	{ 
   
	 case 1: 
	 	system("cls");//清屏 
	 createmap();
	 initsnake();
	 createfood();
	 keyboardcontrol();
	 break;
	 case 2:
	 	explation();
	 	break;
	 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();
 	gotoxy(64,4);
 	color(11);
 	printf("*最高纪录*: %d",highscore);
 	gotoxy(64,8);
 	color(14);
 	printf("得分: %d ",score);
 	color(13);
 	gotoxy(73,11);
 	printf("小提示");
	gotoxy(60,13);
 	color(6);
 	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;
 	tail->next=NULL;
 	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));
   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为蛇身上除蛇头以外的节点 
	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=sleeptime-10;
		add=add+2;
	 } 
}

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

 void snakemove()//控制方向 
{ 
   
	snake *nexthead;
	cantcrosswall();
	nexthead=(snake*)malloc(sizeof(snake));
	if(status==U)//上
	{ 
   
		nexthead->x=head->x;         //向上前进时,x不变,y-1 
		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; 
			  }
  //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
		      gotoxy(q->next->x,q->next->y);
			  color(3);
			  printf("■");//恢复走过的位置 
			  free(q->next);
			  q->next=NULL; 
		 }	 
		 
	 } 
  if(status==D)
  { 
   
        nexthead->x=head->x;         //向下前进时,x不变,y+1 
		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; 
			  }
  //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
		      gotoxy(q->next->x,q->next->y);
			  color(3);
			  printf("■");//恢复走过的位置 
			  free(q->next);
			  q->next=NULL; 
		 }
	}
 if(status==L)//左 
   { 
   
   	    nexthead->x=head->x-2;         //向左前进时,x不变,y+1 
		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; 
			  }
  //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
		      gotoxy(q->next->x,q->next->y);
			  color(3);
			  printf("■");//恢复走过的位置 
			  free(q->next);
			  q->next=NULL; 
		 }	 
   }
  if(status==R)
  { 
   
  	    nexthead->x=head->x+2;         //向上前进时,x不变,y-1 
		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; 
			  }
  //经过上面的循环 ,q指向蛇尾,蛇尾的下一步就是蛇走过去的位置 
		      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();
 //GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态
    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函数,令进程停止,直到达到其中设定的参数时间 
			   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,j;
	gotoxy(17,5);
	color(11);
	printf("+------------------------");
	
	gotoxy(35,5);
	color(14);
	printf("o00o");
	
    gotoxy(39,5);
	color(11);
	printf("----------");
	
	gotoxy(48,5);
	color(14);
	printf("---");
	
	gotoxy(51,5);
	color(11);
	printf("----------");
	
	gotoxy(61,5);
	color(14);
	printf("o00o");
	
	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(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)
	  { 
   
	  	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(); 
		   } 
	choose();	   
  }
  void file_in()//将最高分存储到文件中 
  { 
   
  	FILE *fp;
  	fp=fopen("save.txt","w+");//以读写的方式建立文件 
  	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;
  			printsnake();
  			wlcome();
  			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("=");
	 		else if(j==20||j==75)printf("||");
		 }
	  }
	  color(3);
	  gotoxy(30,8);
	  printf("1、不能穿墙,不能咬到自己");
	  color(3);
	  gotoxy(30,8);
	  printf("1、不能穿墙,不能咬到自己");
	  color(10);
	  gotoxy(30,11);
	  printf("2、用↑↓←→分别控制蛇的移动");
	  color(14);
	  gotoxy(30,14);
	  printf("3、F1为加速,F2为减速");
	  color(11);
	  gotoxy(30,17);
	  printf("4、按空格键暂停游戏,再按空格键继续");
	  color(4);
	  gotoxy(30,20);
	  printf("5、ESC:退出游戏,space:暂停游戏");
	  getch();//按任意键返回主界面
	  system("cls");
	  printsnake();
	  wlcome(); 
	   
  }






 
 
 
 
 
 
 
 
 
 
 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/141116.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Coredump(tracedump)

    引言当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中(core文件),这种行为就叫做CoreDump或者叫做‘核心转储’,利用coredump可以帮助我们快速定位程序崩溃位置开启coredump终端输入命令:ulimit-a用来显示对进程的一些限制限制,其中第一行表示了core文件最大的大小限制(单位为blocks)默认是…

    2022年4月12日
    90
  • 计算机网络ip地址划分范围,ip地址分类及范围划分有哪些

    计算机网络ip地址划分范围,ip地址分类及范围划分有哪些ip地址分为网络地址和主机地址,IP地址是真正网络中计算机的身份标识。手机的IP是手机上网使用的地址,不论是手机还是电脑,一个网段里面只有一个IP,所以每个人手机的IP都是唯一的,当用手机发朋友圈时,就会显示手机ip地址所在地,因此有些人会想要修改手机ip地址。那么ip地址可分为哪几类?其范围是怎么划分的?如何修改手机ip地址?下面小编为大家解答手机ip地址修改方法及ip地址分类及范围划分等知识。…

    2022年5月29日
    47
  • 谈Kong网关插件[通俗易懂]

    谈Kong网关插件[通俗易懂]转载李亚飞大佬的文章:https://www.lyafei.com/今天的一个重点就是要加强对KongAPIGateway网关的研究,对于Kong网关之前写过两篇文章,今天重点谈下Kong网关的插件支持能力。从上面图可以看到,Kong网关是基于OpenResty应用服务器,OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web.

    2022年6月26日
    57
  • CSS鼠标样式[通俗易懂]

    CSS鼠标样式[通俗易懂]CSS鼠标样式cursor:pointer;鼠标变小手cursor其他取值auto:标准光标default:标准箭头pointer,hand:手形光标wait:等待光标text:I形光标…

    2022年5月31日
    30
  • linux如何抓包是什么,linux抓包命令是什么[通俗易懂]

    linux如何抓包是什么,linux抓包命令是什么[通俗易懂]linux抓包命令是“tcpdump”,可以抓取流动在网卡上的数据包,可以将网络中传送的数据包的“头”完全截获下来提供分析;它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。本教程操作环境:RedHatEnterpriseLinux6.1系统、DellG3电脑。tcpdump命令是基于unix系统的命令行的数据报嗅探工具,可以抓取…

    2022年10月14日
    0
  • [Cqoi2014]数三角形——组合数

    [Cqoi2014]数三角形——组合数[Cqoi2014]数三角形——组合数

    2022年4月20日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号