C++中的菲夫游戏
Fif Game in C++
Fif 游戏:9 个标记为 1-9 的方块。 我轮流对着电脑,在 9 个方块中的每一个上放置一个 X 或 O。 第一个得到 15 总和且至少 3 个方格的人获胜。
我正在尝试完成 Fif 游戏的C++程序。 我在网上找到了一些井字游戏的代码。 我借用了其中的一些,对其进行了一点修改(但我还没有完成),并将其制作成"Fif"游戏。 除了一些事情外,它有效。 索引偏离 1(这是次要的)。 此外,更重要的是,它需要 3 件事。 1.静态评估,判断计算机的动作。 2. 移动生成器 3.α-β 普鲁宁。 我没有完全使用老师给我们的模板来完成这个作业,但他确实有一个完整的 alpha-beta 功能,我认为这是我唯一缺少的东西,因为该程序基本上可以工作。 我将发布alpha-beta,然后发布我所拥有的。 基本上我需要帮助将所有东西放在一起。
float AlphaBeta(State S, Ply N, float Alpha, float Beta)
//Recusively score state S using evaluation function Eval
//and an N - Ply state space graph.
{
State Next;
ListIndex I;
float V, Value, BestScore;
List L; //successors of S at this level
if ((N == 0) || Terminal(S))
{
Value = Eval(S);
T[S] = Value; //record values only to confirm cut offs
if (Value > 100) //machine win
return INT_MAX;
else if (Value < -100) //machine loss
return -INT_MAX;
else if (Value == 0) //draw
return 0;
else
return Value;
}
else
{
if (MachineMove(N)) //program's move
BestScore = Alpha;
else
BestScore = Beta;
I = 1;
while (I <= MaxNum)
{
Next = Child(S, I);
V = AlphaBeta(Next, N - 1, Alpha, Beta);
if (MachineMove(N)) //program's move
{
BestScore = Max(V, BestScore);
Alpha = BestScore;
if (Alpha >= Beta)
{
BestScore = Beta;
I = MaxNum; //prune remaining S successors
}
}
else
{
BestScore = Min(V, BestScore);
Beta = BestScore;
if (Alpha >= Beta)
{
BestScore = Alpha;
I = MaxNum; //prune remaining S successors
}
}
I = I + 1;
}
return BestScore;
}
}
//My Fif Program itself
#include<iostream>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
//global constants
const char X = 'X';
const char O = 'O';
const char EMPTY = ' ';
const char TIE = 'T';
const char NO_ONE = 'N';
// function prototypes
char askYesNo(string question);
int askNumber(string question, int high, int low = 1);
char humanPiece();
char opponent(char piece);
void displayBoard(const vector<char>& board);
char winner(const vector<char>& board);
int humanMove(const vector<char>& board, char human);
bool isLegal(const vector<char>& board, int move);
int humanMove(const vector<char>& board, char human);
int computerMove(vector<char> board, char computer);
void announceWinner(char winner, char computer, char human);
//main function
int main()
{
int move;
const int NUM_SQUARES = 9;
vector<char> board(NUM_SQUARES, EMPTY);
char human = humanPiece();
char computer = opponent(human);
char turn = X;
int ChoiceToPlayAgain;
string question;
cout << "Welcome to the 'Fif' Game! You are competing aganst the computer."<<endl;
cout << "Below is the board that you are using. The object of the game is to" <<endl;
cout << "make your values to where you can get 3 of the values to sum to 15."<<endl;
cout << "Valid input values are from 1-9" <<endl<<endl;
cout<<"123456789"<<endl;
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;
}
cout<<"123456789"<<endl;
displayBoard(board);
turn = opponent(turn);
}
announceWinner(winner(board), computer, human);
system("pause");
return 0;
}
char askYesNo(string question)
{
char response;
do
{
cout << question << "(C/Y): ";
cin >> response;
} while (response != 'y' && response != 'n');
return response;
}
int askNumber(string question, int high, int low)
{
int number;
do
{
cout << question << " (1-9): ";
cin >> number;
}while (number > high || number < low);
return number;
}
char humanPiece()
{
char go_first = askYesNo("Should I start or you?");
if (go_first == 'Y')
{
cout << "Make your move:";
return X;
}
else
{
cout << "I will start:";
return O;
}
}
char opponent(char piece)
{
if (piece == X)
return O;
else
return X;
}
void displayBoard(const vector<char>& board)
{
cout << board[0] << board[1] << board[2]<< board[3] << board[4] << board[5]<< board[6] << board[7] << board[8];
cout << "nn";
}
char winner(const vector<char>& board)
{
//all possible winning rows
const int WINNING_ROWS[8][3] = {
{4,9,2},
{3,5,7},
{8,1,6},
{4,3,8},
{9,5,1},
{2,7,6},
{4,5,6},
{2,5,8}
};
const int TOTAL_ROWS = 8;
//if any winning row has three value that are the same (and not EMPTY),
// then we have a winner
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]];
}
}
//since nobody has won, check for a tie (no empty squares left)
if (count(board.begin(), board.end(), EMPTY) == 0)
return TIE;
// since nobody has won it isn't a tie, the game ain't over
return NO_ONE;
}
bool isLegal(int move, const vector<char>& board)
{
return (board[move] == EMPTY);
}
int humanMove(const vector<char>& board, char human)
{
int move = askNumber("Where will you move?", (board.size()-1));
while (!isLegal(move, board))
{
cout << "nThis square is already taken, choose a different square. n";
move = askNumber("Where will you move?", (board.size()-1));
}
return move;
}
int computerMove(vector<char> board, char computer)
{
cout << "I'll take number: ";
//if computer can win on next move, make that move
for(int move = 1; move < board.size(); ++move)
{
if (isLegal(move, board))
{
board[move] = computer;
if (winner(board) == computer)
{
cout << move << endl;
return move;
}
//done checking this move, undo it
board[move] = EMPTY;
}
}
//if human can win on next move, block that move
char human = opponent(computer);
for(int move = 1; move < board.size(); ++move)
{
if (isLegal( move, board))
{
board[move] = human;
if (winner(board) == human)
{
cout << move << endl;
return move;
}
// done checking this move, undo it
board[move] = EMPTY;
}
}
// the best moves to make, in order
const int BEST_MOVES[] = {5,4,2,8,6,9,3,7,1};
// since no one can win on next move, pick best open square
for(int i = 1; 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 << "3 of my numbers sums to 15, so you lose! "<<endl;
}
else if (winner == human)
{
cout << winner << "'s won!n";
cout << "3 of your numbers sums to 15, so you win!" <<endl;
}
else
{
cout << "Nobody reached a sum of 15 after board is filled, so it's a tie." << endl;
}
}
您不能将教授的 alpha beta 修剪应用于您的程序,因为您的程序缺少静态评估。
您需要一个函数,在给定主板配置的情况下,生成该配置对计算机的"好坏"程度的值。
你的AI在你的computerMove()函数中,你制定了一些明确的规则:
1)如果我能在下一步中获胜,那就接受它
2)如果人类可以在一招中获胜,请阻止它
3)否则,采取下一个可用的"最佳"举措
您必须将这些规则转换为数值。该函数应为更理想的板(对于计算机)返回更高的值。 因此,计算机获胜的电路板将具有最高价值。 他可以一举取胜的棋盘会略少一些。 人类获胜的棋盘的值为 0,依此类推。
一旦你有了这个神奇的功能,你的电脑需要创建所有可能的电路板配置(可能用于多圈,从而创建一个树)并评估它们的"优点"。 alpha-beta 修剪将应用于创建的板配置树,用于修剪不再需要评估的分支 b/c 已经确定了更好的选择。
如果您想应用最小最大值和 alpha-beta 修剪,看起来您还有相当多的工作要做。 祝你好运!
- 在C++游戏中与库存系统作斗争
- 换位表导致测试失败(但在游戏中运行良好)
- Craps游戏问题,忽略if语句
- 矢量下标超出SFML游戏中的范围
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 我在贪吃蛇游戏中收到了错误代码 -1073741571
- 我应该在简单的策略游戏中为各个派系使用类吗 - C++
- 游戏体验和升级
- 我的代码运行良好,但在游戏循环中中断
- 如何使用 SFML 在贪吃蛇游戏中定义游戏结束?
- 我可以使用任何好的逻辑来阻止计算机将 O 放在井字游戏中的现有 X 上
- 将鼠标和键盘输入发送到 unity3d 游戏 (Rust)
- 在猜谜游戏 c++ 中不计算尝试次数
- 在C++不适用于猜数字游戏的情况下再次播放选项
- 在为我的基于文本的 RPG 游戏制作库存时遇到困难
- 在定义字符数组(井字游戏)的 for 循环中应用输入限制
- Frank Luna 在他的书"使用 DirectX12 进行 3D 游戏编程"的介绍中盒子示例的问题
- 如何在Linux上正确发布C++软件(游戏)
- 提高基于组件的游戏引擎的效率
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类