搜索
简帛阁>技术文章>C语言实现三子棋(代码详解)

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

目录

一、问题分析

二、代码流程

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;
}

三、总结

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

目录一、问题分析二、代码流程1简单的菜单2下棋的方案3棋盘初始化4玩家下棋5电脑下棋6判定输赢7头文件8主函数三、总结一、问题分析1写一个简单的菜单界面,供用户进行选择2下棋的总方案,需要实现哪些具体
目录声明多文件代码实现及讲解maincchesshchesscInitBoard()ShowBoard()PlayerMove()ComputerMove()JudgeResult()Game()知识
大家好,我是诚挚的乔治前言:本次蛇形矩阵我将以两种方法来实现,即非递归和递归非递归的实现:defineright1definedown2defineleft3defineup4definen5//控制
本文仅实现游戏运行,电脑下棋由随机数控制。目录主函数(testc文件游戏开始界面设计游戏运行逻辑(不具体解释函数的实现头文件(gameh及游戏函数文件(gamec初始化空棋盘函数棋盘打印函数玩
我是半自主的完成了这个程序,看了B站鹏哥视频并仔细思索后才做出来的,我没有完全采用他的方法,导致程序还有一些不足之处,还请各位大佬指出。首先,我将该程序的实现分为3个板块,main,gameh,和ga
选择排序是排序算法的一种,这里以从小到大排序为例进行讲解。基本思想及举例说明选择排序(从小到大的基本思想是,首先,选出最小的数,放在第一个位置;然后,选出第二小的数,放在第二个位置;以此类推,直到
三子棋一、问题描述二、基本流程三、步骤1菜单界面2创建棋盘3棋盘初始化4打印棋盘(1)简陋方法:(2)美观方法:5玩家落子6电脑落子7判断胜负四、结果演示1玩家胜利2电脑胜利3和棋五、代码实现一、问题
文章目录声明多文件三子棋游戏实现讲解testcgamehgamecINITBUF()DisplayBuf(PlayerMova(ComputerMove()whowin()game(完整的代码
三子棋1问题描述使用c语言程序实现三子棋2基本流程1设置菜单界面2创建棋盘并初始化3打印棋盘4玩家落子5判定胜负关系6电脑落子7判定胜负关系8回到步骤2继续执行3结果演示结果:4代码实现在这里插入代码
1先来讲讲三子棋的基础流程1创建莱单2创建数组3初始化数组4打印棋盘5玩家落子用坐标的方式来下棋,代表玩家6实现判定输赢,Q等于平局,代表玩家赢,7用随机的方式来实现电脑移动,*号代表电脑的棋子8判定