2D角色移动,地图更新,位置更新

时间:2019-05-28 18:29:07

标签: c game-physics

我是初学者。如何在此代码中更新地图。我如何更新球员位置?我想通过增加[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;
}

1 个答案:

答案 0 :(得分:2)

首先,我绝对不了解您要实现的目标。但是我看到您是C的入门者,我想到了一个非常简单的示例,该示例希望与您尝试做的事情相似。

关于我必须通过您的代码修复的内容的一些说明:

    播放器结构中的
  1. int pos[i][j];毫无意义,如果您需要数组作为结构参数,请在其中设置一个指针,并确保将其分配到代码中的某个位置以适合您的需要。我将其替换为一些int参数,以跟踪旧玩家和当前玩家的位置
  2. 主要功能需要运行一些东西
  3. 默认情况下,C中没有true / false值。不确定您的编译器和编译标志,但是从linux上,我为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;
}