在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++游戏开发 → 贪吃蛇.cpp(基于window)

贪吃蛇.cpp(基于window)

C/C++游戏开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:5.80KB
  • 下载次数:6
  • 浏览次数:102
  • 发布时间:2020-09-13
  • 实例类别:C/C++游戏开发
  • 发 布 人:教大家分
  • 文件格式:.cpp
  • 所需积分:2
 相关标签: 贪吃蛇

实例介绍

【实例简介】
【实例截图】

【核心代码】

#include<iostream>
#include<windows.h>
#include<conio.h>
#include<time.h>
#include<stdlib.h>
using namespace std;
int GameOver=0;
struct Body//蛇身(链表结构)
 {
	int x,y;//蛇身结点坐标 
	Body *next;//下一个结点
 };
void SetPos(int i,int j)//设定光标位置(蛇尾) 
 { 
 	COORD pos={i-1,j-1};//坐标变量
	HANDLE Out=GetStdHandle(STD_OUTPUT_HANDLE);//获取输出句柄 
	SetConsoleCursorPosition(Out,pos);//设定光标位置
 }
class Sneak//贪吃蛇类
 {      
 	private: 
 			Body *head;//蛇头指针
   			int Direction;//移动方向。1,2,3,4对应上左下右 
  			int Count;//蛇长 
        	int Speed;//速度(等级) 
  			int FoodExist;//食物存在标记 
 			int Food_x;//食物X坐标 
  			int Food_y;//食物Y坐标  
    public:  
 			Sneak(int a=3,int b=4,int c=1,int d=0)//构造函数 
  				{  
				    FoodExist=d;//起始不存在食物    
  					Body *temp1,*temp2;           
     				head=new(Body);//申请起始蛇身3节  
    				head->x=4;     
 					head->y=2;       
    				temp1=new(Body);   
   					temp1->x=3;   
   					temp1->y=2;       
        			temp2=new(Body);   
   					temp2->x=2;   
   					temp2->y=2;    
   					head->next=temp1;  
    				temp1->next=temp2;   
   					temp2->next=NULL;   
    				Direction=b;//方向为右  
    				Count=a;//长为3   
   					Speed=c;//等级1   
   				} 
void Map();//画界面函数 
void Paint();//画蛇身函数 
void Food();//生成食物 
int Over();//判断游戏是否结束 
void Gaming();//游戏进程函数 
void Move();//移动 
}; 
void Sneak::Map()//使用
 {  
 	int i;
  	for(i=1;i<=50;i  )  
		{   
			SetPos(i,1); 
  			cout<<"-"; 
   		} 
 	for(i=2;i<=25;i  ) 
 		{  
		  	SetPos(1,i);  
 			cout<<"|"; 
  			SetPos(50,i); 
     		cout<<"|"; 
 		} 
 	for(i=1;i<=50;i  ) 
 		{  
		  	SetPos(i,25); 
  			cout<<"-"; 
   		} 
 	SetPos(54,3); 
 	cout<<"贪吃蛇"; 
 	SetPos(54,5); 
 	cout<<"贪吃蛇长度为:"<<Count; 
    SetPos(54,7); 
 	cout<<"等级:"<<Speed; } 
void Sneak::Food() 
{ 
	Body *p;
	int InBody=0; //判断食物是否产生在蛇体内 
 	srand((int)time(0));//用系统时间来做随机数种子 
 	while(1) 
 		{     
		  	Food_x=rand()%48 2;//随机出食物的坐标  
    		Food_y=rand()%23 2;   
  			 p=head;  
    		while(p!=NULL)//判断食物是否产生在蛇体内     
				 {     
				   	if(p->x==Food_x&&p->y==Food_y)  
 						{  
						    InBody=1; 
     						break;  
	    				}   
					 p=p->next; 
		  		 } 
  			if(InBody==0)//食物不在蛇身。生成成功  
 			break; 
  			InBody=0; 
 		} 
} 
int Sneak::Over()
 { 
  	Body *p; 
  	p=head; 
 	if((head->x)>=50||(head->x)<=1||(head->y)<=1||(head->y)>=25)//是否撞到边缘  
 	return 1;
  	p=head->next;
  	while(p!=NULL)//是否撞到蛇身  
		{   
			if((head->x==p->x)&&(head->y==p->y))  
  				return 1;
				p=p->next; 
		} 
 	return 0;
 } 
void Sneak::Paint() 
{  
	Body *p;  
	p=head; 
 	while(p!=NULL) 
 		{   
			SetPos(p->x,p->y); 
  			cout<<"*";   
			p=p->next; 
		}  
	SetPos(Food_x,Food_y); 
 	cout<<"*"; 
}  
void Sneak::Move() 
{      
	Body *New;
  	New=new(Body);//新的蛇身结点 
 	if(Direction==1)//确定新蛇头的坐标 
  		{         
  			New->x=head->x; 
   			New->y=head->y-1;  
  			New->next=head;  
  			head=New; 
 		} 
 	if(Direction==2)  
		{          
 			New->x=head->x-1;  
  			New->y=head->y;  
 			New->next=head;  
  			head=New;  
		}  
	if(Direction==3) 
 		{       
    		New->x=head->x;  
  			New->y=head->y 1; 
   			New->next=head; 
   			head=New; 
		} 
  	if(Direction==4) 
 		{         
 			New->x=head->x 1;  
  			New->y=head->y; 
       		New->next=head;  
  			head=New; 
 		}
}   
void Sneak::Gaming()
{ 
  	system("cls");//刷新屏幕  
	char x;  Body *p;  
    Map();//画界面的先   
  	Paint();//再画蛇身   
  	while(1)  
		{   
			if(_kbhit())//_kbhit()判断是否有键盘操作 
  				{    
				  	x=_getch();//重缓冲区读出一个字符赋给x  
 					if((x=='W'||x=='w')&&Direction!=3)//改变蛇的方向(不可以是反方向) 
   					Direction=1;  
  					if((x=='S'||x=='s')&&Direction!=1) 
    				Direction=3;  
  					if((x=='A'||x=='a')&&Direction!=4)   
  					Direction=2; 
   					if((x=='D'||x=='d')&&Direction!=2)  
   					Direction=4;  
  					while(_kbhit())//读掉这之后所有的键盘输入 
   					_getch(); 
  				}  
			if(FoodExist==0)//如果食物被吃了或刚开始游戏,要生成新的食物 
  				{      
  					Food();   
  					FoodExist=1; 
 				}   
			Move();//移动蛇
   			if(head->x==Food_x&&head->y==Food_y)//如果蛇吃到了食物 
  				{    
  					FoodExist=0;   
   					Count  ;//蛇身 1  
    				SetPos(54,5);  
    				cout<<"贪吃蛇长度:"<<Count;//改变界面信息   
   					if(Count%10==0)//每十个蛇身升一级    
  						{     
 							Speed  ;   
   							SetPos(54,7);    
							cout<<"LEVEL:"<<Speed;   
   						}  
    				if(Speed==10)//最高等级达成。退出游戏   
    					break;   
				}   
			Paint();//画新的蛇身 
  			if(FoodExist==1)//如果没有吃到食物,需要删除蛇尾。 
 				{   
 					p=head;   
					while((p->next)->next!=NULL)  
        			p=p->next;  
  					SetPos(p->next->x,p->next->y);   
          			cout<<" "; 
					delete(p->next);    
        			p->next=NULL;  
 				}  
 			if(Over())//判断是否游戏结束 
   				break;
   			Sleep(500-Speed*50);//等待,具体时间和等级有关  

		}  
	system("cls");  
	if(Speed==10)//通关 
 		{  
 			SetPos(25,25); 
  			cout<<"恭喜你,你已经通关了"<<endl; 
  			system("pause"); 
 		}  
	else		//失败  
		{   
			SetPos(25,10); 
  			cout<<"gameover,最终长度为 "<<Count<<endl;  
 			system("pause"); 
		} 
}
int main() 
{  
	system("color blue"); 
 	Sneak game;
  	system("cls"); 
 	cout<<"*      说明:                                       *"<<endl;  
	cout<<"*            W,A,S,D控制移动                        *"<<endl;   
	cout<<"*********         按任意键开始   **********************"<<endl;  
	_getch(); 
 	game.Gaming();
  	return 0;
 }
	
	
	
	
	

标签: 贪吃蛇

实例下载地址

贪吃蛇.cpp(基于window)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警