[ad_1]
#include <stdio.h> #include <stdlib.h> // Constants for the map characters const char MAP_BORDER = '*'; const char PLAYER_CHAR = 'P'; const char GOAL_CHAR = 'G'; const char COLLAPSED_CHAR = 'X'; const char EMPTY_CHAR = ' '; int main(int argc, char *argv[]) { // Check if the correct number of arguments was provided if (argc != 7) { printf("Error: Invalid number of arguments\n"); return 1; } // Convert the arguments to integers and check for invalid values int row_map = atoi(argv[1]); int col_map = atoi(argv[2]); int row_player = atoi(argv[3]); int col_player = atoi(argv[4]); int row_goal = atoi(argv[5]); int col_goal = atoi(argv[6]); if (row_map < 5 || col_map < 5 || row_player < 1 || col_player < 1 || row_goal < 1 || col_goal < 1 || row_player > row_map - 2 || col_player > col_map - 2 || row_goal > row_map - 2 || col_goal > col_map - 2) { printf("Error: Invalid argument values\n"); return 1; } // Allocate memory for the 2D array int **map = malloc(row_map * sizeof(int *)); for (int i = 0; i < row_map; i++) { map[i] = malloc(col_map * sizeof(int)); } // Initialize the map with empty spaces for (int i = 0; i < row_map; i++) { for (int j = 0; j < col_map; j++) { map[i][j] = 0; } } // Set the borders of the map for (int i = 0; i < col_map; i++) { map[0][i] = 1; map[row_map - 1][i] = 1; } for (int i = 1; i < row_map - 1; i++) { map[i][0] = 1; map[i][col_map - 1] = 1; } // Set the player and goal locations in the map map[row_player][col_player] = 2; map[row_goal][col_goal] = 3; // Print the initial map system("clear"); // clear the terminal screen for (int i = 0; i < row_map; i++) { for (int j = 0; j < col_map; j++) { if (map[i][j] == 1) { printf("%c", MAP_BORDER); } else if (map[i][j] == 2) { printf("%c", PLAYER_CHAR); } else if (map[i][j] == 3) { printf("%c", GOAL_CHAR); } else if (map[i][j] == 4) { printf("%c", COLLAPSED_CHAR); } else { printf("%c", EMPTY_CHAR); } } printf("\n"); } // Wait for user input and move the player accordingly char input; while (1) { scanf(" %c", &input); // Move the player based on the input int new_row_player = row_player; int new_col_player = col_player; if (input == 'w') { new_row_player--; } else if (input == 'a') { new_col_player--; } else if (input == 's') { new_row_player++; } else if (input == 'd') { new_col_player++; } else { printf("Error: Invalid input\n"); continue; } // Check if the new player location is valid if (new_row_player < 1 || new_row_player > row_map - 2 || new_col_player < 1 || new_col_player > col_map - 2 || map[new_row_player][new_col_player] == 1) { printf("Invalid move\n"); continue; } // Update the player location in the map map[row_player][col_player] = 0; if (map[new_row_player][new_col_player] == 3) { // Player reached the goal printf("Congratulations, you reached the goal!\n"); break; } else { map[new_row_player][new_col_player] = 2; } // Update the player coordinates row_player = new_row_player; col_player = new_col_player; // Print the updated map system("clear"); // clear the terminal screen for (int i = 0; i < row_map; i++) { for (int j = 0; j < col_map; j++) { if (map[i][j] == 1) { printf("%c", MAP_BORDER); } else if (map[i][j] == 2) { printf("%c", PLAYER_CHAR); } else if (map[i][j] == 3) { printf("%c", GOAL_CHAR); } else if (map[i][j] == 4) { printf("%c", COLLAPSED_CHAR); } else { printf("%c", EMPTY_CHAR); } } printf("\n"); } } // Free the memory allocated for the map for (int i = 0; i < row_map; i++) { free(map[i]); } free(map); return 0; }
私が試したこと:
そこで、プレイヤーが移動するたびに、空のフロア グリッドの 1 つを「折りたたむ」ようにしたいと考えました。 しかし、崩壊は、単一の空のグリッドが崩壊し、ゲーム端末で「X」として表される方法で発生する必要がありました. フロア グリッドが毎回新しい位置で折りたたまれるように機能する必要がありました。 プレイヤーがいる場所、ゴールがある場所、または崩壊した床がすでに存在する場所ではありません。
void move_player(char board[][SIZE], int *player_row, int *player_col, int move_row, int move_col) { int new_row = *player_row + move_row; int new_col = *player_col + move_col; if (new_row < 0 || new_row >= SIZE || new_col < 0 || new_col >= SIZE) { printf("Invalid move\n"); return; } if (board[new_row][new_col] == EMPTY) { // Check if the empty space can collapse if (board[new_row][new_col] != COLLAPSED && (new_row != *player_row || new_col != *player_col) && (new_row != GOAL_ROW || new_col != GOAL_COL)) { printf("A grid collapses!\n"); board[new_row][new_col] = COLLAPSED; } else { printf("Invalid move\n"); return; } } if (new_row == GOAL_ROW && new_col == GOAL_COL) { printf("Congratulations! You have reached the goal.\n"); exit(0); } board[*player_row][*player_col] = EMPTY; board[new_row][new_col] = PLAYER; *player_row = new_row; *player_col = new_col; }
この関数を作成し、メイン ファイルにインポートしようとしましたが、不明な型名エラーが発生し続けました。 不明な名前の種類のエラーは、”import collapse” に対するものです。collapse.c は、メイン ファイルにインポートしたいセカンダリ ファイルの名前です。
解決策 1
エラーの説明は役に立ちません。エラーの場所がわかりません。 推測する必要がある場合は、インデントから main メソッドを終了するのが早すぎたと言えます。 for
ループしてメモリを解放します。
コーディング中に毎日、おそらく 1 日に何度も構文エラーが発生することを予期する必要があります。経験の豊富さに関係なく、誰もがそうです! 変数やキーワードのスペルを間違えることがあります。 文字列やコード ブロックを閉じるのを忘れることがあります。 猫があなたのキーボードの上を歩いて、とても奇妙なことをタイプすることがあります。 メソッド呼び出しに必要なパラメーターの数を忘れてしまうことがあります。
我々はすべての間違いを犯します。
そして、私たちは皆そうしているので、構文エラーを修正する必要があります。他の誰かが修正してくれるのを待つよりも、方法を学んで自分で修正する方がはるかに迅速です! したがって、エラー メッセージの読み方と、コンパイラが間違っていると言っていることに照らして記述されたコードを解釈する方法を学ぶことに少し時間を費やしてください。
だからこれを読んでください: 問題を解決するコードの書き方、初心者向けガイド パート 2: 構文エラー[^] – エラーとその理由を特定するのに役立つはずです。 そうでない場合は、少なくとも必要な情報を教えてくれます。
[ad_2]
コメント