009using namespace std;
010#include "Token.h"
011#include "ExpCalc.h"
012#include "24Game.h"
013int Game::minOperand = 1;
014int Game::maxOperand = 13;
015extern char operators[7];
016Game::Game()
017{
018 srand(time(NULL));
019}
020void Game::GenNewNumbers()
021{
022 while (1)
023 {
024 for (int i = 0;i<4;i++)
025 generated_operands[i] = rand()%(maxOperand-minOperand+1) + minOperand;
026 if (hasSolutions()) break;
027 }
028 //generated_operands[0] = 4;
029 //generated_operands[1] = 8;
030 //generated_operands[2] = 4;
031 //generated_operands[3] = 9;
032
033}
034
035//若有解,只保存一组先
036bool Game::hasSolutions()
037{
038 vector<double> a(4);//操作数
039 vector<Operator> ops(3);//操作符
040 double res;
041 copy(generated_operands,generated_operands+4,a.begin());
042 sort(a.begin(),a.end());
043 while (next_permutation(a.begin(),a.end()))
044 {
045 for (int i = ADD_OPR;i<=DIV_OPR;i++)
046 {
047 for (int j = ADD_OPR;j<=DIV_OPR;j++)
048 {
049 for (int k = ADD_OPR;k<=DIV_OPR;k++)
050 {
051 ops[0] = Operator(i);ops[1]=Operator(j);ops[2] = Operator(k);
052 bool isOk = calc.PostfixCalc(a,ops,res);
053 if (isOk && fabs(res - 24) < 1e-6)
054 {
055 solu_operands = a;
056 solu_operators = ops;
057 hasSolu = true;
058 return true;
059 }
060 }
061 }
062 }
063 }
064 hasSolu = false;
065 return false;
066}
067
068void Game::ShowNums()
069{
070 for (int i = 0;i<4;i++)
071 cout << generated_operands[i] << " ";
072 cout << endl;
073}
074
075void Game::ShowSolution()
076{
077 for (int i = 0;i<solu_operands.size();i++)
078 cout << solu_operands[i]<<" ";
079 for (int i = 0;i<solu_operators.size();i++)
080 cout << operators[solu_operators[i]] << " ";
081 cout << endl;
082}
083
084bool Game::Calc(vector<Token>& tokens,double & res)
085{
086 return calc.infixCalc(tokens,res);
087}
088
089bool Game::Check(vector<Token>& tokens)
090{
091 vector<double> a;
092 for (int i = 0;i<tokens.size();i++)
093 {
094 if (tokens[i].type == Numeric)
095 a.push_back(tokens[i].x);
096 }
097 sort(a.begin(),a.end());
098
099 vector<double> opr_copy(4);
100 copy(generated_operands,generated_operands+4,opr_copy.begin());
101 sort(opr_copy.begin(),opr_copy.end());
102
103 if (opr_copy.size()!=a.size())
104 {
105 return false;
106 }
107 for (int i = 0;i<a.size();i++)
108 {
109 if (a[i]!=opr_copy[i])
110 {
111 return false;
112 }
113 }
114 return true;
115}
24Points:主文件
01#include <string>
02#include <iostream>
03#include <vector>
04#include <stack>
05#include <cmath>
06using namespace std;
07#include "Token.h"
08#include "ExpCalc.h"
09#include "24Game.h"
10int main()
11{
12 Game game;
13 double res;
14 while (1)
15 {
16 cout << "开始本轮算24游戏"<<endl;
17 game.GenNewNumbers();
18 game.ShowNums();
19 while(1)
20 {
21 cout << "输入你的表达式:以#结尾,只输入#将显示答案,案例:(4*9 -4-8)"<<endl;
22 string expression;
23 getline(cin,expression);
24 if (expression == "#")
25 {
26 game.ShowSolution();
27 break;
28 }
29 vector<Token> tokens;
30 Parse(expression,tokens);
31
32 if (!game.Check(tokens))
33 cout << "输入的数字不对"<<endl;
34 bool isOk = game.Calc(tokens,res);
35 if (!isOk)
36 cout << "输入格式有误" <<endl;
37 else if (fabs(res - 24) < 1e-6 )
38 cout <<"您算对了"<<endl;
39 else
40 cout << "您算错了"<<endl;
41 }
42 }
43 return 0;
44}