我是初学者。如何在此代码中更新地图。我如何更新球员位置?我想通过增加[x] [y]值之一来使他移动,但是我该怎么做?下面的代码是一个好的开始吗?
#include <windows.h>
int map[5][5]={
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}};
int m_print(int x) {
int i, j;
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", map[i][j]);
}
printf("\n");
}
}
struct player {
int pos[i][j];
int show;
int movement;
};
int map_update(int x) {
}
int p_show(int x) {
}
main() {
int game_running = true;
}
答案 0 :(得分:2)
首先,我绝对不了解您要实现的目标。但是我看到您是C的入门者,我想到了一个非常简单的示例,该示例希望与您尝试做的事情相似。
关于我必须通过您的代码修复的内容的一些说明:
int pos[i][j];
毫无意义,如果您需要数组作为结构参数,请在其中设置一个指针,并确保将其分配到代码中的某个位置以适合您的需要。我将其替换为一些int参数,以跟踪旧玩家和当前玩家的位置bool
宏(实际上被作为int处理)做了一些typedef展示如何使用typedefs 我编写的代码做了一些非常基本的事情。首先,我使用我们定义的结构分配一个玩家。然后,我将他的位置设置为0,0
,还将map[0][0]=1
设置为指示玩家在那里。
我用一个非常简单的输入方法设置了while循环,该方法从控制台中扫描了输入字符。可接受的字符为w,a,s,d
。它们被传递到move_player
方法,该方法根据输入更新播放器结构的位置。然后map_update
方法将玩家结构作为参数,并相应地更新地图以显示玩家的新位置。请注意,这两种方法都将struct指针作为参数。使用指针,我们只传递引用(结构的内存地址),而不传递实际值(结构的所有数据的副本)。否则,我们将无法轻松更新播放器数据。
最后,我打印出玩家的位置和地图,只是向用户显示他所在的位置。
Round 32
Move Player [w,a,s,d]: a
Player Position [4,2]
Game Map
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
现在,我知道您可能不知所措,但是我发现对于像您这样的新C程序员来说这是一个很好的开始,因此我决定提供帮助(PS:编译此答案所花的时间比编写/更新码)。我可能无法尽可能高效地完成所有工作,但是对于这样的情况,我认为它有足够的东西让您保持一段时间。玩得开心!
这是代码
//#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
typedef int bool;
#define TRUE 1
#define FALSE 0
int map[5][5]={
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0},
{0, 0, 0, 0, 0}};
int m_print() {
int i, j;
printf("Game Map\n");
for (i = 0; i < 5; i++) {
for (j = 0; j < 5; j++) {
printf("%d ", map[i][j]);
}
printf("\n");
}
}
struct player {
int old_pos_x;
int old_pos_y;
int pos_x;
int pos_y;
int show;
int movement;
};
void map_update(struct player *p) {
map[p->old_pos_x][p->old_pos_y] -= 1;
map[p->pos_x][p->pos_y] += 1;
}
void move_player(struct player *p, char move){
//Save current player state
p->old_pos_x = p->pos_x;
p->old_pos_y = p->pos_y;
switch(move) {
case 'w':
p->pos_x -= 1;
break;
case 's':
p->pos_x += 1;
break;
case 'd':
p->pos_y += 1;
break;
case 'a':
p->pos_y -= 1;
break;
}
//Fit position to map
//Rotate right
p->pos_x %= 5;
p->pos_y %= 5;
if (p->pos_x < 0)
p->pos_x = 4;
if (p->pos_y < 0)
p->pos_y = 4;
}
void p_show(struct player *p) {
//Report Player position
printf("Player Position [%d,%d]\n", p->pos_x, p->pos_y);
}
int main() {
bool game_running = TRUE;
//Initialize Game
struct player p;
//Set player properties
p.pos_x = 0;
p.pos_y = 0;
//Manually add player to map
map[0][0] = 1;
int counter = 0;
char button;
while (TRUE) {
printf("Round %d\n", counter);
//Get input
printf("Move Player [w,a,s,d]: ");
scanf(" %c", &button);
//Update player position
move_player(&p, button);
//Update map
map_update(&p);
//Report Player
p_show(&p);
//Show map
m_print();
counter++;
}
return 0;
}