试图制作一款tictactoe游戏,我通常是编程新手,在控制台上打印游戏地图时不断获得SIGBUS
void draw(MATRIX m){/**
* x | o | x
____|___|_____
* | o |
____|___|_____
| |
| o |
*/
char inttox[3];
inttox[0]=' ';inttox[1]='x';inttox[2]='o';
printf(" %c | %c | %c n____|___|_____n %c | %c | %c n____|___|_____n | | n %c | %c | %c n",
inttox[m.im[0][2]],inttox[m.im[1][2]],inttox[m.im[2][2]]
,inttox[m.im[0][1]],inttox[m.im[1][1]],inttox[m.im[2][1]]
,inttox[m.im[0][0]],inttox[m.im[1][0]],inttox[m.im[2][0]]);
}
当我运行gdb时,我得到
Player 1's turn: 1 0
Program received signal SIGBUS, Bus error.
0x000055555555528b in draw (m=...) at galo.c:39
39 ,inttox[m.im[0][0]],inttox[m.im[1][0]],inttox[m.im[2][0]]);
inttox是一个有3个位置的向量,索引是玩家输入的,从0到没有人在这里玩,从1/2到各自的玩家在这里玩。
m是包含向量的矩阵,因为我发现它比处理如何正确实现字符串矩阵更容易理解。
完整的代码在这里:
#include<stdio.h>
typedef struct {
int im[3][3];
}MATRIX;
int logic(int p, MATRIX m){
if(
(m.im[0][0])==(m.im[1][1])==(m.im[2][2])||//diagonals
(m.im[0][2])==(m.im[1][1])==(m.im[2][0])||
(m.im[0][0])==(m.im[0][1])==(m.im[0][2])||//columns
(m.im[1][0])==(m.im[1][1])==(m.im[1][2])||
(m.im[2][0])==(m.im[2][1])==(m.im[2][2])||
(m.im[0][0])==(m.im[1][0])==(m.im[2][0])||//lines
(m.im[0][1])==(m.im[1][1])==(m.im[2][1])||
(m.im[0][2])==(m.im[1][2])==(m.im[2][2])){
return 1;
}
p++;
if(p>2)p=1;
return 0;
}
void draw(MATRIX m){/**
* x | o | x
____|___|_____
* | o |
____|___|_____
| |
| o |
*/
char inttox[3];
inttox[0]=' ';inttox[1]='x';inttox[2]='o';
printf(" %c | %c | %c n____|___|_____n %c | %c | %c n____|___|_____n | | n %c | %c | %c n",
inttox[m.im[0][2]],inttox[m.im[1][2]],inttox[m.im[2][2]]
,inttox[m.im[0][1]],inttox[m.im[1][1]],inttox[m.im[2][1]]
,inttox[m.im[0][0]],inttox[m.im[1][0]],inttox[m.im[2][0]]);
}
MATRIX input(int p,MATRIX m){
if(p>2||p<1){
printf("###player invalid###");
}
int a,b;
printf("Player %d's turn: ",p);
scanf("%d %d", &a, &b);
if(a>2||b>2){
printf("Insert a correct position (0-2, 0-2)");
return input(p,m);
}
m.im[a][b]=p;
return m;
}
int main(){
MATRIX matriz;
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
matriz.im[i][j]=0;
}
}
int p=1;
draw(matriz);
matriz=input(p,matriz);
logic(p,matriz);
}
您有3个位置,但您在这里只初始化了2个位置:
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
matriz.im[i][j]=0;
}
}
变量matriz
被声明为非静态局部变量,因此其值在初始化之前是不确定的。
初始化这样的所有元素以修复:
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 3; j++)
{
matriz.im[i][j]=0;
}
}