Простая игра на C с использованием проблемы getch - segfault? - PullRequest
2 голосов
/ 05 ноября 2010

В следующем коде есть проблемы с ошибками сегмента (он также размещен в pastebin ):

#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include "mygetch.h"

#define MAX_SIZE 255
#define SCR_CLEAR "\033[2J\033[;H"

void getgrid(int, int);
void resetgrid(void);
void getkey(void);


static bool grid[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 main() {

    while(1) {
        getkey();
    }


    return 0;
}

void getgrid(int xpos, int ypos) {
    int x = 0;
    int y = 0;

    grid[xpos][ypos] = 1;

    for(x = 0; x <= 4; x++) {
        for(y = 0; y <= 4; y++) {
            printf("%i ", grid[x][y]);
        }
        printf("\n");
    }
}


void resetgrid() {
    int x = 0;
    int y = 0;

    for(x = 0; x <= 4; x++) {
        for(y = 0; y <= 4; y++) {
            grid[x][y] = 0;
        }
    }
}

void getkey() {
    static int xpos = 0;
    static int ypos = 0;
    int c = mygetch();

    //0x41 = up.. apparently on my linux console?
    //0x42 = down
    //0x44 = left
    //0x43 = right

    if(c == 0x41 && ypos != 0) {
        ypos--;
    } else if(c == 0x42 && ypos != 4) {
        ypos++;
    } else if(c == 0x44 && xpos != 4) {
        xpos--;
    } else if(c == 0x43 && xpos != 0) {
        xpos++;
    }

    resetgrid();
    printf(SCR_CLEAR);
    getgrid(xpos, ypos);
}

Можно предположить, что mygetch() возвращает целочисленную кодовую точку ASCII, на моей консоли linux вверх слева и справа находятся A / B / C / D, поэтому я отобразил их так.

Моя проблема по какой-то причине, хотя я правильно определил многомерный массив, когда я нажимаю вверх / вниз / влево / вправо влево и вправо, не работают, они уходят с экрана и вызывают ошибку, теперь я знаю ключи отображаются правильно, поэтому я не знаю, почему y-- y++ и т. д. не будут работать правильно, если я не допустил ошибку при определении массива или где-то еще.

Я определенно многому научусь, исправляя это и делая больше, но я просто хочу развлечься.

1 Ответ

3 голосов
/ 05 ноября 2010

Ваши граничные условия инвертированы для слева и справа . Вы должны иметь:

if (c == 0x41 && ypos != 0) {
    ypos--;
} else if(c == 0x42 && ypos != 4) {
    ypos++;
} else if(c == 0x44 && xpos != 0) {
    xpos--;
} else if(c == 0x43 && xpos != 4) {
    xpos++;
}

Вместо:

if (c == 0x41 && ypos != 0) {
    ypos--;
} else if(c == 0x42 && ypos != 4) {
    ypos++;
} else if(c == 0x44 && xpos != 4) {
    xpos--;
} else if(c == 0x43 && xpos != 0) {
    xpos++;
}
...