c - 如何用 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';
}
我以为我的计划是完美的,但结果令人绝望。
我不知道我哪里做错了。我会很感激你的帮助。
解决方案
第一个潜在问题:
如果您将地图声明为二维数组,如下所示:
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]);
}
该程序生成以下输出:
####### #######
# # # #
# # # #
# # # #
####### #######
@@@@@@@ @@@@@@@
@ @ @ @
@ @ @ @
@ @ @ @
@@@@@@@ @@@@@@@
推荐阅读
- python - 如何在 python 应用程序之外使用 Alembic?
- python - 在 vscode 构建任务 OSX Catalina 中从 conda 获取构建依赖项的问题
- node.js - 如何使用带有 JWT 的节点、ws 和护照验证 Web 套接字?
- javascript - 通过 onClick 事件打开特定组件 - REACT.JS
- android - 尝试从片段中的图像库中选择图像 - Android
- angular - Angular:无法在“FileReader”上执行“readAsDataURL”:参数 1 不是“Blob”类型
- sql - SQL:获取每个类别、每天、每个国家的最高记录?
- angular - How to simplify NgRx effects? Only difference the service method they call-
- php - 带循环的 PHP 动态数组名称
- javascript - 如何修改我的 js 以使其正常工作?