Прежде всего, я понятия не имею о том, чего вы пытаетесь достичь.Однако я увидел, что вы новичок в C, и я подумал о том, чтобы собрать очень быстрый пример чего-то похожего на то, что вы пытаетесь сделать.
Некоторые заметки о том, что я должен был исправить из вашего кода:
int pos[i][j];
в структуре проигрывателя не имеет смысла, если вам нужен массив в качестве параметра структуры, установите там указатель и убедитесь, что он размещен где-то в вашем коде в соответствии с вашими потребностями.Я заменил его на некоторые параметры int для отслеживания старой и текущей позиции игрока - Основная функция должна что-то запустить
- По умолчанию в 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;
}