贪吃蛇代码
2015-06-16 22:53
302 查看
#include<stdio.h> #include<windows.h> #include<time.h> #include<conio.h> #include<stdlib.h> #include <iostream> #include <cmath> #include <cstring> using namespace std; struct node{ int x,y; node *next; }; int Life=1;//是否死亡 0代表死亡; int x_food,y_food;//食物位置 int x_block[36],y_block[36];//障碍物的位置 char movedir='R';//方向 node* SHead=NULL;// node* STail=NULL; node* p=NULL; int foodnum=0; int score=0; int level=0; int death=0; int speed=400; void creatsnakemap();//创建地图 void creatsnake();//创建蛇 void gotoxy(int,int);//光标定位函数* void SetColor(unsigned short);//设置颜色 void startgame();//开始游戏 void makeblock();//产生障碍物 void isdead();//判断是否死亡; void nofood(int x,int y);//前方没有食物 void yesfood();//前方有食物 void makefood();//随机产生食物 void drawsnake();//画出蛇 void Snakedelete();//删除蛇的尾巴 void isfood();//判断前方是否有食物 void creatscreen();//打印开始屏幕 void ending();//结束 bool judge();//判断食物是否出现在蛇身体上 int main() { system("mode con cols=80 lines=35"); system("color 1f"); creatscreen(); creatsnakemap(); creatsnake(); startgame(); ending(); while(getch()!=27) continue; } void creatscreen() { SetColor(7); gotoxy(31,10);printf("经典贪吃蛇"); gotoxy(28,12);printf("按任意键开始游戏"); gotoxy(28,30);printf("Copyright@_御心飞行"); getch(); system("cls"); } void creatsnakemap() { int i; SetColor(3); for(i=4;i<50;i+=2)//横墙 { gotoxy(i,4); printf("■"); gotoxy(i,29); printf("■"); Sleep(30); } for(i=4;i<29;i++)//竖墙 { gotoxy(4,i); printf("■"); gotoxy(48,i); printf("■"); Sleep(30); } SetColor(7); gotoxy(58,13);printf("人头:"); gotoxy(58,15);printf("等级:"); gotoxy(58,19);printf("还没有穿墙技能"); makeblock(); } void creatsnake() { node* newsnake; int i; SHead=(node *)malloc(sizeof(node)); STail=SHead; STail->next=NULL; for(i=0;i<3;i++) { newsnake=(node *)malloc(sizeof(node)); newsnake->next=NULL; STail->next =newsnake; STail=newsnake; } STail->next=NULL; p=SHead; SetColor(2); gotoxy(p->x=16,p->y=10),printf("◆"); p=p->next; SetColor(3); gotoxy(p->x=14,p->y=10),printf("□"); p=p->next; gotoxy(p->x=12,p->y=10),printf("□"); p=p->next; gotoxy(p->x=10,p->y=10),printf("□"); } void startgame() { while(1) { isdead(); if(Life==0) break; if(foodnum==0) { makefood(); foodnum=1; } if(GetAsyncKeyState(VK_UP)&&movedir!='D') movedir='U'; if(GetAsyncKeyState(VK_DOWN)&&movedir!='U') movedir='D'; if(GetAsyncKeyState(VK_LEFT)&&movedir!='R') movedir='L'; if(GetAsyncKeyState(VK_RIGHT)&&movedir!='L') movedir='R'; isfood(); //判断前方是否有食物,然后移动一格 Sleep(speed);//刷新时间,即速度; int Olevel=level; SetColor(7); gotoxy(68,13);printf("%d",score); gotoxy(68,15);printf("%d",level=score/7+1); if(Olevel==level-1)//等级判断 { if(speed>200) speed-=60; else if(speed>100) speed-=40; else speed-=14; } SetColor(5); if(level>=5) { gotoxy(58,19);printf("穿墙技能GET.22333"); gotoxy(58,20);printf("你可放心穿过白墙"); } } system("cls"); } void isfood() { if(movedir=='U') { if(SHead->x==x_food&&SHead->y-1==y_food)//判断 yesfood(); //前方有食物 else nofood(SHead->x,SHead->y-1);//前方没有食物 } if(movedir=='D') { if(SHead->x==x_food&&SHead->y+1==y_food) yesfood(); else nofood(SHead->x,SHead->y+1); } if(movedir=='L') { if(SHead->x-2==x_food&&SHead->y==y_food) yesfood(); else nofood(SHead->x-2,SHead->y); } if(movedir=='R') { if(SHead->x+2==x_food&&SHead->y==y_food) yesfood(); else nofood(SHead->x+2,SHead->y); } drawsnake(); } void nofood(int x,int y) { node* Nh;//临时头节点 Nh=(node *)malloc(sizeof(node));//设定新的蛇头 Nh->x=x; Nh->y=y; Nh->next=SHead; SHead=Nh; Snakedelete();//删除最后一个节点 } void yesfood() { node* food; food=(node*)malloc(sizeof(node)); food->x=x_food; food->y=y_food; food->next=SHead; SHead=food; foodnum=0; makefood(); score++; } void Snakedelete() { p=SHead; while((p->next)->next!=NULL) { p=p->next; } gotoxy(STail->x,STail->y),printf(" "); free(STail); STail=p; STail->next=NULL; } void drawsnake() { p=SHead->next; SetColor(2); gotoxy(SHead->x,SHead->y); printf("◆"); while(p!=NULL) { SetColor(2); gotoxy(p->x,p->y),printf("□"); p=p->next; } } void isdead()//判断是否死亡 { node* p; if(SHead->y==4&&movedir=='U')//预判是否撞到墙 { Life=0; return; } if(SHead->y==29&&movedir=='D') { Life=0; return; } if(SHead->x==4&&movedir=='L') { Life=0; return; } if(SHead->x==48&&movedir=='R') { Life=0; return; } for(p=SHead->next;p!=NULL;p=p->next)//判断是否撞到自己 { if(SHead->x==p->x&&SHead->y==p->y) { Life=0; break; } } if(level<5) { for(int i=0;i<36;i++) { if(SHead->x==x_block[i]&&SHead->y==y_block[i]) { Life=0; break; } } } } void makefood()//随机产生食物 { srand(time(NULL)); do { x_food=rand()%41+5; if(x_food%2==1) x_food++; y_food=(rand()*rand())%23+5; }while(judge());//判断食物是否会产生在蛇的身体上 gotoxy(x_food,y_food); SetColor(4); printf("●"); foodnum=1; } void makeblock()//随机产生障碍物 { memset(x_block,0,sizeof(x_block)); memset(y_block,0,sizeof(y_block)); int i=0,j=8,k=7,p=2; for(;i<12;i++) { srand(time(NULL)); x_block[i]=(rand()*(++p))%39+8; if(x_block[i]%2==1) x_block[i]++; y_block[i]=(rand()*(++k)*i)%22+5; if(y_block[i]%3==0) { gotoxy(x_block[i],y_block[i]); printf("■■"); x_block[j]=x_block[i]+2; y_block[j++]=y_block[i]; } else if(y_block[i]%3==1)//最坏的情况 { gotoxy(x_block[i],y_block[i]); printf("■"); gotoxy(x_block[i],y_block[i]+1); printf("■"); gotoxy(x_block[i],y_block[i]+2); printf("■"); x_block[j]=x_block[i]; y_block[j]=y_block[i]+1; x_block[j+1]=x_block[i]; y_block[j+1]=y_block[i]+2; j+=2; } else { gotoxy(x_block[i],y_block[i]); printf("■■"); x_block[j]=x_block[i]+2; y_block[j]=y_block[i]; } } } bool judge() { node* p=SHead; int i=0; for(;p!=NULL;p=p->next) { if(p->x==x_food&&p->y==y_food) return 1; } for(;i<36;i++) { if(x_food==x_block[i]&&y_food==y_block[i]) return 1; } return 0; } void ending() { SetColor(6); gotoxy(27,10);printf("game over! -_-!"); SetColor(7); gotoxy(30,14);printf("成绩:%d",score); gotoxy(21,30);printf("我的博客:www.cnblog.com/a1225234/"); } void gotoxy(int x, int y)//光标定位函数 x列,y行 { COORD coord = {x, y}; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); } void SetColor(unsigned short ForeColor) // ForeColor前景色 { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //获得缓冲区句柄 SetConsoleTextAttribute(hCon,ForeColor);//设置文本及背景颜色 }
相关文章推荐
- VC中出现error C2064: term does not evaluate to a function
- win7搭建Python开发环境(下篇--安装pip和ipython解释器)
- Scrapy迁移到生产服务器(aliyun)
- 应用编程之守护进程
- ASP.NET中绑定数据控件OnClientClick事件Eval函数解析错误的处理
- java总结
- IPython,让Python显得友好十倍的外套——windows XP/Win7安装详解
- 求众数(c语言)
- win7 安装github for windows 失败的解决方法
- thinkphp使用phpqrcode生成带logo二维码
- php扩展开发笔记(7) 错误使用 php_base64_decode 导致内存溢出
- JDK动态代理实现原理
- Mac配置Python开发环境并实现简单的字符串和整数拼接
- C语言-判断闰年
- Python读写文件
- JAVA语法细节(1)
- Java加载.class文件的几种方式
- Spring使用教程(三)泛型依赖注入
- 编程学习
- 关于java日期类Date,DateFormat,SimpleDateFormat,Calendar总结