(C语言贪吃蛇)4.显示贪吃蛇身子的一个节点

我们之前的操作成功显示出了地图,但并不包括贪吃蛇的身子和食物。

我们为贪吃蛇设置结构体:

贪吃蛇身子节点

1.行坐标

2.列坐标

3.下一个节点的位置(地址/指针)

当然,我们使用链表构建贪吃蛇的身体。

struct Snake
{
    int hang;
    int lie;
    struct Snake * next;
}
贪吃蛇身子显示

如何设置蛇身子的一个节点:

设该节点:行坐标2,列坐标2

if(hang == x.hang && lie == x.lie)
{
    printw("[]");
}

即扫描时如果行节点与贪吃蛇的行节点相同并且列节点与贪吃蛇的列节点相同,那么就打印贪吃蛇的身体。

#include <curses.h>

struct Snake
{
    int hang;
    int lie;
    struct Snake * next;
};

struct Snake node1 = {2,2,NULL};

void initNcurse()
{
    initscr();
    keypad(stdscr,1);
}

void gamePic()
{
    int hang;
    int lie;

    for(hang = 0;hang < 20;hang ++)
    {

        if(hang == 0)
        {
            for(lie = 0;lie < 20;lie ++)
               {
                   printw("--");
               }
            printw("\n");
        }
        if(hang >= 0 && hang <= 19)
        {
            for(lie = 0;lie <= 20;lie ++)
            {
                if(lie == 0 || lie == 20) printw("|");
                else if(node1.hang == hang && node1.lie == lie) printw("[]");
                else printw("  ");
            }
            printw("\n");
        }
        if(hang == 19)
        {
            for(lie = 0;lie < 20;lie ++)
               {
                   printw("--");
               }
               printw("\n");
               printw("by beiweiqiuAC");
        }
    }

}

int main()
{
    initNcurse();
    gamePic();
    getch();//防止程序退出
    endwin();
    return 0;
}

在终端上运行该程序可以发现地图上已经成功显示了贪吃蛇的一个身体节点

以下是一个简单的C语言贪吃蛇游戏程序,使用了windows.h库和conio.h库: ``` #include <stdio.h> #include <windows.h> #include <conio.h> #define MAP_WIDTH 40 #define MAP_HEIGHT 20 int map[MAP_HEIGHT][MAP_WIDTH] = { 0 }; int snake[100][2] = { 0 }; int length = 3; int direction = 3; int score = 0; void gotoxy(int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos); } void initMap() { int i, j; for (i = 0; i < MAP_HEIGHT; i++) { for (j = 0; j < MAP_WIDTH; j++) { if (i == 0 || i == MAP_HEIGHT - 1 || j == 0 || j == MAP_WIDTH - 1) { map[i][j] = 1; } } } } void showMap() { int i, j; for (i = 0; i < MAP_HEIGHT; i++) { for (j = 0; j < MAP_WIDTH; j++) { gotoxy(j, i); if (map[i][j] == 0) { printf(" "); } else if (map[i][j] == 1) { printf("#"); } else if (map[i][j] == 2) { printf("@"); } else if (map[i][j] == 3) { printf("*"); } } } } void initSnake() { int i; for (i = 0; i < length; i++) { snake[i][0] = MAP_WIDTH / 2 + i; snake[i][1] = MAP_HEIGHT / 2; map[snake[i][1]][snake[i][0]] = 3; } } void showSnake() { int i; for (i = 0; i < length; i++) { gotoxy(snake[i][0], snake[i][1]); printf("*"); } } void createFood() { int x, y; do { x = rand() % (MAP_WIDTH - 2) + 1; y = rand() % (MAP_HEIGHT - 2) + 1; } while (map[y][x] != 0); map[y][x] = 2; } void updateSnake() { int i, tail_x, tail_y; tail_x = snake[length - 1][0]; tail_y = snake[length - 1][1]; for (i = length - 1; i > 0; i--) { snake[i][0] = snake[i - 1][0]; snake[i][1] = snake[i - 1][1]; } if (direction == 0) { snake[0][1]--; } else if (direction == 1) { snake[0][0]++; } else if (direction == 2) { snake[0][1]++; } else if (direction == 3) { snake[0][0]--; } if (map[snake[0][1]][snake[0][0]] == 1 || map[snake[0][1]][snake[0][0]] == 3) { gotoxy(MAP_WIDTH / 2 - 4, MAP_HEIGHT / 2); printf("Game Over!"); getch(); exit(0); } if (map[snake[0][1]][snake[0][0]] == 2) { length++; score += 10; createFood(); } map[tail_y][tail_x] = 0; map[snake[0][1]][snake[0][0]] = 3; } void showScore() { gotoxy(MAP_WIDTH + 5, 5); printf("Score: %d", score); } int main() { initMap(); initSnake(); createFood(); while (1) { showMap(); showSnake(); showScore(); Sleep(100); updateSnake(); if (_kbhit()) { int ch = _getch(); if (ch == 'w' && direction != 2) { direction = 0; } else if (ch == 'd' && direction != 3) { direction = 1; } else if (ch == 's' && direction != 0) { direction = 2; } else if (ch == 'a' && direction != 1) { direction = 3; } } } return 0; } ``` 该程序使用二维数组表示地图,使用二维数组表示蛇,通过调用控制台API函数来实现显示,并使用conio.h库来实现键盘输入。程序运行后,使用wasd来控制蛇的移动,吃到食物后蛇的长度会增加,分数也会增加。当蛇撞到墙或自己时,游戏结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值