Utilice una matriz bidimensional para realizar la versión general de three-bang

inserte la descripción de la imagen aquí

Consejo: Una vez escrito el artículo, la tabla de contenido se puede generar automáticamente. Cómo generarla puede consultar el documento de ayuda a la derecha.


prefacio

Hoy compartiré con ustedes cómo usar una matriz bidimensional para realizar la versión general de los tres ajedrez (el tamaño del tablero es arbitrario)


提示:以下是本篇文章正文内容,下面案例可供参考

1. Implementación del código

Aquí usamos múltiples archivos para el procesamiento.
Aquí
usamos el archivo game.c para realizar la función.
Use el archivo test.c para administrar la interfaz del juego.
Use el archivo game.h para almacenar la declaración de la función . inclusión del archivo de encabezado y la definición de la macro.

archivo juego.c

#include "game.h"

void menu()
{
    
    
	printf("********************\n");
	printf("*****  1.play  *****\n");
	printf("*****  0.exit  *****\n");
	printf("********************\n");
}

void game()
{
    
    
	//创建棋盘
	char board[ROW][COL] = {
    
     0 };
	//记录落子的坐标,第一个元素是行,第二个元素是列
	int location[2] = {
    
     0 };
	//记录游戏状态
	char ret = 0;
	//初始化棋盘
	InitBoard(board, ROW, COL);
	//打印棋盘
	PrintBoard(board,ROW,COL);
	while (1)
	{
    
    
		//玩家落子
		PlayMove(board, location, ROW, COL);
		//打印棋盘
		PrintBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, location,ROW,COL);
		if (ret != 'C')
			break;
		//电脑随机落子
		ComputerMove(board, location, ROW, COL);
		//打印棋盘
		PrintBoard(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, location, ROW, COL);
		if (ret != 'C')
			break;
	}
	if (ret == '*')
	{
    
    
		printf("玩家赢\n");
	}
	else if (ret == '#')
	{
    
    
		printf("电脑赢\n");
	}
	else
	{
    
    
		printf("平局\n");
	}
}

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

//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col)
{
    
    
	int i = 0;
	//打印列
	for (i = 2; i < row-2; i++)
	{
    
    
		int j = 0;
		//打印行
		for (j = 2; j < col-2; j++)
		{
    
    
			printf(" %c ", board[i][j]);
			if (j < col - 3)
				printf("|");
		}
		printf("\n");
		//打印行
		if(i<row-3)
			for (j = 2; j < col-2; j++)
			{
    
    
				printf("---");
				if (j < col - 3)
					printf("|");
			}
		printf("\n");
	}
}


//玩家落子
void PlayMove(char board[ROW][COL], int location[], int row, int col)
{
    
    
	//行
	int i = 0;
	//列
	int j = 0;
	while (1)
	{
    
    
		printf("请输入坐标,以空格分隔:>");
		scanf("%d %d", &i, &j);
		if (i >= 1 && i <= ROW_SHOW && j >= 1 && j <= COL_SHOW)
		{
    
    
			if (board[i+1][j+1] == ' ')
			{
    
    
				location[0] = i+1;
				location[1] = j+1;
				board[i+1][j+1] = '*';
				break;
			}
			else
				printf("坐标以被占用,请从新输入\n");
		}
		else
		{
    
    
			printf("输入错误,请从新输入\n");
		}
	}
}


//电脑随机落子
void ComputerMove(char board[ROW][COL], int location[], int row, int col)
{
    
    
	printf("电脑落子\n");
	while (1)
	{
    
    
		//行
		int i = rand() % ROW_SHOW + 2;
		//列
		int j = rand() % COL_SHOW + 2;
		if (board[i][j] == ' ')
		{
    
    
			location[0] = i;
			location[1] = j;
			board[i][j] = '#';
			break;
		}
	}
	
}


//判断
char IsWin(char board[ROW][COL], int location[],int row,int col)
{
    
    
	//行
	int i = location[0];
	//列
	int j = location[1];
	//计数器
	int count = 0;
	//行
	int n = 0;
	//列
	int m = 0;
	//行
	count = 0;
	for (n = i - 2; n <= i + 2; n++)
	{
    
    
		if (board[i][j] == board[n][j])
			count++;
	}
	if (count == 3)
	{
    
    
		return board[i][j];
	}
	//列
	count = 0;
	for (m = j - 2; m <= j + 2; m++)
	{
    
    
		if (board[i][j] == board[i][m])
			count++;
	}
	if (count == 3)
	{
    
    
		return board[i][j];
	}
	//正对角线
	count = 0;
	for (n = i - 2, m = j - 2; n <= i + 2; n++, m++)
	{
    
    
		if (board[i][j] == board[n][m])
			count++;
	}
	if (count == 3)
	{
    
    
		return board[i][j];
	}
	//逆对角线
	count = 0; 
	for (n = i - 2, m = j + 2; n <= i + 2; n++, m--)
	{
    
    
		if (board[i][j] == board[n][m])
			count++;
	}
	if (count == 3)
	{
    
    
		return board[i][j];
	}
	//平局
	if (Judge(board, row, col))
	{
    
    
		return 'Q';
	}
	//游戏继续
	return 'C';
}



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

archivo prueba.c

#include "game.h"


int main()
{
    
    
	int input = 0;
	srand((unsigned int)time(NULL));
	do
	{
    
    
		menu();
		printf("请输入选项:>");
		scanf("%d", &input);
		switch (input)
		{
    
    
		case EXIT:
			printf("退出游戏\n");
			break;
		case PLAY:
			game();
			break;
		default:
			printf("输入错误,请从新输入\n");
			break;
		}

	} while (input);

	return 0;
}

archivo juego.h

#pragma once

#define _CRT_SECURE_NO_WARNINGS 1
#define ROW_SHOW 3//显示大小
#define COL_SHOW 3//显示大小
#define ROW ROW_SHOW+4//实际大小
#define COL ROW_SHOW+4//实际大小


#include <stdio.h>
#include <stdlib.h>
#include <time.h>


enum
{
    
    
	EXIT,
	PLAY
};



//菜单
void menu(void);

//三子棋
void game(void);

//初始化棋盘
void InitBoard(char board[ROW][COL], int row, int col);

//打印棋盘
void PrintBoard(char board[ROW][COL], int row, int col);

//玩家落子
void PlayMove(char board[ROW][COL], int location[], int row, int col);

//电脑随机落子
void ComputerMove(char board[ROW][COL], int location[], int row, int col);

//判断输赢
//规定‘*’代表玩家赢
//规定‘#’代表电脑赢
//规定‘Q’代表平局
//规定‘C’代表继续
//判断
char IsWin(char board[ROW][COL], int location[],int row,int col);

//判断棋盘是否满了
int Judge(char board[ROW][COL], int row, int col);


2. Explicación de ideas

Supongamos que lo que queremos completar primero es un juego de 3 * 3.
Aquí primero creamos un tablero con un tamaño de 7 *
7 y solo mostramos el tamaño de 3 * 3. Luego vamos registrando las coordenadas de cada movimiento.
¿Por qué quieres hacer esto?
Aquí viene la parte de juzgar.
Aquí, mi parte de juicio adopta el método de conteo
de la siguiente manera:
(Usamos 0 para representar el espacio)
inserte la descripción de la imagen aquí
Ahora, cuando es necesario juzgar el punto cuyas coordenadas son (2,2) (el punto a los ojos del usuario es (1,1 )), el estado del juego.
inserte la descripción de la imagen aquí
Ahora expandimos 2 capas desde (2,2) al área circundante. Primero
inserte la descripción de la imagen aquí
juzguemos desde (2,0), (2,1), (2,2), (2,3), (2,4) Cinco Los puntos encuentran varios personajes en el cuadro negro. Si hay 3 personajes en el cuadro negro, significa que el personaje en el cuadro negro gana. Si hay menos de tres, significa que el personaje no gana. Para juzgar la columna, busque caracteres en varios cuadros negros de los cinco puntos (0,2), (1,2), (2,2), (3,2), (4,2), si hay 3 caracteres en el cuadro negro, significa que el personaje en el cuadro negro gana, y si hay menos de tres personajes, significa que el personaje no gana. Juzgando la diagonal positiva de (0,0), (1,1), (2,2), (3,3), (4,4), estos cinco puntos encuentran varios cuadros negros Si hay 3 caracteres en el cuadro negro, significa que el personaje en el cuadro negro gana, y si hay menos de tres personajes, significa que el personaje no gana. Juzgando la diagonal inversa









Encuentra caracteres en varios cuadros negros de los cinco puntos (0,4), (1,3), (2,2), (3,1), (4,0), si hay 3
negros El personaje en el cuadro Significa que el personaje en el cuadro negro gana, y si es menos de tres, significa que el personaje no gana.

Eso si es un juego tamaño 5 5.
Sólo necesitamos crear un tablero de ajedrez con un tamaño real de 9
9 y mostrar 5*5.
inserte la descripción de la imagen aquí
Puede utilizar el mismo método de juicio.

3. Resultados

7 7 tallas
inserte la descripción de la imagen aquí
5
5 tallas
inserte la descripción de la imagen aquí


Resumir

Lo anterior es mi método de implementación para backgammon.

Supongo que te gusta

Origin blog.csdn.net/li209779/article/details/130545048
Recomendado
Clasificación