如何用c语言写一个简单三子棋——详解

前言

用c语言写一个简单的三子棋,首先我们得知道它在屏幕上是怎样实现的,还有它的逻辑构造
首先,这个三子棋在屏幕上是这样子的:
在这里插入图片描述
玩家走一步,电脑走一步(这个代码只能使电脑随机下,不能使电脑智能的下棋),最后判断输赢。
它的逻辑构造如下:
在这里插入图片描述
这里我们设定玩家下*,电脑下#

代码详细讲解

首先我们可以创建3个文件:一个头文件game.h,两个源文件game.c,test.c
在这里插入图片描述
game.h是用来各个函数的声明,game.c是各个函数的代码的实现,test.c是三子棋用各个函数组成的三子棋

game.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);//判断输赢

在game.h里可以先声明一些变量如(ROW和COL)和头文件,和要定义的函数的声明

game.c

首先需要在game.c里引用**#include “game”,引用这个后可以使用game.h里面的定义的变量和函数**

初始化棋盘

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] = ' ';
		}
	}
}

棋盘的打印

首先,我们需要打印一个这样的棋盘
在这里插入图片描述

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

玩家下棋

在这里插入图片描述


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

电脑下棋

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

判断输赢

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

test.c

最后我们只需要把各个定义好的函数在game函数里拼接好就行
玩家下棋 打印棋盘 判断输赢 电脑下棋 打印棋盘 判断输赢 直到循环结束

#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;
}
以上是博主通过自己的理解和自己组织的语言写出来的博客,如有错误,请帮忙指正,谢谢

猜你喜欢

转载自blog.csdn.net/sjp11/article/details/114852455