首页 > 其他 > 详细

贪吃蛇

时间:2019-04-18 00:38:02      阅读:124      评论:0      收藏:0      [点我收藏+]

如何编一个贪吃蛇

改变光标的位置:

void gotoxy(int x, int y) {
    COORD pos;
    pos.X = 2 * y; pos.Y = x;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

用于制造比较大的,清屏后输出比较慢的地图(此处因为我地图的每个格子是占两个字符的,故使用2*y)

隐藏光标(好像没什么用):

HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态

初始化:

初始化时要设定长度,位置,地图以及提示信息,例如:

color(136);
for (int i = 0; i <= N + 1; i++) printf("$ ");
color(15);
puts("");
for (int i = 1; i <= N; i++) {
    color(136);
    printf("$ ");
    color(15);
    for (int j = 1; j <= N; j++) printf(". ");
    color(136);
    printf("$ ");
    color(15);
    puts("");
}
color(136);
for (int i = 0; i <= N + 1; i++) printf("$ ");
color(15);
puts("");
gotoxy(0, N + 2);
color(15);
printf("use 'w','a','s','d' to move.");
color(15);
gotoxy(2, N + 2);
color(15);
printf("other key to pause.");
color(15);
gotoxy(4, N + 2);
color(15);
printf("point:  0");
color(15);

(这烦人的缩进)
‘$ ’是围栏,‘. ’是空地
此处使用pair<int,int>来表示坐标,first表示x坐标,second表示y坐标(下称pair)

苹果

首先,建立一个pair来保存苹果的坐标,否则就不好判断吃到没有了。
然后要防止把苹果放在蛇上。
用‘O ’来表示苹果。

while (1) {
    apple.first = rand() % N + 1;
    apple.second = rand() % N + 1;
    bool flag = false;
    for (int i = 0; i < len; i++) {
        if (apple.first == snake[i].first && apple.second == snake[i].second) {
            flag = true;
            break;
        }
    }
    if (!flag) break;
}
gotoxy(apple.first, apple.second);
color(14);
printf("O ");
color(15);

死亡

这个应该大家能看懂

bool gameover() {
    if (snake[0].first == 0 || snake[0].first == N + 1 || snake[0].second == 0 || snake[0].second == N + 1) {
        return true;
    }
    for (int i = 1; i < len; i++) {
        if (snake[0].first == snake[i].first && snake[0].second == snake[i].second) {
            return true;
        }
    }
    return false;
}

先检测蛇头有没有碰到,如果碰到了就增加长度。

void eat() {
    if (snake[0].first == apple.first && snake[0].second == apple.second) {
        len++;
        snake[len - 1].first = snake[len - 2].first;
        snake[len - 1].second = snake[len - 2].second;
        create();
        gotoxy(4, N + 6);
        color(15);
        printf("%d", len - 1);
        color(15);
    }
}

移动

void move(int dx, int dy) {
    gotoxy(snake[len - 1].first, snake[len - 1].second);
    color(15);
    printf(". ");
    color(15);
    gotoxy(snake[0].first + dx, snake[0].second + dy);
    color(14);
    printf("# ");
    color(15);
    for (int i = len - 1; i > 0; i--) {
        snake[i].first = snake[i - 1].first;
        snake[i].second = snake[i - 1].second;
    }
    snake[0].first += dx;
    snake[0].second += dy;
}

移到蛇尾,用空地覆盖它,然后到蛇头,打一个蛇头,其他的向前移。

键盘检测

char getkey() {
    char res = ch;
    if (kbhit()) {
        gotoxy(N + 1, 0);
        res = getche();
    }
    return res;
}

这个要用conio.h头文件,kbhit()是检测键盘按下的。

主程序

int main() {
    srand(time(NULL));
    N = 30;
    init();
    len = 1;
    snake[0].first = rand() % N + 1;
    snake[0].second = rand() % N + 1;
    while (gameover()) {
        snake[0].first = rand() % N + 1;
        snake[0].second = rand() % N + 1;
    }
    gotoxy(snake[0].first, snake[0].second);
    color(14);
    printf("# ");
    color(15);
    for (int i = 1; i < N; i++) {
        snake[i].first = snake[0].first;
        snake[i].second = snake[0].second;
        gotoxy(snake[i].first, snake[i].second);
        color(14);
        printf("# ");
        color(15);
    }
    create();
    while (!gameover()) {
        eat();
        ch = getkey();
        switch (ch) {
        case 'w': move(-1, 0); break;
        case 'a': move(0, -1); break;
        case 's': move(1, 0); break;
        case 'd': move(0, 1); break;
        }
        Sleep(200);
    }
    return 0;
}

整体代码:

#include<bits/stdc++.h>
#include<conio.h>
#include<windows.h>
using namespace std;
#define MAX_N 1000
#define MAX_LEN 1000
void gotoxy(int x, int y) {
    COORD pos;
    pos.X = 2 * y; pos.Y = x;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void color(int a) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), a);
}

pair<int, int> snake[MAX_LEN], apple;
int len, N;
char ch = 'p';

void init() {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO CursorInfo;
    GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
    CursorInfo.bVisible = false; //隐藏控制台光标
    SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
    color(136);
    for (int i = 0; i <= N + 1; i++) printf("$ ");
    color(15);
    puts("");
    for (int i = 1; i <= N; i++) {
        color(136);
        printf("$ ");
        color(15);
        for (int j = 1; j <= N; j++) printf(". ");
        color(136);
        printf("$ ");
        color(15);
        puts("");
    }
    color(136);
    for (int i = 0; i <= N + 1; i++) printf("$ ");
    color(15);
    puts("");
    gotoxy(0, N + 2);
    color(15);
    printf("use 'w','a','s','d' to move.");
    color(15);
    gotoxy(2, N + 2);
    color(15);
    printf("other key to pause.");
    color(15);
    gotoxy(4, N + 2);
    color(15);
    printf("point:  0");
    color(15);
}

void create() {
    while (1) {
        apple.first = rand() % N + 1;
        apple.second = rand() % N + 1;
        bool flag = false;
        for (int i = 0; i < len; i++) {
            if (apple.first == snake[i].first && apple.second == snake[i].second) {
                flag = true;
                break;
            }
        }
        if (!flag) break;
    }
    gotoxy(apple.first, apple.second);
    color(14);
    printf("O ");
    color(15);
}

bool gameover() {
    if (snake[0].first == 0 || snake[0].first == N + 1 || snake[0].second == 0 || snake[0].second == N + 1) {
        return true;
    }
    for (int i = 1; i < len; i++) {
        if (snake[0].first == snake[i].first && snake[0].second == snake[i].second) {
            return true;
        }
    }
    return false;
}

void eat() {
    if (snake[0].first == apple.first && snake[0].second == apple.second) {
        len++;
        snake[len - 1].first = snake[len - 2].first;
        snake[len - 1].second = snake[len - 2].second;
        create();
        gotoxy(4, N + 6);
        color(15);
        printf("%d", len - 1);
        color(15);
    }
}

void move(int dx, int dy) {
    gotoxy(snake[len - 1].first, snake[len - 1].second);
    color(15);
    printf(". ");
    color(15);
    gotoxy(snake[0].first + dx, snake[0].second + dy);
    color(14);
    printf("# ");
    color(15);
    for (int i = len - 1; i > 0; i--) {
        snake[i].first = snake[i - 1].first;
        snake[i].second = snake[i - 1].second;
    }
    snake[0].first += dx;
    snake[0].second += dy;
}

char getkey() {
    char res = ch;
    if (kbhit()) {
        gotoxy(N + 1, 0);
        res = getche();
    }
    return res;
}



int main() {
    srand(time(NULL));
    N = 30;
    init();
    len = 1;
    snake[0].first = rand() % N + 1;
    snake[0].second = rand() % N + 1;
    while (gameover()) {
        snake[0].first = rand() % N + 1;
        snake[0].second = rand() % N + 1;
    }
    gotoxy(snake[0].first, snake[0].second);
    color(14);
    printf("# ");
    color(15);
    for (int i = 1; i < N; i++) {
        snake[i].first = snake[0].first;
        snake[i].second = snake[0].second;
        gotoxy(snake[i].first, snake[i].second);
        color(14);
        printf("# ");
        color(15);
    }
    create();
    while (!gameover()) {
        eat();
        ch = getkey();
        switch (ch) {
        case 'w': move(-1, 0); break;
        case 'a': move(0, -1); break;
        case 's': move(1, 0); break;
        case 'd': move(0, 1); break;
        }
        Sleep(200);
    }
    return 0;
}

如有错误请在下方评论区留言。

贪吃蛇

原文:https://www.cnblogs.com/liuchenyun/p/tan-chi-she.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!