c++井字过三关源码
根据提供的信息,我们可以详细解析这份C++代码,它实现了一个经典的井字游戏(Tic-Tac-Toe)。接下来,我们将从各个部分详细分析这个程序的关键知识点。 ### 1. 包含头文件与命名空间 ```cpp #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; ``` - **`#include<iostream>`**: 引入了标准输入输出流库,允许程序进行基本的输入输出操作。 - **`#include<string>`**: 引入字符串处理库,虽然在这个程序中并未直接使用到字符串功能,但保持了良好的代码风格。 - **`#include<vector>`**: 引入向量容器库,用于创建动态数组存储游戏盘的状态。 - **`#include<algorithm>`**: 引入算法库,用于某些高级操作如排序等,但在本程序中未直接用到。 - **`using namespace std;`**: 声明使用标准命名空间,简化后续代码中的输入输出等操作。 ### 2. 定义常量 ```cpp const char X = 'X'; const char O = 'O'; const char EMPTY = ''; const char TIE = 'T'; const char NO_ONE = 'N'; ``` 这些常量定义了游戏中常用的符号: - **`X`** 和 **`O`**: 分别代表玩家和电脑(或两个玩家)的标记。 - **`EMPTY`**: 表示游戏盘上的空位。 - **`TIE`**: 表示游戏结果为平局。 - **`NO_ONE`**: 表示当前没有玩家赢得游戏。 ### 3. 函数声明 - **`instruction()`**: 显示游戏规则和指导信息。 - **`askYesNO(string question)`**: 向用户提问,并接收“y”或“n”的回答。 - **`askNumber(string question, int high, int low)`**: 请求用户输入一个指定范围内的数字。 - **`turnsChoose()`**: 让用户选择先手还是后手。 - **`opponent(char turns)`**: 根据当前玩家返回对手的标记。 - **`displayBoard(const vector<char>& board)`**: 显示当前的游戏盘面。 - **`winner(const vector<char>& board)`**: 检查是否有赢家,返回相应的标记。 - **`isLegal(int move, const vector<char>& board)`**: 检查指定位置是否合法(即是否为空)。 - **`humanMove(const vector<char>& board)`**: 获取人类玩家的动作并返回对应的坐标。 - **`computerMove(vector<char>& board, char computer)`**: 执行电脑的动作。 - **`announceWinner(char winner, char human, char computer)`**: 公布最终的比赛结果。 ### 4. 主函数 `main()` ```cpp int main() { // 初始化变量 int move; const int NUM_SQUARES = 9; vector<char> board(NUM_SQUARES, EMPTY); // 游戏流程 instruction(); // 显示游戏规则 char human = turnsChoose(); // 选择先手 char computer = opponent(human); // 确定电脑角色 char turn = X; // 初始化回合 displayBoard(board); // 显示初始棋盘 while (winner(board) == NO_ONE) { if (turn == human) { move = humanMove(board); board[move] = human; } else { move = computerMove(board, computer); board[move] = computer; } displayBoard(board); // 更新棋盘显示 turn = opponent(turn); // 更换回合 } announceWinner(winner(board), human, computer); // 结束游戏并宣布胜者 return 0; } ``` ### 5. 其他关键函数 #### `instruction()` 显示游戏的规则和布局示例。 #### `askYesNO(string question)` 询问用户问题,并确保得到的回答是“y”或“n”。 #### `askNumber(string question, int high, int low)` 请求用户输入一个在指定范围内的数字。 #### `turnsChoose()` 让用户选择先手还是后手。 #### `opponent(char turns)` 根据当前玩家返回对手的标记。 #### `displayBoard(const vector<char>& board)` 展示当前的游戏盘状态。 #### `winner(const vector<char>& board)` 检查是否有玩家赢得游戏,或者游戏是否为平局。 #### `isLegal(int move, const vector<char>& board)` 检查指定位置是否为空,即是否可以落子。 #### `humanMove(const vector<char>& board)` 获取人类玩家的移动,并返回对应的坐标。 #### `computerMove(vector<char>& board, char computer)` 执行电脑的移动。 #### `announceWinner(char winner, char human, char computer)` 宣布游戏结果,包括胜者或者平局。 通过上述分析可以看出,这个程序实现了完整的井字游戏逻辑,包括游戏规则、玩家交互、游戏盘管理以及胜利条件判断等功能。对于初学者来说,这是一个很好的学习C++编程基础和面向对象编程思想的例子。
#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 instruction();
char askYesNO(string question);
int askNumber(string question,int high,int low);
char turnsChoose();
char opponent(char turns);
void displayBoard(const vector<char>&board);
char winner(const vector<char>& board);
inline bool isLegal(int move,const vector<char>& board);
int humanMove(const vector<char>& board);
int computerMove(vector<char>& board,char computer);
void announceWinner(char winner,char human,char computer);
int main()
{
int move;
vector<char>board(NUM_SQUARES,EMPTY);
instruction();
char human=turnsChoose();
char computer=opponent(human);
char turn= X;
displayBoard(board);
while (winner(board)==NO_ONE)
{
if(turn==human)
{
move=humanMove(board);
board[move]=human;
}
else
{
move=computerMove(board,computer);
board[move]=computer;
}
displayBoard(board);
turn=opponent(turn);
}
announceWinner(winner(board),human,computer);
return 0;
}
剩余8页未读,继续阅读
- 「已注销」2012-10-13很好的井字棋游戏,适合学习。
- 粉丝: 1
- 资源: 5
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助