2D перемещение персонажа, обновление карты, обновление позиции - PullRequest
0 голосов
/ 28 мая 2019

Я начинающий программист.Как мне сделать обновление карты в этом коде.Как мне обновить положение игроков?Я хотел заставить его двигаться, увеличивая одно из значений [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 Ответ

2 голосов
/ 28 мая 2019

Прежде всего, я понятия не имею о том, чего вы пытаетесь достичь.Однако я увидел, что вы новичок в C, и я подумал о том, чтобы собрать очень быстрый пример чего-то похожего на то, что вы пытаетесь сделать.

Некоторые заметки о том, что я должен был исправить из вашего кода:

  1. int pos[i][j]; в структуре проигрывателя не имеет смысла, если вам нужен массив в качестве параметра структуры, установите там указатель и убедитесь, что он размещен где-то в вашем коде в соответствии с вашими потребностями.Я заменил его на некоторые параметры int для отслеживания старой и текущей позиции игрока
  2. Основная функция должна что-то запустить
  3. По умолчанию в C. нет значений true / false. Не уверенпро ваш компилятор и флаги компиляции, но из linux я сделал несколько typedefs для макроса bool (который на самом деле обрабатывается как int), просто чтобы показать вам, как можно использовать typedefs

код, которыйЯ сделал очень простые вещи.Сначала я выделяю игрока, используя структуру, которую мы определили.Затем я установил его положение на 0,0, а также установил map[0][0]=1, чтобы указать, что там есть игрок.

Я настроил цикл while с очень простым методом ввода, который сканирует для ввода символов с консоли.Допустимые символы: w,a,s,d.Они передаются методу move_player, который на основе входных данных обновляет позицию структуры игрока.Затем метод map_update получает структуру игрока в качестве аргумента и обновляет карту соответственно, чтобы показать новую позицию игрока.Обратите внимание, что оба метода принимают указатели структуры в качестве аргументов.Используя указатели, мы просто передаем ссылку (адрес памяти структуры), а не фактическое значение (копию всех данных структуры).В противном случае мы не сможем так легко обновить данные игрока.

Наконец, я распечатываю положение игрока и карту, чтобы показать пользователю, где он находится.

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 

Теперь я знаю, что вы, вероятно, перегружены информацией, но я нашел, что это очень хорошее начало для начинающего программиста на Си, как вы, поэтому я решил помочь (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...