贪吃蛇代码

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <time.h>  //使用当前时间做种子
#include <conio.h>
using namespace std;
enum dir {Up, Down, Left, Right}; //枚举类型enum dir
//围墙
class Fence {
public:
    void InitFence();
    void OutputF();
public:
    char game[20][20];
} f; //定义对象
//画框框
void Fence :: InitFence() {
    for(int i = 0; i < 20; i++)
        for(int j = 0; j < 20; j++) {
            if(i == 0 || i == 19 || j == 0 || j == 19)
                game[i][j] = '#';
            else game[i][j] = ' ';
        }
}

//显示框框
void Fence :: OutputF() {
    for(int i = 0; i < 20; i++) {
        for(int j = 0; j < 20; j++)
            cout << game[i][j] << ' ';

        cout << endl;
    }
}

//蛇结点
class SnakeNode {
private:
    int x, y;
    SnakeNode *prior, *next;
public:
    void add_head(int x, int y);
    int get_x();
    int get_y();
    void delete_tail();
}*head = NULL, *tail = NULL;
//插入头结点
void SnakeNode :: add_head(int x, int y) {
    SnakeNode *q = new SnakeNode;
    q -> x = x;
    q -> y = y;
    q -> next = head;
    q -> prior = NULL;

    if(head) head -> prior = q;

    head = q;

    if(!tail) tail = head;

    f.game[x][y] = '*'; //f对象可以在定义Fence类时定义; 且Fence类在SnakeNode类前定义
}
int SnakeNode :: get_x() {
    return x;
}
int SnakeNode :: get_y() {
    return y;
}
//删除尾结点
void SnakeNode :: delete_tail() {
    SnakeNode *p = tail;
    f.game[tail -> get_x()][tail -> get_y()] = ' '; //把尾结点的坐标表示的'*'置为空格

    if(tail == head)
        tail = head = NULL;
    else {
        tail = tail -> prior;
        tail -> next = NULL;
    }

    delete p;
}

//move移动;
class move {
public:
    dir point;    //枚举变量point: 控制方向
    int food_x;
    int food_y;
public:
    void moving();
    void change_point(char);  //改变方向
    void get_food();
};

void move :: moving() {
    int a, b;
    a = head -> get_x(); //取得头结点横坐标
    b = head -> get_y(); //头结点纵坐标

    switch(point) {
    case Up:
        --a;
        break;

    case Down:
        ++a;
        break;

    case Left:
        --b;
        break;

    case Right:
        ++b;
        break;
    }

    if(a == 19 || b == 19 || a == 0 || b == 0) {                //判断是否撞墙
        cout << "Game Over!!!" << endl;
        exit(0);
    }

    if(a == food_x && b == food_y) {                    //吃food
        head -> add_head(a, b);
        get_food();
    } else {
        head -> add_head(a, b); //插入头结点
        head -> delete_tail(); //删除尾结点
    }
}

void move :: change_point(char keydown) {
    switch (keydown) {
    case 'w':
        point = Up;
        break;

    case 's':
        point = Down;
        break;

    case 'a':
        point = Left;
        break;

    case 'd':
        point = Right;
        break;
    }
}

void move :: get_food() {
    srand((unsigned int) time(NULL));
    food_x = rand() % 18 + 1;
    food_y = rand() % 18 + 1;
    f.game[f
int main(void) {
    cout << "使用 W, S, A, D 键控制方向,按任意键开始\n\n\n";
    //画框框和小蛇;
    move m;
    f.InitFence();
    head -> add_head(4, 3);
    head -> add_head(4, 4);
    head -> add_head(4, 5);
    m.get_food();
    f.OutputF();

    while (true) {
        char keydown = getch();
        m.change_point(keydown);

        while (! kbhit()) { //判断有没有按键落下
            system("cls");  //清屏函数
            m.moving();
            f.OutputF();
            Sleep(200);
        }
    }

    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值