Base da linguagem C - três xadrez (explicação detalhada)

Prefácio: O código completo será fornecido no final do artigo. O código anterior não será completo porque é fácil de explicar e serve apenas para referência.

Índice

1. Regras do jogo de gamão

2. Como analisar o layout

3. Exibição e explicação do código

1. Menu do jogo

2. Mostre o tabuleiro de xadrez

3. Os jogadores jogam xadrez

4. Xadrez de computador

5. Julgue vitória/derrota/empate

4. Exibição de código completo

1.jogo.h

2.jogo.c

3.teste.c

5. Resumo


1. Regras do jogo de gamão

Meus amigos devem ter        jogado gamão quando eram pequenos. Não passa de um tabuleiro de xadrez três por três . Não há criança para largar, ou seja, nove grades estão ocupadas , resultando em empate .

2. Como analisar o layout

       Sabemos que escrever códigos requer um design limpo e ordenado. Mesmo projetar um jogo extremamente simples como o xadrez de três luas não pode ser feito em apenas algumas dezenas de linhas de código.

       Conforme mostrado na figura abaixo, criamos nosso próprio arquivo de cabeçalho " game.h" para armazenar centralmente os arquivos de cabeçalho que precisamos usar e declarar as funções que precisamos usar. Só precisamos declarar nossos próprios arquivos de cabeçalho no arquivo de origem Apenas #include "game.h" .

 

Além disso, criamos um novo arquivo fonte game.c para nos concentrar na criação das funções que precisamos.

 Finalmente, o código principal do nosso jogo está escrito no arquivo fonte test.c.

3. Exibição e explicação do código

1. Menu do jogo

Qualquer jogo precisa de um menu para escolher como será jogado.

void menu()//打印菜单函数
{
	printf("******************************\n");
	printf("*******     1.play     *******\n");
	printf("*******     0.exit     *******\n");
	printf("******************************\n");

}
char board[ROW][COL] = {'0'};//游戏数组
int main()
{
	int input = 0;
	do {
		menu();
		printf("请选择->:");
		scanf("%d", &input);//选择
		switch (input)
		{
		case 1:
			printf("三子棋\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

         Criamos uma função de menu (menu) para gerar especificamente nosso menu e usamos o loop do-while e a instrução switch-case para realizar o loop do jogo.

       Aqui está um pequeno truque , sabemos que a condição de julgamento de while é 0 é falsa e diferente de zero é true , então usamos o caso 0 como o jogo de saída, e ele também pode encerrar o loop e inserir 1 ou outros números , ele continuará em loop, reinicie, escolha.

2. Mostre o tabuleiro de xadrez

Nosso tabuleiro de xadrez ideal é assim, o que obviamente requer um array bidimensional, e os elementos desse array bidimensional são todos " ", (space) .

void SetBoard(char board[ROW][COL], int row, int col)//创建棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void ShowBoard(char board[ROW][COL],int row,int col)//展示棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j < col - 1)
			printf("|");
		}
		printf("\n");
		if(i < row - 1)
		printf("---|---|---\n");
	}
}

       Acima definimos o array char board[ROW][COL] = {'0'} , que é definido como um array com apenas um elemento "0", e a seguir criamos o tabuleiro de xadrez através da primeira função SetBoard acima , e depois Use a função ShowBoard para decorar e exibir o tabuleiro de xadrez.

3. Os jogadores jogam xadrez

void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋函数
{
	while (1)
	{
		printf("玩家下棋(选择坐标):");
		int x, y;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("该坐标已被占用,请重新输入:\n");
		}
		else
			printf("输入的坐标错误,请重新输入:\n");
	}


}

       Jogamos xadrez aqui para modificar os elementos do array . Os jogadores inserem uma coordenada para julgar se a posição está vazia. Se estiver vazia, eles descartarão '*' . Se as coordenadas de entrada estiverem fora dos limites, um aviso será emitido e a entrada será inserida novamente . Aqui os jogadores precisam ficar atentos a uma coisa ao jogar xadrez, ou seja, os jogadores não são necessariamente programadores , eles não irão inserir o subscrito correspondente ao array quando escolherem as coordenadas, serão 2 3 se forem duas linhas e três colunas , só precisamos deixar esses dois números Ambos -1 , o efeito pode ser alcançado.

4. Xadrez de computador

void ComputerMove(char board[ROW][COL], int row, int col)//电脑下棋函数
{
	printf("电脑下棋:\n");
	int x, y;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
srand((unsigned int)time(NULL));//生成随机数,rand函数需要用,此处无用,供参考

Um dos pontos-chave do xadrez de computador é a aleatoriedade . As coordenadas aqui precisam usar a função rand para gerar números aleatórios. Observe que o próprio computador não presta tanta atenção ao xadrez quanto os jogadores. Os números aleatórios gerados podem estar entre 0- 2. Ao jogar xadrez com um computador, estipulamos que o lance seja '#' .

5. Julgue vitória/derrota/empate

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;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] &&board[i][0] != ' ')
			return board[i][0];

	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][i];

	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];
	if (IsFull(board, row, col))//判断平局
	{
		return 'Q';
	}
	return 'C';
}

Aqui definimos a função IsWin para julgar a vitória ou a derrota e realizamos isso retornando um valor .

Estipulamos as seguintes quatro maneiras de julgar o progresso do jogo:

O jogador vence --> retorna '*'
vitórias do computador --> retorna '#'
empate --> retorna 'Q'
o jogo continua --> retorna 'C'

       Por que isso está estipulado? Sabemos que a peça do jogador é '*' , e se o jogador vencer, então uma de nossas linhas, colunas ou diagonais será '*' , então podemos retornar um elemento à vontade, e o seguinte o código pode ser realizado com vitórias do jogador. O computador vence da mesma maneira. Ao mesmo tempo também teremos o resultado de um empate , então como é um empate? Muito simplesmente, se ninguém ganha e o tabuleiro está preenchido , não é um empate?

Portanto, definimos a função IsFull para julgar se o array está cheio e retornar 1 se estiver cheio, de modo que a declaração final de julgamento if for true e, finalmente, retornar 'Q' e retornar 0 se não estiver cheio e, finalmente, retornar 'C' .

	char ret = 0;//判断结果
		case 1:
			SetBoard(board, ROW, COL);//创建棋盘
			ShowBoard(board, ROW, COL);//展示棋盘
			while (1)
			{
				//玩家先开始下棋
				PlayerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
				//电脑开始下棋
				ComputerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
			}
			if (ret == '*')
				printf("玩家赢\n");
			else if (ret == '#')
				printf("电脑赢\n");
			else
				printf("平局\n");
			break;

 Aqui está o julgamento da função principal , definimos ret para receber o valor de retorno da função IsWin e usamos a instrução de julgamento if -else para realizar o julgamento do resultado do jogo.

4. Exibição de código completo

1.jogo.h

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3//行数为三
#define COL 3//列数为三
void SetBoard(char board[ROW][COL], int row, int col);//创建棋盘
void ShowBoard(char board[ROW][COL], int row, int col);//展示棋盘
void PlayerMove(char board[ROW][COL], int row, int col);//玩家下棋
void ComputerMove(char board[ROW][COL], int row, int col);//电脑下棋
char IsWin(char board[ROW][COL], int row, int col);//判断输赢

2.jogo.c

#include"game.h"
void SetBoard(char board[ROW][COL], int row, int col)//创建棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			board[i][j] = ' ';
		}
	}
}
void ShowBoard(char board[ROW][COL],int row,int col)//展示棋盘函数
{
	int i;
	int j;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
		{
			printf(" %c ", board[i][j]);
			if(j < col - 1)
			printf("|");
		}
		printf("\n");
		if(i < row - 1)
		printf("---|---|---\n");
	}
}
void PlayerMove(char board[ROW][COL], int row, int col)//玩家下棋函数
{
	while (1)
	{
		printf("玩家下棋(选择坐标):");
		int x, y;
		scanf("%d %d", &x, &y);
		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
		{
			if (board[x - 1][y - 1] == ' ')
			{
				board[x - 1][y - 1] = '*';
				break;
			}
			else
				printf("该坐标已被占用,请重新输入:\n");
		}
		else
			printf("输入的坐标错误,请重新输入:\n");
	}


}
void ComputerMove(char board[ROW][COL], int row, int col)//电脑下棋函数
{
	printf("电脑下棋:\n");
	int x, y;
	while (1)
	{
		x = rand() % row;
		y = rand() % col;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
//玩家赢-->'*'
//电脑赢-->'#'
//平局-->'Q'
//游戏继续-->'C'
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;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1] && board[i][1] == board[i][2] &&board[i][0] != ' ')
			return board[i][0];

	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ')
			return board[0][i];

	}
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
		return board[1][1];
	if (IsFull(board, row, col))//判断平局
	{
		return 'Q';
	}
	return 'C';
}

3.teste.c

#include"game.h"
void menu()//打印菜单函数
{
	printf("******************************\n");
	printf("*******     1.play     *******\n");
	printf("*******     0.exit     *******\n");
	printf("******************************\n");

}
char board[ROW][COL] = {'0'};//游戏数组
int main()
{
	srand((unsigned int)time(NULL));//生成随机数,供电脑下棋使用
	int input = 0;
	char ret = 0;//判断结果
	do {
		menu();
		printf("请选择->:");
		scanf("%d", &input);//选择
		switch (input)
		{
		case 1:
			SetBoard(board, ROW, COL);//创建棋盘
			ShowBoard(board, ROW, COL);//展示棋盘
			while (1)
			{
				//玩家先开始下棋
				PlayerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
				//电脑开始下棋
				ComputerMove(board, ROW, COL);
				ShowBoard(board, ROW, COL);//下棋之后展示棋盘
				//判断输赢
				ret = IsWin(board, ROW, COL);
				if (ret != 'C')
					break;
			}
			if (ret == '*')
				printf("玩家赢\n");
			else if (ret == '#')
				printf("电脑赢\n");
			else
				printf("平局\n");
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);
	return 0;
}

5. Resumo

       Este é provavelmente o caso da criação do xadrez três. O blogueiro também é iniciante. Pode haver mais planos de melhoria em muitos lugares. No futuro, irei me aprimorar por meio do aprendizado contínuo para melhorar o código. Ao mesmo tempo, Gostaria de agradecer aos meus amigos pela paciência, minha explicação, se você tiver alguma dúvida ou sugestão de melhoria, fique à vontade para comentar por mensagem privada.

       Por fim, espero que nossos amiguinhos que gostam de programação possam ir cada vez mais longe e conseguir suas ofertas favoritas. Se você gostou do artigo do blogueiro, não esqueça de clicar três vezes . Até a próxima!

Acho que você gosta

Origin blog.csdn.net/2303_78442132/article/details/131936381
Recomendado
Clasificación