您的位置:首页 > 编程语言 > C语言/C++

【求助】大神专家们都来看看,我忙活了一整个下午,运用基础C++写的小游戏为啥还有错误;

2012-12-16 18:59 399 查看
#include <iostream>

#include <string>

#include <vector>

#include <algorithm>

using namespace std;

//全局变量

const char X='X';

const char O='O';

const char EMPTY=' ';

const char TIE='T';

const char NO_ONE='N';

//函数原型

void instructions();

char askyesno(string question);

int asknumber(string question,int high,int low=0);

char humanpiece();

char opponent(char piece);

void displayboard(const vector<char>& board);

char winner(const vector<char>&board);

bool islegal(const vector<char>&board),int move);

int humanmove(const vector<char>&board),char human);

int computermove(vector<char> board,char computer);

void announcedwinner(char winner,char computer,char human);

//主函数

int main()

{

int move;

const int NUM_SQUARES=9;

vector<char> board(NUM_SQUARES,EMPTY);

instructions();

char human=humanpiece();

char conputer=opponent(human);

char turn=X;

displayboard(board);

while(winner(board)==NO_ONE)

{

if(turn==human)

{

move=humanmove(board,human);

board(move)=human;

}

else

{

move=computermove(board,computer);

board(move)=computer;

}

displayboard(board);

turn=opponent(turn);

}

announcedwinner(winner(board),computer,human);

return 0;

}

void instructions()

{

cout<<"欢迎来到由鲁家志制作的简单的井字棋游戏!"<<endl;

cout<<"现在就让你体会一下我们学了两个月的C++也是能制作人工智能的"<<endl;

cout<<"接下来就是由你和电脑对战"<<endl;

cout<<"棋盘外形以及棋子位置如下图所示:"<<endl;

cout<<" 0 | 1 | 2\n";

cout<<" 3 | 4 | 5\n";

cout<<" 6 | 7 | 8\n"<<endl;

cout<<"准备好了吗,小子,要开始了!"<<endl<<endl;

}

char askyesno(string question)

{

char response;

do

{

cout<<question<<"(y/n):";

cin>>response;

}while(response !='y'&&response!='n');

return response;

}

int asknumber(string question,int high,int low)

{

int number;

do

{

cout<<question<<"("<<low<<"-"<<high<<"):";

cin>>number;

}while (number>high||number<low);

return 0;

}

char humanpiece()

{

char go_first=askyesno("你准备走第一步么?");

if(go_first=='y')

{

cout<<"\n小子,就让你先走!\n";

return X;

}

else

{

cout<<"\n小子,你就装逼吧,OK,老子先走!\n";

return O;

}

}

char opponent(char piece)

{

if(piece==X)

return O;

else

return X;

}

void displayboard(const vector<char>&board)

{

cout<<"\n\t"<<board[0]<<" | "<<board[1]<<" | "<<board[2];

cout<<"\n\t"<<"---------";

cout<<"\n\t"<<board[3]<<" | "<<board[4]<<" | "<<board[5];

cout<<"\n\t"<<"---------";

cout<<"\n\t"<<board[6]<<" | "<<board[7]<<" | "<<board[8];

cout<<"\n\n";

}

char winner(const vector<char>&board)

{

const int WINNING_ROWS[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}};

const int TOTAL_ROWS=8;

for(int row=0;row<TOTAL_ROWS;++row)

{

if((board[WINNING_ROWS[row][0]]!=EMPTY)&&(board[WINNING_ROWS[row][0]]==board[WINNING_ROWS[row][1]])&&board[WINNING_ROWS[row][1]]==board[WINNING_ROWS[row][2]]))

{

return board[WINNING_ROWS[row][0]];

}

}

if(count(board.begin(),board.end(),EMPTY)==0)

return TIE;

return NO_ONE;

}

inline bool islegal(int move,const vector<char>&board)

{

return (board[move]==EMPTY);

}

int humanmove(const vector<char>&board,char human)

{

int move=asknumber("你要走在哪儿?",(board.size()-1));

while(!islegal(move,board))

{

cout<<"\n这个地方已经被占了,笨蛋!\n";

move=asknumber("你要走在哪儿?",(board.size()-1));

}

cout<<"Fine...\n";

return move;

}

int computermove(vector<char> board,char computer)

{

cout<<"I shall take square number";

for(int move=0;move<board.size();++move)

{

if(islegal(move,board))

{

board[move]=computer;

if(winner(board)==computer)

{

cout<<move<<endl;

return move;

}

board[move]=EMPTY;

}

}

char human=opponent(computer);

for(int move=0;move<board.size();++move)

{

if(islegal(move,board))

{

board[move]=human;

if(winner(board)==human)

{

cout<<move<<endl;

return move;

}

board[move]=EMPTY;

}

}

const int BEST_MOVES[]={4,0,2,6,8,1,3,5,7};

for(int i=0;i<board.size();++i)

{

int move=BEST_MOVES[i];

if(islegal(move,board))

{

cout<<move<<endl;

return move;

}

}

}

void announcewinner(char winner,char computer,char human)

{

if(winner==computer)

{

cout<<winner<<"'s won!\n";

cout<<"不,不可能,你这个笨蛋怎么可能赢我\n";

cout<<"但是,一切还没有结束,鲁家志大人一定会创造比我更强的人工智能的!"<<endl;

}

else

{

cout<<"小子你输了!"<<endl;

cout<<"我说也是,你小子怎么能击败我呢!"<<endl;

cout<<"祝贺你。。。输了,哇哈哈啊哈哈哈哈啊"<<endl;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐