当前位置:网站首页>C语言实现三子棋(代码详解)

C语言实现三子棋(代码详解)

2022-08-11 05:30:00 CHAKMING1

目录

一、问题分析

二、代码流程

1.简单的菜单

2.下棋的方案

3.棋盘初始化

4.玩家下棋

5.电脑下棋

6.判定输赢

7.头文件

8.主函数

三、总结


一、问题分析

1.写一个简单的菜单界面,供用户进行选择

2.下棋的总方案,需要实现哪些具体的步骤

3.就是将我们的棋盘进行初始化

4.玩家进行下棋的方式

5.电脑进行下棋的方式

6.判断电脑和玩家谁获胜

二、代码流程

1.简单的菜单

只有简单的两个功能,输入1是开始玩游戏,输入0是退出游戏

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

void test()
{
	int input = 0;
	// 菜单
	do {
		menu();
		printf("请输入:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出成功\n");
			break;
		default:
			printf("输入错误,请按照规定范围输入\n");
			break;
		}
	}while(input);
}

2.下棋的方案

// 游戏总方案
void game()
{
	// 棋盘的创立
	char board[ROW][COL] = { 0 };

	// 初始化棋盘
	init_Board(board, ROW, COL);

	// 打印棋盘
	Print_Board(board,ROW,COL);
    
    // 游戏开始
	while (1)
	{
		// 玩家输入
		printf("玩家输入\n");
		Player_move(board, ROW, COL);
		Print_Board(board, ROW, COL);
		//判断胜利条件
		if (Win_Name(board, ROW, COL) == '*') { // 返回值为1,说明玩家胜利
			printf("恭喜你赢了\n");
			break;
		}
		if (Board_Max(board, ROW, COL) == 1){ // 判断棋子是否满了
			printf("真菜!还打成平手\n");
			break;
		}
		// 电脑输入
		printf("电脑输入.............................\n");
		Sleep(1000);  //延迟1秒
		Computer_move(board, ROW, COL);
		Print_Board(board, ROW, COL);
		if (Win_Name(board, ROW, COL) == '#') { // 返回值为#,说明电脑胜利
			printf("真菜!人机都打不过\n");
			break;
		}
		if (Board_Max(board, ROW, COL) == 1) { // 判断棋子是否满了
			printf("真菜!还打成平手\n");
			break;
		}
	}
}

3.棋盘初始化

建立一个二维数组作为棋盘,这一步骤是将棋盘的值先初始化为空格,然后再设置一个样式。

// 棋盘初始化,将所有值设置为空格
void init_Board(char board[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
		for (int j = 0; j < col; j++)
			board[i][j] = ' ';
	printf("\n");
}

// 打印棋盘,为棋盘设置一个好看的样式
void Print_Board(char board[][COL],int row,int col) {
	printf("+---+---+---+\n");
	for (int row = 0; row < ROW; row++) {
		printf("| %c | %c | %c |\n", board[row][0],board[row][1], board[row][2]);
		printf("+---+---+---+\n");
	}
	printf("\n");
}

4.玩家下棋

这一步骤让玩家通过输入来确认在哪个位置下棋,判断这个位置是否合理,如不合理让玩家重新输入。

// 玩家下棋
void Player_move(char board[][COL], int row, int col)
{
	while (1)
	{
		// 定义坐标
		int x = 0; // 行
		int y = 0; // 列
		printf("输入方法:行 列 \n");
		printf("请输入您的坐标(row,col):> ");
		scanf("%d %d", &x, &y);
		// 判断这个坐标是否在合理范围,行和列均从1开始
		if (x >= 0 && x <= row && y >= 0 && y <= col)
		{
			if (board[x-1][y-1] != ' ')
				printf("此位置已有棋子,无法下棋\n");
			else
			{
				board[x-1][y-1] = '*'; // *号代表是玩家下的棋
				break;
			}
		}
		else 
			printf("您输入的坐标不合理,请重新输入\n");
	}
}

5.电脑下棋

这一步骤是通过一个传入一个随机值来让电脑进行随机下棋。

// 电脑输入
void Computer_move(char board[][COL], int row, int col)
{
	while (1)
	{
		int x = rand() % (row+1);
		int y = rand() % (col+1);
		//检查电脑下棋的位置是否有棋子
		if (board[x - 1][y - 1] != ' ')
			continue;
		board[x - 1][y - 1] = '#'; // # 为电脑下棋
		break;
	}
}

6.判定输赢

三子棋游戏的输赢是看数组中横、竖、斜的字符是否相等,如果相等就传回其中一个值。如果棋盘已满,则为平手。

// 判断谁胜利
char Win_Name(char board[][COL], int row, int col)
{
	// 胜利条件是横排或者竖排或者斜对角线都是相同符号,满足其中一个条件即可
	// 玩家胜利
	int i, j = 0;
	// 判断横排是否相等
	for (i = 0; i < row; i++)
	{
		if (board[i][0] != ' ' && board[i][0] == board[i][1] && board[i][1] == board[i][2]) {
			return board[i][0];
		}
	}
	// 判断竖排是否相等
	for (i = 0; i < col; i++) {
		if (board[0][i] != ' ' && board[0][i] == board[1][i] && board[1][i] == board[2][i]) {
			return board[0][i];
		}
	}
	// 判断左斜线是否相等
	if (board[0][0] != ' ' && board[0][0] == board[1][1] && board[1][1] == board[2][2]) {
		return board[0][0];
	}
	// 判断右斜线是否相等
	if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[1][1] == board[2][0]) {
		return board[1][1];
	}
	return 0;
}
// 判断是否棋满
int Board_Max(char board[][COL], int row, int col)
{
	int i, j;
	int count = 0;
	for (i = 0; i < row; i++)
	{
		for (j = 0; j < col; j++)
			if (board[i][j] != ' ')
				count++;
	}
	if (count == row * col)
		return 1;
	return 0;
}

7.头文件

#include <stdio.h>
#include <time.h> // 包含 time
#include <stdlib.h>  // 包含 rand、srand
#include <Windows.h> // 包含 Sleep

// 棋盘大小的初始值设置
#define ROW 3
#define COL 3

// 棋盘初始化
void init_Board(char board[][COL],int row,int col);
// 打印棋盘
void Print_Board(char board[][COL], int row, int col);
// 玩家输入
void Player_move(char board[][COL], int row, int col);
// 电脑输入
void Computer_move(char board[][COL], int row, int col);
// 判断谁赢了
char Win_Name(char board[][COL], int row, int col);
// 判断是否棋盘
int Board_Max(char board[][COL], int row, int col);

8.主函数

int main() 
{
	srand((unsigned int)time(NULL)); // 设置随机数
	test();
	return 0;
}

三、总结

进行一个大工程的代码实现,最好就是先理清思路,设计好一个总方案以及具体需要实现的步骤,才能把复杂问题变成简单问题。再写这篇代码之前,可以先看了别人写的代码,了解后再用自己擅长的方式进行填写。

原网站

版权声明
本文为[CHAKMING1]所创,转载请带上原文链接,感谢
https://blog.csdn.net/CHAKMING1/article/details/122629609