各位大佬,请帮忙看看我这是哪里错误了,运行不了(小白,下面代码是在别人搬运过来的,非自创)
#include<windows.h>
#include<iostream>#include<string>
using namespace std;
//定义四种情况,人机进行对弈
enum players{Computer , Human , Draw , None};
//可能赢得情况,一行一列或对角
const int iWin[8][3]= {{0,1,2},{3,4,5},{6,7,8},{0,3,6},{1,4,7},{2,5,8},{0,4,8},{2,4,6}};
//井字游戏类
class ttt
{
public:
//构造方法
ttt()
{
//轮到谁走,如果-p=1,人走;否则电脑走
_p = rand()%2
//重新置为空,即原始状态
reset();
}
// 游戏函数
void play()
{
//res表示最终结果,初始值为平局
int res = Draw;
//死循环
while(true)
{
//给出3*2的格子
drawGrid();
//内层死循环
while (true)
{
//轮到人走
if(_p)getHumanMove();
//轮到电脑走
else getComputerMove();
//继续根据人和电脑下的棋子,画出3*3的棋局
drawGrid();
//判断人和电脑谁赢
res = checkvictory();
//如果当前棋局状态已经可以判断出输赢,跳出内层死循环
if(res != None)
break;
//计数器+1,判断下一个是谁走
++_p %= 2;
}
//
// 如果res 是Human ,那么人赢了
if(res == Human )
cout <<"CONGRATULATIONS HUMAN ---- YOU WON!";
//如果res是Computer,那么人输了
else if(res == Computer )
cout<< " NOT SO MUCH A SURPRISE ---I WON!";
//平局
else
cout<<"It's a draw!";
cout<< endl << endl;
string r;
//输入是否还在玩一局
cout<<"play again(Y/N)?";
cin >> r;
//当选择不玩下一局,即退出游戏,跳出外循环死循环
if (r!= "Y"&&r!="y" )
return ;
//计数器+1
++_p %= 2;
//重置棋局状态
reset();
}
}
private:
//棋局最开始的状态函数
void reset()
{
for(int x = 0; x < 9; x++)
_fied[x] = None;
}
//分别给格子进行赋值
void drawGrid()
{
//清屏
system("cls");
//定义控制台屏幕初始坐标
COORD c = {0, 2};
//设置控制台光标位置
SetConsoleCursorPosition(GetStdHandle(STD_DOUTPUT_HANDLE),c);
//棋局初始状态
cout<<"1 | 2 | 3" << endl;
cout<<"4 | 5 | 6" << endl;
cout<<"--+---+--" << endl;
cout<<"7 | 8 | 9" << endl << endl << endl;
//棋子计时器
int f = 0;
for(int y = 0; y < 5; y += 2)//纵坐标
for(int x = 1; x < 11; x += 4 )//横坐标
{
//如果格子已经被用过,即有棋子
if(_field[f]!=None)
{
//光标位置坐标
COORD c = {x,2 + y};
//设置控制台光标位置
SetConsoleCursorPosition( GetStdHandle(STD_OUTPUT_HANDLE), c);//GetStdHandle函数获得句柄
//判断当前下棋子的人是否为电脑,如果是电脑即输出X,否则输出O
string o = _field[f] == Computer ?"X" : " O";
cout<< o;
}
//棋子个数+1
f++;
}
c.Y = 9;
//设置控制台光标位置
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ),c);
}
//判断当前棋局是否可以判断输赢
int checkVictory()
{
//如果有一行或一列或对角,那么就表示已经赢了
for(int i = 0; i < 8; i++)
{
if(_field[iWin[i][0]]!= None&& _field[iWin[i][0]] == _field[iWin[i][1]] && _field[iWin[i][1]] == _field[iWin[i][2]])
{
//赢的状态是人还是电脑取决于_field[iWin[i][0]的值
return _field[iWin[i][0]];
}
}
//i 表示棋子个数
int i = 0;
for (int f = 0; f < 9; f++)
{
//如果已经有9个格子有棋子,那么就是一个平局状态
if (i == 9)
return Draw;
//None表示还可以继续下棋子,非分出胜负
return None;
}
//人进行下棋子
void getHumanMove()
{
int m;
cout << "Enter your move(1-9)";
//开始死循环
while (true)
{
m = 0;
//输入想要下的棋子的格子编号
cin >> m;
//如果第m个格子已经有棋子,表示是无效输入
if(_field[m-1]!=None)
cout<<"Invalid move. Try again!"<< endl;
//否则为有效输入,跳入循环
else
break;
}
//将第M个格子标记为人下的棋子
_field[m-1] = Human;
}
//电脑进行下棋子
void getComputerMove()
{
//定义一个电脑想要的棋子的格子编号
int move = 0 ;
do
{
//随机取得一个值
move = rand()%9;
}
//只要这个格子里没有棋子
while(_field[move]!= None);
//对赢的状态进行枚举
for(int i =0; i< 8;i++)
{
//try1,try2和try3表示可能赢的3个格子坐标
int try1 = iWin[i][0], try2 = iWin[i][1], try3 = iWin[i][2];
//如果try1和try2已经有棋子,并且下棋子的玩家是一样的,而且try3没有棋子
if(_field[try1]!=None && _field[try1] == _field[try2] && _field[try3] == None)
{
//电脑会将棋子下载try3这个格子上
move = try3;
//如果try1这个格子的棋子是电脑,那么电脑赢了,游戏结束
if(_field[try1] == Computer )
break;
}
//如果try1和try3已经有棋子,并且下棋子的玩家是一样的,而且try2,没有棋子
if(_field[try1]!= None && _field[try1] == _field[try3] && _field[try2] == None)
{
//电脑会将棋子下载try2 这个格子上
move = try2;
//如果try1,这个棋子是电脑,那么电脑赢,游戏结束
if(_field[try1] == Computer )
break ;
}
//如果try2和try3已结有棋子,并且下棋子的玩家是一样的,而且try1没有棋子
if(_field[try2] != None && _field[try2] == _field[try3] && _field[try1] == None)
{
//电脑会将棋子下到try1这个格子上
move =try1;
//如果try2这个格子的棋子是电脑,那么电脑赢,游戏结束
if(_field[try2] == Computer )
break;
}
}
//将第move个格子标记为电脑下的棋子
_field[move] = Computer;
}
//计数器,用来判断当前玩家是谁
int _p;
//格子状态
int _field[9];
}
int main(int argc, char*argv[])
{
//随机初始化
srand(GetTickCount());
//定义井字游戏的实例对象
ttt tic;
//开始进行游戏
tic.play();
return 0;
}
全部评论
(3) 回帖