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