[C Language] Atualizando Gobang de Sanbang (adequado para iniciantes, com imagens e textos super detalhados)

Índice

1. Ideia de implementação

1. Alterações no tamanho do tabuleiro de xadrez

2. Mudanças na função de julgar vitórias e derrotas

(1) linha

(2) coluna

(3) "\" direção diagonal

(4) "/" direção diagonal

2. Implementar código + análise de comentários

3. Situação de teste


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.

Acho que você gosta

Origin blog.csdn.net/m0_73156359/article/details/131117019
Recomendado
Clasificación