C++实现贪吃蛇项目

【问题描述】

1.首先自动生成一个N * N(如20 * 20)的空间,在内部随机生成1个 $ 代表食物,随机生成一条长度为5的蛇,蛇的身体用心形(ASCII码为003)显示,蛇头用笑脸(ASCII码为002)显示。
2.自行定义蛇的起始位置。
3用户随意按键后蛇即刻开始自行行走,可设置行走速率为0.5秒。
3.监测用户按键,根据用户的选择方向键,改变蛇的行走方向。
4.在遇到食物$ 时,长度增一,且随机生成另一个食物$。倘若蛇碰到墙壁,则游戏失败,并打印蛇最终的长度。

【代码实现】

#include <iostream>
#include<cstdlib>
#include<stdio.h>
#include<ctime>
#include<windows.h>
#include <conio.h>
#define N 20
using namespace std;

double start=clock();
int Snake_head_x,Snake_head_y;                          //保存记录蛇头的位置坐标
int Snake_length=5,movement=0,Food_num=0;
int Food_index_x,Food_index_y;                          //保存食物位置坐标
int *p_x=new int[1000000];
int *p_y=new int[1000000];
bool Food_tag =true;                                   //false代表未吃到食物


//打印提示信息
void Notification()
{
    cout<<"         ";
    cout<<"<<The Snake>>"<<"        "<<"Designed by wuchen"<<endl<<endl;
    cout<<"**************************Notification**************************"<<endl<<endl;
    cout<<"1.Choose W A S D to change direction of snake"<<endl;
    cout<<"2.Speed up when the direction you chose is forward  "<<endl;
    cout<<"3.Game Over when the snake hit the the wall or hit its body"<<endl;
    cout<<"4.Enjoy Yourself"<<endl<<endl;
    cout<<"****************************Warnings****************************"<<endl<<endl;
    cout<<"All rights reserved"<<endl;
    cout<<"Those responsible for unauthorized reproduction will be prosecuted"<<endl<<endl;
}

//实现实时记录🐀𓐀的位置
void Snake_position(int a[][N],int num)
{
    if( *(p_x+Snake_length+movement-1)!=Snake_head_x
        || *(p_y+Snake_length+movement-1)!=Snake_head_y )
    {
        *(p_x+Snake_length+movement)=Snake_head_x;      //保存新的蛇头的实时位置
        *(p_y+Snake_length+movement)=Snake_head_y;
        movement++;
    }
}

//🐀𓐀的身体的初始化
void Snake_body(int a[][20],int index_x,int index_y)
{
    int next_position,index_x0=index_x,index_y0=index_y;//保存初始的中心位置
    static int counter=0;
    do
    {
        next_position=rand()%4+1;
        switch (next_position)
        {
        case 1:
            {
                if(a[index_x][index_y]==0)
                {
                    a[index_x-1][index_y]=3;
                    index_x--;
                }
                break;
            }
        case 2:
            {
                if(a[index_x][index_y-1]==0)
                {
                    a[index_x][index_y-1]=3;
                    index_y--;
                }
                break;
            }
        case 3:
            {
                if(a[index_x+1][index_y]==0)
                {
                    a[index_x+1][index_y]=3;
                    index_x++;
                }
                break;
            }
        case 4:
            {
                if(a[index_x][index_y+1]==0)
                {
                    a[index_x][index_y+1]=3;
                    index_y++;
                }
                break;
            }
        }
    }while(index_x0==index_x&&index_y0==index_y);
    counter++;
    *(p_x+4-counter)=index_x;
    *(p_y+4-counter)=index_y;

    if(counter==4)
    {}
    else Snake_body(a,index_x,index_y);

}

//实现🐀𓐀的初始化
void Snake(int a[][N],int num)
{
    int row,colum;
    //画出蛇头
    while(1)
    {
        row=rand()%(num-4)+2;           //友好设定:距边界的位置大于一格
        colum=rand()%(num-4)+2;         //给参与者减少难度
        if(row!=Food_index_x && colum!=Food_index_y&& a[row][colum]==0)
        {
            break;
        }
    }
    a[row][colum]=2;
    Snake_head_x=row;
    Snake_head_y=colum;
    *(p_x+4)=Snake_head_x;
    *(p_y+4)=Snake_head_y;

    Snake_body(a,row,colum);
}

//实现食物的出现
void Food_show(int (*a)[N],int num) //
{
    bool food_show=false;
    srand(unsigned(time(NULL)));
    if(Food_tag==true)
    {
        do
        {
            Food_index_x=rand()%(num-2)+1;
            Food_index_y=rand()%(num-2)+1;
            if(*( *(a+Food_index_x)+Food_index_y )==0)
            {
                *( *(a+Food_index_x)+Food_index_y )=36;
                food_show=true;
            }

        }while(food_show==false);
        Food_tag=false;
    }
}

//实现整体界面的初始化(框架、食物、蛇)
void Initial(int (*a)[N],int num )
{
/*   产生***框架     */
    for(int i=0;i<num;i++)
    {
        for(int j=0;j<num;j++)
        {
            if(i==0||i==num-1)
            {
                *( *(a+i)+j ) = 42;
            }
            else if(j==0||j==num-1)
            {
                *( *(a+i)+j ) = 42;
            }
        }
    }
/*  产生食物    */
    Food_show(a,num);
/*  画出蛇 */
    Snake(a,num);
}

//实现所有图形的绘制
void Draw(int *a,int num)
{
    for(int i=0;i<num;i++)
    {
        for(int j=0;j<num;j++)
        {
            if(*(a+i*N+j)==42)
            {
                cout<<char(42);     //生成 *
            }
            else if(*(a+i*N+j)==0)
            {
                cout<<char(32);     //生成' '
            }
            else if(*(a+i*N+j)==36)
            {
                cout<<char(36);     //生成 $
            }
            else if(*(a+i*N+j)==2)
            {
                cout<<2;            //生成蛇头
            }
            else if(*(a+i*N+j)==3)
            {
                cout<<3;            //生成身子
            }
        }
        cout<<endl;
    }
}

//检测蛇是否吃到食物更新蛇的长度
void Snake_Food(int a[][N],int num)
{
    if(a[Snake_head_x][Snake_head_y]==36)            //🐀𓐀吃到了食物
    {
        Food_tag=true;
        Food_show(a,num);
        Food_num++;

    }
    else                                            //🐀𓐀没吃到食物
    {
        a[*(p_x+movement-Food_num)][*(p_y+movement-Food_num)]=0;
    }
}

//实现用户的键盘录入控制蛇头的移动
void Snake_head_movement(int (*a)[N],int num,char direction)
{
    if(kbhit())
    {
        direction=getch();
        switch(direction)
        {
        case 'w':
        case 'W':
            {
                Snake_head_x--;
                if(*(*(a+Snake_head_x)+Snake_head_y)==0
                   || *(*(a+Snake_head_x)+Snake_head_y)==36)
                {
                    Snake_Food(a,num);
                    *(*(a+Snake_head_x)+Snake_head_y)=2;
                    *(*(a+Snake_head_x+1)+Snake_head_y)=3;
                    start=clock();                          //重新计时
                }
                break;
            }
        case 'a':
        case 'A':
            {
                Snake_head_y--;
                if(*(*(a+Snake_head_x)+Snake_head_y)==0
                    || *(*(a+Snake_head_x)+Snake_head_y)==36)
                {
                    Snake_Food(a,num);
                    *(*(a+Snake_head_x)+Snake_head_y)=2;
                    *(*(a+Snake_head_x)+Snake_head_y+1)=3;
                    start=clock();                          //重新计时
                }
                break;
            }
        case 's':
        case 'S':
            {
                Snake_head_x++;
                if(*(*(a+Snake_head_x)+Snake_head_y)==0
                    || *(*(a+Snake_head_x)+Snake_head_y)==36)
                {
                    Snake_Food(a,num);
                    *(*(a+Snake_head_x)+Snake_head_y)=2;
                    *(*(a+Snake_head_x-1)+Snake_head_y)=3;
                    start=clock();                          //重新计时
                }
                break;
            }
        case 'd':
        case 'D':
            {
                Snake_head_y++;
                if(*(*(a+Snake_head_x)+Snake_head_y)==0
                    || *(*(a+Snake_head_x)+Snake_head_y)==36)
                {
                    Snake_Food(a,num);
                    *(*(a+Snake_head_x)+Snake_head_y)=2;
                    *(*(a+Snake_head_x)+Snake_head_y-1)=3;
                    start=clock();                          //重新计时
                }
                break;
            }
        }
    }

}

//实现🐀𓐀的自动移动
void Snake_head_auto_movement(int (*a)[N],int num)
{
    if(Snake_head_x-1==*(p_x+Snake_length+movement-2)
       && Snake_head_y==*(p_y+Snake_length+movement-2))
    {
        Snake_head_x++;
        if(*(*(a+Snake_head_x)+Snake_head_y)==0
                   || *(*(a+Snake_head_x)+Snake_head_y)==36)
        {
            Snake_Food(a,num);
            *(*(a+Snake_head_x)+Snake_head_y)=2;
            *(*(a+Snake_head_x-1)+Snake_head_y)=3;
            start=clock();                          //重新计时
        }
    }
    if(Snake_head_x==*(p_x+Snake_length+movement-2)
       && Snake_head_y-1==*(p_y+Snake_length+movement-2))
    {
        Snake_head_y++;
        if(*(*(a+Snake_head_x)+Snake_head_y)==0
                   || *(*(a+Snake_head_x)+Snake_head_y)==36)
        {
            Snake_Food(a,num);
            *(*(a+Snake_head_x)+Snake_head_y)=2;
            *(*(a+Snake_head_x)+Snake_head_y-1)=3;
            start=clock();                          //重新计时
        }
    }
    if(Snake_head_x+1==*(p_x+Snake_length+movement-2)
       && Snake_head_y==*(p_y+Snake_length+movement-2))
    {
        Snake_head_x--;
        if(*(*(a+Snake_head_x)+Snake_head_y)==0
                   || *(*(a+Snake_head_x)+Snake_head_y)==36)
        {
            Snake_Food(a,num);
            *(*(a+Snake_head_x)+Snake_head_y)=2;
            *(*(a+Snake_head_x+1)+Snake_head_y)=3;
            start=clock();                          //重新计时
        }
    }
    if(Snake_head_x==*(p_x+Snake_length+movement-2)
       && Snake_head_y+1==*(p_y+Snake_length+movement-2))
    {
        Snake_head_y--;
        if(*(*(a+Snake_head_x)+Snake_head_y)==0
                   || *(*(a+Snake_head_x)+Snake_head_y)==36)
        {
            Snake_Food(a,num);
            *(*(a+Snake_head_x)+Snake_head_y)=2;
            *(*(a+Snake_head_x)+Snake_head_y+1)=3;
            start=clock();                          //重新计时
        }
    }
}
int main()
{
    int structure[N][N]={};
    int num=N;
    char direction=0;
    Notification();
    system("pause");
    Initial(structure,num);
    Draw(*structure,num);
    start=clock();
    while(clock()-start<=500)//给游戏一定的游戏延迟
    {

        Snake_head_movement(structure,num,direction);

        if(structure[Snake_head_x][Snake_head_y]!=2 //移动以后不是墙或者不是食物
        && structure[Snake_head_x][Snake_head_y]!=36)break; //结束游戏
        system("cls");//清屏
        Snake_position(structure,num);
        Draw(*structure,num);
        if(clock()-start>=500)//用户未选择移动时每隔0.5s自动移动
        {
            Snake_head_auto_movement(structure,num);
            if(structure[Snake_head_x][Snake_head_y]!=2 //移动以后不是墙或者不是食物
            && structure[Snake_head_x][Snake_head_y]!=36)break;
            system("cls");
            Snake_position(structure,num);
            Draw(*structure,num);
        }
    }
    cout<<"Game Over!!"<<endl;
    return 0;
}

转载请注明来源

  • 10
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值