windows下c/c++编程实现 贪吃蛇简易版

来源:互联网 发布:帝国cms系统目录 编辑:程序博客网 时间:2024/06/17 03:13

简单地实现场景、蛇的移动、食物、得分以及游戏开始、结束。


实现

头文件 stdlib.h iostream windows.h time.h conio.h vector
先定义一个位置函数,主要通过位置函数来对蛇、食物进行操作。
定义一个场景初始化函数,对场景进行描绘。
蛇的长度是会变的,所以必须使用动态空间为蛇进行定义。
其次是食物,食物是随机的,所以通过rand()、srand()获取随机位置。
最后是获取位移操作,本案例通过操作蛇的头的位置来对整条蛇进行控制。通过获取输入(w,s,a,d)来为其位置进行+、-。从而实现蛇的移动控制。
废话不多说,直接看代码吧。

代码实现

#include<iostream>#include<windows.h>#include<time.h>#include<stdlib.h>#include<conio.h>#define N 21#include <vector>using std::vector;using std::cin;using std::cout;using std::endl;using std::string;void gotoxy(int x,int y)//位置函数{    COORD pos;    pos.X=2*x;    pos.Y=y;    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);}void color(int a)//颜色函数{    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);}void init(int apple[2])//初始化函数(初始化围墙、显示信息、苹果){    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;    }    //wall[1][1]=0;    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;    }    gotoxy(N+3,1);//显示信息    color(24);    cout<<"按 W S A D 移动方向"<<endl;    gotoxy(N+3,2);    color(20);    cout<<"按任意键暂停"<<endl;    gotoxy(N+3,3);    color(20);    cout<<"得分:"<<endl;    apple[0]=rand()%N+1;//苹果    apple[1]=rand()%N+1;    gotoxy(apple[0],apple[1]);    color(12);    cout<<"Θ"<<endl;}int main(){    int i,j;    int** snake=NULL;    int apple[2];    int score=0;    int tail[2];    int len=3;    char ch='p';    srand((unsigned)time(NULL));    init(apple);    snake=(int**)realloc(snake,sizeof(int*)*len);    for(i=0;i<len;i++)        snake[i]=(int*)malloc(sizeof(int)*2);    for(i=0;i<len;i++)    {        snake[i][0]=N/2;        snake[i][1]=N/2+i;        gotoxy(snake[i][0],snake[i][1]);        color(14);        cout<<"◆"<<endl;    }    while(1)//进入消息循环    {        tail[0]=snake[len-1][0];        tail[1]=snake[len-1][1];        gotoxy(tail[0],tail[1]);        color(11);        cout<<"  "<<endl;        for(i=len-1;i>0;i--)        {            snake[i][0]=snake[i-1][0];            snake[i][1]=snake[i-1][1];            gotoxy(snake[i][0],snake[i][1]);            color(14);            cout<<"◆"<<endl;        }        if(kbhit())        {            gotoxy(0,N+2);            ch=getche();        }        switch(ch)        {            case 'w':snake[0][1]--;break;            case 's':snake[0][1]++;break;            case 'a':snake[0][0]--;break;            case 'd':snake[0][0]++;break;            default: break;        }        gotoxy(snake[0][0],snake[0][1]);        color(14);        cout<<"◆"<<endl;        Sleep(abs(200-0.5*score));        if(snake[0][0]==apple[0]&&snake[0][1]==apple[1])//吃掉苹果后蛇分数加1,蛇长加1        {            score++;            len++;            snake=(int**)realloc(snake,sizeof(int*)*len);            snake[len-1]=(int*)malloc(sizeof(int)*2);            apple[0]=rand()%N+1;            apple[1]=rand()%N+1;            gotoxy(apple[0],apple[1]);            color(12);            cout<<"Θ"<<endl;            gotoxy(N+5,3);            color(20);            cout<<score<<endl;        }        if(snake[0][1]==0||snake[0][1]==N||snake[0][0]==0||snake[0][0]==N)//撞到围墙后失败        {            gotoxy(N/2,N/2);            color(30);            cout<<"失败!!!"<<endl;            for(i=0;i<len;i++)            free(snake[i]);            while(!kbhit())//按任意键继续                Sleep(0.1);            for(i=0;i<len;i++)            {                gotoxy(snake[i][0],snake[i][1]);                color(11);                cout<<"  "<<endl;            }            for(i=0;i<len;i++)            {                snake[i][0]=N/2;                snake[i][1]=N/2+i;                gotoxy(snake[i][0],snake[i][1]);                color(14);                cout<<"◆"<<endl;            }            gotoxy(N/2,N/2);            color(11);            cout<<"          "<<endl;            continue;//          Sleep(INFINITE);            exit(0);        }    }    return 0;}... 
0 0