c++贪吃蛇改进版
来源:互联网 发布:淘宝金币有什么用 编辑:程序博客网 时间:2024/05/01 07:41
上次的贪吃蛇的基础上改变了食物的颜色,增加了读取上次记录,本来想写一个读取最高纪录的,没写出来,太菜,,,下面是代码
/**红色豆,可以读写上次记录,最大记录还是写不进去*/#include <iostream>#include<windows.h>#include<time.h>#include<math.h>#include<conio.h>#include <cstdlib>#include <cstdio>#include<fstream>using namespace std;/*#define w 1//上#define a 3//左#define s 2//下#define d 4//右*//**定位光标*/HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);COORD coord;void locate(int x,int y){ coord.X=y; coord.Y=x; SetConsoleCursorPosition(hout,coord);}/**隐藏光标*/void hide(){ CONSOLE_CURSOR_INFO cursor_info = {1,0}; SetConsoleCursorInfo(hout,&cursor_info);}/**生成随机数*/double random(double start,double end){ return start+(end-start)*rand()/(RAND_MAX+1.0);}/**地图的长宽,蛇的坐标,长度,方向,食物的位置*/int m,n;struct node{ int x; int y;}snake[1000];int snake_length,dir;node food;int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}};/**输出墙*/void print_wall(int n,int m){ cout<<" "; for(int i=0;i<n;i++){ cout<<"-"; } cout<<" "<<endl; for(int j=0;j<m;j++){ cout<<"|"; for(int k=0;k<n;k++){ cout<<" "; } cout<<"|"<<endl; } cout<<" "; for(int i=0;i<n;i++){ cout<<"-"; }}/**首次输出蛇*/void print_snake(){ SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); locate(snake[0].x,snake[0].y); cout<<"@"; for(int i=1;i<=snake_length-1;i++){ locate(snake[i].x,snake[i].y); cout<<"*"; }}/**判断自撞以及撞墙*/bool is_correct(){ if(snake[0].x==0||snake[0].y==0||snake[0].x==21||snake[0].y==61){ return false; } for(int i=1;i<=snake_length-1;i++){ if(snake[0].x==snake[i].x&&snake[0].y==snake[i].y){ return false; } } return true;}/**随机生成并输出食物*/bool print_food(){ //WORD wOldColorAttrs;//Word是16位短整数,无符号短整型,0到65535之间的整数 //CONSOLE_SCREEN_BUFFER_INFO csbiInfo; // Save the current color //GetConsoleScreenBufferInfo(h, &csbiInfo);//用于检索指定的控制台屏幕缓冲区的信息,调用成功返回值非0,调用不成功返回0; //wOldColorAttrs = csbiInfo.wAttributes; srand((unsigned)time(0)); bool e; while(1){ e=true; int i=(int)random(0,20)+1,j=(int)random(0,60)+1; food.x=i;food.y=j; for(int k=0;k<=snake_length-1;k++){ if(food.x==snake[k].x&&food.y==snake[k].y){ e= false; break; } } if(e){ break; } } locate(food.x,food.y); //SetConsoleTextAttribute(h, wOldColorAttrs); //cout<<"$";*/ SetConsoleTextAttribute(h, FOREGROUND_RED |FOREGROUND_INTENSITY); //设置控制台背景颜色和字体颜色的函数, cout<<"$"; return true;}void print_smileface(){ SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); locate(8,64); cout<<" ******** "<<endl; locate(9,64); cout<<"* *"<<endl; locate(10,64); cout<<"* ^ ^ *"<<endl; locate(11,64); cout<<"* *"<<endl; locate(12,64); cout<<"* ˇ *"<<endl; locate(13,64); cout<<" ******** "<<endl; locate(14,66); cout<<"吃到了~"<<endl;}void print_face(){ SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); locate(8,64); cout<<" ******** "<<endl; locate(9,64); cout<<"* *"<<endl; locate(10,64); cout<<"* * * *"<<endl; locate(11,64); cout<<"* *"<<endl; locate(12,64); cout<<"* * *"<<endl; locate(13,64); cout<<" ******** "<<endl; locate(14,66); cout<<"小心哦~"<<endl;}int readmaxlength(){ ifstream inFile; inFile.open("c:\\snake.txt"); if(inFile.is_open()){ int maxlength; inFile>>maxlength; return maxlength; }}/**写上次记录*///http://blog.csdn.net/kingstar158/article/details/6859379/void writeFile(){ ofstream outFile; outFile.open("c:\\snake.txt"); int lastlength; lastlength=snake_length; int maxlength; outFile << lastlength <<endl; int length=readmaxlength(); if(length<snake_length){ maxlength=snake_length; outFile<<maxlength; } else{ maxlength=length; outFile<<maxlength; } outFile.close();}/**写最大记录*//*void writemaxFile(){ ifstream inFile; inFile.open("c:\\snake1.txt"); if(inFile.is_open()){ int maxlength; inFile>>maxlength; int length=maxlength; if(snake_length>length){ ofstream outFile; outFile.open("c:\\snake1.txt"); outFile << length << endl; locate(17,64); cout<<"最高记录:"<<maxlength<<endl; } }}*//**读取纪录*/void readFile(){ ifstream inFile; inFile.open("c:\\snake.txt"); if(inFile.is_open()){ int lastlength; inFile >> lastlength; int maxlength; inFile>>maxlength; locate(16,64); cout << "上次纪录:" << lastlength << endl; locate(17,64); cout<<"最高纪录:"<<maxlength<<endl; } else{ locate(16,64); cout << "上次纪录:" << 0 << endl; locate(17,64); cout<<"最高纪录:"<<snake_length<<endl; }}/**前进*/bool go_ahead(){ SetConsoleTextAttribute(h, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); node temp; temp = snake[snake_length-1]; bool e = false; for(int i=snake_length-1;i>=1;i--){ snake[i]=snake[i-1]; } snake[0].x=snake[0].x+direct[dir][0]; snake[0].y=snake[0].y+direct[dir][1]; locate(snake[1].x,snake[1].y); cout<<"*"; /*如果吃到食物了*/ if(snake[0].x==food.x&&snake[0].y==food.y){ snake_length++; e = true; snake[snake_length-1]=temp; } /*输出此时蛇的状态*/ if(!e){ locate(temp.x,temp.y); cout<<" "; print_face(); readFile(); } else{ print_food(); print_smileface(); readFile(); } locate(snake[0].x,snake[0].y); cout<<"@"; /*如果自撞或者撞墙了*/ if(!is_correct()){ system("cls"); cout<<"你输了"<<endl; cout<<"最终长度是:"<<snake_length; return false; } return true;}void print_logo(){ // SetConsoleTextAttribute(h,FOREGROUND_RED|FOREGROUND_INTENSITY); cout<<"********** ** ** * ** **********"<<endl; cout<<"********** *** ** *** ** ** **********"<<endl; cout<<"** **** ** ** ** ** ** ** "<<endl; cout<<"** ** ** ** ** ** ** ** ** "<<endl; cout<<"********** ** ** ** ** ** **** **********"<<endl; cout<<"********** ** ** ** ********* *** **********"<<endl; cout<<" ** ** ** ** ** ** ** ** ** "<<endl; cout<<" ** ** **** ** ** ** ** ** "<<endl; cout<<"********** ** *** ** ** ** ** **********"<<endl; cout<<"********** ** ** ** ** ** ** **********"<<endl; for(int i=1;i<65;i++){ cout<<"-"; }cout<<endl;//SetConsoleTextAttribute(h,FOREGROUND_GREEN|FOREGROUND_INTENSITY); cout<<" * ** * "<<endl; cout<<"* . . *"<<endl; cout<<"* *"<<endl; cout<<"* - *"<<endl; cout<<" * * * *"<<endl; cout<<" * * * * * * *"<<endl; cout<<" * * * * * * * * ** "<<endl; cout<<" * * * * * * *"<<endl; cout<<endl; locate(12,30); cout<<"游戏规则:按上下左右键控制蛇的移动"<<endl; locate(13,40); cout<<"每吃掉一个食物身体长长一节"<<endl; locate(14,40); cout<<"撞到墙或者自己的身体则游戏失败"<<endl; locate(15,40); cout<<"我们的目标是变大变长!"<<endl; locate(16,40); cout<<"请输入难度(1~100)开始游戏吧!"<<endl; cout<<endl;}/**主函数**/int main(){ print_logo(); int hard; locate(17,40); cin>>hard; if(hard<1||hard>100){ cout<<"游戏难度不得小于1不得大于100,请重新开始游戏"<<endl; system("pause"); return 0; } snake_length=5; for(int i=0;i<5;i++){ snake[i].x=1; snake[i].y=5-i; } dir=3; system("cls"); hide(); print_wall(60,20); print_food(); print_snake(); locate(3,62); cout<<"当前长度:"; //char a,s,w,d; clock_t q,t; char ch; double hard_len; /**开始游戏*/ while(1){ hard_len=(double)snake_length/(double)(60*20); q=clock(); while(1){ t=clock(); if(t-q>=(int)(400-30*hard)*(1-sqrt(hard_len))){ break; } } /**键入上下左右*/ if(kbhit()){ ch=getch(); if(ch==-32){ ch=getch(); switch(ch){ case 72://上 if(dir==2||dir==3){ dir=0; } break; case 80: if(dir==2||dir==3){ dir=1; } break; case 75: if(dir==0||dir==1){ dir=2; } break; case 77: if(dir==0||dir==1){ dir=3; } break; /* case 3://左a if(dir==0||dir==1){ dir=2; } break; case 1://上w if(dir==2||dir==3){ dir=0; } break; case 2://下s if(dir==2||dir==3){ dir=1; } break; case 4://右d if(dir==0||dir==1){ dir=3; } break;*/ } } } if(!go_ahead()){ writeFile(); // writemaxFile(); break; } locate (3,73); cout<<snake_length<<endl; } system("pause"); return 0;}
下面是运行结果
0 0
- 贪吃蛇改进版
- c++贪吃蛇改进版
- 贪吃蛇(改进版)
- Android之改进版贪吃蛇
- 贪吃蛇(改进)
- C版贪吃蛇
- C《贪吃蛇》简易字符版
- DOS简易版C语言贪吃蛇
- C语言贪吃蛇Linux版
- 贪吃蛇C语言实现(简易版)
- DOS简易版C语言贪吃蛇
- 贪吃蛇C实现
- 贪吃蛇C代码
- C代码 贪吃蛇
- [C++] Console 贪吃蛇
- c 贪吃蛇
- 贪吃蛇(C语言版)
- 贪吃蛇,c,c++
- threadlocal
- 80x86的内存寻址机制
- deviceone 开发 烦烦索索那些事
- amr文件的解析
- 19.Selenium2 自动化测试实战-基于Python语言-数组与字典
- c++贪吃蛇改进版
- 【YOLO学习】使用YOLO v2训练自己的数据
- Jquery使包含a标签的标签可点击跳转
- NYOJ zb的生日
- jzoj 100003. 【NOI2017模拟.4.1】 Tree 无源汇最大费用流
- Android Studio快捷键生成点击事件
- EOS demo实战
- Android 中动态广播接收器和静态广播接收器的使用
- 项目中js文件修改后浏览器不能及时更新的解决办法