贪吃蛇C++

#include<iostream>
#include<conio.h>
#include <limits.h>    //声明INT_MAX和ULONG_MAX常量
#include <windows.h>    //声明GetTickCount()函数,其返回从开机到现在经过的毫秒数
#include <stdlib.h>   //声明rand和srand函数
#include <time.h>     //声明time函数
using namespace std;
class TRandom
{
public:
    //缺省使用系统时间(开机后经过的毫秒数)为种子
    TRandom(long seed = 0) { mSeed = (seed ? seed : GetTickCount64()); }

    //也可以定义自己的种子
    void Seed(long seed = 0) { mSeed = (seed ? seed : GetTickCount64()); }

    //取得一个随机的整数
    int  Integer() { return Next(); }

    //取得一个在指定范围内的随机整数
    int  Integer(int min, int max) { return min + Next() % (max - min + 1); }

    //取得一个随机的0到1之间的小数
    double Real() { return double(Next()) / double(INT_MAX); }

private:
    //使用调和算法
    void Change() { mSeed = (314159265 * mSeed + 13579) % ULONG_MAX; }

    //取得伪随机数发生器的随机数序列中的下一个随机整数
    int  Next() {
        int loops = mSeed % 3;
        for (int i = 0; i <= loops; i++)
            Change();
        return int(mSeed / 2);
    }
    unsigned long  mSeed;   //随机数发生器的种子
};
int x=0, y=0;
void printm(int startX, int startY)
{
    HANDLE hd;
    COORD pos;
    pos.X = startX;
    pos.Y = startY;
    hd = GetStdHandle(STD_OUTPUT_HANDLE);    /*获取标准输出的句柄*/
    SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
    printf("*");
}
void prints(int startX, int startY)
{
    HANDLE hd;
    COORD pos;
    
    pos.X = startX;
    pos.Y = startY;
    hd = GetStdHandle(STD_OUTPUT_HANDLE);    /*获取标准输出的句柄*/
    SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
    printf("@");
}
void printq(int startX, int startY)
{
    HANDLE hd;
    COORD pos;
    pos.X = startX;
    pos.Y = startY;
    hd = GetStdHandle(STD_OUTPUT_HANDLE);    /*获取标准输出的句柄*/
    SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
    printf("&");
}
void go(int startX, int startY) {
    HANDLE hd;
    COORD pos;
    pos.X = startX;
    pos.Y = startY;
    hd = GetStdHandle(STD_OUTPUT_HANDLE);    /*获取标准输出的句柄*/
    SetConsoleCursorPosition(hd, pos);/*设置控制台光标输出的位置*/
}
class Map {
public:
    void Map_Create(int x,int y) {
        for (int j = 0; j < y; j++) {
            if (j == 0 || j == y - 1) {
                for (int i = 0; i < x; i+=2) {
                    printm(i, j);
                }
            }
            else {
                printm(0, j);
                printm(x-1, j);
            }
        }
    }
};
class Snake {
public:
    int length;
    int x[1000];
    int y[1000];
    int numh = 0;
    int numr = 0;
    int Head_dir;//1上2下3左4右
    int Rear_dir;
    Snake(int l) {
        length = l;
        Head_dir = 4;
        Rear_dir = 4;
        x[0] = 1;
        y[0] = 1;
        x[1] = l;
        y[1] = 1;
        numh = 1;
        numr = 0;
    }
    void Dir_change(char ch) {
            if (ch == 'w' && Head_dir != 1 && Head_dir != 2) {
                Head_dir = 1;
                numh++;
                x[numh] = x[numh - 1];
                y[numh] = y[numh - 1];
            }
            else if (ch == 's' && Head_dir != 1 && Head_dir != 2) {
                Head_dir = 2;
                numh++;
                x[numh] = x[numh - 1];
                y[numh] = y[numh - 1];
            }
            else if (ch == 'a' && Head_dir != 3 && Head_dir != 4) {
                Head_dir = 3;
                numh++;
                x[numh] = x[numh - 1];
                y[numh] = y[numh - 1];
            }
            else if (ch == 'd' && Head_dir != 3 && Head_dir != 4) {
                Head_dir = 4;
                numh++;
                x[numh] = x[numh - 1];
                y[numh] = y[numh - 1];
            }
    }
    void move() {
        if (Head_dir == 1) {
            y[numh]--;
            if (Rear_dir == 1)
                y[numr]--;
            else if (Rear_dir == 2)
                y[numr]++;
            else if (Rear_dir == 3)
                x[numr]--;
            else if (Rear_dir == 4)
                x[numr]++;
            if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
                numr++;
                if (x[numr] == x[numr + 1]) {
                    if (y[numr] > y[numr + 1]) {
                        Rear_dir = 1;
                    }
                    else Rear_dir = 2;
                }
                else {
                    if (x[numr] > x[numr + 1]) {
                        Rear_dir = 3;
                    }
                    else Rear_dir = 4;
                }
            }
        }
    else if (Head_dir == 2) {
            y[numh]++;
            if (Rear_dir == 1)
                y[numr]--;
            else if (Rear_dir == 2)
                y[numr]++;
            else if (Rear_dir == 3)
                x[numr]--;
            else if (Rear_dir == 4)
                x[numr]++;
            if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
                numr++;
                if (x[numr] == x[numr + 1]) {
                    if (y[numr] > y[numr + 1]) {
                        Rear_dir = 1;
                    }
                    else Rear_dir = 2;
                }
                else {
                    if (x[numr] > x[numr + 1]) {
                        Rear_dir = 3;
                    }
                    else Rear_dir = 4;
                }
            }
        }
    else if (Head_dir == 3) {
            x[numh]--;
            if (Rear_dir == 1)
                y[numr]--;
            else if (Rear_dir == 2)
                y[numr]++;
            else if (Rear_dir == 3)
                x[numr]--;
            else if (Rear_dir == 4)
                x[numr]++;
            if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
                numr++;
                if (x[numr] == x[numr + 1]) {
                    if (y[numr] > y[numr + 1]) {
                        Rear_dir = 1;
                    }
                    else Rear_dir = 2;
                }
                else {
                    if (x[numr] > x[numr + 1]) {
                        Rear_dir = 3;
                    }
                    else Rear_dir = 4;
                }
            }
        }
    else if (Head_dir == 4) {
            x[numh]++;
        if (Rear_dir == 1)
            y[numr]--;
        else if (Rear_dir == 2)
            y[numr]++;
        else if (Rear_dir == 3)
            x[numr]--;
        else if (Rear_dir == 4)
            x[numr]++;
            if (x[numr] == x[numr + 1] && y[numr] == y[numr + 1]) {
                numr++;
                if (x[numr] == x[numr + 1]) {
                    if (y[numr] > y[numr + 1]) {
                        Rear_dir = 1;
                    }
                    else Rear_dir = 2;
                }
                else {
                    if (x[numr] > x[numr + 1]) {
                        Rear_dir = 3;
                    }
                    else Rear_dir = 4;
                }
            }
        }
     }
    void eat() {
        if (Rear_dir == 1) {
            y[numr]++;
        }
        else if(Rear_dir == 2) {
            y[numr]--;
        }
        else if (Rear_dir == 3) {
            x[numr]++;
        }
        else if (Rear_dir == 4) {
            x[numr]--;
        }
        length++;
    }
    void draw() {
        int n = numh;
        int posx = x[numh];
        int posy = y[numh];
        prints(posx, posy);
        for (; n > numr; n--) {
            if (x[n] == x[n - 1]) {
                if (y[n] > y[n - 1]) {
                    for (int i = y[n]-1; i >= y[n - 1]; i--) {
                        printm(x[n], i);
                    }
                }
                else {
                    if (y[n] < y[n - 1]) {
                        for (int i = y[n]+1; i <= y[n - 1]; i++) {
                            printm(x[n], i);
                        }
                    }
                }
            }
            else {
                if (x[n] > x[n - 1]) {
                    for (int j=x[n]-1;j>=x[n-1];j--){
                        printm(j, y[n]);
                    }
                }
                else {
                    for (int j = x[n]+1; j <= x[n - 1]; j++) {
                        printm(j, y[n]);
                    }
                }
            }
        }
    }
    int eatself() {
        for (int i = numr; i < numh; i++) {
            if (x[numh] == x[i]&&y[numh]==y[i]) {
                return 0;
            }
            else if (x[numh] == x[i]) {
                if (y[i] > y[i + 1]) {
                    if (y[numh]<y[i] && y[numh]>y[i + 1])
                        return 0;
                }
                else if (y[numh] > y[i] && y[numh] < y[i + 1])
                    return 0;
            }
            else if (y[numh] == y[i]) {
                if (x[i] > x[i + 1]) {
                    if (x[numh] < x[i] && x[numh] > x[i + 1])
                        return 0;
                }
                else if (x[numh] > x[i] && x[numh] < x[i + 1])
                    return 0;
            }
        }
        return 1;
    }
    int foodself(int x1,int y1) {
        for (int i = numr; i < numh; i++) {
            if (x1 == x[i] && y1 == y[i]) {
                return 0;
            }
            else if (x1 == x[i]) {
                if (y[i] > y[i + 1]) {
                    if (y1<y[i] && y1>y[i + 1])
                        return 0;
                }
                else if (y1 > y[i] && y1 < y[i + 1])
                    return 0;
            }
            else if (y1 == y[i]) {
                if (x[i] > x[i + 1]) {
                    if (x1 < x[i] && x1 > x[i + 1])
                        return 0;
                }
                else if (x1 > x[i] && x1 < x[i + 1])
                    return 0;
            }
        }
        return 1;
    }
};
class food {
public:
    int x;
    int y;
    void born(int x1,int y1) {
        TRandom T;
        x = T.Integer(1, x1);
        y = T.Integer(1, y1);
    }
    void print() {
        printq(x, y);
    }
};
int game(int x,int y,int rate) {
    Map M;
    Snake s(10);
    food F;
    F.born(x-2, y-2);
    while (1) {
        while (!_kbhit()) {
            system("cls");
            M.Map_Create(x, y);
            F.print();
            s.move();
            s.draw();
            if (s.x[s.numh] == F.x && s.y[s.numh] == F.y) {
                F.born(x-2, y-2);
                s.eat();
                while (s.foodself(F.x, F.y) == 0) {
                    F.born(x - 2, y - 2);
                    s.eat();
                }
            }
            if (s.eatself() == 0)
                return s.length;
            if (s.x[s.numh] == 0 || s.x[s.numh] == x-1 || s.y[s.numh] == 0 || s.y[s.numh] == y-1)
                return s.length;
            Sleep(rate);
        }
        char ch;
        ch = _getch();
        s.Dir_change(ch);
        rate = rate * 100 / 101;
    }
}
void menu() {
    Map m;
    m.Map_Create(21, 10);
    go(1, 1);
    printf("        贪吃蛇        ");
    go(1, 3);
    printf("   小骚逼若谷       ");
    go(1, 4);
    printf("1 小地图");
}
void fail() {
    
}
int main() {
    int score=game(41, 20, 100);
    system("cls");
    printf("失败,score=%d",score);
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值