C语言简易版三子棋游戏的实现(超详细版)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

知不足而奋进,望远山而前行。

今天让我们来学习一下C语言实现简易版三子棋游戏。

一、三子棋游戏介绍

《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。

二、游戏大致实现过程

想用C语言来实现三子棋游戏,首先我们要创建三个文件,一个头文件:game.h  两个源文件:game.c test.c

这里我们给大家介绍一下在三子棋这个游戏里面,每个文件是做什么的呢?
(1)头文件game.h,头文件里是用来存放函数的声明,#define常量的定义,库函数的引用
(2)源文件test.c,这个文件里面放的是游戏的测试逻辑
(3)源文件game.c,这个文件里面放的是游戏的实现逻辑,用于函数实现
 

三、游戏的具体实现过程

 3.1游戏菜单的生成

首先,我们都知道,一个游戏,最起码要存在一个游戏的菜单,以便让玩家更好的去进入这个游戏进而去玩这个游戏,所以,我们先创建一个游戏菜单,不用过于花哨,简便一些即可。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void menu()    //游戏菜单
{
	printf("******************************\n");
	printf("**********  1.play  **********\n");
	printf("**********  0.exit  **********\n");
	printf("******************************\n");
}
void game()//实现玩游戏的函数,这里我们先不去写出来,便于游戏菜单的观看
{

}
int main()
{
	int input = 0;   
     do   //这里我们利用do-while循环可以便于用户进行多次游戏
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戏!\n");
			break;
		default:
			printf("选择错误,重新选择!\n");
			break;
		}
	} while (input);//根据do-while的特性,若输入0,则游戏结束
	return 0;
}

 通过以上代码,我们便构建出来一个大致的游戏菜单,这里建议大家代码到这一步时,先去检测一下是否存在错误,便于之后代码的进行。

3.2游戏过程的逐步实现

生成游戏菜单之后,我们便可以进一步去思考这个游戏的一步步的实现过程

3.2.1初始化游戏键盘

#pragma once
# define ROW 3 //在此对游戏键盘的大小进行规定,便于后来的修改
# define COL 3

void InitBoard(char board[ROW][COL],int row,int col);


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

//test.c
void game()
{
	//最开始的时候数组的内容全是空格,进而达到初始化这一个目的
	char board[ROW][COL]; 
	InitBoard(board, ROW, COL);
}

 当然这只是一个简单的初始化,我们还要让其变得更加的美观

像这样:

void DisplayBoard(char board[ROW][COL],int row,int col)
{
	int i = 0,j=0;
	for (i = 0; i < row; i++) {
		for ( j = 0; j < col; j++) {
			//打印数据
			printf(" %c ", board[i][j]);
			//打印分割信息
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < col; j++) {
				printf("---");
				if(j<col-1)
				printf("|");
			}
			printf("\n");
			}
	}
}

通过上面这串代码,我们便可达到那样一个效果,下面,我们再进一步进行下面的实现。

3.2.2玩家棋子的规定及实现

我们规定玩家的棋子为'*',代码实现为:

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

3.2.3电脑的棋子及实现

为了区分玩家与电脑的棋子,我们规定电脑的棋子为'#',下面我们来看一下如何实现:

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	printf("电脑下棋:>\n");
	while (1) {
		x = rand() % row;//生成的随机数已经是0~2了
		y = rand() % col;
		if (board[x][y] == ' ') 
		{
			board[x][y] = '#';
			break;
		}
	}
}

在此我们要知道如何去随机生成一个位置,来让电脑去下棋,在此我们利用的是rand函数,同时要记住在使用rand函数时要求的头文件及调用srand函数

下面我们通过几行简单的代码看一下rand函数如何使用

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main() {
    // 使用当前时间作为种子
    srand((unsigned int)time(NULL));

    // 生成并打印 5 个随机数
    for (int i = 0; i < 5; i++) {
        printf("%d\n", rand());
    }

    return 0;
}

不要去认为这个代码过于简单,记住,多难得事情都要从0做起,多难得知识也应该从一个个小的知识点去开始

3.2.4 判断输赢

这里我们规定一下玩家或电脑输赢的不同返回值

首先游戏的结束一定分为三种情况:

1玩家赢  我们规定返回值为’*‘

2电脑赢 我们规定返回值为’#‘

3平局  我们规定返回值为’Q‘

4我们在游戏中还需去判断游戏是否结束,这里我们利用’C‘

int IsFull(char board[ROW][COL], int row, int col) {
	int i = 0,j=0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}

//找出获胜者
//电脑玩家or平局
//玩家 -'*'
//电脑-’#‘
//平局-'Q'
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0; int j = 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 (j = 0; j < col; j++) {
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') {
			return board[1][j];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') {
		return board[1][1];
	}
	//没有人赢,就要平局
	if (IsFull(board, row, col))
	{
		return 'Q';
	}
	return 'C';
}

同时,我也将几种情况展示给大家:

1玩家胜利:

2.电脑胜利:

3.平局:

这便是所有情况的展示

四.三子棋游戏实现的完整代码(详细代码)

4.1game.h

#pragma once
#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
#include<time.h>
#include<stdlib.h>

#define ROW 3
#define COL 3

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

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

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

//电脑下棋
//找空白的位置随机下棋
void ComputerMove(char board[ROW][COL], int row, int col);

//获胜者
char IsWin(char board[ROW][COL], int row, int col);

int IsFull(char board[ROW][COL], int row, int col);

4.2game.c

#include"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,j=0;
	for (i = 0; i < row; i++) {
		for ( j = 0; j < col; j++) {
			//打印数据
			printf(" %c ", board[i][j]);
			//打印分割信息
			if (j < col - 1)
			{
				printf("|");
			}
		}
		printf("\n");
		if (i < row - 1)
		{
			int j = 0;
			for (j = 0; j < col; j++) {
				printf("---");
				if(j<col-1)
				printf("|");
			}
			printf("\n");
			}
	}
}

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

void ComputerMove(char board[ROW][COL], int row, int col)
{
	int x = 0, y = 0;
	printf("电脑下棋:>\n");
	while (1) {
		x = rand() % row;//生成的随机数已经是0~2了
		y = rand() % col;
		if (board[x][y] == ' ') 
		{
			board[x][y] = '#';
			break;
		}
	}
}


int IsFull(char board[ROW][COL], int row, int col) {
	int i = 0,j=0;
	for (i = 0; i < row; i++) {
		for (j = 0; j < col; j++) {
			if (board[i][j] == ' ') {
				return 0;
			}
		}
	}
	return 1;
}

//找出获胜者
//电脑玩家or平局
//玩家 -'*'
//电脑-’#‘
//平局-'Q'
char IsWin(char board[ROW][COL], int row, int col)
{
	int i = 0; int j = 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 (j = 0; j < col; j++) {
		if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ') {
			return board[1][j];
		}
	}
	//对角线
	if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
	{
		return board[1][1];
	}
	if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') {
		return board[1][1];
	}
	//没有人赢,就要平局
	if (IsFull(board, row, col))
	{
		return 'Q';
	}
	return 'C';
}

4.3test.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);
	//打印棋盘
	DisplayBoard( board, ROW, COL);

	while (1) {
		PlayerMove(board, ROW, COL);
		//判断输赢
		ret = IsWin(board, ROW, COL);

		if (ret != 'C') {
			break;
		}
		DisplayBoard(board, ROW, COL);
		ComputerMove(board, ROW, COL);

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

		if (ret != 'C') {
			break;
		}
		DisplayBoard(board, ROW, COL);
	}
		if (ret == '*') {
			printf("平局\n");
		}
		else if (ret == '#') {
			printf("平局\n");
		}
		else {
			printf("平局\n");
		}
		DisplayBoard(board, ROW, COL);
	
}


int main() {
	srand((unsigned)time(NULL));//设置随机数的生成起点。
	int input = 0;
	do {
		menu();//打印菜单
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("---三子棋游戏---\n");
			game();
			break;
		case 0:
			printf("成功退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择\n");
			break;
		}
	} while (input);  //input为非0就继续,为0就结束
	return 0;
}

总结

以上便是C语言简易版三子棋游戏的代码了,同时,这个游戏还可以有更好的想法,比如能否建立三个难度(简单,正常,困难),当然,我们要在弄懂这些的基础上才能进一步的去探索。同时也欢迎大家找我来探讨。

  • 36
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值