C language - three-piece chess

introduction

Three-piece chess, also known as tic-tac-toe, is a two-player board game. The goal of the game is to connect your pieces in a straight line on a 3x3 board, which can be horizontal, vertical or diagonal lines.

Today we will implement a simple three-piece chess game. The board has only three rows and three columns, and there is no second player. It only implements a game scenario between one player and the computer. The game is implemented in C language. In order to make the code more readable, it is divided into three parts, namely:

  1. game.h
  2. game.c
  3. Three pieces of chess.c

The relationship between the three parts is like this

 


1. Three-piece chess.c

Sanbangqi.c is some functions external to the game, which will call the contents of the game.c header file and the functions of game.c

 Game start menu: Enter 1 to start the game, enter 2 to exit the game

 The main() main function calls the test() function. In the test() function, input is the option entered by the player on the menu interface. srand is a random number created using the time.h library function. Next, the test() function uses do... ...while loop statement implements the start and end of the game

Enter 1 to start the game and enter the game() function through the case1 statement of the switch statement in the do...while statement.

 

 After entering game(), initialize the chessboard and then print the chessboard. This is of course done in game.c.

#include "game.h"


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

}

void game()
{
	char ret = 0;
	//存放下棋的数据
	char board[ROW][COL] = { 0 };
	//初始化棋盘为全空格
	Initboard(board, ROW, COL);
	//打印棋牌
	Printboard(board, ROW, COL);

	while (1)
	{
		//玩家下棋
		player_move(board, ROW, COL);
		Printboard(board, ROW, COL);

		//判断输赢
		ret = Is_win(board, ROW, COL);

		if (ret != 'C')
		{
			break;
		}

		//电脑下棋
		Computer_board(board, ROW, COL);
		Printboard(board, ROW, COL);
		//随机下棋
		ret = Is_win(board, ROW, COL);
		if (ret != 'C')
		{
			break;
		}
	}
	//判断输赢

	if (ret == '*')
	{
		printf("玩家赢了!\n");
	}
	else if (ret == '#')
	{
		printf("电脑赢了!\n");
	}
	else
	{
		printf("平局!\n");
	}
	//Printboard(board, ROW, COL);
}

//玩家赢了,游戏是不是要结束
//玩家赢 游戏结束 - '*'
//电脑赢 游戏结束 - '#'
//平局   游戏结束 - 'Q'
//继续           - 'C' 

void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));

	do
	{
		menu();
		printf("请选择 -->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
		     game();
				break;
		case 2:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误!请重新选择:");
			break;
		}
	} while (input);

}

int main()
{
	test();

	return 0;
}

2. game.c

#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 Printboard(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++)
		{
			printf(" %c ", board[i][j]);
			if(j<col-1)
				printf("|");
		}
		printf("\n");

		//打印数据
		//printf(" %c | %c | %c |", board[i][0], board[i][1], board[i][3]);
        
		if (i < row - 1)
		{
			for (j = 0;j < col;j++)
			{
				printf("---");
				if (j < col - 1)
					printf("|");
			}
			printf("\n");
		}
	}
}

//玩家下棋
void player_move(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("该坐标被占用,请重新输入");
			}
		}
		else
		{
			printf("坐标非法,请重新输入\n");
		}
	}
}

void Computer_board(char board[ROW][COL], int row, int col)
{
	int x = 0;
	int y = 0;
	printf("电脑下棋\n");
	while (1)
	{
		x = rand() % row;
		y = rand() % col;

		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
} 
static is_full(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 Is_win(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][1] !=' ')
		{
			return board[i][1];
		}
	}

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

	//判断斜线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
		return board[1][1];
	if(board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
		return board[1][1];

	//判断平局
	if (is_full(board, row, col) == 1)
		return 'Q';

	//继续
	return 'C';
}

3. game.h

#define ROW 3
#define COL 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

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

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

//玩家下棋
void player_move(char board[ROW][COL], int row, int col);

//输入棋盘中的位置
void Computer_board(char board[ROW][COL], int row, int col);

//判断输赢
char Is_win(char board[ROW][COL], int row, int col);

Guess you like

Origin blog.csdn.net/cdtu_mid/article/details/131852597