[Lenguaje C] Serie de lenguaje C - Implementación de Gobang

Un programa de backgammon se puede dividir en cuatro partes. La primera parte es la creación del archivo de encabezado, que permite que nuestras funciones estén bien encapsuladas. Hay dos detalles a los que prestar atención: uno es usar define en el archivo de encabezado para definir líneas y columnas, de modo que cuando queramos hacer cambios en filas y columnas en el futuro, solo necesitamos cambiar este lugar de definición. El segundo es incluir stdio.h time.h y otros archivos de encabezado en el archivo de encabezado game.h para evitar la inclusión repetida.

La segunda parte es la implementación de la lógica de la función test.c, que contiene la lógica básica requerida para realizar el juego, incluida la impresión del menú, la inicialización del tablero de ajedrez, la impresión del tablero de ajedrez, el jugador y la computadora jugando. ajedrez, y el juicio del estado del juego.

La tercera parte es la implementación de funciones relacionadas con el juego. El anverso es la descripción de cada función específica del juego, y el reverso es el código general.

La cuarta parte es la visualización de los efectos del juego. 

Parte V: El código de implementación general del juego 

primera parte:

Contenido de los archivos de encabezado: declaración de funciones relacionadas con el juego, declaración de símbolos, inclusión de archivos de encabezado

#pragma once

//game.h  游戏相关函数的声明、符号的声明、头文件的包含

//符号的声明
#define ROW 5
#define COL 5

//头文件的包含
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//函数的声明
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(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);

//判断输赢
//游戏状态:*:玩家赢
//          #:电脑赢
//          Q:平局
//          C:游戏继续
char IsWin(char board[ROW][COL], int row, int col);

Parte 2 - La lógica del juego de mapas test.c  

#define _CRT_SECURE_NO_WARNINGS 1

//test.c  测绘游戏的逻辑
//game.c  游戏相关函数的实现
//game.h  游戏相关函数的声明、符号的声明、头文件的包含
#define _CRT_SECURE_NO_WARNINGS 1    //解决VS中scanf不安全问题
#include"game.h"                     //自己创建的头文件用双引号
void menu()                          //菜单的实现
{
	printf("1.play\n");
	printf("0.exit\n");
}
void game()                          //游戏实现部分
{
	//定义数组--存储数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	char ret;      //判断游戏状态
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);   //判断游戏输赢
		if (ret != 'C')
			break;   
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else
		printf("平局\n");
}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:->");
		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); break;
		case 0:printf("退出游戏"); break;
		default:printf("选择错误,重新选择\n");
		}
	} while (n);
	return 0;
}

La tercera parte: la implementación de funciones relacionadas con el juego game.c

1. Inicialización de tablero de ajedrez (esencialmente inicialización de matriz)

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			board[i][j] = ' ';      //将棋盘初始化为空格
	}
}

2. Imprime el tablero de ajedrez

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	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)
		{
			for (j = 0; j < col; j++)         //打印横线和竖线
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

3. El jugador juega al ajedrez : es necesario juzgar si las coordenadas ingresadas por el jugador son legales y si las coordenadas están ocupadas .

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("玩家走\n");

	while (1)              //如果坐标违法就重新输入
	{
		printf("请输入坐标->:");
		scanf("%d%d", &m, &n);
		//判断坐标合法性
		if (m <= ROW && m >= 1 && n <= COL && n >= 1)
		{
			//判断坐标是否被占用
			if (board[m - 1][n - 1] == ' ')     //玩家不知道数组下标从零开始,输入是从(1 1)开始的,所以要减一
			{
				board[m - 1][n - 1] = '*';
				break;
			}
			else
				printf("坐标被占用,请重新输入\n");
		}
		else
			printf("坐标非法,请重新输入\n");
	}
}

4. La computadora juega al ajedrez : para permitir que la computadora genere una coordenada aleatoria dentro del rango de la matriz, se utiliza la función de generación de valor de función aleatoria rand () Al mismo tiempo, para garantizar la aleatoriedad del valor, es necesario establecer una semilla para ello Determinar si las coordenadas están ocupadas.

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("电脑走\n");
	while (1)
	{
		m = rand() % row;
		n = rand() % col;
		//判断坐标是否被占用
		if (board[m][n] == ' ')
		{
			board[m][n] = '#';
			break;
		}
	}
}

5. Determinar el estado del juego -- :*: El jugador gana              

                                     #: La computadora gana
                                     Q: Empate
                                     C: El juego continúa

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]
			&& board[i][1] == board[i][2]
			&& board[i][2] == board[i][3]
			&& board[i][3] == board[i][4]
			&& board[i][4] != ' ')
			return board[i][1];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i]
			&& board[0][i] == board[1][i]
			&& board[1][i] == board[2][i]
			&& board[2][i] == board[3][i]
			&& board[3][i] == board[4][i]
			&& board[4][i] != ' ')
			return board[1][i];
	}
	if (board[0][0] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	if (board[0][4] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	int ret = IsFull(board, row, col);
	if (ret)
		return 'Q';
	return 'C';
}

6. Juzgar el estado del juego -- juzgar si el tablero está lleno

in//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == ' ')

				flag = 0;
	}
	return flag;
}

7. La implementación general de game.c

#define _CRT_SECURE_NO_WARNINGS 1

//game.c  游戏相关函数的实现
#include"game.h"

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			board[i][j] = ' ';      //将棋盘初始化为空格
	}
}

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	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)
		{
			for (j = 0; j < col; j++)         //打印横线和竖线
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("玩家走\n");

	while (1)              //如果坐标违法就重新输入
	{
		printf("请输入坐标->:");
		scanf("%d%d", &m, &n);
		//判断坐标合法性
		if (m <= ROW && m >= 1 && n <= COL && n >= 1)
		{
			//判断坐标是否被占用
			if (board[m - 1][n - 1] == ' ')     //玩家不知道数组下标从零开始,输入是从(1 1)开始的,所以要减一
			{
				board[m - 1][n - 1] = '*';
				break;
			}
			else
				printf("坐标被占用,请重新输入\n");
		}
		else
			printf("坐标非法,请重新输入\n");
	}
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("电脑走\n");
	while (1)
	{
		m = rand() % row;
		n = rand() % col;
		//判断坐标是否被占用
		if (board[m][n] == ' ')
		{
			board[m][n] = '#';
			break;
		}
	}
}

//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == ' ')

				flag = 0;
	}
	return flag;
}

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]
			&& board[i][1] == board[i][2]
			&& board[i][2] == board[i][3]
			&& board[i][3] == board[i][4]
			&& board[i][4] != ' ')
			return board[i][1];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i]
			&& board[0][i] == board[1][i]
			&& board[1][i] == board[2][i]
			&& board[2][i] == board[3][i]
			&& board[3][i] == board[4][i]
			&& board[4][i] != ' ')
			return board[1][i];
	}
	if (board[0][0] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	if (board[0][4] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	int ret = IsFull(board, row, col);
	if (ret)
		return 'Q';
	return 'C';
}

Parte 4 - Efectos del juego

1. El efecto del menú

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5pWy5Luj56CB55qE6aKc, tamaño_20, color_FFFFFF, t_70, g_se, x_16

2. El efecto de inicializar el tablero de ajedrez.

911012b94d6546b59148f178781961a1.png

 3. El efecto del juego

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5pWy5Luj56CB55qE6aKc, tamaño_8, color_FFFFFF, t_70, g_se, x_16

4. El efecto del fin del juego

marca de agua, tipo_d3F5LXplbmhlaQ, sombra_50, texto_Q1NETiBA5pWy5Luj56CB55qE6aKc, tamaño_8, color_FFFFFF, t_70, g_se, x_16

La quinta parte: el código de implementación general del juego.

juego.h

#pragma once

//game.h  游戏相关函数的声明、符号的声明、头文件的包含

//符号的声明
#define ROW 5
#define COL 5

//头文件的包含
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//函数的声明
//初始化棋盘
void InitBoard(char board[ROW][COL],int row,int col);
//打印棋盘
void DisplayBoard(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);

//判断输赢
//游戏状态:*:玩家赢
//          #:电脑赢
//          Q:平局
//          C:游戏继续
char IsWin(char board[ROW][COL], int row, int col);

 prueba.c

#define _CRT_SECURE_NO_WARNINGS 1

//test.c  测绘游戏的逻辑
//game.c  游戏相关函数的实现
//game.h  游戏相关函数的声明、符号的声明、头文件的包含
#define _CRT_SECURE_NO_WARNINGS 1    //解决VS中scanf不安全问题
#include"game.h"                     //自己创建的头文件用双引号
void menu()                          //菜单的实现
{
	printf("1.play\n");
	printf("0.exit\n");
}
void game()                          //游戏实现部分
{
	//定义数组--存储数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	DisplayBoard(board, ROW, COL);
	char ret;      //判断游戏状态
	while (1)
	{
		//玩家下棋
		PlayerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);   //判断游戏输赢
		if (ret != 'C')
			break;   
		//电脑下棋
		ComputerMove(board, ROW, COL);
		DisplayBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
		printf("玩家赢\n");
	else if (ret == '#')
		printf("电脑赢\n");
	else
		printf("平局\n");
}
int main()
{
	int n = 0;
	srand((unsigned int)time(NULL));
	do 
	{
		menu();
		printf("请选择:->");
		scanf("%d", &n);
		switch (n)
		{
		case 1:game(); break;
		case 0:printf("退出游戏"); break;
		default:printf("选择错误,重新选择\n");
		}
	} while (n);
	return 0;
}

 juego.c

#define _CRT_SECURE_NO_WARNINGS 1

//game.c  游戏相关函数的实现
#include"game.h"

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			board[i][j] = ' ';      //将棋盘初始化为空格
	}
}

//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	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)
		{
			for (j = 0; j < col; j++)         //打印横线和竖线
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("玩家走\n");

	while (1)              //如果坐标违法就重新输入
	{
		printf("请输入坐标->:");
		scanf("%d%d", &m, &n);
		//判断坐标合法性
		if (m <= ROW && m >= 1 && n <= COL && n >= 1)
		{
			//判断坐标是否被占用
			if (board[m - 1][n - 1] == ' ')     //玩家不知道数组下标从零开始,输入是从(1 1)开始的,所以要减一
			{
				board[m - 1][n - 1] = '*';
				break;
			}
			else
				printf("坐标被占用,请重新输入\n");
		}
		else
			printf("坐标非法,请重新输入\n");
	}
}

//电脑下棋
void ComputerMove(char board[ROW][COL], int row, int col)
{
	int m = 0, n = 0;
	printf("电脑走\n");
	while (1)
	{
		m = rand() % row;
		n = rand() % col;
		//判断坐标是否被占用
		if (board[m][n] == ' ')
		{
			board[m][n] = '#';
			break;
		}
	}
}

//判断棋盘是否满了
int IsFull(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0, flag = 1;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] == ' ')

				flag = 0;
	}
	return flag;
}

//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0, j = 0;
	for (i = 0; i < row; i++)
	{
		if (board[i][0] == board[i][1]
			&& board[i][1] == board[i][2]
			&& board[i][2] == board[i][3]
			&& board[i][3] == board[i][4]
			&& board[i][4] != ' ')
			return board[i][1];
	}
	for (i = 0; i < col; i++)
	{
		if (board[0][i] == board[1][i]
			&& board[0][i] == board[1][i]
			&& board[1][i] == board[2][i]
			&& board[2][i] == board[3][i]
			&& board[3][i] == board[4][i]
			&& board[4][i] != ' ')
			return board[1][i];
	}
	if (board[0][0] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	if (board[0][4] == board[1][1]
		&& board[1][1] == board[2][2]
		&& board[2][2] == board[3][3]
		&& board[3][3] == board[4][4]
		&& board[4][4] != ' ')
		return board[0][0];
	int ret = IsFull(board, row, col);
	if (ret)
		return 'Q';
	return 'C';
}

Supongo que te gusta

Origin blog.csdn.net/m0_62391199/article/details/122540210
Recomendado
Clasificación