【求助】大神专家们都来看看,我忙活了一整个下午,运用基础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;
}
}
#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;
}
}
相关文章推荐
- C++ 基础 类和对象 2017_11_13下午(续)
- 【C++基础02】类中不写成员函数易犯错误模型
- 感觉还有好多的C++基础知识要去学习
- 【来自oschina】c++基础编程 拼图小游戏
- 那个大神需要个打杂的(C++方面),联系小弟,最近闲,无偿服务,只求学个一招半式(有基础)。
- C++基础——一些细节、常犯错误的汇总
- 两个有错误的代码,先存着。大神帮忙看看
- QT学习4:C++基础和一些错误总结
- 大家看看这个php+mysql留言板哪里有错误?不同的地方下载几次同样的了,这么大留言板设计出来,还有小问题!败在细节。
- vue遇到一个坑一下午没爬出来 请大神看看
- javascript测试回答错误,基础提高,经常使用。不常用,也看看。
- 大家帮忙看看c++中派生类发生浅拷贝,但是在析构时候怎么没有内存错误!求解!
- 求助一下,麻烦大神们看看是哪里有逻辑上的错误,题目是三个数由大到小输出
- C++基础day01类中不写成员函数易犯错误模型
- springmvc+mybatis+maven项目集成的时候遇到一个问题,项目搭起来以后,http请求怎么都进不到controller中,页面直接返回404错误,控制台没有报任何错误,请大神帮我看看
- springmvc+mybatis+maven项目集成的时候遇到一个问题,项目搭起来以后,http请求怎么都进不到controller中,页面直接返回404错误,控制台没有报任何错误,请大神帮我看看
- C++中运用模版报“无法解析的外部符号”错误解决方法
- 错误程序改编,请大家看看还有不妥吗
- c++高级---C语言中的类型提升——基础概念,但还有很多人搞不清
- 求解,为啥出这种错误(C++)