我正在制作一个使用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 8n"); //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] {
和main
中的board
应定义为:
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;
}