基于C语言 --- 自己写一个三子棋小游戏

这篇具有很好参考价值的文章主要介绍了基于C语言 --- 自己写一个三子棋小游戏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初阶三子棋小游戏(开源)

前言:
游戏规则:
(1)、在打印的数组棋盘里,输入坐标,下棋。
(2)、坐标格式:x(空格) y
(3)、x横坐标,y竖坐标
(4)、连成三个棋子为一线则判定胜利
如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

采用模块化编写
arr_game1.c执行主要逻辑程序
arr_game1.h存放头文件或函数声明等程序
arr_main.c放主函数逻辑程序

1、arr_main.c程序大纲

首先,从以往玩游戏的经验来谈,我们需要为游戏写一个游戏开始菜单,由玩家选择是否开始游戏。
这里可以借助所学的menu( )自定义函数,设计一个简易的菜单

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

当我们选择1,则开始游戏;当选择0,则退出游戏。
那么就得思考,如何对玩家得选择进行判定
1.利用 scanf( ) 函数获取输入值,将获取的值,借用 do while 循环语句和switch( )选择语句,进行下一步。
2.当选择1,开始游戏则执行game()自定义,游戏主逻辑执行程序
3.当选择0,switch中 进入case 0 : 的入口,执行退出游戏,并且 do while( ),判定为0,则退出程序
4.当玩家误选择非法数值,则default : 提示玩家输入错误

int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("\n*********** 三子棋游戏开始 *************\n\n");
			game();//游戏执行逻辑函数
			break;
		case 0:
			printf("\n退出游戏\n");
			break;
		default:
			printf("\n选择错误请重新选择\n\n");
			break;
		}

	} while (input);

接下来,主要阐述game( )函数内容,游戏的执行逻辑
1.当玩家选择1,开始游戏后,会显示整个空棋盘
如何实现空棋盘的显示呢?
(1)、利用所学的数组知识可以联想到,棋盘不过是由一个个字符拼接而成,在需要下棋的地方,放置空格字符进行占位,达到肉眼所见的空棋盘。
(2)、又因为棋盘是一个平面,平面由一条条线组成,线又由一个个点组成,首先得定义和初识化一个二维数组 board[ROW][COL] ,由几行几列的方式实现一个面的显示/打印
(3)、自定义初识化函数 InitBoard( ) ,自定义显示棋盘函数 DisPlayBoard( ) ;
(4)、函数的参数,可想而知,需要数组名(board) — 首元素的地址指定需操作的数组,需要行(ROW)和列(COL)指定操作的元素或坐标或地址;

void game()
{
	//定义棋盘大小
	char board[ROW][COL] = { 0 };
	//初识化棋盘
	InitBoard(board,ROW,COL);
	//显示棋盘
	DisPlayBoard(board, ROW, COL);
	
}

2.当我们完成棋盘的初识化和显示后,那么默认玩家先下棋,电脑再下棋;
所以就得写一个玩家下棋的自定义逻辑函数和电脑下棋的自定义函数,交替下棋直到游戏判定输赢或平局
(1)、玩家下棋自定义函数 PlayerMove( ) ;
(2)、电脑下棋自定义函数 ComputerMove( ) ;
(3)、判断输赢函数 IsWin( );
那么很容易思考到,交替进行下棋,就是反复的调用玩家下棋函数和电脑下棋函数,同时不停的判断每一步棋是否达到输赢的结果。所以需要一个循环来实现,这里就用while循环,实现不停的下棋。
但是,不停的下棋,始终在死循环,那么就思考利用,break跳出循环,所以 IsWin( )函数是具备返回值的,可以由IsWin( )函数的返回值进行判定跳出。 且由于棋局均有字符进行的操作,所以确定了 IsWin( )数据类型也为 char 类型。
(4)、IsWin( )跳出循环的返回值判定
a、玩家获胜 - - - - ‘ * ’
a、电脑获胜 - - - - ‘ # ’
a、平局 - - - - ‘ Q ’
a、游戏继续 - - - - ‘ C ’

//游戏执行逻辑函数
void game()
{
	//定义棋盘大小
	char board[ROW][COL] = { 0 };
	//初识化棋盘
	InitBoard(board,ROW,COL);
	//显示棋盘
	DisPlayBoard(board, ROW, COL);
	//根据IsWin()返回值,判断输赢
	char ret = 0;
	//下棋
	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玩家赢\n\n");
	else if (ret == '#')
		printf("\n电脑赢\n\n");
	else
		printf("\n平局\n\n");
	//显示棋局
	DisPlayBoard(board, ROW, COL);
}

arr_main.c程序大纲展示

#include "arr_game1.h"

//游戏菜单
void menu()
{
	printf("****************************************\n");
	printf("************** 1.play game *************\n");
	printf("************** 0.game over *************\n");
	printf("****************************************\n");
}
//游戏执行逻辑函数
void game()
{
	//定义棋盘大小
	char board[ROW][COL] = { 0 };
	//初识化棋盘
	InitBoard(board,ROW,COL);
	//显示棋盘
	DisPlayBoard(board, ROW, COL);
	//根据IsWin()返回值,判断输赢
	char ret = 0;
	//下棋
	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玩家赢\n\n");
	else if (ret == '#')
		printf("\n电脑赢\n\n");
	else
		printf("\n平局\n\n");
	//显示棋局
	DisPlayBoard(board, ROW, COL);
}

int main()
{
	srand((unsigned int)time(NULL));//初识化随机值生成器
	int input = 0;
	do
	{
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("\n*********** 三子棋游戏开始 *************\n\n");
			game();//游戏执行逻辑函数
			break;
		case 0:
			printf("\n退出游戏\n");
			break;
		default:
			printf("\n选择错误请重新选择\n\n");
			break;
		}

	} while (input);
	return 0;
}

2、arr_game1.h

用于存放所自定义的函数和头文件等声明的程序
通俗易懂,就不多赘述,详见代码注释的说明。

#include <stdio.h>
#include <time.h>//调用time函数,所需声明的头文件
#include <stdlib.h>//调用srand和rand函数,所需声明的头文件

//宏定义棋盘大小
#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);

3、arr_game1.c

用于存放对 arr_main.c 程序大纲做提到的函数进行封装,实现具体的功能的程序
说明:基于arr_main.c 程序大纲逻辑对代码进行讲解
注意:这里均以3*3的棋盘为例哦

3.1、 自定义初识化函数 InitBoard( ) 和 自定义显示函数 DisPlayBoard( )

首先,根据需求我们需要一个棋盘才可以正常的下棋.
如何让棋盘初识化呢?
1.根据所学的二维数组知识,便可以知道,当我们遍历二维数组的每一个元素,使得填充为空格字符,便可以由InitBoard( ) 达到效果。

//初识化棋盘
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] = ' ';
		}
	}
}

如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏
如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

2.但是,这样的棋盘全是空格字符,只有程序员可见字符空格,玩家并不知道,所以将对棋盘进行修饰美化,使得大众化。所以借助 DisPlayBoard( ) 达到修饰棋盘的效果。
这里使用一些分隔符,将棋盘划分出,三组,并且数组元素加分隔符为一组。

//打印棋盘
void DisPlayBoard(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++)
		{
			printf(" %c ",board[i][j]);
			printf("|");
		}
		printf("\n");//每行打印完换行
	}
	printf("\n");
}

如图所示:
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

但是目前的效果达不到理想的棋盘效果,导致最后一组的分隔符,也被打印了出来。
所以思考可知:由 if (j < col - 1) 进行判断让最后一行的分割符被约束不打印出来。
然后打印完一行,换行一次
同理,每一列打印完,使用 if (i < row - 1) 使得最后一列的分隔符不被打印出来
所以优化后得到以下代码:

//打印棋盘
void DisPlayBoard(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++)
		{
			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");//每行打印完换行
		}
	}
	printf("\n");
}

如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏
棋盘显示最终效果如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

3.2、 自定义玩家下棋函数 PlayerMove( )

1.首先,我们下棋,需要给棋子一个坐标,并且需要以作为玩家的角度,思考坐标的取值范围。因为玩家不一定知道数组的下标从0开始,所以我们定义 x,y 坐标变量,使得 if (x >= 1 && x <= row && y >= 1 && y <= col )//符合玩家下棋坐标的逻辑
2.当我们坐标符合了范围,还得判定玩家输入错误坐标超出范围时,给予提示信息,超出范围,重新输入。
3.当玩家输入坐标范围正确,但是此时的坐标处已经被上一步棋子占用时,也得提示重新输入。

//玩家下棋
void PlayerMove(char board[ROW][COL], int row, int col)
{
	//定义下棋的坐标
	int x = 0;
	int y = 0;
	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坐标被占用,请重新输入坐标\n");
			}
		}
		else 
		{
			printf("\n坐标超出棋盘范围,请重新输入棋子,坐标\n");
		}
	}
}

如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

3.4、 自定义电脑下棋函数 ComputerMove( )

1.下棋的逻辑与玩家如出一辙,不多赘述。
2.这里强调一下,电脑如何实现产生随机的坐标下棋?
首先,在之前的篇章链接: link 里提到的srand函数与rand函数的应用原理相同。通过初识化srand随机值生成器函数,提供变化的随机值范围,给rand随机值函数,将rand()%row 和 rand()%col,就可以得到符合范围的数组元素坐标。
然后根据srand的参数要求,放一个时刻变化的数据,这里就用到了time时间转换函数,相互作用即可。

查阅资料文档的具体参数:
void srand( unsigned int seed ); 头文件 <stdlib.h>
int rand(void ); 头文件 <stdlib.h>
time_t time( time_t *timer ); 头文件 <time.h>

所以得到:

srand((unsigned int)time(NULL));
x = rand() % row;
y = rand() % col;

注意:srand只需要整个工程初识化一次即可

//电脑下棋
void ComputerMove(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;
		}
	}
}

如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

3.5、 输赢判断函数 IsWin( )

由arr_main.c程序大纲提到的思路可知:
如何判定输赢:
玩家赢 — ‘*’
电脑赢 — ‘#’
平局 ---- ‘Q’
继续游戏 — ‘C’
所以可以明确 IsWin( ) 的返回值类型为char字符型

根据三子棋的游戏规则,三个棋子连城一线即可判定获胜,所以有:
(1)、一行三个棋子
(2)、一列三个棋子
(3)、对角线三个棋子
那么如何判定平局呢?
顾名思义,当我们的棋盘被占用完,还是没有连成一线,则判定为平局。
这里利用 int IsFull( )函数,遍历判断数组每个元素是否已用完即可,当返回0,则仍然有空位,继续游戏;当返回1,则所有元素均被占用且未连成一线,判定为平局。


//判断输赢
//玩家赢 --- '*'
//电脑赢 --- '#'
//平局 ---- 'Q'
//继续游戏 --- 'C'
int Isfull(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++)
		{
			if (board[i][j] == ' ')
			{
				return 0;//棋盘没满
			}
		}
	}
	return 1;//满了
}

char IsWin(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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];//*/#
	}
	//判断平局
	int ret = Isfull(board, ROW, COL);
	if (ret == 1)//棋盘无空位,平局
	{
		return 'Q';
	}
	//以上所有情况不满足时,继续游戏
	return 'C';
}

输赢结果如图所示
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏
基于C语言 --- 自己写一个三子棋小游戏,C语言基础,c语言,开发语言,C语言写三子棋,开源小游戏,三子棋,二维数组,三子棋小游戏

4、结束语

相信通过这样一个三子棋的小游戏,更具掌握了对数组的操作以及对自定义函数的深刻认识;
如果觉着文章对您有所帮助,请不要吝啬的一赞三连哦,谢谢阅读,不足之处还请多多指教。

三子棋源码获取链接: 三子棋文章来源地址https://www.toymoban.com/news/detail-626508.html

到了这里,关于基于C语言 --- 自己写一个三子棋小游戏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言三子棋小游戏--数组的应用

    注:在最后面,完整源码会以两种形式展现。在讲解时,以三个源文件的形式。 前言:三子棋,顾名思义,就是三个子连在一起就可以胜出。在本节我们要介绍的三子棋模式是这样子的:在键盘输入坐标(表示落子),和电脑对下(当前电脑设计为随机下)。 我们先看游戏

    2024年02月13日
    浏览(38)
  • c语言项目——三子棋小游戏(带详细讲解解析)

    三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时候会出现和棋的局面。 两个玩家,一个打圈(◯),一个打

    2024年02月09日
    浏览(44)
  • C语言经典小游戏之三子棋(超详解释+源码)

    “纵有疾风来,人生不言弃,风乍起,合当奋意向此生。” 今天我们一起来学习一下三子棋小游戏用C语言怎么写出来? 《三子棋》是一款古老的民间传统游戏,又被称为黑白棋、圈圈叉叉棋、井字棋、一条龙、九宫棋等。游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子

    2024年02月14日
    浏览(45)
  • 小游戏:人生中写的第一个小游戏——贪吃蛇(C语言)

            小编开了一个关于游戏的专栏,主要是运用easyx图形库进行的。        第一章:人生中写的第一个小游戏——贪吃蛇(C语言)         这个游戏的代码我在gitee上发布了,大家如果不嫌弃,可以进入这个网址进行查看和复制:https://gitee.com/rising-sun-1。      

    2024年02月09日
    浏览(57)
  • 趣味益智小游戏 三子棋+五子棋 优化版(可任意选择棋盘大小)

    今天牛牛给大家分享的是c语言实现三子棋和五子棋游戏,初学者可能有些不理解的地方,记得私信提问哦,牛牛会一 一回答的。 《三子棋》是一款益智小游戏,通常是在九宫格里面玩,所以也被称为”九宫棋“或”井字棋“。 游戏规则也极其简单,只要三子相连即可获胜。

    2024年01月19日
    浏览(49)
  • 基于C#制作一个贪吃蛇小游戏

    基于C#制作一个贪吃蛇小游戏,简单耐玩,操作简单。

    2024年02月08日
    浏览(48)
  • 【C语言】做一个贪吃蛇小游戏,完整代码&附带视频演示

    视频演示: https://www.bilibili.com/video/BV1pt421a7Nu/?spm_id_from=333.999.0.0vd_source=82b65865be0947de29bd55efc8cdb40a 编译环境:linux(Vmware16.2.4 + Ubantu20.04.3); 小蛇🐍只能在固定的范围内活动; 可以利用键盘方向键控制小蛇🐍的前进方向; 活动范围内会随机生成食物; 小蛇🐍吃到食物,身

    2024年02月21日
    浏览(43)
  • 一篇文章教会你写一个贪吃蛇小游戏(纯C语言)

    实现基本的功能 : • 贪吃蛇地图绘制 • 蛇吃⻝物的功能(上、下、左、右⽅向键控制蛇的动作) • 蛇撞墙死亡 • 蛇撞⾃⾝死亡 • 计算得分 • 蛇⾝加速、减速 • 暂停游戏 Win32 API是一套由Microsoft提供的应用程序编程接口,用于开发Windows平台上的应用程序。它包括了丰

    2024年01月22日
    浏览(49)
  • 基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】

    俄罗斯方块,一款起源于上世纪80年代的经典电子游戏,凭借简单的规则和独特的魅力,一跃成为全球家喻户晓的经典。你知道其实只需要一些基础的编程知识,就可以自己实现它吗?今天,我们将使用Python的Pygame库,一步步带你构建属于自己的俄罗斯方块小游戏! 游戏初始

    2024年02月04日
    浏览(47)
  • 基于STM32 LCD屏实现的俄罗斯方块小游戏(20220522完成 第一个综合类项目)

    本项目基于 正点原子mini(stm32f103RCT6) 2.8 寸的 ALIENTEK TFTLCD 模块 二轴摇杆模块 的俄罗斯方块小游戏。(学习过程中的项目自测) 1.随机数生成我是用RTC的时钟自己写的,用srand+rand 只能生成一次。 2.并行程序(有什么更好的方法)。 3.觉得我哪里需要改进或者有什么见解可以评论

    2024年02月08日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包