[英]Unable to print tokens in game board
我正在寫一個簡單的棋盤游戲。 程序運行時我想做的是先打印一個空的棋盤,然后詢問用戶X
和Y
坐標,然后在輸入的坐標中打印帶有玩家令牌的棋盤。 當我運行程序時,它會打印出一塊空白的木板,然后問我X
坐標,然后問Y
坐標,然后出現以下錯誤:
X:1,Y:2
Y:2,Y:3
分段故障(核心已轉儲)
是什么導致該錯誤,我該如何解決? 謝謝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <stdbool.h>
struct p1Data{
int xCoordinate;
int yCoordinate;
bool flag;
};
char **gameBoard;
int height, width, boardArea, xCor, yCor, dataSize, i;
char **allocateMemory(int boardHeight, int boardWidth);
void fillBoard(char **board, int height, int width, struct p1Data data[], int sizeData);
void printBoard(char **board, int boardHeight, int boardWidth);
void freeBoardArray(char **board, int boardHeight);
int main(int argc, char** argv ){
height = 4;
width = 4;
boardArea = height * width;
struct p1Data data[boardArea];
dataSize = sizeof(data)/sizeof(data[0]);
data[0].flag = false;
gameBoard = allocateMemory(height, width);
fillBoard(gameBoard, height, width, data, dataSize);
printBoard(gameBoard, height, width);
printf("\n");
for(i = 0; i < boardArea; i++ ){
printf("Enter X-Coordinate: ");
scanf("%d", &xCor);
printf("Enter Y-Coordinate: ");
scanf("%d", &yCor);
data[i].flag = true;
data[i].xCoordinate = xCor;
data[i].yCoordinate = yCor;
fillBoard(gameBoard, height, width, data, dataSize);
printBoard(gameBoard, height, width);
printf("\n");
}
return 0;
}
char **allocateMemory(int boardHeight, int boardWidth){
int i;
char **gameBoard;
gameBoard = (char **)malloc(sizeof(char *)*boardHeight);
for( i = 0; i < boardWidth; i++ ){
gameBoard[i] = (char *)malloc(sizeof(char)*boardWidth);
}
return gameBoard;
}
void fillBoard(char** board, int height, int width, struct p1Data data[], int sizeData){
int i, j, x, y;
for(i = 0; i < height; i++){
for(j = 0; j < width; j++ ){
board[i][j] = '.';
}
}
if(data[0].flag == true ){
for( i = 0; i < sizeData; i++ ){
x = data[i].xCoordinate;
y = data[i].yCoordinate;
board[x][y] = 'O';
printf("X: %d, Y: %d\n", x, y);
}
}
}
void printBoard(char **board, int boardHeight, int boardWidth){
int i, j;
printf("/");
for( i = 0; i < boardWidth; i++ ){
printf("-");
}
printf("\\");
printf("\n");
for(i = 0; i < boardHeight; i++ ){
printf("|");
for(j = 0; j < boardWidth; j++ ){
printf("%c", board[i][j]);
}
printf("|");
printf("\n");
}
printf("\\");
for( i = 0; i < boardWidth; i++ ){
printf("-");
}
printf("/");
}
void freeBoardArray(char **board, int boardHeight){
int i;
for( i = 0; i < boardHeight; i++ )
free(board[i]);
free(board);
}
if (data[0].flag == true) {
for (i = 0; i < sizeData; i++) {
x = data[i].xCoordinate; //<== not intialized
y = data[i].yCoordinate; //<== not intialized
board[x][y] = 'O'; //<= x/y are undefined
printf("X: %d, Y: %d\n", x, y);
}
}
您必須初始化data[i].xCoordinate
和data[i].yCoordinate
否則這些值是不確定的。 稍后您調用board[x][y]
會導致錯誤。
//initialize here:
for (i = 0; i < boardArea; i++)
{
data[i].flag = false;
data[i].xCoordinate = 0;
data[i].yCoordinate = 0;
}
fillBoard(gameBoard, height, width, data, dataSize);
...
在這種情況下,您還可以使用memset(&data, 0, sizeof(data));
初始化memset(&data, 0, sizeof(data));
將初始值設置為零。
請注意,您還可以避免使用二維數組來簡化游戲。 了解X / Y坐標和Width / Height后,您可以將索引計算為x + y * width
。 或者使用除法和mod運算符%
從一維數組索引中提取X / Y坐標。 例:
void printBoard(char *data, int w, int h)
{
int x, y;
for (y = 0; y < h; y++)
{
for (x = 0; x < w; x++)
printf("%c", data[x + y * w] ? 'O' : '.');
printf("\n");
}
printf("\n");
}
int main(int argc, char** argv)
{
int width = 4;
int height = 4;
int area = width * height;
int i, xCor, yCor;
char data[area];
memset(data, 0, area);
for (i = 0; i < area; i++)
{
printBoard(data, width, height);
printf("Enter X-Coordinate: ");
scanf("%d", &xCor);
printf("Enter Y-Coordinate: ");
scanf("%d", &yCor);
int index = xCor + yCor * width;
if (index < area)
data[index] = 1;
}
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.