说明

  大三做的一个小程序,比起那个汉诺塔来说已经算更完整的一个小游戏了,当然,缺点还是有的,等水平再高一些会做更好的实例的。

演示

视频大小 - 480KB





代码

TanChiSheA1.cpp

#include "贪吃蛇A1\TanChiSheA1.h"

int main()
{
    ChoseA(0);

    return 0;
}

TanChiSheA1.h

/*Using VS2017

主要思路为用一个二维数组铺地图
另一数组记录蛇身体各部分的坐标
(第三个维度为每个二维空间大小)

瑕疵1:吃到食物后要走两步后才会变长
改过数组坐标后上面瑕疵1解决

一定注意snakeBody[][]第一个值
不要用snakeLarge+i,因为i=snakeLarge+2了,直接用i即可

瑕疵2:屏幕闪烁问题(已用gotoxy()解决)
瑕疵3:碰到自身GameOver延迟一次的问题
瑕疵4:自动行走有一格延迟,下一版本再说
*/

#ifndef TCSH_H
#define TCSH_H

#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <ctime>
#include <Windows.h>
using namespace std;

#define Size 28
char Map[Size][Size+12][3];
char Food[3];
int Direction = 2;          //1234上下左右
int snakeLarge = 0;
int snakeBody[10000][2];    //蛇的身体
int foodRandX_New = rand() % (Size - 2) + 1;
int foodRandY_New = rand() % (Size - 2) + 1;
int foodRandX_Old;
int foodRandY_Old;

class Init
{
public:
    //Init();
    //~Init();
    void InitMapBegin();
    void ShowMap();
    void InitScore();
    void InitFood(bool eat);
    void InitSnake();

private:
    int i = 1;
    int ii = 2;
};
class Operation
{
public:
    //Operation();
    //~Operation();
    void Move(int dir);
    void SnakeRules(bool food);
    void JudgeFood();
    void JudgeSelf(int dir);
    void JudgeWall();
    void GameOver();

private:
    
};


void Init::InitMapBegin()
{
    for (int i = 0; i < Size; i++)          //给整个数组初始化为两字节空格
    {                                       //如果不初始化,数组为空最后一列会并到第二列
        for (int j = 0; j < Size + 12; j++)
            strcpy_s(Map[i][j], "  ");
    }

    for (int i = 0; i < Size; i++)          //画出边框
    {
        for (int j = 0; j < Size; j++)
        {
            if (i == 0)
            {
                if (j == 0)
                    strcpy_s(Map[i][j], "╔");
                else if (j == Size - 1)
                    strcpy_s(Map[i][j], "╗");
                else
                    strcpy_s(Map[i][j], "═");
            }
            if (i == Size - 1)
            {
                if (j == 0)
                    strcpy_s(Map[i][j], "╚");
                else if (j == Size - 1)
                    strcpy_s(Map[i][j], "╝");
                else
                    strcpy_s(Map[i][j], "═");
            }
            if (j == 0 && i != 0 && i != Size - 1)
                strcpy_s(Map[i][j], "║");
            if (j == Size - 1 && i != 0 && i != Size - 1)
                strcpy_s(Map[i][j], "║");
        }
    }
}
void Init::ShowMap()
{
    for (int i = 0; i < Size; i++)
    {
        for (int j = 0; j < Size + 12; j++)
            cout << Map[i][j];
        cout << endl;
    }
}
void Init::InitScore()
{
    strcpy_s(Map[5][Size + 2], "贪");
    strcpy_s(Map[5][Size + 3], "吃");
    strcpy_s(Map[5][Size + 4], "蛇");
    strcpy_s(Map[5][Size + 5], "A1");
    strcpy_s(Map[5][Size + 6], ".0");
    
    strcpy_s(Map[7][Size + 2], "By");
    strcpy_s(Map[7][Size + 3], ":M");
    strcpy_s(Map[7][Size + 4], ".X");
    strcpy_s(Map[7][Size + 5], "Y ");

    strcpy_s(Map[12][Size + 2], "Sc");
    strcpy_s(Map[12][Size + 3], "or");
    strcpy_s(Map[12][Size + 4], "e:");
    //*Map[12][Size + 5] = '0' + snakeLarge;    //给字符型数组赋整型值(已由新方法解决)
    strcpy_s(Map[12][Size + 5], "0 ");

    strcpy_s(Map[16][Size + 2], "Q ");
    strcpy_s(Map[16][Size + 3], ": ");
    strcpy_s(Map[16][Size + 4], "退");
    strcpy_s(Map[16][Size + 5], "出");

    strcpy_s(Map[18][Size + 2], "P ");
    strcpy_s(Map[18][Size + 3], ": ");
    strcpy_s(Map[18][Size + 4], "暂");
    strcpy_s(Map[18][Size + 5], "停");

    strcpy_s(Map[20][Size + 2], "N ");
    strcpy_s(Map[20][Size + 3], ": ");
    strcpy_s(Map[20][Size + 4], "重");
    strcpy_s(Map[20][Size + 5], "新");
    strcpy_s(Map[20][Size + 6], "开");
    strcpy_s(Map[20][Size + 7], "始");


}
void Init::InitFood(bool eat)
{
    strcpy_s(Food, "[]");
    foodRandX_Old = foodRandX_New;
    foodRandY_Old = foodRandY_New;

    if (eat == true)
    {
        i = time(0);
        ii = i * i;
        //strcpy_s(Map[foodRandX_Old][foodRandY_Old], "  ");
        srand(i);                                       //用系统时间产生随机数
        foodRandX_New = rand() % (Size - 2) + 1;        //1-(Size-2)的随机数
        srand(ii);
        foodRandY_New = rand() % (Size - 2) + 1;
    }
    //strcpy_s(Map[foodRandX_New][foodRandY_New], Food);        //(已由新方法解决)

    //for (int i = 0; i < 30; i++)
    //  cout << rand() % 26 + 1 << endl;
}
void Init::InitSnake()
{
    snakeBody[0][0] = 10;
    snakeBody[0][1] = 13;
    snakeBody[1][0] = snakeBody[0][0] - 1;
    snakeBody[1][1] = snakeBody[0][1];
    snakeBody[2][0] = snakeBody[0][0] - 2;
    snakeBody[2][1] = snakeBody[0][1];
    strcpy_s(Map[(snakeBody[0][0])][(snakeBody[0][1])], "■");
    strcpy_s(Map[(snakeBody[1][0])][(snakeBody[1][1])], "□");
    strcpy_s(Map[snakeBody[2][0]][snakeBody[2][1]], "  ");

    for (int i = 3; i < 100; i++)
    {
        snakeBody[i][0] = 0;
        snakeBody[i][1] = 0;
    }
    snakeLarge = 0;
}


void Operation::Move(int dir)       //主要功能函数
{
    JudgeSelf(dir);

    switch (dir)
    {
    case 72:
    {
        int i = snakeLarge + 2;
        //strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "  ");    //(已由新方法解决)
        for (; i > 0; i--)
        {
            snakeBody[i][0] = snakeBody[(i - 1)][0];
            snakeBody[i][1] = snakeBody[(i - 1)][1];
        }
        /*for (i = snakeLarge + 2; i > 0; i--)                          //(已由新方法解决)
        {
            strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "□");
        }*/
        snakeBody[0][0] -= 1;
        //strcpy_s(Map[(snakeBody[0][0])][(snakeBody[0][1])], "■"); //(已由新方法解决)
        break;
    }
    case 80:
    {
        int i = snakeLarge + 2;
        //strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "  ");    //(已由新方法解决)
        for (; i > 0; i--)
        {
            snakeBody[i][0] = snakeBody[(i - 1)][0];
            snakeBody[i][1] = snakeBody[(i - 1)][1];
        }
        /*for (i = snakeLarge + 2; i > 0; i--)                          //(已由新方法解决)
        {
            strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])],"□");
        }*/
        snakeBody[0][0] += 1;
        //strcpy_s(Map[(snakeBody[0][0])][(snakeBody[0][1])], "■"); //(已由新方法解决)
        break;
    }
    case 75:
    {
        int i = snakeLarge + 2;
        //strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "  ");
        for (; i > 0; i--)
        {
            snakeBody[i][0] = snakeBody[(i - 1)][0];
            snakeBody[i][1] = snakeBody[(i - 1)][1];
        }
        /*for (i = snakeLarge + 2; i > 0; i--)
        {
            strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "□");
        }*/
        snakeBody[0][1] -= 1;
        //strcpy_s(Map[(snakeBody[0][0])][(snakeBody[0][1])], "■");
        break;
    }
    case 77:
    {
        int i = snakeLarge + 2;
        //strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "  ");
        for (; i > 0; i--)
        {
            snakeBody[i][0] = snakeBody[(i - 1)][0];
            snakeBody[i][1] = snakeBody[(i - 1)][1];
        }
        //for (i = snakeLarge + 2; i > 0; i--)
        //{
        //  strcpy_s(Map[(snakeBody[i][0])][(snakeBody[i][1])], "□");
        //}
        snakeBody[0][1] += 1;
        //strcpy_s(Map[(snakeBody[0][0])][(snakeBody[0][1])], "■");
        break;
    }
    }
}
void Operation::SnakeRules(bool food)
{
    if (food == true)
    {
        snakeLarge += 1;
    }
}
void Operation::JudgeFood()
{
    Init initB3;

    if (snakeBody[0][0] == foodRandX_New && snakeBody[0][1] == foodRandY_New)
    {
        initB3.InitFood(true);
        SnakeRules(true);

        char color[9] = {"color 0"};        //变换颜色
        srand(time(0));
        int i = rand() % 9 + 1;
        color[7] = '0' + i;
        system(color);
    }
    else
    {
        initB3.InitFood(false);
        SnakeRules(false);
    }
}
void Operation::JudgeSelf(int dir)
{
    if (snakeBody[1][0] < snakeBody[0][0] && dir == 1)
        GameOver();
    if (snakeBody[1][0] > snakeBody[0][0] && dir == 2)
        GameOver();
    if (snakeBody[1][1] < snakeBody[0][1] && dir == 3)
        GameOver();
    if (snakeBody[1][1] > snakeBody[0][1] && dir == 4)
        GameOver();
    for (int i = 0; i < snakeLarge; i++)
    {
        if (snakeBody[0][0] == snakeBody[i + 3][0] && snakeBody[0][1] == snakeBody[i + 3][1])
            GameOver();
    }
}
void Operation::JudgeWall()
{
    if (snakeBody[0][0] == 0 || snakeBody[0][0] == Size - 1)
        GameOver();
    if (snakeBody[0][1] == 0 || snakeBody[0][1] == Size - 1)
        GameOver();
}
void ChoseA(int Ca);
void Operation::GameOver()
{
    Init initB4;
    system("cls");
    initB4.InitMapBegin();
    strcpy_s(Map[13][11], "Ga");
    strcpy_s(Map[13][12], "me");
    strcpy_s(Map[13][13], "  ");
    strcpy_s(Map[13][14], "Ov");
    strcpy_s(Map[13][15], "er");
    initB4.ShowMap();
    _getch();
    ChoseA(0);
}


void gotoxy(int x, int y)
{
    HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD pos = { x,y };
    SetConsoleCursorPosition(hOut, pos);
}
void ChoseB(int Cb, bool B);
void ChoseA(int Ca)
{
    system("color 0A");
    Init initA;
    initA.InitSnake();
    system("cls");
    initA.InitMapBegin();

    strcpy_s(Map[8][10], "贪");
    strcpy_s(Map[8][11], "  ");
    strcpy_s(Map[8][12], "吃");
    strcpy_s(Map[8][13], "  ");
    strcpy_s(Map[8][14], "蛇");
    strcpy_s(Map[8][15], "  ");
    strcpy_s(Map[8][16], "A1");
    strcpy_s(Map[8][17], ".0");


    strcpy_s(Map[10][12], "By");
    strcpy_s(Map[10][13], ":M");
    strcpy_s(Map[10][14], ".X");
    strcpy_s(Map[10][15], "Y ");

    strcpy_s(Map[16][12], "1.");
    strcpy_s(Map[16][13], "开");
    strcpy_s(Map[16][14], "始");
    strcpy_s(Map[18][12], "2.");
    strcpy_s(Map[18][13], "退");
    strcpy_s(Map[18][14], "出");
    initA.ShowMap();

    Ca = _getch();
    if (Ca == 49)
        ChoseB(0, true);
    else if (Ca == 50)
    {
        system("cls");
        initA.InitMapBegin();

        strcpy_s(Map[12][8], "感");
        strcpy_s(Map[12][10], "谢");
        strcpy_s(Map[12][12], "您");
        strcpy_s(Map[12][14], "的");
        strcpy_s(Map[12][16], "使");
        strcpy_s(Map[12][18], "用");

        initA.ShowMap();
        exit(0);
    }
    else
        ChoseA(0);
}
void ChoseB(int Cb,bool B)
{
    if (B == true)
    {
        Init initB;
        Operation opeB;
        initB.InitMapBegin();
        initB.InitSnake();
        initB.InitFood(false);
        system("cls");
        initB.InitScore();
        initB.ShowMap();
        Cb = _getch();

        while(1)
        {
            //_getch();                 //上下左右可以只用一个键监测
            //if (kbhit())              //自动行走有延迟现象,下一版本解决
            {
                Cb = _getch();

                if (Cb == 113 || Cb == 50)              //Q或2
                {
                    system("cls");
                    initB.InitMapBegin();

                    strcpy_s(Map[12][8], "感");
                    strcpy_s(Map[12][10], "谢");
                    strcpy_s(Map[12][12], "您");
                    strcpy_s(Map[12][14], "的");
                    strcpy_s(Map[12][16], "使");
                    strcpy_s(Map[12][18], "用");

                    initB.ShowMap();
                    exit(0);
                }
                else if (Cb == 112)         //P
                {
                    system("cls");
                    strcpy_s(Map[12][13], "暂");
                    strcpy_s(Map[12][14], "停");
                    initB.ShowMap();
                    for (int i = 0;; i++)
                    {
                        if (_getch() == 112)
                        {
                            strcpy_s(Map[12][13], "  ");
                            strcpy_s(Map[12][14], "  ");
                            break;
                        }
                    }
                }
                else if (Cb == 110)         //N
                    ChoseA(0);
                else if (Cb == 49)          //1
                    ChoseB(0, true);
                else if (Cb == 72)          //上
                    opeB.Move(72);
                else if (Cb == 80)          //下
                    opeB.Move(80);
                else if (Cb == 75)          //左
                    opeB.Move(75);
                else if (Cb == 77)          //右
                    opeB.Move(77);
            }
            //opeB.Move(Cb);


            gotoxy(snakeBody[snakeLarge + 2][1] * 2, snakeBody[snakeLarge + 2][0]);
            cout << "  ";
            gotoxy(snakeBody[0][1] * 2, snakeBody[0][0]);
            cout << "■";
            for (int i = 1; i < snakeLarge + 2; i++)
            {
                gotoxy(snakeBody[i][1] * 2, snakeBody[i][0]);
                cout << "□";
            }
            opeB.JudgeFood();
            gotoxy(foodRandY_New * 2, foodRandX_New);
            cout << "[]";
            gotoxy((Size + 5) * 2, 12);
            cout << snakeLarge;
            opeB.JudgeWall();
            //_sleep(200);

        }
    }
}

#endif // !TCSH_H

评论已关闭

Loading...
Fullscreen Image