ege图形库之简单贪吃蛇(c++)

第二次做动画显示效果的小程序,心血来潮想做下儿时的经典游戏----贪吃蛇。由于时间有限,只是简单地做了基本功能,有时间后再完善更多功能。

由于个人水平有限,可能代码有些地方可以改进。不足之处敬请指出。

注:要运行该代码需要正确配置,连接好ege图形库的头文件,做好准备工作。具体教程请看http://jingyan.baidu.com/article/4b07be3c40d35f48b380f3c7.html

编程环境:codeblocks   windows10  corei5 cpu

源代码:

#include < stdio.h > 
#include < graphics.h > 
#include < windows.h > 
#include < stdlib.h > 
#define Random(x)(rand() % x) 
struct position {
    int x;
    int y;
    position * next;
};
class snake {
    private: int direction;
    public: position * tail;
    position * head;
    position * gettail() {
        return tail;
    }
    void settail(position * p) {
        tail = p;
    }
    position * gethead() {
        return head;
    }
    void sethead(position * p) {
        head = p;
    }
    snake() {
        tail = new position;
        head = new position;
        head - >x = 75;
        head - >y = 15;
        tail - >x = 15;
        tail - >y = 15;
        tail - >next = new position;
        tail - >next - >x = 45;
        tail - >next - >y = 15;
        tail - >next - >next = head;
        direction = 4;
    }
    void setdirection(int a) {
        direction = a;
    }
    int getdirection() {
        return direction;
    }
    void move(int x0, int y0, bool & newfood) {
        switch (direction) {
            position * p;
            int xt;
            int yt;
        case 1:
            {
                head - >next = new position;
                xt = head - >x;
                yt = head - >y;
                head = head - >next;
                head - >x = xt;
                head - >y = yt - 30;
                p = tail - >next;
                delete tail;
                tail = p;
                break;
            }
        case 2:
            {
                head - >next = new position;
                xt = head - >x;
                yt = head - >y;
                head = head - >next;
                head - >x = xt;
                head - >y = yt + 30;
                p = tail - >next;
                delete tail;
                tail = p;
                break;
            }
        case 3:
            {
                head - >next = new position;
                xt = head - >x;
                yt = head - >y;
                head = head - >next;
                head - >x = xt - 30;
                head - >y = yt;
                p = tail - >next;
                delete tail;
                tail = p;
                break;
            }
        case 4:
            {
                head - >next = new position;
                xt = head - >x;
                yt = head - >y;
                head = head - >next;
                head - >x = xt + 30;
                head - >y = yt;
                p = tail - >next;
                delete tail;
                tail = p;
                break;
            }
        }
        if (head - >x == x0 && head - >y == y0) {
            newfood = 1;
            switch (direction) {
                int xt;
                int yt;
            case 1:
                {
                    head - >next = new position;
                    xt = head - >x;
                    yt = head - >y;
                    head = head - >next;
                    head - >x = xt;
                    head - >y = yt - 30;
                    break;
                }
            case 2:
                {
                    head - >next = new position;
                    xt = head - >x;
                    yt = head - >y;
                    head = head - >next;
                    head - >x = xt;
                    head - >y = yt + 30;
                    break;
                }
            case 3:
                {
                    head - >next = new position;
                    xt = head - >x;
                    yt = head - >y;
                    head = head - >next;
                    head - >x = xt - 30;
                    head - >y = yt;
                    break;
                }
            case 4:
                {
                    head - >next = new position;
                    xt = head - >x;
                    yt = head - >y;
                    head = head - >next;
                    head - >x = xt + 30;
                    head - >y = yt;
                    break;
                }
            }
        }
    }
    void show() {
        position * p = gettail();
        int sum = 0;
        while (p != gethead() - >next) {
            sum++;
            if (head - >x > 0 && head - >x < 900 && head - >y > 0 && head - >y < 900) {
                setfillcolor(EGERGB(255, 0, 0));
                bar(p - >x - 15, p - >y - 15, p - >x + 15, p - >y + 15);
                setfillcolor(EGERGB(0, 0, 255));
                bar(p - >x - 13, p - >y - 13, p - >x + 13, p - >y + 13);
                p = p - >next;
            } else {
                setcolor(EGERGB(255, 0, 0));
                setfontbkcolor(EGERGB(0x80, 0x00, 0x80));
                setfont(100, 0, "宋体");
                outtextxy(250, 360, "GAMEOVER");
                if (sum < 20) outtextxy(250, 460, "菜鸟水平");
                if (sum >= 20 && sum < 40) outtextxy(250, 460, "高手水平");
                setfont(70, 0, "宋体");
                if (sum >= 40 && sum < 60) outtextxy(100, 460, "你骨骼精奇,是个奇才");
                if (sum >= 60) outtextxy(200, 360, "你已经成仙了");
                Sleep(1000);
                getch();
            }
            int hx,
            hy;
            hx = head - >x;
            hy = head - >y;
            position * p2 = gettail();
            while (p2 != gethead()) {
                if (hx == p2 - >x && hy == p2 - >y) {
                    setcolor(EGERGB(255, 0, 0));
                    setfontbkcolor(EGERGB(0x80, 0x00, 0x80));
                    setfont(100, 0, "宋体");
                    outtextxy(250, 360, "GAMEOVER");
                    if (sum < 20) outtextxy(250, 460, "菜鸟水平");
                    if (sum >= 20 && sum < 40) outtextxy(250, 460, "高手水平");
                    setfont(70, 0, "宋体");
                    if (sum >= 40 && sum < 60) outtextxy(100, 460, "你骨骼精奇,是个奇才");
                    if (sum >= 60) outtextxy(200, 360, "你已经成仙了");
                    Sleep(1000);
                    getch();
                }
                p2 = p2 - >next;
            }
        }
    }
};
int main() {
    INITGRAPH(900, 900);
    setfillcolor(EGERGB(255, 0, 0));
    snake s1;
    char k;
    bool newfood = 1;
    for (;;) {
        delay_fps(8);
        int fx;
        int fy;
        if (newfood) {
            //下面的代码是食物的显示
            L: fx = Random(30) + 1;
            fy = Random(30) + 1; //贪吃蛇的食物产生位置是随机的
            fx = fx * 30 - 15;
            fy = fy * 30 - 15;
            bool bo = 1;
            position * p = s1.gettail();
            while (p != s1.gethead() - >next) {
                if (p - >x == fx && p - >y == fy) {
                    bo = 0;   //食物不能产生在蛇身体的位置;
                    break;
                }
                p = p - >next;
            }
            if (!bo) goto L;
            newfood = 0;
        }
        //手动模式:
        if (kbhit()) {
            k = getch();
            switch (k) {
            case 38:
                if (s1.getdirection() != 2) s1.setdirection(1);
                break; //根据键值修改对应的方向
            case 40:
                if (s1.getdirection() != 1) s1.setdirection(2);
                break;
            case 37:
                if (s1.getdirection() != 4) s1.setdirection(3);
                break;
            case 39:
                if (s1.getdirection() != 3) s1.setdirection(4);
                break;
            }
        }
        s1.move(fx, fy, newfood);
        cleardevice();
        s1.show();
        setfillcolor(EGERGB(0, 0, 255));
        bar(fx - 15, fy - 15, fx + 15, fy + 15);
        setfillcolor(EGERGB(0, 255, 0));
        bar(fx - 15, fy - 15, fx + 15, fy + 15);
        //Sleep(80);
    }
}

运行效果截图:

 

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值