Prefacio
Para escribir un simple ajedrez de tres piezas en lenguaje C, primero tenemos que saber cómo se implementa en la pantalla y su estructura lógica.
Primero, este ajedrez de tres piezas se ve así en la pantalla: el
jugador da un paso , y la computadora se mueve Un paso ( este código solo puede hacer que la computadora juegue al azar, no la computadora de manera inteligente ), y finalmente juzgar al ganador o al perder.
Su estructura lógica es la siguiente:
aquí configuramos el reproductor en *, la computadora #
Explicación detallada del código
Primero, podemos crear 3 archivos: un archivo de encabezado game.h, dos archivos fuente game.c, test.c
game.h se usa para la declaración de cada función, game.c es la implementación del código de cada función, test. c es un ajedrez de tres piezas compuesto por varias funciones
juego.h
#include<stdio.h>
#define ROW 3
#define COL 3
#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 Playmove(char board[ROW][COL], int row, int col);//玩家下棋
void computermove(char board[ROW][COL], int row, int col);//电脑下棋
//判断输赢
//电脑赢 '#'
//玩家赢 '*'
//平局 '0'
//继续 'c'
int checkwin(char board[ROW][COL], int row, int col);//判断输赢
En game.h, puede declarar algunas variables como (FILA y COL) y archivos de encabezado , y la declaración de la función a definir
juego.c
Primero se necesita la referencia game.c ** # incluir "juego" donde , después de esta referencia, se puede usar game.h dentro de las definiciones de variables y funciones **
Inicializar el tablero de ajedrez
void initBoard(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
//将二维数组所有元素全部初始化为空格
board[i][j] = ' ';
}
}
}
Impresión de tablero de ajedrez
Primero, necesitamos imprimir un tablero de ajedrez como este
void DisplayBoard(char board[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
//打印数据
/*printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);*/
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
//前面将board[i][j]赋值为空格
//%c左右有两个空格,这样看起来更加美观
if (j<col - 1)
printf("|");
//第三列就不用打印|
}
printf("\n");
//打印分割的行
/*if (i<row-1)
printf("---|---|---\n");*/
if (i < row - 1)//第三行不用打印---|---|---
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
Jugador, jugar al ajedrez
void Playmove(char board[ROW][COL], int row, int col)//玩家下棋
{
printf("玩家走:>\n");
printf("请输入一个坐标\n");
int i = 0;
int j = 0;
//判断合法性
while (1)
{
scanf("%d%d", &i, &j);
if (i >= 1 && i <= row && j >= 1 && j <= col)
{
//判断棋盘位置是否有位置
if (board[i-1][j-1] == ' ')
{
//假设输入第一行第一个的坐标为(1,1),我们需要对i-1和j-1才能与二维数组的第一个元素相对应
board[i-1][j-1] = '*';
break;
}
else
printf("该出已落棋,请重新选择");
}
else
{
printf("坐标非法,请重新选择\n");
}
}
}
Ajedrez de computadora
void computermove(char board[ROW][COL], int row, int col)//电脑下棋
{
printf("电脑走:>\n");
while (1)
{
//rand可以生成一个随机数,但需要在前面引用srand函数,前面在主函数已经引用了
int x = rand() % row;
int y = rand() % col;
//x y都模3使x y的随机值为0 1 2
if (board[x][y] == ' ')
{
//判断是否有位置可以落子
board[x][y] = '#';
break;
}
}
}
Ganar o perder
int checkwin(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[2][2] == board[1][1] &&board[1][1]!=' ')
{
return board[1][1];
}
//判断对角线
if (board[1][2] == board[1][1] && board[2][1] == board[1][1] && board[1][1]!= ' ')
{
return board[1][1];
}
//若棋盘全满则返回1
//若棋盘满了,但没有一方赢,则平局,返回Q
if (full(board,row,col))
{
return 'Q';
}
//若以上条件都么有满足,则游戏继续,返回'c'
return 'c';
}
prueba.c
Finalmente, solo necesitamos empalmar las funciones definidas en la función de juego. El
jugador juega al ajedrez e imprime el tablero para determinar si gana o pierde. La computadora juega al ajedrez e imprime el tablero para determinar si gana o pierde hasta el final de el lazo.
#include<stdio.h>
//可以使用game.h上的变量
#include"game.h"
void menu()
{
printf("*******************************\n");
printf("* *\n");
printf("* 1.进入游戏 *\n");
printf("* 0.退出游戏 *\n");
printf("* *\n");
printf("* *\n");
printf("*******************************\n");
}
void game()
{
char ret = 0;
char board[ROW][COL];//初始化为空格
//初始化棋盘,初始化为空格
initBoard(board,ROW,COL);
DisplayBoard(board, ROW, COL);
//ROW行 COL列 这样定义更加灵活
while (1)
{
//玩家下棋
Playmove(board, ROW, COL);
//判断输赢
ret = checkwin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
//电脑下棋
printf("\n");
computermove(board, ROW, COL);//随机下棋
DisplayBoard(board, ROW, COL);
printf("\n");
ret = checkwin(board, ROW, COL);
if (ret != 'c')
{
break;
}
//打印棋盘
}
if (ret == '#')
printf("电脑赢了\n");
else if (ret == '*')
printf("玩家赢了\n");
else if (ret == 'Q')
printf("平局\n");
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
//打印一个菜单
menu();
printf("请选择:>\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();//三子棋游戏
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}