C++贪吃蛇源代码
2013-01-26 16:44
525 查看
转自:http://blog.csdn.net/hp_justdoit/article/details/8456000
#include<iostream> #include<windows.h> #include<conio.h> #include<time.h> #include<stdlib.h> using namespace std; const int N=21; //N为蛇所能移动的正方形的边长 void Get_xy(int x,int y) //定位光标位置 { HANDLE hout; COORD pos; pos.X=x*2; pos.Y=y; hout=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hout,pos); } void Color(int num) //设置颜色 { HANDLE hout; hout=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hout,num); } void Initial() //初始化 { int i,j; int wall[N+2][N+2]={{0}}; for(i=1;i<=N;i++) for(j=1;j<=N;j++) wall[i][j]=1; Color(11); for(i=0;i<N+2;i++) { for(j=0;j<N+2;j++) { if(wall[i][j]) cout<<"■"; else cout<<"□"; } cout<<endl; } Get_xy(N+3,1); Color(20); cout<<"按'W','S','A','D'进行操作"<<endl; Get_xy(N+3,2); Color(20); cout<<"按任意键暂停"<<endl; Get_xy(N+3,3); Color(20); cout<<"得分:"<<endl; } void game() { int** snake=NULL; //snake为存储蛇身的每一点的位置的数组 int len=1; int i; int score=0; int apple[2]; int tail[2]; char ch='p'; Initial(); //获得一个随机的食物位置 srand((unsigned)time(NULL)); apple[0]=rand()%N+1; apple[1]=rand()%N+1; Get_xy(apple[0],apple[1]); Color(12); cout<<"●"<<endl; //给snake数组分配内存空间 snake=(int**)realloc(snake,sizeof(int*)*len); for(i=0;i<len;i++) snake[i]=(int*)malloc(sizeof(int)*2); //开始将蛇置于页面正中间 snake[0][0]=N/2; snake[0][1]=N/2+1; Get_xy(snake[0][0],snake[0][1]); Color(14); cout<<"⊙"<<endl; int flag=1; // while(1) { //每移动一次,就把上次的尾巴还原为背景色 if(flag) { tail[0]=snake[len-1][0]; tail[1]=snake[len-1][1]; Get_xy(tail[0],tail[1]); Color(11); cout<<"■"<<endl; } flag=1; for(i=len-1;i>0;i--) { snake[i][0]=snake[i-1][0]; snake[i][1]=snake[i-1][1]; Get_xy(snake[i][0],snake[i][1]); Color(14); cout<<"★"<<endl; } /*==================================================================== 函数名:kbhit()(VC++6.0下为_kbhit()) 功 能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0 用 法:int kbhit(void); 包含头文件: include <conio.h> =====================================================================*/ if(kbhit()) { Get_xy(0,N+3); ch=getche(); } switch(ch) { case 'W': case 'w': snake[0][1]--; break; case 'S': case 's': snake[0][1]++; break; case 'A': case 'a': snake[0][0]--; break; case 'D': case 'd': snake[0][0]++; break; default :break; } for(i=1;i<len;i++) { //蛇咬到蛇身,游戏结束! if(snake[0][0]==snake[i][0] && snake[0][1]==snake[i][1]) { Get_xy(N/2,N/2); Color(30); cout<<"Game over!"<<endl; exit(0); } } Get_xy(snake[0][0],snake[0][1]); Color(14); cout<<"⊙"<<endl; /*================================================================== 函数名: sleep 功 能: 执行挂起一段时间 用 法: unsigned sleep(unsigned milliseconds); 在VC中使用带上头文件 #include <windows.h> 在gcc编译器中,使用的头文件因gcc版本的不同而不同 #include <unistd.h> ===================================================================*/ //分数越高,蛇的移动速度越快 Sleep(abs(200-0.5*score)); //蛇吃到食物 if(snake[0][0]==apple[0] && snake[0][1]==apple[1]) { flag=0; score++; len++; srand((unsigned)time(NULL)); snake=(int**)realloc(snake,sizeof(int*)*len); snake[len-1]=(int*)malloc(sizeof(int)*2); Get_xy(N+6,3); Color(20); cout<<score<<endl; apple[0]=rand()%N+1; apple[1]=rand()%N+1; Get_xy(apple[0],apple[1]); Color(12); cout<<"●"<<endl; } //蛇头撞墙了,游戏结束! if(snake[0][0]==0 || snake[0][0]==N || snake[0][1]==0 || snake[0][1]==N) { Get_xy(N/2,N/2); Color(30); cout<<"Game Over!"<<endl; for(i=0;i<len;i++) free(snake[i]); Sleep(INFINITE); exit(0); } //游戏通关! if(len>=N*N/20) { Get_xy(N/2,N/2); Color(30); cout<<"Win!"<<endl; for(i=0;i<len;i++) free(snake[i]); Sleep(INFINITE); exit(0); } } } int main() { game(); return 0; }
相关文章推荐
- C++事件(Event)机制的实现一例[源代码下载链接已修复]
- 贪吃蛇小游戏(含详细思路及源代码)
- C++线程池源代码实现1
- C++源代码免杀之函数的动态调用
- 从 Windows 移植到 UNIX,第 1 部分: 移植 C/C++ 源代码
- c++源代码---停车计时系统
- 四种加密算法之DES源代码-C++
- 中天账户管理系统 v1.15 (多用户版) GUI美化版 C++源代码 VisualStudio2010
- C/C++实现贪吃蛇逐步运动效果
- FPGA机器学习之蚁群算法的源代码C++
- java贪吃蛇源代码
- 2013腾讯编程马拉松——复赛试题(3月29)题目+第3题源代码(C++版)
- c++ 调试过程中 “没有可用于当前位置的源代码” 和 总是出现反汇编窗口的 解决方案
- C++ Primer Plus 第6版 中文版 清晰有书签PDF+源代码
- 读取纯真IP数据库C++源代码
- 九大经典排序算法整理及其源代码分享(C/C++版)
- T端军衔系统c++源代码,转自飞狐魔兽
- 自制C++ 贪吃蛇
- C++练习,贪吃蛇回顾
- C++第二次实验_作业(4个源代码)