-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
89 lines (74 loc) · 2.57 KB
/
main.cpp
File metadata and controls
89 lines (74 loc) · 2.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <iostream>
#include<limits>
#include "board.hpp"
using namespace std;
int evaluate(Board &board, int depth, int alpha, int beta, int maxDepth) {
// int winner = board.isOver();
// if (winner != 0) return FIVE*winner;
// else if (depth == maxDepth) return board.eval();
int eval = board.eval();
if (depth == maxDepth || abs(eval) >= FOUR) return eval;
bool isMax = true;
int bestEval = -FIVE;
int bestMove = -1;
if (board.getTurn() == -1) {
isMax = false;
bestEval = FIVE;
}
for (int i : board.getROI()) { // try everything
board.place(i);
//cout << board << endl;
int eval = evaluate(board, depth+1, alpha, beta, maxDepth);
if ((isMax && eval > bestEval) || (!isMax && eval < bestEval)) {
bestEval = eval;
bestMove = i;
}
board.eraseLast();
//cout << board << endl;
if (isMax) alpha = max(alpha, eval);
else beta = min(beta, eval);
if (alpha >= beta) break;
}
if (depth == 0) return bestMove;
return bestEval;
}
int main(int argc, char const *argv[]) {
Board board;
// board.place(6, 5); board.place(7, 5);
// board.place(7, 4); board.place(8, 5);
// board.place(7, 7); board.place(8, 7);
// board.place(7, 8); board.place(9, 5);
// board.place(8, 4); board.place(9, 6);
// board.place(8, 6); board.place(9, 8);
// board.place(8, 9); board.place(10, 7);
// board.place(9, 7); board.place(10, 8);
// board.place(10, 6); board.place(10, 9);
// board.place(11, 10); board.place(11, 8);
// board.place(12, 9); board.place(12, 8);
// cout << board << endl;
// cout << board.eval() << endl;
std::cout << "enter a coordinate separated by space: " << endl;
while (true) {
// user
int row, col;
do {
cin >> row >> col;
while(cin.fail()) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
std::cout<< "invalid input" <<endl;
cin >> row >> col;
}
} while (board.place(row, col) == false);
std::cout << board << endl;
if (abs(board.boardValue()) >= FOUR) break; // has a result
// computer
board.place(evaluate(board, 0, -FIVE, FIVE, 5));
std::cout << board << endl;
if (abs(board.boardValue()) >= FOUR) break; // has a result
}
char winner = 'x';
if (board.boardValue() < 0) winner = 'o';
std::cout << "the winner is: " << winner << endl;
return 0;
}