我正在使用 2D 数组制作一个小游戏。我尝试创建一个函数,让您从一个干净的板开始,并希望它以这样的方式进行:如果有意义的话,干净板函数是一个右值。
#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define EMPTY 0
#define BLACK 1
#define WHITE -1
//Fills the 2D array with 0s and places the 4 starting pieces in the middle
int **cleanboard(void){
int newboard[MAX][MAX];
(*newboard)[MAX] = malloc(sizeof*newboard*MAX);
for(int row=0; row<MAX; row++){
for(int col=0; col<MAX; col++){
newboard[row][col] = EMPTY;
}
}
newboard[3][3] = WHITE, newboard[4][4] = WHITE;
newboard[4][3] = BLACK, newboard[3][4] = BLACK;
return newboard;
}
//Displays the board
void printboard(int arr[][MAX]){
printf(" 1 2 3 4 5 6 7 8\n"); //Top numbers
for(int i=0; i<MAX; i++){
for(int j=0; j<MAX; j++){
if(j==0){printf("%d ", i+1);} //Side numbers
switch(arr[i][j]){ //Print piece
case 0: printf(" .");
break;
case 1: printf(" b");
break;
case -1: printf(" w");
break;
}
}
printf("\n");
}
}
int main(){
int **board;
board = cleanboard();
printboard(board);
return 0;
}
使用给定的代码,它输出:
1 2 3 4 5 6 7 8
1
但是,这个示例是电路板应该看起来的样子:
//Example 2D array:
int grid[MAX][MAX] = {{-1, 1, -1, 1, 0, -1, 1, 0},
{1, -1, -1, 1, 0, -1, -1, 1},
{1, 1, -1, 1, -1, 1, 1, 1},
{-1, 0, -1, -1, -1, 1, 1, -1},
{1, -1, 0, 1, 0, 1, 0, 0},
{0, 1, -1, 1, -1, -1, 1, -1},
{1, 1, 1, -1, 0, -1, -1, -1},
{0, -1, -1, -1, -1, 1, -1, 0}};
printboard(grid);
输出:
1 2 3 4 5 6 7 8
1 w b w b . w b .
2 b w w b . w w b
3 b b w b w b b b
4 w . w w w b b w
5 b w . b . b . .
6 . b w b w w b w
7 b b b w . w w w
8 . w w w w b w .
cleanboard 函数未存储值或导致 printboard 函数停止的内容。 如有任何帮助,我们将不胜感激。
printboard
的参数类型就是你想要的。 但是,数组到指针的转换仅发生在多维数组的第一维上。 您正在尝试在 int (*)[MAX]
和 int **
之间进行转换,它们不是同一件事。
在
cleanboard
中,您需要将newboard
定义为:
int (*newboard)[MAX] = malloc(sizeof*newboard*MAX);
那么函数本身应该定义为:
int (*cleanboard(void))[MAX] {
并且
board
中的main
应定义为:
int (*board)[MAX];
此外,您还需要在内部循环运行后在
printboard
中打印换行符。
以下建议代码:
现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 8
#define EMPTY 0
#define BLACK 1
#define WHITE -1
//Fills the 2D array with 0s and places the 4 starting pieces in the middle
int **cleanboard(void)
{
int **newboard = malloc( MAX * sizeof( int ) );;
for(int row=0; row<MAX; row++)
{
newboard[row] = malloc( MAX * sizeof( int ) );
}
for(int row=0; row<MAX; row++)
{
for(int col=0; col<MAX; col++)
{
newboard[row][col] = EMPTY;
}
}
newboard[3][3] = WHITE;
newboard[4][4] = WHITE;
newboard[4][3] = BLACK;
newboard[3][4] = BLACK;
return newboard;
}