Tabla de contenido
2. Implementación de la función de juego
2.1 Inicializar el tablero de ajedrez
2.2 Mostrar el tablero de ajedrez
2.3 Los jugadores juegan al ajedrez
2.6 Determinar si el tablero está lleno
Prefacio:
Para poder realizar los tres ajedrez, primero debemos escribir el código en módulos, estamos divididos en 3 partes
1. test.c — probar el juego (función principal) 2. game.c realizar parte del código del juego 3. declaración de la función game.h, definición de macro, etc.
1. Impresión del menú
Impresión del menú:
Para la comodidad de jugar, podemos configurar un menú e imprimirlo cada vez que jugamos, para facilitar al jugador la experiencia del juego. La implementación es la siguiente:
El jugador elige "1" - jugar
El jugador selecciona "0" - sale del juego
El jugador elige otro número: indica que la elección es incorrecta y vuelve a elegir
Implemente el número de selección para jugar:
1. ¿Cómo jugar un juego tras otro y salir del juego si no quieres jugar?
Podemos usar el bucle do-while para configurar el bucle para determinar el valor de la entrada, de modo que podamos salir del juego solo cuando la entrada sea 0
2. ¿Cómo elegir 1 para jugar el juego, elegir 0 para salir del juego y elegir otros números para indicar la elección incorrecta ?
Podemos usar la instrucción switch-case dentro del ciclo do-while
el código se muestra a continuación:
2. Implementación de la función de juego
2.1 Inicializar el tablero de ajedrez
Lo que escribimos aquí es el código de ajedrez tridimensional, tres filas y tres columnas, podemos usar una matriz bidimensional para imprimir
Podemos atravesar esta matriz bidimensional e inicializar los 9 elementos en ella a espacios
código:
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] = ' ';
}
}
}
2.2 Mostrar el tablero de ajedrez
Dado que inicializamos cada elemento de la matriz bidimensional anterior en un espacio, si solo lo imprimimos para que el jugador juegue, la experiencia será muy mala, por lo que utilizaremos los siguientes métodos para optimizar la visualización de nuestro tablero para la comodidad del jugador Jugar
En el rectángulo azul de arriba:
Podemos agrupar tres espacios (datos en el medio, espacios a ambos lados) y las barras verticales detrás de él en un grupo, y hay tres grupos en esta línea
Nota: nuestro último grupo no tiene una barra vertical (|), por lo que debemos controlarlo por separado
En el cuadro rectángulo amarillo de arriba:
Agrupamos tres líneas horizontales y una línea vertical en 1 grupo, y una línea también son tres grupos, y la última línea es la misma
Código:
Resumen: a través del análisis anterior, podemos ver que por cada línea de tablero de ajedrez impresa, en realidad tenemos dos líneas de control de formato de tablero de ajedrez, por lo que podemos considerar los cuadros azul y amarillo como un grupo, hay tres grupos en total, y el último grupo No imprimir líneas horizontales
void DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//1. 打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
//2. 打印分割线
if (i < row - 1)
{
//printf("---|---|---\n");
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}
2.3 Los jugadores juegan al ajedrez
Una matriz bidimensional con tres filas y tres columnas. El rango del subíndice de la fila y la columna es de 0 a 2. Es posible que el jugador no sepa la naturaleza de la matriz, y el subíndice de la matriz puede exceder el límite. En este momento , necesitamos ingresar las coordenadas horizontales y verticales del jugador. disminuir en 1
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋>:\n");
while (1)
{
printf("请输入下棋的坐标,中间使用空格>:");
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");
}
}
}
2.4 Ajedrez informático
Al jugar al ajedrez con una computadora, podemos usar la función de generar números aleatorios, de modo que los números aleatorios generados % fila y % columna sean un subíndice de matriz aleatoria bidimensional
El uso de la función de generar números aleatorios se presentó en mi blog anterior. Si está interesado, ¡puede aprenderlo!
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x = 0;//0~row-1
int y = 0;//0~col-1
printf("电脑下棋:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
2.5 Juzgar Ganar o Perder
Esta función necesita realizar las siguientes 4 situaciones
1. El jugador gana
2. La computadora gana
3. Dibujar
4. Si no se cumple ninguna de las condiciones anteriores, continúe
Tres casos de victoria
1. Aparecen tres símbolos idénticos en cada fila 2. Aparecen tres símbolos idénticos en cada columna 3. Aparecen tres símbolos idénticos en diagonal
dibujar:
Implemente una función para juzgar si el juego es un empate, y llámela en la función de juzgar si el juego se gana o se pierde.
char IsWin(char board[ROW][COL], int row, int col)
{
//赢
//行
int i = 0;
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) == 1)
{
return 'Q';
}
//继续
return 'C';
}
2.6 Determinar si el tablero está lleno
Recorra la matriz para ver si hay un elemento o un espacio, si lo hay, devuelva 0, si no, significa que el tablero está lleno, devuelva 1
Nota: El número devuelto aquí se devuelve a la declaración de juicio condicional de la función de ganar o perder del juicio
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
3. Todo el código
3.1 juego.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//初始化棋盘
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);
3.2 juego.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//初始化棋盘为空格
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 DisplayBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
//1. 打印数据
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");
//2. 打印分割线
if (i < row - 1)
{
//printf("---|---|---\n");
int j = 0;
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 x = 0;
int y = 0;
printf("玩家下棋>:\n");
while (1)
{
printf("请输入下棋的坐标,中间使用空格>:");
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)
{
int x = 0;//0~row-1
int y = 0;//0~col-1
printf("电脑下棋:>\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
//判断棋盘是否已满
int IsFull(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++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
char IsWin(char board[ROW][COL], int row, int col)
{
//赢
//行
int i = 0;
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) == 1)
{
return 'Q';
}
//继续
return 'C';
}
3.3 prueba.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("*****************************\n");
printf("******** 1. play *********\n");
printf("******** 0. exit *********\n");
printf("*****************************\n");
}
void game()
{
char board[ROW][COL] = {0};
InitBoard(board, ROW, COL);
//打印棋盘
DisplayBoard(board, ROW, COL);
//下棋
char ret = 0;
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 input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:>");
scanf("%d", &input);//1 0 4
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}
} while (input);
return 0;
}
Si cree que el artículo es bueno, espero su enlace triple de un clic. Su aliento es la fuente de motivación para mi creación. ¡Trabajemos juntos y nos vemos en la cima! ! !