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

发布于:2025-02-10 ⋅ 阅读:(46) ⋅ 点赞:(0)

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

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

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

第一种模式的代码

#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;
/*初始化棋盘*/
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]) {
	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索引):\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 ;
}
/*电脑下(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<<"现在一共下了"<<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;
	Sleep(4000);
	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);
		/*电脑下*/
		computerchess(T);
		winner=isWin(T);
		/*有特殊情况(棋盘满或有一方已经胜利)*/
		if(winner!=' ') {
			break;
		}
		continue;
	}
	system("cls");
	print_T(T);
	sum++;
	if (winner == 'x') {
		Win++;
		cout<<"恭喜您,您赢了!\n";
		if(!easy) {
			cout<<"有本事切换地狱难度!\n";
		}
	} else if (winner == 'o') {
		if(easy) {
			cout<<"太菜了,连人工智障都下不过!\n";
		} else {
			cout<<"太菜了,连随机都下不过!\n";
		}
	} else {
		P++;
		if(easy) {
			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;
}

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

第三种玩法:人对人下

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

第二种模式的代码

#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]) {
	cout<<"温馨提示:o为玩家1所下,x为玩家2所下\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 ;
}
/*判断是否满*/
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<<"现在一共下了"<<sum<<"盘\n";
	cout<<"其中:\n";
	cout<<"玩家1:\n";
	cout<<"玩家1一共赢了:"<<Win<<"盘\n";
	cout<<"玩家1一共平局了:"<<P<<"盘\n";
	cout<<"玩家1一共输了:"<<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<<"玩家1的获胜率为:"<<fixed<<setprecision(5)<<(sum==0?0:wwin)<<"%\n";
	cout<<"玩家1的平局率为:"<<fixed<<setprecision(5)<<(sum==0?0:PP)<<"%\n";
	cout<<"玩家1的失败率为:"<<fixed<<setprecision(5)<<(sum==0?0:SS)<<"%\n";
	cout<<"玩家2:\n";
	cout<<"玩家2一共赢了:"<<sum-Win-P<<"盘\n";
	cout<<"玩家2一共平局了:"<<P<<"盘\n";
	cout<<"玩家2一共输了:"<<sum-P<<"盘\n";
	double Wwin=(sum-Win-P)*100*1.0/sum,Pp=P*100*1.0/sum,Ss=(sum-P)*100*1.0/sum;
	cout<<"玩家2的获胜率为:"<<fixed<<setprecision(5)<<(sum==0?0:Wwin)<<"%\n";
	cout<<"玩家2的平局率为:"<<fixed<<setprecision(5)<<(sum==0?0:Pp)<<"%\n";
	cout<<"玩家2的失败率为:"<<fixed<<setprecision(5)<<(sum==0?0:Ss)<<"%\n";
	char T[Max_N][Max_M]= { 0 };
	init(T);
	char winner=' ';
	Sleep(4000);
	while(1) {
		system("cls");
		print_T(T);
		/*人下*/
		chess(T);
		winner=isWin(T);
		/*有特殊情况(棋盘满或有一方已经胜利)*/
		if (winner!=' ') {
			break;
		}
		system("cls");
		print_T(T);
		/*第二人下*/
		chess2(T);
		winner=isWin(T);
		/*有特殊情况(棋盘满或有一方已经胜利)*/
		if(winner!=' ') {
			break;
		}
		continue;
	}
	system("cls");
	print_T(T);
	sum++;
	if (winner == 'x') {
		Win++;
		cout<<"恭喜玩家1, 您赢了!\n";
		cout<<"玩家2连玩家1都打不过,菜!\n";
	} else if (winner == 'o') {
		cout<<"恭喜玩家2, 您赢了!\n";
		cout<<"玩家1连玩家2都打不过,菜!\n";
	} else {
		P++;
		cout<<"哈哈,玩家1只能和玩家2打平手!\n";
		cout<<"哈哈,玩家2只能和玩家1打平手!\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;
}

接下来,上综合代码!

作者写了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;
}


网站公告

今日签到

点亮在社区的每一天
去签到