寒假作死项目之贪吃蛇

寒假闲的发慌,就顺手找点代码写写。至少写点啥打发打发时间(┑( ̄Д  ̄)┍)。
于是乎,就寻思写个贪吃蛇玩玩。

1.1 具体思路

具体还是参考了《C语言课程设计与游戏开发实践教程》这本书的大体思路。核心思想是通过二维数组来实现地图,小蛇的存储,小蛇的转向,食物的出现等等。其中小蛇的转向通过用数字的变换来实现—用1,2,3,4,5等依次排列的数字表示蛇身,数组存储1的位置代表蛇头,这样就在数组中实现小蛇的存储。

那么,小蛇的转向如何实现呢?

如图,(选自《C语言课程设计与游戏开发实践教程》)
当当当,就是这样实现了
当初看到这里,不得不感慨思路的独特。

1.2具体代码

#ifndef ASNAKE_H_INCLUDED
#define ASNAKE_H_INCLUDED
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <mmsystem.h>//导入声音头文件
#pragma comment(lib,"Winmm.lib")
//解压之后放F盘好了
#define length 28
#define wide 60
#define snake_long 100

//游戏界面
int  Play_show[length][wide]={0};  //0表示未使用
char a=69;
using namespace std;

//欢迎界面
class Welcome
{
public:
    void Hello()
    {
    F_hello();
    system("pause");//按任意键进行
}
private:
    void F_hello(){cout<<"欢迎来到贪吃蛇"<<endl;}
};


//游戏主函数
class Play_snake
{
public:
    //1.游戏初始化
    void Play_startshow();

    //2.游戏行进画面
    void Play_menu();
private:
    //1.清屏函数
    //system("cls");

    //2.光标控制函数
    void gotoxy(int x,int y);

    //3.蛇的构造
    //int snake[snake_long]={1,2,3,4,5};//1 2 3 4 5

    //4.食物的随机出现
    void Play_food();

    //5.音乐播放函数
    void Play_music();

    //6.小蛇的移动函数
    void snake_more();

    //7.小蛇的死亡函数

    //8.游戏结束函数

    //9.游戏开关控制变量
    int Play_switch=1;//开关控制变量
    //10.食物的控制变量
    int Play_food_switch=0;//0表示没食物生成,1为有食物生成
    //11.长度控制变量
    int snake_maxlength=5;
    //12.转弯控制变量
    //char a=69;
};

//1.游戏初始化
void Play_snake::Play_startshow()
{
    //清屏函数
    Play_music();
    cout<<"游戏开始"<<endl;
    system("pause");

    //int Play_switch=1;//开关控制变量
    system("cls");
    gotoxy(0,0);//将光标初始化在0.0
    for(int i=0;i<length;i++)
    {
        Play_show[i][0]=-1;
        for(int j=0;j<wide;j++)
            {
                if(i==0||i==length-1)
                    Play_show[i][j]=-1;
            }

            Play_show[i][wide-1]=-1;
            cout<<endl;
        }
        for(int i=0;i<5;i++)
        {
            Play_show[length/2][wide/2+i]=i+1;//小蛇构建
        }
        gotoxy(0,0);
        //小蛇数组出现在中间//G
        system("pause");
        //开始游戏

        while(Play_switch)
        {
            Play_menu();
        }
        system("cls");
        system("pause");
        cout<<"小蛇死亡"<<endl<<"游戏结束"<<endl;
        //游戏退出
}
//2.游戏行进画面
void Play_snake::Play_menu()
{
    system("cls");
    gotoxy(0,0);
    //游戏界面打印G
    Play_food();//出现食物
    for(int i=0;i<length;i++)
    {
        for(int j=0;j<wide;j++)
            {
                if(Play_show[i][j]==-1)//墙
                    cout<<'#';
                else if(Play_show[i][j]==0)//地板
                    cout<<" ";
                else if(Play_show[i][j]==-2)//食物
                    cout<<'$';
                else if(Play_show[i][j]==1)//蛇头
                    cout<<"@";
                else if(Play_show[i][j]>1)//蛇身
                    cout<<'*';
            }
        if(i==10)
            cout<<"\t"<<"\t"<<"w(小写)向上走";
        else if(i==11)
            cout<<"\t"<<"\t"<<"a(小写)向左走";
        else if(i==12)
            cout<<"\t"<<"\t"<<"s(小写)向右走";
        else if(i==13)
            cout<<"\t"<<"\t"<<"d(小写)向下走";
        else if(i==16)
            cout<<"\t"<<"\t"<<"得分:"<<snake_maxlength-5;
        cout<<endl;
        }
    Sleep(100);
    //小蛇打印G
    if(kbhit())
    {
        a=getch();
    }
    //这样就不用输入回车了
    //cin>>a;
    snake_more();
    //玩家输入控制小蛇G


    //system("pause");
    //依次循环G
    //如果小蛇死亡,开关语句Play_switch为0;
}
//2.光标控制函数
void Play_snake::gotoxy(int x,int y)
{
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos;
    pos.X=x;
    pos.Y=y;
    SetConsoleCursorPosition(handle,pos);
}
//4.食物的随机出现//M
void Play_snake::Play_food()
{
    srand((unsigned)time(NULL));
    //随机设置食物
    //随机生成的部分不能是小蛇身体部分//G
    if(Play_food_switch)
        return ;
    Play_show[rand()%(length-4)+1][rand()%(length-4)+1]=-2;//食物不能生成在边界
    Play_food_switch=1;


}
//5.音乐播放函数
void Play_snake::Play_music()
{
    //D:C++工作区\\bin\\sounds\\音乐.wav
    //C:\\Users\\夜归人\\Desktop\\C++工作区\\bin\\sounds\\音乐.wav
    mciSendString("open D:\\C++工作区\\bin\\sounds\\音乐.wav",NULL,0,NULL);
    mciSendString("play D:\\C++工作区\\bin\\sounds\\音乐.wav",NULL,0,NULL);//最后路径改D盘
}
//6.小蛇的移动函数
void Play_snake::snake_more()
{
    char ch=a;
    if(ch=='w'||ch=='a'||ch=='s'||ch=='d'||ch=='W'||ch=='A'||ch=='S'||ch=='D')
    {
    for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]>=1)
                        Play_show[i][j]=Play_show[i][j]+1;
                }
        }
    }
    switch(ch)
    {
    case 'w':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i-1][j]==-1||Play_show[i-1][j]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i-1][j]==-2)//吃食
                            {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i-1][j]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    case 'a':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i][j-1]==-1||Play_show[i][j-1]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i][j-1]==-2)//吃食
                          {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i][j-1]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    case 's':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i+1][j]==-1||Play_show[i+1][j]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i+1][j]==-2)//吃食
                          {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i+1][j]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    case 'd':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i][j+1]==-1||Play_show[i][j+1]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i][j+1]==-2)//吃食
                          {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i][j+1]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;


    case 'W':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i-1][j]==-1||Play_show[i-1][j]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i-1][j]==-2)//吃食
                            {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i-1][j]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    case 'A':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i][j-1]==-1||Play_show[i][j-1]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i][j-1]==-2)//吃食
                          {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i][j-1]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    case 'S':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i+1][j]==-1||Play_show[i+1][j]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i+1][j]==-2)//吃食
                          {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i+1][j]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    case 'D':
        for(int i=0;i<length;i++)
        {
            for(int j=0;j<wide;j++)
                {
                    if(Play_show[i][j]==2)
                     {
                         if(Play_show[i][j+1]==-1||Play_show[i][j+1]>2)//撞墙
                            Play_switch=0;
                         else if(Play_show[i][j+1]==-2)//吃食
                          {
                                snake_maxlength++;
                                Play_food_switch=0;
                            }
                         Play_show[i][j+1]=1;
                     }
                    else if(Play_show[i][j]==snake_maxlength+1)//去尾
                        Play_show[i][j]=0;

                }
        }
                break;
    default:
        break;

    }
}


#endif // ASNAKE_H_INCLUDED
#include "asnake.h"

int main()
{
    Welcome T;
    T.Hello();       //欢迎界面
    Play_snake user1;
    user1.Play_startshow();

    //1.使用循环进行游戏//M
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值