首页 > 解决方案 > 如何用 C 语言在控制台中实现二维“地图”

问题描述

我正在学校的数据结构课上做一些项目。我想在控制台中实现一些“土地”,所以我努力尝试如下。

首先,我在 excel 中绘制了我想要执行的内容,并检查了我应该将行分配到哪些索引。

在此处输入图像描述

我将每个索引存储在二维数组中。

int NODE[5][NUM] =
{
    {0},
    {1,2,3,4,5,6,7,31,37,61,67,91,97, 121,122,123,124,125,126,127}
    {15,16,17,18,19,20,21,45,51,75,81,105,111,135,136,137,138,139,140,141},
    {301,302,303,304,305,306,307,331,337,361,367,391,397,421,422,423,424,425,426,427},
    {315,316,317,318,319,320,321,345,351,375,381,405,411,435,436,437,438,439,440,441}
};

在二维映射数组中,首先我在所有索引中分配空格字符,其次我在行的每一端分配 CR('\n') 字符,第三我使用 NODE 数组分配'#'作为土地的边缘以上。

我使用指针转换来接近二维数组作为索引。

int* ptr = (int*)map;

void map_initialize()
{
    int i, j;

    for (i = 0; i < 15; i++)
        for (j = 0; j < 30; j++)
            map[i][j] = 32;

    for (i = 1; i < 5; i++)
        for (j = 0; j < NUM; j++)
            ptr[NODE[i][j]] = '#';

    for (i = 29; i < 450; i += 30)
        ptr[i] = '\n';

}

我以为我的计划是完美的,但结果令人绝望。

在此处输入图像描述

我不知道我哪里做错了。我会很感激你的帮助。

标签: cindexing

解决方案


第一个潜在问题:

如果您将地图声明为二维数组,如下所示:

char map[15][30];

然后,当你想将它用作一维数组时,你应该这样转换它:

char* ptr = (char*)map;

因为如果您有一个字符数组并将其转换为 的数组int,则指向的每个索引都会ptr跳过地图中的四个索引

第二个潜在问题:

您的数组NODE并非所有行都具有相同的长度,这使得它几乎无法管理,除非您为每一行使用“终止字符”。

如果我尝试写一些东西来解决上述两个问题,我会得到:

#include "stdio.h"


int Node0[]={0, -1};
int Node1[]={1,2,3,4,5,6,7,31,37,61,67,91,97, 121,122,123,124,125,126,127, -1};
int Node2[]={15,16,17,18,19,20,21,45,51,75,81,105,111,135,136,137,138,139,140,141, -1};
int Node3[]={301,302,303,304,305,306,307,331,337,361,367,391,397,421,422,423,424,425,426,427, -1};
int Node4[]={315,316,317,318,319,320,321,345,351,375,381,405,411,435,436,437,438,439,440,441, -1};

int *NODE[5]=
{
    Node0,
    Node1,
    Node2,
    Node3,
    Node4
};

char perNode[5]= { ' ', '#', '#', '@', '@'};

char map[15][30];
char* ptr = (char*)map;

void map_initialize()
{
    int i, j;

    for (i = 0; i < 15; i++)
        for (j = 0; j < 30; j++)
            map[i][j] = ' ';

    for (i = 1; i < 5; i++)
        for (j = 0; NODE[i][j] != -1 ; j++)
            ptr[NODE[i][j]] = perNode[i] ;

    for (i = 0; i < 15; ++i)
        map[i][29] = '\n';
}

int main(int ac, char *av[])
{
    int i ;
    map_initialize();
    for (i = 0 ; i < 15 ; i++)
        printf("%.30s", map[i]);
}

该程序生成以下输出:

 #######       #######       
 #     #       #     #       
 #     #       #     #       
 #     #       #     #       
 #######       #######       
                             
                             
                             
                             
                             
 @@@@@@@       @@@@@@@       
 @     @       @     @       
 @     @       @     @       
 @     @       @     @       
 @@@@@@@       @@@@@@@       

推荐阅读