Índice
1. Alterações no tamanho do tabuleiro de xadrez
2. Mudanças na função de julgar vitórias e derrotas
prefácio
Eu mesmo sou iniciante, mas quando aprendo o código de outros caras grandes, sempre encontro alguns problemas: o código é muito esotérico para os iniciantes entenderem; Então, escrevi um blog sozinho para explicar em detalhes o problema de "Atualizar Gobang de Sanziqi".
Explicação do xadrez de três luas (estudantes que não aprenderam xadrez de três luas podem ler isto primeiro): [Linguagem C] Versão simples do xadrez de três luas (com código-fonte)_Byte Link Blog-CSDN Blog
Análise: Mudar Sanbang para Gobang só precisa mudar o tamanho do tabuleiro e a função de julgar as vitórias e derrotas .
1. Ideia de implementação
1. Alterações no tamanho do tabuleiro de xadrez
#define ROW 10 //棋盘的行数
#define COL 10 //棋盘的列数
Os benefícios de usar #define para definir o número de linhas e colunas antes são refletidos e podem ser facilmente modificados a qualquer momento.
2. Mudanças na função de julgar vitórias e derrotas
(1) linha
Suponha que haja um tabuleiro de xadrez com 6 linhas e 6 colunas (linha = 6, col = 6), então existem duas possibilidades de cinco peças conectadas e idênticas em uma linha, como segue:
Queremos encontrar as peças nas coordenadas (0, 0) e (0, 1)
Em seguida, compare esta peça com as próximas quatro peças, se todas as cinco peças forem iguais e não forem espaços, alguém será declarado o vencedor ("X" é o jogador, "O" é o computador)
No entanto, este é apenas o caso de uma linha. De acordo com o tamanho do tabuleiro de xadrez real, cada linha deve ser julgada desta forma
Se i for considerado como uma linha e j como uma coluna, então o intervalo de i é 0~5 e o intervalo de j é 0~1
Escrito em forma de código:
//假设棋盘是6行6列,row=6,col=6
for (i = 0; i < row; i++) //0~5
{
for (j = 0; j < col - 4; j++) //0~1
{
if (board[i][j] == board[i][j + 1] &&
board[i][j + 1] == board[i][j + 2] &&
board[i][j + 2] == board[i][j + 3] &&
board[i][j + 3] == board[i][j + 4] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
Forma gráfica:
A área amarela é a área a ser percorrida
(2) coluna
O princípio é o mesmo acima, apenas modifique o intervalo de i e j no loop for e as condições de julgamento no loop.
Formulário de código:
for (j = 0; j < col; j++)
{
for (i = 0; i < row - 4; i++)
{
if (board[i][j] == board[i + 1][j] &&
board[i + 1][j] == board[i + 2][j] &&
board[i + 2][j] == board[i + 3][j] &&
board[i + 3][j] == board[i + 4][j] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
Forma gráfica:
A área amarela é a área a ser percorrida
(3) "\" direção diagonal
Supondo que haja um tabuleiro de xadrez com 6 linhas e 6 colunas (linha=6, col=6), então existem quatro possibilidades de cinco peças de xadrez conectadas e idênticas na linha diagonal na direção "\" como segue:
Pode-se encontrar uma regra de que sua posição inicial seja sempre em uma área no canto superior esquerdo , então:
Formulário de código:
for (i = 0; i < row - 4; i++)
{
for (j = 0; j < col - 4; j++)
{
if (board[i][j] == board[i + 1][j + 1] &&
board[i + 1][j + 1] == board[i + 2][j + 2] &&
board[i + 2][j + 2] == board[i + 3][j + 3] &&
board[i + 3][j + 3] == board[i + 4][j + 4] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
Forma gráfica:
A área amarela é a área a ser percorrida
(4) "/" direção diagonal
Suponha que haja um tabuleiro de xadrez com 6 linhas e 6 colunas (linha = 6, col = 6), então também existem as quatro possibilidades a seguir para cinco peças de xadrez conectadas e idênticas na linha diagonal na direção "/" :
Desta vez as posições iniciais das cinco peças são sempre no canto superior direito , então:
Formulário de código:
for (i = 0; i < row - 4; i++)
{
for (j = 4; j < col; j++)
{
if (board[i][j] == board[i + 1][j - 1] &&
board[i + 1][j - 1] == board[i + 2][j - 2] &&
board[i + 2][j - 2] == board[i + 3][j - 3] &&
board[i + 3][j - 3] == board[i + 4][j - 4] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
Forma gráfica:
A área amarela é a área a ser percorrida
Quanto à situação de empate e continuação, é a mesma do xadrez de três conexões anterior, portanto não entrarei em detalhes aqui.
2. Implementar código + análise de comentários
//判断棋盘是否被占满
//未占满 --- 0
//占 满 --- 1
int IsFull(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢 --- 五子棋的判断
char IsWin(char board[ROW][COL], int row, int col)
{
int i, j;
//判断每行有五个相同的棋子
//假设有6列,COL=col=6,每行五子相同有以下两种可能性
// 0 1 2 3 4 5 (列的下标)
// X X X X X (把“X”当作棋子)
// X X X X X
//我们要拿五个棋子中的【第一个棋子】去跟【后面的四个棋子】比较一下是否相同
//可以看到j的范围在0~1之间,也就是:for (j = 0; j < col - 4; j++)
for (i = 0; i < row; i++)
{
for (j = 0; j < col - 4; j++)
{
if (board[i][j] == board[i][j + 1] &&
board[i][j + 1] == board[i][j + 2] &&
board[i][j + 2] == board[i][j + 3] &&
board[i][j + 3] == board[i][j + 4] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
//判断每列有五个相同的棋子
//原理同上,i的范围:for (i = 0; i < row - 4; i++)
for (j = 0; j < col; j++)
{
for (i = 0; i < row - 4; i++)
{
if (board[i][j] == board[i + 1][j] &&
board[i + 1][j] == board[i + 2][j] &&
board[i + 2][j] == board[i + 3][j] &&
board[i + 3][j] == board[i + 4][j] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
//判断\方向有五个相同的棋子
//假设有6行6列,有以下四种可能性
// 0 1 2 3 4 5 | 0 1 2 3 4 5
// 0 X X | 0
// 1 X X | 1 X X
// 2 X X | 2 X X
// 3 X X | 3 X X
// 4 X X | 4 X X
// 5 | 5 X X
//由于我们要拿五个棋子中的【第一个棋子】去跟【后面的四个棋子】比较
//所以(i,j)的可能取值:(0,0) (0,1) (1,0) (1,1)
for (i = 0; i < row - 4; i++)
{
for (j = 0; j < col - 4; j++)
{
if (board[i][j] == board[i + 1][j + 1] &&
board[i + 1][j + 1] == board[i + 2][j + 2] &&
board[i + 2][j + 2] == board[i + 3][j + 3] &&
board[i + 3][j + 3] == board[i + 4][j + 4] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
//判断/方向有五个相同的棋子
//假设有6行6列,同样有以下四种可能性
// 0 1 2 3 4 5 | 0 1 2 3 4 5
// 0 X X | 0
// 1 X X | 1 X X
// 2 X X | 2 X X
// 3 X X | 3 X X
// 4 X X | 4 X X
// 5 | 5 X X
//(i,j)的可能取值:(0,4) (0,5) (1,4) (1,5)
for (i = 0; i < row - 4; i++)
{
for (j = 4; j < col; j++)
{
if (board[i][j] == board[i + 1][j - 1] &&
board[i + 1][j - 1] == board[i + 2][j - 2] &&
board[i + 2][j - 2] == board[i + 3][j - 3] &&
board[i + 3][j - 3] == board[i + 4][j - 4] &&
board[i][j] != ' ')
{
return board[i][j];
}
}
}
//平局(棋盘被占满还未分出胜负)
if (IsFull(board, row, col) == 1)
{
return 'Q';
}
//继续
return 'C';
}
3. Situação de teste
Eu testei e deve estar bom.Se você tiver algum bug ou outras perguntas, deixe uma mensagem na área de comentários.