(C语言贪吃蛇)3.地图规划

对于本节内容分为两个部分进行讲解

1.地图规划

大小20X20

地图竖直方向上的边界“|”

地图水平方向的边界“--‘

贪吃蛇的身体”[ ]“

贪吃蛇的食物”##“

效果如下图所示

立刻构建出地图有些困难,我们先试着打印20X20的方块出来,代码在这:

#include <curses.h>

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

void gamePic()
{
    int hang;
    int lie;

    for(hang = 0;hang < 20;hang ++)
    {
        for(lie = 0;lie < 20;lie ++)
        {
            printw("##");
        }
        printw("\n");
    }
}

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

其中getch()函数作用是防止程序退出。

在终端运行该程序

那么我们慢慢来,先尝试写出地图的顶部

#include <curses.h>

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");
        for(lie = 0;lie < 20;lie ++)
        {
            if(lie == 0 || lie == 19) printw("|");
            else printw("  ");
        }

    }
}

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

运行效果是这样的

地图右边还是偏了一点,没关系我们稍做修改。

#include <curses.h>

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");
        for(lie = 0;lie <= 20;lie ++)
        {
            if(lie == 0 || lie == 20) printw("|");
            else printw("  ");
        }

    }
}

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

此时的效果已经非常棒了:

2.代码实现

继续修改:

#include <curses.h>

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");
            for(lie = 0;lie <= 20;lie ++)
            {
                if(lie == 0 || lie == 20) printw("|");
                else printw("  ");
            }
            printw("\n");
        }
        if(hang > 0 && hang <= 18)
        {
            for(lie = 0;lie <= 20;lie ++)
            {
                if(lie == 0 || lie == 20) 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语言贪吃蛇拾金币的实现,其中包含了蛇的移动、金币的生成和吃掉金币等功能。 ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> #include <windows.h> #define ROW 20 #define COL 30 #define SNAKE_LEN 5 int map[ROW][COL] = {0}; // 地图 int snake[SNAKE_LEN][2] = {0}; // 蛇 int food[2] = {0}; // 食物 int score = 0; // 得分 void init_map() // 初始化地图 { int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (i == 0 || i == ROW - 1 || j == 0 || j == COL - 1) { map[i][j] = -1; // 边界 } else { map[i][j] = 0; // 空地 } } } } void init_snake() // 初始化蛇 { int i; for (i = 0; i < SNAKE_LEN; i++) { snake[i][0] = 1; snake[i][1] = i + 1; map[1][i + 1] = 1; // 蛇的初始位置 } } void init_food() // 初始化食物 { srand((unsigned)time(NULL)); int x, y; do { x = rand() % (ROW - 2) + 1; y = rand() % (COL - 2) + 1; } while (map[x][y] != 0); food[0] = x; food[1] = y; map[x][y] = 2; // 食物的位置 } void show() // 显示地图 { system("cls"); // 清屏 int i, j; for (i = 0; i < ROW; i++) { for (j = 0; j < COL; j++) { if (map[i][j] == -1) { printf("#"); // 边界 } else if (map[i][j] == 0) { printf(" "); // 空地 } else if (map[i][j] == 1) { printf("*"); // 蛇 } else if (map[i][j] == 2) { printf("$"); // 食物 } } printf("\n"); } printf("Score: %d\n", score); // 显示得分 } void move() // 移动蛇 { int i; int tail[2] = {snake[SNAKE_LEN - 1][0], snake[SNAKE_LEN - 1][1]}; for (i = SNAKE_LEN - 1; i > 0; i--) { snake[i][0] = snake[i - 1][0]; snake[i][1] = snake[i - 1][1]; } if (snake[0][0] == food[0] && snake[0][1] == food[1]) { // 吃到食物 SNAKE_LEN++; score++; init_food(); } snake[0][0] += tail[0] - snake[0][0]; snake[0][1] += tail[1] - snake[0][1]; if (map[snake[0][0]][snake[0][1]] == -1 || map[snake[0][0]][snake[0][1]] == 1) { // 撞墙或撞到自己 printf("Game Over!\n"); exit(0); } map[tail[0]][tail[1]] = 0; map[snake[0][0]][snake[0][1]] = 1; } int main() { init_map(); init_snake(); init_food(); while (1) { show(); move(); Sleep(200); // 控制蛇的速度 if (_kbhit()) { // 按键控制蛇的方向 char c = _getch(); if (c == 'w' && map[snake[0][0] - 1][snake[0][1]] != -1) { snake[0][0]--; } else if (c == 's' && map[snake[0][0] + 1][snake[0][1]] != -1) { snake[0][0]++; } else if (c == 'a' && map[snake[0][0]][snake[0][1] - 1] != -1) { snake[0][1]--; } else if (c == 'd' && map[snake[0][0]][snake[0][1] + 1] != -1) { snake[0][1]++; } } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值