Add auto test
This commit is contained in:
@ -6,12 +6,35 @@
|
|||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief The implementation of function CheckResult
|
||||||
|
* @details Only for debug. It checks the map_status and orginal map to see if
|
||||||
|
* the result of Gauss-Jordan Elimination is correct.
|
||||||
|
*/
|
||||||
|
void CheckResult() {
|
||||||
|
#define ERROR_IN_RESULT 0
|
||||||
|
using namespace Client;
|
||||||
|
using namespace Server;
|
||||||
|
for (int i = 0; i < rows; i++)
|
||||||
|
for (int j = 0; j < columns; j++) {
|
||||||
|
if ('0' <= visible_map[i][j] && visible_map[i][j] <= '8')
|
||||||
|
assert(map_status[i][j] == 2);
|
||||||
|
if (visible_map[i][j] == '?') assert(map_status[i][j] != 2);
|
||||||
|
if (map_status[i][j] == 2)
|
||||||
|
assert('0' <= visible_map[i][j] && visible_map[i][j] <= '8');
|
||||||
|
if (map_status[i][j] == 0) assert(visible_map[i][j] == '?');
|
||||||
|
if (map_status[i][j] == 1) assert(origin_map[i][j] == '.');
|
||||||
|
if (map_status[i][j] == -1) assert(origin_map[i][j] == 'X');
|
||||||
|
}
|
||||||
|
#undef ERROR_IN_RESULT
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* @brief The implementation of function Execute
|
* @brief The implementation of function Execute
|
||||||
* @details Use it only when trying advanced task. Do NOT modify it before
|
* @details Use it only when trying advanced task. Do NOT modify it before
|
||||||
* discussing with TA.
|
* discussing with TA.
|
||||||
*/
|
*/
|
||||||
void Execute(int row, int column) {
|
void Execute(int row, int column) {
|
||||||
|
CheckResult();
|
||||||
std::string str;
|
std::string str;
|
||||||
VisitBlock(row, column);
|
VisitBlock(row, column);
|
||||||
if (game_state != 0) {
|
if (game_state != 0) {
|
||||||
|
139
src/autotest.py
Executable file
139
src/autotest.py
Executable file
@ -0,0 +1,139 @@
|
|||||||
|
#!/usr/bin/python3
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import random
|
||||||
|
built_in_test_cases = [
|
||||||
|
"""10 10
|
||||||
|
........X.
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
......X...
|
||||||
|
..........
|
||||||
|
.X.......X
|
||||||
|
..........
|
||||||
|
X........X
|
||||||
|
..........
|
||||||
|
X....XX...
|
||||||
|
0 0""",
|
||||||
|
"""10 10
|
||||||
|
.....X...X
|
||||||
|
.........X
|
||||||
|
X..X......
|
||||||
|
X.X.......
|
||||||
|
..X.......
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
..........
|
||||||
|
X.........
|
||||||
|
0 0""",
|
||||||
|
"""10 10
|
||||||
|
.XX.......
|
||||||
|
...X...XX.
|
||||||
|
..........
|
||||||
|
...X......
|
||||||
|
.X......X.
|
||||||
|
..X....X..
|
||||||
|
XX....X...
|
||||||
|
..X...X...
|
||||||
|
..X.X.X.X.
|
||||||
|
....X.....
|
||||||
|
0 9""",
|
||||||
|
"""10 10
|
||||||
|
.......X..
|
||||||
|
X.....X...
|
||||||
|
X...X.....
|
||||||
|
...X......
|
||||||
|
..........
|
||||||
|
.X.X.X....
|
||||||
|
..X.X..X..
|
||||||
|
.X.X.....X
|
||||||
|
....X.....
|
||||||
|
.....X....
|
||||||
|
4 9""",
|
||||||
|
"""20 20
|
||||||
|
X...........X.......
|
||||||
|
..XX.............X.X
|
||||||
|
.X......X.........X.
|
||||||
|
....X.X...X...X.....
|
||||||
|
....X.X.........X...
|
||||||
|
X.XX...........X.X..
|
||||||
|
...X.............XX.
|
||||||
|
...XX...X..X..X.X...
|
||||||
|
...X.X...X...X......
|
||||||
|
.............XX.X...
|
||||||
|
.X............X.....
|
||||||
|
.X..X.........X....X
|
||||||
|
X.X.X..X...X..X.....
|
||||||
|
.X....X.X......X....
|
||||||
|
...X.........X..X...
|
||||||
|
...X.X...X..........
|
||||||
|
..X.XX.X......XXXX..
|
||||||
|
.X.X...............X
|
||||||
|
XXX..X....X.XX..X...
|
||||||
|
.X...X.XX........X.X
|
||||||
|
0 10"""
|
||||||
|
]
|
||||||
|
mine_rate=0.15
|
||||||
|
total_round=0
|
||||||
|
win_round=0
|
||||||
|
for i in range(0,10):
|
||||||
|
for data in built_in_test_cases:
|
||||||
|
fn=open("tmp/test.in","w")
|
||||||
|
fn.write(data)
|
||||||
|
fn.close()
|
||||||
|
os.system("build/src/client < tmp/test.in > tmp/test.out")
|
||||||
|
fn=open("tmp/test.out","r")
|
||||||
|
lines=fn.readlines()
|
||||||
|
fn.close()
|
||||||
|
print(lines)
|
||||||
|
total_round+=1
|
||||||
|
if lines[0]=='YOU WIN!\n':
|
||||||
|
win_round+=1
|
||||||
|
print("win rate: "+str(win_round/total_round),win_round,total_round)
|
||||||
|
|
||||||
|
input("Press Enter to continue...")
|
||||||
|
|
||||||
|
while True:
|
||||||
|
# randomly generate n,m in [2,30]
|
||||||
|
n=random.randint(2,30)
|
||||||
|
m=random.randint(2,30)
|
||||||
|
# print(n,m)
|
||||||
|
# randomly generate mine_rate in [0,1]
|
||||||
|
#mine_rate=random.random()
|
||||||
|
# generate a random map
|
||||||
|
map=[]
|
||||||
|
for i in range(n):
|
||||||
|
map.append([])
|
||||||
|
for j in range(m):
|
||||||
|
if random.random()<mine_rate:
|
||||||
|
map[i].append('X')
|
||||||
|
else:
|
||||||
|
map[i].append('.')
|
||||||
|
# generate a random start point with no mine
|
||||||
|
sx=random.randint(0,n-1)
|
||||||
|
sy=random.randint(0,m-1)
|
||||||
|
while map[sx][sy]=='X':
|
||||||
|
sx=random.randint(0,n-1)
|
||||||
|
sy=random.randint(0,m-1)
|
||||||
|
# output the map
|
||||||
|
fn=open("tmp/test.in","w")
|
||||||
|
fn.write(str(n)+" "+str(m)+"\n")
|
||||||
|
for i in range(n):
|
||||||
|
for j in range(m):
|
||||||
|
fn.write(map[i][j])
|
||||||
|
fn.write("\n")
|
||||||
|
fn.write(str(sx)+" "+str(sy))
|
||||||
|
fn.close()
|
||||||
|
# run the program
|
||||||
|
os.system("build/src/client < tmp/test.in > tmp/test.out")
|
||||||
|
# read the output
|
||||||
|
fn=open("tmp/test.out","r")
|
||||||
|
lines=fn.readlines()
|
||||||
|
fn.close()
|
||||||
|
# check the output
|
||||||
|
print(lines)
|
||||||
|
total_round+=1
|
||||||
|
if lines[0]=='YOU WIN!\n':
|
||||||
|
win_round+=1
|
||||||
|
print("win rate: "+str(win_round/total_round),win_round,total_round)
|
@ -290,6 +290,7 @@ void InterpretResult(std::vector<std::vector<double> > equations) {
|
|||||||
assert(vid >= 0);
|
assert(vid >= 0);
|
||||||
assert(vid < variaID_to_position.size());
|
assert(vid < variaID_to_position.size());
|
||||||
std::pair<int, int> pos = variaID_to_position[vid];
|
std::pair<int, int> pos = variaID_to_position[vid];
|
||||||
|
if (map_status[pos.first][pos.second] != 0) continue;
|
||||||
if (sol == 0) {
|
if (sol == 0) {
|
||||||
map_status[pos.first][pos.second] = 1;
|
map_status[pos.first][pos.second] = 1;
|
||||||
no_mine_block_to_be_clicked.push(pos);
|
no_mine_block_to_be_clicked.push(pos);
|
||||||
|
Reference in New Issue
Block a user