欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > c++井字棋(单人对电脑:1.电脑随机下 2.电脑AI;3.双人对决)

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

2025/2/3 18:22:41 来源:https://blog.csdn.net/hlb20130715/article/details/145421655  浏览:    关键词: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  1if(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;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com