C++实现和电脑对战三子棋实例

目录
  • 前言
  • 一.准备需要的函数
    • 1.棋盘
    • 2.各自下棋
    • 3.输赢判断
  • 二.游戏实现
    • 1.菜单的实现
    • 2.游戏本体的构建
  • 总结

前言

前两天在牛客网写了一道题,关于KiKi和BoBo玩 “井”字棋,请根据棋盘状态,判断当前输赢。也就是说系统给你一个已经下好的棋,让你来判断谁输谁赢还是平局。写完这道题也不禁让我有点想法,能不能写一个代码来实现我和电脑对峙三子棋,边下棋系统边判断是否输赢或者平局,否则继续下棋。经过一天查阅资料,观看视频,自己实践,终于实现了我当初的想法,现在来分享给大家我自己的思路。

一.准备需要的函数

1.棋盘

①构建

三子棋的棋盘肯定是必不可少,我们可以利用void函数来实现一个空的棋盘,让他为九宫格然后每一个格子都是空

void intiboard(char arr[ROW][COL], int row, int col)//初始化棋盘
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			arr[i][j] = ' ';
		}
	}
}

②美化棋盘

棋盘肯定得有棋盘的样子,我们得美化一下键盘,我的思路是在横列上先打印'|'然后打印字符,在竖列上直接打印|---,然后循环。

void displayboard(char arr[ROW][COL], int row, int col)//打印棋盘
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			printf("|");
			printf(" %c ", arr[i][j]);
		}
		printf("\n");
		{
			for (int k = 0; k < col; k++)
			{
				printf("|---");
			}
			printf("\n");
		}
	}
}

最后实现是这样的。

2.各自下棋

①玩家下棋

玩家这部分我们需要自己输入横竖坐标,但是实际上数组的是从0开始的,因此我们输入的时候应该给玩家输入的实际坐标减一,假如玩家输出超出范围或者输入的值被电脑抢先输入程序会反馈重新输入,这边使用while循环也成功实现了这一点,直到找到break才可以跳出这个循环。

void playermove(char arr[][COL], int row, int col)//玩家回合
{
	int x = 0;
	int y = 0;
	printf("玩家回合\n");
	while (1)//一直循环直到break
	{
		printf("请输入你想要下的坐标\n");
		scanf_s("%d %d", &x, &y);
		if (x >= 1 && x <= row && y >= 1 && y <= col)//输入合法
		{
			if (arr[x-1][y-1] == ' ')
			{
				arr[x-1][y-1] = 'X';
				break;
			}
			else printf("棋盘重复,重新输入\n");
		}
		else printf("超出范围,请重新输入!\n");
	}
}

②电脑下棋

电脑这边有一个难点就在于如何让电脑随机输入数值,我是利用rand()来实现关于随机的范围我选择了除余来解决,让电脑输入有了随机性,同时也利用了while函数,只有输入了正确的位置才会跳出循环

void AImove(char arr[][COL], int row, int col)//电脑回合
{
	printf("AI回合\n");
	while (1)
	{
		int x = rand() % row;
		int y = rand() % col;
		if (arr[x][y] == ' ')
		{
			arr[x][y] = 'O';
			break;
		}
	}
}

3.输赢判断

关于输赢我选择利用带有返回值的函数,方便日后判断。关于井字棋我们只要行、列,或者任意对角线上面出现三个连续相同的棋子,就能获胜。因此我们可以用if语句来判断是否满足以上任一条件如果满足则返回对于数值的字符,关于平局时在没有决出胜负的情况下棋盘下满,因此我们需要构建函数来判断棋盘是否满,不是则继续,是则暂停返回值。

int Full(char arr[][COL], int row, int col)
{
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			if (arr[i][j] == ' ')
				return 0;//返回0说明棋盘没有满
		}
	}
	return 1;//棋盘满了,平局
}
char Winner(char arr[][COL], int row, int col)//判断输赢
{
	for (int i = 0; i < row; i++)
	{
		if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][0] != ' ')
		{
			return arr[i][0];
		}
		else if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
		{
			return arr[0][i];
		}
	 if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
		{
			return arr[0][0];
		}
	 if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')
		{
			return arr[1][1];
		}
	}
	int x = Full;
	if (x == 0)
	{
		return 'Q';
	}
	else return 'C';
}

因此我们准备的函数就准备完毕了。

二.游戏实现

1.菜单的实现

对于菜单没有什么说的直接就简单粗暴的打印就好

void menu()
{
	printf("---------------------------------------\n");
	printf("============1.开始  2.结束=============\n");
	printf("+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=\n");
	printf("----------------------------------------\n");
}//游戏的主页面;

然后菜单选项的实现我利用了do while函数来实现,用while来判断输入值的真假,假如是真的判断是否是一,要是一就开始游戏,否则提示输入超纲,重新循环,如果输入是零的话,while语句为假跳出循环,也就是结束游戏。

void test()//前端游戏页面和选择
{
	int input = 0;
	srand((unsigned int)time(NULL));//后面rand的使用
	do {
		menu();//调用菜单的打印
		printf("请输入你的选择(1/0):\n");
		scanf_s("%d", &input);
		if (input == 1)
		{
			printf("三子棋游戏开始!\n");
			play();
		}
		else if (input == 0)
		{
			printf("结束游戏,感谢游玩\n");
		}
		else printf("请你重新选择qaq\n");
	} while (input);//假如input=0也就是input为假的时候结束循环:
}

2.游戏本体的构建

关于游戏的逻辑,首先我们得构建一个数组来实现因此构建一个数组是必不可少的,然后利用函数对数组重置并且美化,然后实现玩家互相下棋然后显示棋盘,判断是否输赢或者平局,这里我们继续用了while循环来实现只有有了结果我们才会跳出循环

void play()
{
	char board[ROW][COL];
	char ret = 0;
	intiboard(board, ROW, COL);
	displayboard(board, ROW, COL);
	while (1)
	{
		playermove(board, ROW, COL);
		displayboard(board, ROW, COL);
		ret=Winner(board, ROW, COL);
		if (ret != 'C')//棋盘满了,或者决出胜负了!
		{
			break;
		}
		AImove(board, ROW, COL);
		displayboard(board, ROW, COL);
		ret = Winner(board, ROW, COL);
		if (ret != 'C')//棋盘满了,或者决出胜负了!
		{
			break;
		}
	}
	if (ret == 'X')
	{
		printf("玩家获胜!\n");
	}
	else if (ret == 'O')
	{
		printf("电脑获胜!\n");
	}
	else if(ret=='Q')
		printf("平局.\n");
}

就这样一个游戏就成功完成!

总结

这个游戏其实过于简单,因为三子棋判断输赢比较简单,也不麻烦,重点在于需要判断每一步是否输赢或者平局和对于while的理解,何时跳出循环,何时继续循环,而且要细心,就比如我在写的时候好多次把自己定义函数名字打错导致编译器错误找了好久才发现,还是得细心才行。

关于这个代码源码头文件什么的我都上传到gitee上去了如果感兴趣可以去看看

CSDN writings/三子棋 · banbanni/banni - 码云 - 开源中国 (gitee.com)

到此这篇关于C++实现和电脑对战三子棋实例的文章就介绍到这了,更多相关C++三子棋内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 基于C语言实现三子棋游戏

    说到三子棋,我想大家一定不陌生吧,它也是我童年中的一部分,今天我们用C语言来实现一下简易版的三子棋. 首先,介绍一下游戏规则: 1.在一个九宫格上进行下棋: 2.玩家两名,双方先后落子: 3.若在一条直线上有三颗同一玩家的棋子,则该玩家赢,若棋盘下满也没有出现三颗棋子在一条直线上,则为平局. 设计思路如下: 1.用do-while循环可以保证玩完一把还能接着玩,玩家可以自行选择继续玩还是退出. 2.用一个3x3的二维数组来存放玩家和电脑下的棋子,再进行判断输赢. 3.进行游戏的棋盘如下: 代码如

  • C语言实现三子棋简单小游戏

    三子棋 ,也叫井字棋,是一款大家都玩过的经典小游戏,也是一个适合初学c语言的小伙伴练练手的小项目. 1.整个棋盘采用二维数组存储,下棋时只要获取到x,y两个方向的坐标访问二维数组中的元素改变存储的字符串样式. 2.判断输赢或平局,直接穷举就行了,判断每行.每列.和对角线是否有三个棋子相连.可设置一个带返回值的检查函数,根据不一样的返回值进行不同操作. 3.其余的页面菜单,和棋盘打印.只需要合理利用循环和判断来打印相关内容,很容易就能实现了. 效果展示 附上全部源码,大家可以在自己的编译器上跑一下

  • C语言实现的一个三子棋游戏详解流程

    目录 前言 一.三子棋完成程序运行结果 二.三子棋代码实现 1.创建源文件与头文件 2.整体页面的制作 3.制作并打印棋盘 1.在test.c文件中,定义函数game(); 2.在game.h 头文件中 3.在game.c源文件中 4.人机互动下棋 1.在test.c源文件中 2.在game.h头文件中 3.在game.c源文件中 4.此时打印效果 5.判断输赢 1.在test.c源文件中 2.在game.h头文件中 3.在game.c源文件中 4.最终实现结果 最后 前言 三子棋是我们先前所学

  • C语言实现简单版三子棋

    本文实例为大家分享了C语言实现简单版三子棋的具体代码,供大家参考,具体内容如下 游戏的主函数设计: 1.打印出可以让玩家选择游戏开始和退出的菜单. 2.如果玩家选择1,则游戏开始,并开始执行game()函数. 3.如果玩家选择0,则游戏退出. 4.如果玩家选择了其他数,提醒玩家选择正确的功能. 主函数的实现: int main() { int input = 0; srand((unsigned int)time(NULL)); do { menu(); printf("请输入-->&qu

  • C语言三子棋游戏的简单设计

    本文实例为大家分享了C语言三子棋游戏简单设计的具体代码,供大家参考,具体内容如下 题目思想: 用 3×3 的二维数组表示棋盘 每一个棋子的格子,也就是每个元素表示三种状态:分别是 1.未落子 ' ' 2.玩家落子 'X' 3.电脑落子 'O' 玩家通过输入数字作为落子位置的坐标(输入的行数与输入的列数) 直接上代码解析 1.创建出棋盘 #define _CRT_SECURE_NO_WARNINGS //利用宏定义行和列 #define MAX_ROW 3 #define MAX_COL 3 #i

  • 适合初学者练习的C语言实现三子棋小游戏

    目录 一.写代码前明确下棋时的步骤与顺序 二 根据初步的主函数完成想要的代码 1.写一个函数来初始化棋盘 2.打印棋盘 3.玩家落子 4.电脑落子 5.判断胜负 三.三子棋实现代码 用简单的C语言来实现小时候玩的三子棋游戏,下面是人机对战,当然这个代码的电脑对手是人工智障而不是人工智能 一.写代码前明确下棋时的步骤与顺序 1.创建一个3*3的棋盘. 2.将上面创建的棋盘中每个格初始化成' '状态. 3.打印出初始化完成的棋盘 4.玩家落子 5.电脑落子 6.判断胜负 写代码之前梳理好大概的思路,

  • C++实现和电脑对战三子棋实例

    目录 前言 一.准备需要的函数 1.棋盘 2.各自下棋 3.输赢判断 二.游戏实现 1.菜单的实现 2.游戏本体的构建 总结 前言 前两天在牛客网写了一道题,关于KiKi和BoBo玩 “井”字棋,请根据棋盘状态,判断当前输赢.也就是说系统给你一个已经下好的棋,让你来判断谁输谁赢还是平局.写完这道题也不禁让我有点想法,能不能写一个代码来实现我和电脑对峙三子棋,边下棋系统边判断是否输赢或者平局,否则继续下棋.经过一天查阅资料,观看视频,自己实践,终于实现了我当初的想法,现在来分享给大家我自己的思路.

  • C语言实现三子棋实例代码

    我是半自主的完成了这个程序,看了B站鹏哥视频并仔细思索后才做出来的,我没有完全采用他的方法,导致程序还有一些不足之处,还请各位大佬指出. 首先,我将该程序的实现分为3个板块,main,game.h,和game.c; 代码如下: #define _CRT_SECURE_NO_WARNINGS #include"game.h" void menu() { printf("****************************************\n"); prin

  • 使用C语言实现三子棋小游戏

    目录 1.实现原理 2.实现模块 3.实现逻辑 4.实现结果 本文实例为大家分享了C语言实现三子棋小游戏的具体代码,供大家参考,具体内容如下 1.实现原理 采用二位数组保存棋盘信息,棋盘上面的任何一个位置,里头可以放三个信息: 1.空2.用户落子3.电脑落子 下三子棋就是在二维数组种找对应的空位置,进行落子,落完之后立即就要判断落子位置是否有三字连珠,从而判断谁数输谁赢.每走一次棋会有四种情况: *用户1赢*用户2赢*平局(棋盘被沾满)**没有出结果 继续下棋 2.实现模块 文件名      

  • C语言如何实现三子棋

    目录 三子棋 测试逻辑 游戏逻辑 初始化棋盘 下棋 判断胜利 总结 相信在座的各位都玩过三子棋和扫雷,但是有哪一位想过自己能够在电脑上实现三子棋呢?今天我们就一起来实现一下吧. 三子棋 首先我们看三子棋,三子棋的实现分两步走,首先是测试逻辑,再是游戏逻辑. 测试逻辑 #define _CRT_SECURE_NO_WARNINGS 1 #include "game.h" void menu() { printf("******************\n"); pri

  • C语言新手初阶教程之三子棋实现

    目录 三子棋 创建项目环境 头文件内容 编写main函数(test.c) 实现每一个接口函数 1.board 2.printfboard 3.play 4.computerplay 5.win 总结 三子棋 大家小时候应该都玩过三子棋吧,学习了这么久的C语言,我们其实已经具备了做三子棋这种小型项目的能力,今天我会尽量沉浸式的教大家实现三子棋,如果看完这篇博客还是不会的可以去我最后附上的gitee仓库链接中寻找.但我还是希望大家能自己完成,在三子棋中体现自己的风格. 创建项目环境 首先,第一步,打

  • C语言数组应用实现三子棋游戏

    三子棋游戏的基本构架是数组的应用,但是要实现游戏还得结合具有相关功能的函数,接下来就介绍三子棋游戏的基本框架及相关函数:下面先介绍一下写三子棋代码的过程和思路: 1.游戏开始要先显示游戏界面 (菜单函数) .2.要有一个棋盘给玩家下棋,所以需要一个二维数组,最开始显示给玩家的棋盘应该是空棋盘,所以初始化数组为空格(棋盘初始化函数) ,全为空格的数组打印出来是没有显示的,所以我们要画一个棋盘框并把它打印出来(打印棋盘函数) .3.开始游戏后,玩家下棋(玩家下棋函数) ,数组更改并打印,电脑下棋(电

  • C语言实现三子棋小游戏

    在这里我们要写出一个三子棋的小游戏,能够实现所需要的三字连珠的功能,并且可以使得游戏让玩家进行选择是否继续的功能. 代码: #define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3 void init_board(char arr[ROW][COL]) { int i=0; int j=0; for

  • C语言实现三子棋游戏

    本文实例为大家分享了C语言实现三子棋游戏的具体代码,供大家参考,具体内容如下 #include<stdio.h> #include<stdlib.h> #include<time.h> void chess_board(char arr[3][3]) //打印棋盘 { int i = 0; int j = 0; for (i = 0; i < 3; i++) { printf( " %c | %c | %c \n", arr [i][0], a

  • C语言实现简单三子棋程序

    使用C语言实现简单的三子棋程序,主要是对二维数组的运用,我们需要一个头文件,两个源文件来实现. game.h //包含函数的声明,宏定义 test.c //包含主函数,函数调用 game.c //包含函数的定义 整体思路 1.要完成一个简单的三子棋程序,首先需要创建一个二维数组,并完成数组初始化. //使用宏定义定义常量,方便之后对数组的使用 #define ROW 3 //行 #define COL 3 //列 char arr[ROW][COL] = { 0 }; Arr_init(arr,

随机推荐