当前位置: 首页 > article >正文

c++井字棋(单人对电脑:1.电脑随机下 2.电脑AI;3.双人对决)

本游戏分两个模式,三种玩法:

每个玩法中的人下棋规则不变,如下:

while (1) {
	/*输入*/
	int row,col;
	cout<<"请输入坐标(1索引):\n";
	cin>>row>>col;
	/*切换索引*/
	row--;
	col--;
	if(legal(row,col)) {
		printf("您的坐标不在合法范围内[1,3],请重新输入:\n");
		continue;
	}
	if (T[row][col]!=' ') {
		printf("您想下的位置已经有棋子了!\n");
		continue;
	}
	/*下*/
	T[row][col]='x';
	break;
}

第一种模式:单人对电脑模式

这种模式适合一个人玩,对手为电脑,但是分两种难度,并且加上了胜利系统:第一种难度为普通难度,对手为电脑随机生成;第二种难度为地狱难度,对手为AI,接下来将详细介绍:

第一种玩法:单人对电脑随机下

此玩法的电脑将以以下方式下棋:

while(1) {
		int row=rand()%Max_N;/*MAX_N的值为3,为棋盘的范围*/
		int col=rand()%Max_M;/*MAX_M的值为3,为棋盘的范围*/
		/*已经下过了*/
		if (T[row][col]!=' ') {
			continue;
		}
		/*下*/
		T[row][col]='o';
		break;
}

第二种玩法:单人对电脑AI下

此玩法的电脑将以以下方式下棋且用到了一种策略(能赢就不堵):

    /*判断行是否赢*/
	for(int i=0; i<Max_N; i++) {
		if(T[i][0]=='o'&&T[i][1]=='o'&&T[i][2]!='x') {
			T[i][2]='o';
			return ;
		} else if(T[i][1]=='o'&&T[i][2]=='o'&&T[i][0]!='x') {
			T[i][0]='o';
			return ;
		} else if(T[i][0]=='o'&&T[i][2]=='o'&&T[i][1]!='x') {
			T[i][1]='o';
			return ;
		}
	}
	/*判断列是否赢*/
	for(int i=0; i<Max_M; i++) {
		if(T[0][i]=='o'&&T[1][i]=='o'&&T[2][i]!='x') {
			T[2][i]='o';
			return ;
		} else if(T[1][i]=='o'&&T[2][i]=='o'&&T[0][i]!='x') {
			T[0][i]='o';
			return ;
		} else if(T[0][i]=='o'&&T[2][i]=='o'&&T[1][i]!='x') {
			T[1][i]='o';
			return ;
		}
	}
	/*判断斜是否赢*/
	if(T[0][0]=='o'&&T[1][1]=='o'&&T[2][2]!='x') {
		T[2][2]='o';
		return ;
	} else if(T[1][1]=='o'&&T[2][2]=='o'&&T[0][0]!='x') {
		T[0][0]='o';
		return ;
	} else if(T[0][0]=='o'&&T[2][2]=='o'&&T[1][1]!='x') {
		T[1][1]='o';
		return ;
	}
	/*判断行是否输*/
	for(int i=0; i<Max_N; i++) {
		if(T[i][0]=='x'&&T[i][1]=='x'&&T[i][2]!='o') {
			T[i][2]='o';
			return ;
		} else if(T[i][1]=='x'&&T[i][2]=='x'&&T[i][0]!='o') {
			T[i][0]='o';
			return ;
		} else if(T[i][0]=='x'&&T[i][2]=='x'&&T[i][1]!='o') {
			T[i][1]='o';
			return ;
		}
	}
	/*判断列是否输*/
	for(int i=0; i<Max_M; i++) {
		if(T[0][i]=='x'&&T[1][i]=='x'&&T[2][i]!='o') {
			T[2][i]='o';
			return ;
		} else if(T[1][i]=='x'&&T[2][i]=='x'&&T[0][i]!='o') {
			T[0][i]='o';
			return ;
		} else if(T[0][i]=='x'&&T[2][i]=='x'&&T[1][i]!='o') {
			T[1][i]='o';
			return ;
		}
	}
	/*判断斜是否输*/
	if(T[0][0]=='x'&&T[1][1]=='x'&&T[2][2]!='o') {
		T[2][2]='o';
		return ;
	} else if(T[1][1]=='x'&&T[2][2]=='x'&&T[0][0]!='o') {
		T[0][0]='o';
		return ;
	} else if(T[0][0]=='x'&&T[2][2]=='x'&&T[1][1]!='o') {
		T[1][1]='o';
		return ;
	}

第二种模式:双人对决模式

第三种玩法:人对人下

顾名思义,两个相同代码就行了

接下来,上代码!

作者写了357行,求关注收藏,非喜勿喷,有任何问题请联系作者,一定改正。

#include<bits/stdc++.h>
#include<ctime>
#include<cstdlib>
#include<unistd.h>
#include <windows.h>
using namespace std;
#define Max_N 3
#define Max_M 3
/*总局数,赢得局数,平局的局数*/
int sum,Win,P;
bool easy=1,Double=1;
/*初始化棋盘*/
void init(char T[Max_N][Max_M]) {
	for(int row=0; row<Max_N; row++) {
		for(int col=0; col<Max_M; col++) {
			T[row][col]=' ';
		}
	}
	return ;
}
/*输出棋盘*/
void print_T(char T[Max_N][Max_M]) {
	if(Double) {
		cout<<"温馨提示:o为玩家1所下,x为玩家2所下\n";
	} else {
		cout<<"温馨提示:o为你所下,x为电脑所下\n";
	}
	cout<<"+---+---+---+\n";
	for (int i=0; i<Max_N; i++) {
		cout<<"| "<<T[i][0]<<" | "<<T[i][1]<<" | "<<T[i][2]<<" |\n+---+---+---+\n";
	}
	return ;
}
/*判断下棋位置是否合法*/
bool legal(int i,int j) {
	return i<0||i>=Max_N||j<0||j>=Max_M;
}
/*下棋*/
void chess(char T[Max_N][Max_M]) {
	while (1) {
		/*输入*/
		int row,col;
		cout<<"请玩家1输入坐标(1索引):\n";
		cin>>row>>col;
		/*切换索引*/
		row--;
		col--;
		if(legal(row,col)) {
			printf("您的坐标不在合法范围内[1,3],请重新输入:\n");
			continue;
		}
		if (T[row][col]!=' ') {
			printf("您想下的位置已经有棋子了!\n");
			continue;
		}
		/*下*/
		T[row][col]='x';
		break;
	}
	return ;
}
/*双人对手下棋*/
void chess2(char T[Max_N][Max_M]) {
	while (1) {
		/*输入*/
		int row,col;
		cout<<"请玩家2输入坐标(1索引):\n";
		cin>>row>>col;
		if(legal(row-1,col-1)) {
			printf("您的坐标不在合法范围内[1,3],请重新输入:\n");
			continue;
		}
		if (T[row-1][col-1]!=' ') {
			printf("您想下的位置已经有棋子了!\n");
			continue;
		}
		/*下*/
		T[row-1][col-1]='o';
		break;
	}
	return ;
}
/*电脑下(AI)*/
void computerchess(char T[Max_N][Max_M]) {
	/*这里用到了一种策略,就是如果赢了就一定不堵*/
	/*表格*/
//	  0  1  2
//	0 1  1  1
//	1 1  1  1
//	2 1  1  1
	if(easy) {
		/*判断行是否赢*/
		for(int i=0; i<Max_N; i++) {
			if(T[i][0]=='o'&&T[i][1]=='o'&&T[i][2]!='x') {
				T[i][2]='o';
				return ;
			} else if(T[i][1]=='o'&&T[i][2]=='o'&&T[i][0]!='x') {
				T[i][0]='o';
				return ;
			} else if(T[i][0]=='o'&&T[i][2]=='o'&&T[i][1]!='x') {
				T[i][1]='o';
				return ;
			}
		}
		/*判断列是否赢*/
		for(int i=0; i<Max_M; i++) {
			if(T[0][i]=='o'&&T[1][i]=='o'&&T[2][i]!='x') {
				T[2][i]='o';
				return ;
			} else if(T[1][i]=='o'&&T[2][i]=='o'&&T[0][i]!='x') {
				T[0][i]='o';
				return ;
			} else if(T[0][i]=='o'&&T[2][i]=='o'&&T[1][i]!='x') {
				T[1][i]='o';
				return ;
			}
		}
		/*判断斜是否赢*/
		if(T[0][0]=='o'&&T[1][1]=='o'&&T[2][2]!='x') {
			T[2][2]='o';
			return ;
		} else if(T[1][1]=='o'&&T[2][2]=='o'&&T[0][0]!='x') {
			T[0][0]='o';
			return ;
		} else if(T[0][0]=='o'&&T[2][2]=='o'&&T[1][1]!='x') {
			T[1][1]='o';
			return ;
		}
		/*判断行是否输*/
		for(int i=0; i<Max_N; i++) {
			if(T[i][0]=='x'&&T[i][1]=='x'&&T[i][2]!='o') {
				T[i][2]='o';
				return ;
			} else if(T[i][1]=='x'&&T[i][2]=='x'&&T[i][0]!='o') {
				T[i][0]='o';
				return ;
			} else if(T[i][0]=='x'&&T[i][2]=='x'&&T[i][1]!='o') {
				T[i][1]='o';
				return ;
			}
		}
		/*判断列是否输*/
		for(int i=0; i<Max_M; i++) {
			if(T[0][i]=='x'&&T[1][i]=='x'&&T[2][i]!='o') {
				T[2][i]='o';
				return ;
			} else if(T[1][i]=='x'&&T[2][i]=='x'&&T[0][i]!='o') {
				T[0][i]='o';
				return ;
			} else if(T[0][i]=='x'&&T[2][i]=='x'&&T[1][i]!='o') {
				T[1][i]='o';
				return ;
			}
		}
		/*判断斜是否输*/
		if(T[0][0]=='x'&&T[1][1]=='x'&&T[2][2]!='o') {
			T[2][2]='o';
			return ;
		} else if(T[1][1]=='x'&&T[2][2]=='x'&&T[0][0]!='o') {
			T[0][0]='o';
			return ;
		} else if(T[0][0]=='x'&&T[2][2]=='x'&&T[1][1]!='o') {
			T[1][1]='o';
			return ;
		}
	}
	/*否则随意下*/
	while(1) {
		int row=rand()%Max_N;
		int col=rand()%Max_M;
		/*已经下过了*/
		if (T[row][col]!=' ') {
			continue;
		}
		/*下*/
		T[row][col]='o';
		break;
	}
	return ;
}
/*判断是否满*/
int Is_Empty(char T[Max_N][Max_M]) {
	for(int row=0; row<Max_N; row++) {
		for(int col=0; col<Max_M; col++) {
			if (T[row][col]==' ') {
				return 0;
			}
		}
	}
	return 1;
}
/*是否胜利*/
char isWin(char T[Max_N][Max_M]) {
	/*行*/
	for (int i=0; i<Max_N; i++) {
		if (T[i][0]!=' '&&T[i][0]==T[i][1]&&T[i][0]==T[i][2]) {
			return T[i][0];
		}
	}
	/*列*/
	for(int j=0; j<Max_M; j++) {
		if (T[0][j]!=' '&&T[0][j]==T[1][j]&&T[0][j]==T[2][j]) {
			return T[0][j];
		}
	}
	if (T[0][0]!=' '&&T[0][0]==T[1][1]&&T[0][0]==T[2][2]) {
		return T[0][0];
	}
	if (T[2][0]!=' '&&T[2][0]==T[1][1]&&T[2][0]==T[0][2]) {
		return T[2][0];
	}
	/*满,返回错误信息*/
	if (Is_Empty(T)) {
		return 'q';
	}
	/*否则没有胜利,返回空格*/
	return ' ';
}
/*游戏*/
void game() {
	cout<<"请选择模式(0为单人模式,对手为电脑;1为双人模式)\n";
	cin>>Double;
	if(!Double) {
		cout<<"现在一共下了"<<sum<<"盘\n";
		cout<<"其中:\n";
		cout<<"您一共赢了:"<<Win<<"盘\n";
		cout<<"您一共平局了:"<<P<<"盘\n";
		cout<<"您一共输了:"<<sum-Win-P<<"盘\n";
		double wwin=Win*100*1.0/sum,PP=P*100*1.0/sum,SS=(sum-Win-P)*100*1.0/sum;
		cout<<"您的获胜率为:"<<fixed<<setprecision(5)<<(sum==0?0:wwin)<<"%\n";
		cout<<"您的平局率为:"<<fixed<<setprecision(5)<<(sum==0?0:PP)<<"%\n";
		cout<<"您的失败率为:"<<fixed<<setprecision(5)<<(sum==0?0:SS)<<"%\n";
		cout<<"请选择难度(0为普通难度,对手为电脑随机生成;1为地狱难度,对手为AI)\n";
		cin>>easy;
	}
	char T[Max_N][Max_M]= { 0 };
	init(T);
	char winner=' ';
	while(1) {
		system("cls");
		print_T(T);
		/*人下*/
		chess(T);
		winner=isWin(T);
		/*有特殊情况(棋盘满或有一方已经胜利)*/
		if (winner!=' ') {
			break;
		}
		system("cls");
		print_T(T);
		/*电脑或第二人下*/
		if(Double) {
			chess2(T);
		} else {
			computerchess(T);
		}
		winner=isWin(T);
		/*有特殊情况(棋盘满或有一方已经胜利)*/
		if(winner!=' ') {
			break;
		}
		continue;
	}
	system("cls");
	print_T(T);
	sum++;
	if (winner == 'x') {
		Win++;
		if(Double) {
			cout<<"恭喜玩家1, 您赢了!\n";
			cout<<"玩家2连玩家1都打不过,菜!\n";
		} else {
			cout<<"恭喜您,您赢了!\n";
		}
		if(!easy&&!Double) {
			cout<<"有本事切换地狱难度!\n";
		}
	} else if (winner == 'o') {
		if(easy) {
			if(Double) {
				cout<<"恭喜玩家2, 您赢了!\n";
				cout<<"玩家1连玩家2都打不过,菜!\n";
			} else {
				cout<<"太菜了,连人工智障都下不过!\n";
			}
		} else {
			cout<<"太菜了,连随机都下不过!\n";
		}
	} else {
		P++;
		if(easy) {
			if(Double) {
				cout<<"哈哈,玩家1只能和玩家2打平手!\n";
				cout<<"哈哈,玩家2只能和玩家1打平手!!n";
			}
			cout<<"哈哈,你只能和人工智障打平手!\n";
		} else {
			cout<<"哈哈,你只能和随机打平手!\n";
		}
	}
	Sleep(5000);
	system("cls");
}
/*菜单*/
int menu() {
	cout<<"--------------------------\n";
	cout<<"--------1.开始游戏--------\n";
	cout<<"--------0.退出游戏--------\n";
	cout<<"--------------------------\n";
	int choice=0;
	cout<<"请输入你的选择:";
	cin>>choice;
	return choice;
}
void _Sleep() {
	cout<<"程序正在加载中\n";
	system("cls");
	cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n                                                    加载进度:";
	for(int i=1; i<=100;) {
		/*让数随机*/
		srand(time(NULL));
		/*更新值,等待*/
		Sleep(100+rand()%(50-1+1));
		i+=(1+rand()%(10));
		/*判断开始*/
		if(i>=100) {
			cout<<"开始!";
			Sleep(2000);
			system("cls");
			break;
		}
		/*输出现在加载情况*/
		cout<<i<<"%\n";
		system("cls");
		cout<<"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n                                                    加载进度:";
	}
	system("cls");
	return ;
}
/*主函数*/
int main() {
	_Sleep();
	srand((unsigned int)time(0));
	while (1) {
		int choice=menu();
		if (choice==1) {
			game();
		} else if (choice==0) {
			cout<<"退出游戏,再见\n";
			break;
		} else {
			cout<<"输入错误!请重新输入!\n";
			continue;
		}
	}
	return 0;
}


http://www.kler.cn/a/529815.html

相关文章:

  • LeetCode435周赛T2贪心
  • 解决Django非ORM模型提示初始化request问题
  • AI开发学习之——PyTorch框架
  • 自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数
  • MySQL数据库(二)- SQL
  • PHP中配置 variables_order详解
  • Python Web框架比较:Flask与FastAPI的特性和应用场景
  • Mask R-CNN与YOLOv8的区别
  • 【HTML入门】Sublime Text 4与 Phpstorm
  • 青少年编程与数学 02-008 Pyhon语言编程基础 15课题、运用函数
  • DBO-高斯回归预测matlab
  • Day33【AI思考】-函数求导过程 的优质工具和网站
  • Python Django 嵌入 Grafana Dashboard(随手记)
  • 基于深度学习的视觉检测小项目(十六) 用户管理界面的组态
  • 在 Ubuntu 中使用 FastAPI 创建一个简单的 Web 应用程序
  • Linux网络 HTTPS 协议原理
  • 鸟哥Linux私房菜笔记(三)
  • 25寒假算法刷题 | Day1 | LeetCode 240. 搜索二维矩阵 II,148. 排序链表
  • Python 中最大堆和最小堆的构建与应用:以寻找第 k 大元素为例
  • 熵采样在分类任务中的应用
  • Android 音视频 --- EGL介绍和使用
  • Python魔法函数
  • MySQL入门 – 设置环境变量和使用系统数据库
  • [SAP ABAP] 在ABAP Debugger调试器中设置断点
  • 本地部署DeepSeek方法
  • UE 5.3 C++ 对垃圾回收的初步认识