1

C でローグライク ゲームを作成していますが、キャラクターを思うように動かすことができません。ポイント (x, y) に文字を含む 2D char 配列を作成し、配列を描画し、x と y の値を変更し、進む方向の入力時に配列を再描画しました (Zork に似ていますが、グラフィック)。しかし、これは私が計画したようにうまくいきません。コードは私ができる以上のことを説明します:

/* game.h (header file for globals) */

#define GAME_H

char character = '@';
//char monster = '&';

int x = 2;
int y = 2;

/* my beginning floor
(will not be implemented, just for testing movement) */
char floor[10][6] = { /* 219 = filled block, 32 = space */
        219, 219, 219, 219, 219, 219, 219, 219, 219, '\n',
        219,  32,  32,  32,  32,  32,  32,  32, 219, '\n',
        219,  32,  32,  32,  32,  32,  32,  32, 219, '\n',
        219,  32,  32,  32,  32,  32,  32,  32, 219, '\n',
        219, 219, 219, 219, 219, 219, 219, 219, 219, '\n'};



/* game.c (main file) */
#include <stdio.h>
#include "game.h"

int main(void){
        system("cls");
        floor[x][y] = character;
        printf("%s", floor);
        char move;

        redo:

        printf("\nTravel which way?\n");
        printf("a = left\ns = down\nd = up\nf = right\n\n>");
        scanf("%s", &move);

        /*
        array oftentimes gets desroyed because the newlines are
        being overwritten by the assignments.
        the if statements should have prevented this.
        why didn't they?
        */

        if (move == 'a'){ /* LEFT */
                if (x < 1){
                        x = 1;}
                x--;
                floor[x][y] = character;
                floor[x+1][y] = ' ';
                system("cls");
                printf("%s", floor);
                goto redo;

        } else if (move == 's'){ /* DOWN (works, but goes right. Sometimes clones itself) */
                if (y > 3){
                        y = 3;} /*bounds may be wrong*/
                y++;
                floor[x][y] = character;
                floor[x][y-1] = ' ';
                system("cls");
                printf("%s", floor);
                goto redo;

        } else if (move == 'd'){ /* UP */
                if (y < 1){
                        y = 1;}
                y--;
                floor[x][y] = character;
                floor[x][y+1] = ' ';
                system("cls");
                printf("%s", floor);
                goto redo;

        } else if (move == 'f'){ /* RIGHT */
                if (x > 7){
                        x = 7;}
                x++;
                floor[x][y] = character;
                floor[x-1][y] = ' ';
                system("cls");
                printf("%s", floor);
                goto redo;}
        else {
                goto done;
        }

        done:
        return 0;
}

誰が私が間違っているのか教えてもらえますか?

注:このマップのセットアップは単なるドラフトです。メカニックが完成したら、まったく別の方法で行う予定ですが、ほぼ同じ方法でアレイに沿ってキャラクターを移動する予定です。それをより良く/違う方法で行うために。ただし、これは私の最初のローグライクゲームであるため、そもそも私自身が完全に間違っている可能性があるため、より良い実装を示す関連する回答とソースコードは依然として有用であり、高く評価されます.

4

3 に答える 3

3

あなたの床の宣言は、私には少し奇妙に見えますが、次のようなことを試してみてください:

//c arrays are generally array[rows][columns]
int rows = 6, cols = 10;
char floor[rows][cols] = {
    {219, 219, 219, 219, 219, 219, 219, 219, 219, '\n'},
    {219,  32,  32,  32,  32,  32,  32,  32, 219, '\n'},
    {219,  32,  32,  32,  32,  32,  32,  32, 219, '\n'},
    {219,  32,  32,  32,  32,  32,  32,  32, 219, '\n'},
    {219, 219, 219, 219, 219, 219, 219, 219, 219, '\n'}};

例はこちらhttp://ideone.com/O7UG8g . この例では 219->35 に変更しました。そのサイトでは拡張 ASCII の印刷が機能しないと思うからです。

また、バインドされたチェックは次のようにする必要があると思います。

//move left (go one column left)
//if current position is array[curRow][curCol]
//assuming array[0][0] is top left of map
//check if left is a wall
if((curCol - 1) == charForAWall)
   return;
else
   curCol--;

右が +1 列、上が -1 行、下が +1 行です。

于 2013-04-09T00:06:52.343 に答える
1

移動を処理するコードに問題はありません。問題は、配列の割り当て方法に関係しているようです。まず、6 列ではなく 5 列しかありません。要素を次のようにグループ化しました。

char floor[10][5] = {
    {219,219,219,219,219},
    {219,32,32,32,219},
    {219,32,32,32,219},
    {219,32,32,32,219},
    {219,32,32,32,219},
    {219,32,32,32,219},
    {219,32,32,32,219},
    {219,32,32,32,219},
    {219,219,219,219,219},
    {'\n','\n','\n','\n','\n'}
};

そして、次のように、配列を出力する別の関数を作成しました(printfステートメントを置き換えるため、このようには機能しなくなります):

int printArray() {
    int i, j;

    for(i=0; i<5; i++) {
        for(j=0; j<10; j++) {
            printf("%c", floor[j][i]);
        }
    }
}

その後、残りのコードは正常に機能します。

于 2013-04-09T00:22:10.937 に答える