您的位置:首页 > 编程语言 > C语言/C++

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++