khetai 0.3.3 → 0.3.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.clang-format +5 -1
- data/.gitignore +8 -4
- data/Gemfile.lock +1 -1
- data/README.md +48 -28
- data/ext/khetai/khetai.c +1 -1
- data/ext/khetai/khetai_lib.c +32 -29
- data/ext/khetai/khetai_lib.h +0 -4
- data/khetai.gemspec +1 -1
- data/lib/khetai/version.rb +1 -1
- metadata +2 -54
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/ext/khetai/dev/CMakeLists.txt +0 -5
- data/ext/khetai/dev/README.md +0 -15
- data/ext/khetai/dev/fltk-ui/Makefile +0 -65
- data/ext/khetai/dev/fltk-ui/Makefile.khetai +0 -46
- data/ext/khetai/dev/fltk-ui/README.md +0 -34
- data/ext/khetai/dev/fltk-ui/ai_loader.cpp +0 -78
- data/ext/khetai/dev/fltk-ui/ai_loader.h +0 -33
- data/ext/khetai/dev/fltk-ui/assets/anubis_red_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_red_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_red_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_red_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_silver_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_silver_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_silver_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/anubis_silver_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/example_board.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_red_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_red_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_red_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_red_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_silver_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_silver_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_silver_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/laser_silver_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pharaoh_red.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pharaoh_silver.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_red_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_red_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_red_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_red_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_silver_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_silver_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_silver_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/pyramid_silver_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_red_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_red_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_red_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_red_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_silver_e.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_silver_n.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_silver_s.png +0 -0
- data/ext/khetai/dev/fltk-ui/assets/scarab_silver_w.png +0 -0
- data/ext/khetai/dev/fltk-ui/build_khetai.sh +0 -9
- data/ext/khetai/dev/fltk-ui/game_board.cpp +0 -794
- data/ext/khetai/dev/fltk-ui/game_board.h +0 -98
- data/ext/khetai/dev/fltk-ui/game_board_util.cpp +0 -101
- data/ext/khetai/dev/fltk-ui/game_board_util.h +0 -15
- data/ext/khetai/dev/fltk-ui/khet.cpp +0 -54
- data/ext/khetai/dev/main.c +0 -49
- data/ext/khetai/dev/main.rb +0 -14
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
#ifndef GAMEBOARD_H
|
|
2
|
-
#define GAMEBOARD_H
|
|
3
|
-
|
|
4
|
-
#include "ai_loader.h"
|
|
5
|
-
|
|
6
|
-
#include <FL/Fl_Input.H>
|
|
7
|
-
#include <FL/Fl_PNG_Image.H>
|
|
8
|
-
#include <FL/Fl_Widget.H>
|
|
9
|
-
#include <string>
|
|
10
|
-
#include <unordered_map>
|
|
11
|
-
#include <vector>
|
|
12
|
-
|
|
13
|
-
class GameBoard : public Fl_Widget {
|
|
14
|
-
public:
|
|
15
|
-
GameBoard(int X, int Y, int W, int H, const char *L = 0);
|
|
16
|
-
Fl_Input *max_time_input, *max_depth_input;
|
|
17
|
-
void draw() override;
|
|
18
|
-
int handle(int event) override;
|
|
19
|
-
void init(const std::vector<std::vector<std::string>> &pieces);
|
|
20
|
-
|
|
21
|
-
enum Color {
|
|
22
|
-
SILVER = 1,
|
|
23
|
-
RED = 2
|
|
24
|
-
};
|
|
25
|
-
enum LaserDirection {
|
|
26
|
-
NORTH = 1,
|
|
27
|
-
EAST = 2,
|
|
28
|
-
SOUTH = 3,
|
|
29
|
-
WEST = 4
|
|
30
|
-
};
|
|
31
|
-
enum PieceType {
|
|
32
|
-
ANUBIS,
|
|
33
|
-
PYRAMID,
|
|
34
|
-
SCARAB,
|
|
35
|
-
PHARAOH,
|
|
36
|
-
SPHINX
|
|
37
|
-
};
|
|
38
|
-
enum PieceOrientation {
|
|
39
|
-
ORIENT_NORTH,
|
|
40
|
-
ORIENT_EAST,
|
|
41
|
-
ORIENT_SOUTH,
|
|
42
|
-
ORIENT_WEST
|
|
43
|
-
};
|
|
44
|
-
enum ReflectionResult {
|
|
45
|
-
RESULT_DEAD,
|
|
46
|
-
RESULT_ABSORBED,
|
|
47
|
-
RESULT_EAST,
|
|
48
|
-
RESULT_WEST,
|
|
49
|
-
RESULT_SOUTH,
|
|
50
|
-
RESULT_NORTH
|
|
51
|
-
};
|
|
52
|
-
enum MovePermission {
|
|
53
|
-
S = 1,
|
|
54
|
-
R = 2,
|
|
55
|
-
B = 3
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
static std::string getPieceFilename(char piece, int direction);
|
|
59
|
-
static std::pair<PieceType, PieceOrientation> getPieceTypeAndOrientation(const std::string &piece_str);
|
|
60
|
-
static void laser_timer_cb(void *data);
|
|
61
|
-
|
|
62
|
-
private:
|
|
63
|
-
AILoader ai_loader;
|
|
64
|
-
int rows = 8, cols = 10, clicked_row = -1, clicked_col = -1, square_selected_num = -1;
|
|
65
|
-
int cell_width, cell_height;
|
|
66
|
-
bool square_selected = false;
|
|
67
|
-
bool laser_active = false;
|
|
68
|
-
int laser_step = 5;
|
|
69
|
-
LaserDirection laser_direction;
|
|
70
|
-
float laser_y, laser_x;
|
|
71
|
-
bool remove_piece = false;
|
|
72
|
-
int laser_square_row, laser_square_col, remove_row, remove_col;
|
|
73
|
-
int l_idx;
|
|
74
|
-
std::vector<std::vector<std::string>> board_pieces;
|
|
75
|
-
std::vector<Fl_Image *> piece_images;
|
|
76
|
-
std::vector<std::tuple<int, int, int, int>> laser_path;
|
|
77
|
-
std::vector<std::tuple<int, int, int, int>> laser_path_squares;
|
|
78
|
-
|
|
79
|
-
static std::unordered_map<LaserDirection, std::unordered_map<PieceType, std::unordered_map<PieceOrientation, ReflectionResult>>> reflections_map;
|
|
80
|
-
static std::unordered_map<char, std::string> piece_map;
|
|
81
|
-
static std::unordered_map<int, int> rotate_left_map;
|
|
82
|
-
static std::unordered_map<int, int> rotate_right_map;
|
|
83
|
-
static const MovePermission move_permissions[8][10];
|
|
84
|
-
|
|
85
|
-
void drawInnerSquares();
|
|
86
|
-
void rotateSelectedPiece(bool clockwise);
|
|
87
|
-
void moveSelectedPiece(int end_square);
|
|
88
|
-
void swapPieces(int swap_square);
|
|
89
|
-
void deletePiece();
|
|
90
|
-
void resetPieces();
|
|
91
|
-
void fireLaser(Color color);
|
|
92
|
-
void updateLaserPosition();
|
|
93
|
-
void calculateLaserPathSquares();
|
|
94
|
-
bool squareContainsPiece(int square_num);
|
|
95
|
-
void rebuildReloadKhetAILib();
|
|
96
|
-
};
|
|
97
|
-
|
|
98
|
-
#endif
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
#include "game_board_util.h"
|
|
2
|
-
|
|
3
|
-
#include <cstring>
|
|
4
|
-
#include <iostream>
|
|
5
|
-
|
|
6
|
-
std::vector<std::string> flatten_2d_vector_with_buffer(const std::vector<std::vector<std::string>> &vec2d) {
|
|
7
|
-
size_t new_rows = vec2d.size() + 2;
|
|
8
|
-
size_t new_cols = vec2d.empty() ? 0 : vec2d[0].size() + 2;
|
|
9
|
-
|
|
10
|
-
std::vector<std::vector<std::string>> buffered_vec2d(new_rows, std::vector<std::string>(new_cols, "--"));
|
|
11
|
-
|
|
12
|
-
for (size_t i = 0; i < vec2d.size(); ++i) {
|
|
13
|
-
for (size_t j = 0; j < vec2d[i].size(); ++j) {
|
|
14
|
-
buffered_vec2d[i + 1][j + 1] = vec2d[i][j];
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
std::vector<std::string> flattened;
|
|
19
|
-
for (const auto &row : buffered_vec2d) {
|
|
20
|
-
for (const auto &elem : row) {
|
|
21
|
-
flattened.push_back(elem);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
return flattened;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
char **vector_to_c_array(const std::vector<std::string> &vec) {
|
|
29
|
-
char **c_array = new char *[vec.size()];
|
|
30
|
-
for (size_t i = 0; i < vec.size(); ++i) {
|
|
31
|
-
c_array[i] = new char[vec[i].size() + 1];
|
|
32
|
-
std::strcpy(c_array[i], vec[i].c_str());
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return c_array;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
void free_c_array(char **c_array, size_t size) {
|
|
39
|
-
for (size_t i = 0; i < size; ++i) {
|
|
40
|
-
delete[] c_array[i];
|
|
41
|
-
}
|
|
42
|
-
delete[] c_array;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
Move call_ai_move(AILoader &ai_loader, const std::vector<std::vector<std::string>> &board_pieces, Player player, int max_depth, int max_time) {
|
|
46
|
-
auto init_zobrist = ai_loader.get_init_zobrist();
|
|
47
|
-
auto reset_undo = ai_loader.get_reset_undo();
|
|
48
|
-
auto setup_board = ai_loader.get_setup_board();
|
|
49
|
-
auto print_board = ai_loader.get_print_board();
|
|
50
|
-
auto set_time_parameters = ai_loader.get_set_time_parameters();
|
|
51
|
-
auto alphabeta_root = ai_loader.get_alphabeta_root();
|
|
52
|
-
auto make_move = ai_loader.get_make_move();
|
|
53
|
-
auto get_start = ai_loader.get_get_start();
|
|
54
|
-
auto get_end = ai_loader.get_get_end();
|
|
55
|
-
auto get_rotation = ai_loader.get_get_rotation();
|
|
56
|
-
|
|
57
|
-
char **c_board = vector_to_c_array(flatten_2d_vector_with_buffer(board_pieces));
|
|
58
|
-
|
|
59
|
-
reset_undo();
|
|
60
|
-
init_zobrist();
|
|
61
|
-
srand((unsigned)time(NULL));
|
|
62
|
-
|
|
63
|
-
setup_board(c_board);
|
|
64
|
-
printf("\nStarting Board:\n");
|
|
65
|
-
print_board();
|
|
66
|
-
|
|
67
|
-
time_t start_time = time(NULL);
|
|
68
|
-
set_time_parameters(max_time, start_time);
|
|
69
|
-
|
|
70
|
-
int depth = 1;
|
|
71
|
-
Move best_move = (Move)0;
|
|
72
|
-
Move current_move = (Move)0;
|
|
73
|
-
while (depth <= max_depth) {
|
|
74
|
-
printf("\nDEPTH: %-3d-> ", depth);
|
|
75
|
-
current_move = alphabeta_root(depth, player);
|
|
76
|
-
printf("MOVE -> START: %d, END: %d, ROTATION: %d\n", get_start(current_move), get_end(current_move), get_rotation(current_move));
|
|
77
|
-
if ((time(NULL) - start_time < max_time))
|
|
78
|
-
best_move = current_move;
|
|
79
|
-
else
|
|
80
|
-
break;
|
|
81
|
-
depth++;
|
|
82
|
-
}
|
|
83
|
-
make_move(best_move);
|
|
84
|
-
|
|
85
|
-
printf("\n========================\n\n");
|
|
86
|
-
printf("Ending Board:\n");
|
|
87
|
-
print_board();
|
|
88
|
-
|
|
89
|
-
printf("\nDEPTH: %d\n", depth - 1);
|
|
90
|
-
|
|
91
|
-
int start = get_start(best_move);
|
|
92
|
-
int end = get_end(best_move);
|
|
93
|
-
int rotation = get_rotation(best_move);
|
|
94
|
-
std::cout << "START: " << start << ", END: " << end << ", ROTATION: " << rotation << std::endl;
|
|
95
|
-
return best_move;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
void get_row_col(int index, int &row, int &col) {
|
|
99
|
-
row = (index / 12) - 1;
|
|
100
|
-
col = (index % 12) - 1;
|
|
101
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
#ifndef GAME_BOARD_UTIL_H
|
|
2
|
-
#define GAME_BOARD_UTIL_H
|
|
3
|
-
|
|
4
|
-
#include "ai_loader.h"
|
|
5
|
-
|
|
6
|
-
#include <string>
|
|
7
|
-
#include <vector>
|
|
8
|
-
|
|
9
|
-
std::vector<std::string> flatten_2d_vector_with_buffer(const std::vector<std::vector<std::string>> &vec2d);
|
|
10
|
-
char **vector_to_c_array(const std::vector<std::string> &vec);
|
|
11
|
-
void free_c_array(char **c_array, size_t size);
|
|
12
|
-
Move call_ai_move(AILoader &ai_loader, const std::vector<std::vector<std::string>> &board_pieces, Player player, int max_depth, int _max_time);
|
|
13
|
-
void get_row_col(int index, int &row, int &col);
|
|
14
|
-
|
|
15
|
-
#endif
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
#include "game_board.h"
|
|
2
|
-
#include <FL/Fl.H>
|
|
3
|
-
#include <FL/Fl_Box.H>
|
|
4
|
-
#include <FL/Fl_Double_Window.H>
|
|
5
|
-
#include <FL/Fl_Input.H>
|
|
6
|
-
#include <FL/Fl_Int_Input.H>
|
|
7
|
-
|
|
8
|
-
class PositiveIntInput : public Fl_Int_Input {
|
|
9
|
-
public:
|
|
10
|
-
PositiveIntInput(int X, int Y, int W, int H, const char *L = 0)
|
|
11
|
-
: Fl_Int_Input(X, Y, W, H, L) {}
|
|
12
|
-
|
|
13
|
-
int handle(int event) override {
|
|
14
|
-
int result = Fl_Int_Input::handle(event);
|
|
15
|
-
if (event == FL_KEYDOWN || event == FL_KEYUP || event == FL_PASTE) {
|
|
16
|
-
const char *value = this->value();
|
|
17
|
-
if (value[0] == '-') {
|
|
18
|
-
this->value("");
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
return result;
|
|
22
|
-
}
|
|
23
|
-
};
|
|
24
|
-
|
|
25
|
-
int main(int argc, char **argv) {
|
|
26
|
-
Fl_Double_Window *window = new Fl_Double_Window(800, 600, "Khet AI");
|
|
27
|
-
GameBoard *board = new GameBoard(50, 50, 700, 504);
|
|
28
|
-
|
|
29
|
-
std::vector<std::vector<std::string>> init_board = {
|
|
30
|
-
{"L2", "--", "--", "--", "A2", "X2", "A2", "P1", "--", "--"},
|
|
31
|
-
{"--", "--", "P2", "--", "--", "--", "--", "--", "--", "--"},
|
|
32
|
-
{"--", "--", "--", "p3", "--", "--", "--", "--", "--", "--"},
|
|
33
|
-
{"P0", "--", "p2", "--", "S2", "S3", "--", "P1", "--", "p3"},
|
|
34
|
-
{"P1", "--", "p3", "--", "s1", "s0", "--", "P0", "--", "p2"},
|
|
35
|
-
{"--", "--", "--", "--", "--", "--", "P1", "--", "--", "--"},
|
|
36
|
-
{"--", "--", "--", "--", "--", "--", "--", "p0", "--", "--"},
|
|
37
|
-
{"--", "--", "p3", "a0", "x0", "a0", "--", "--", "--", "l0"}};
|
|
38
|
-
|
|
39
|
-
board->init(init_board);
|
|
40
|
-
|
|
41
|
-
Fl_Box *max_time_label = new Fl_Box(50, 10, 80, 30, "Max Time:");
|
|
42
|
-
PositiveIntInput *max_time_input = new PositiveIntInput(125, 15, 30, 20);
|
|
43
|
-
max_time_input->value("5");
|
|
44
|
-
board->max_time_input = max_time_input;
|
|
45
|
-
|
|
46
|
-
Fl_Box *max_depth_label = new Fl_Box(250, 10, 80, 30, "Max Depth:");
|
|
47
|
-
PositiveIntInput *max_depth_input = new PositiveIntInput(325, 15, 30, 20);
|
|
48
|
-
max_depth_input->value("25");
|
|
49
|
-
board->max_depth_input = max_depth_input;
|
|
50
|
-
|
|
51
|
-
window->end();
|
|
52
|
-
window->show(argc, argv);
|
|
53
|
-
return Fl::run();
|
|
54
|
-
}
|
data/ext/khetai/dev/main.c
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
#include "../khetai_lib.h"
|
|
2
|
-
#include <stdio.h>
|
|
3
|
-
#include <stdlib.h>
|
|
4
|
-
#include <time.h>
|
|
5
|
-
|
|
6
|
-
char *init_board[120] =
|
|
7
|
-
{"--", "--", "--", "--", "--", "--", "--", "--", "--", "--", "--", "--",
|
|
8
|
-
"--", "L2", "--", "--", "--", "A2", "X2", "A2", "P1", "--", "--", "--",
|
|
9
|
-
"--", "--", "--", "P2", "--", "--", "--", "--", "--", "--", "--", "--",
|
|
10
|
-
"--", "--", "--", "--", "p3", "--", "--", "--", "--", "--", "--", "--",
|
|
11
|
-
"--", "P0", "--", "p2", "--", "S2", "S3", "--", "P1", "--", "p3", "--",
|
|
12
|
-
"--", "P1", "--", "p3", "--", "s1", "s0", "--", "P0", "--", "p2", "--",
|
|
13
|
-
"--", "--", "--", "--", "--", "--", "--", "P1", "--", "--", "--", "--",
|
|
14
|
-
"--", "--", "--", "--", "--", "--", "--", "--", "p0", "--", "--", "--",
|
|
15
|
-
"--", "--", "--", "p3", "a0", "x0", "a0", "--", "--", "--", "l0", "--",
|
|
16
|
-
"--", "--", "--", "--", "--", "--", "--", "--", "--", "--", "--", "--"};
|
|
17
|
-
|
|
18
|
-
int main() {
|
|
19
|
-
init_zobrist();
|
|
20
|
-
srand((unsigned)time(NULL));
|
|
21
|
-
|
|
22
|
-
setup_board(init_board);
|
|
23
|
-
print_board();
|
|
24
|
-
|
|
25
|
-
time_t start_time = time(NULL);
|
|
26
|
-
int max_time = 5;
|
|
27
|
-
set_time_parameters(max_time, start_time);
|
|
28
|
-
int max_depth = 25;
|
|
29
|
-
|
|
30
|
-
int depth = 1;
|
|
31
|
-
Move best_move = (Move)0;
|
|
32
|
-
Move current_move = (Move)0;
|
|
33
|
-
while (depth <= max_depth) {
|
|
34
|
-
current_move = alphabeta_root(depth, RED);
|
|
35
|
-
if (time(NULL) - start_time < max_time)
|
|
36
|
-
best_move = current_move;
|
|
37
|
-
else
|
|
38
|
-
break;
|
|
39
|
-
depth++;
|
|
40
|
-
}
|
|
41
|
-
make_move(best_move);
|
|
42
|
-
|
|
43
|
-
printf("\n========================\n\n");
|
|
44
|
-
print_board();
|
|
45
|
-
|
|
46
|
-
printf("\nDEPTH: %d\n", depth - 1);
|
|
47
|
-
|
|
48
|
-
return 0;
|
|
49
|
-
}
|
data/ext/khetai/dev/main.rb
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
require_relative "../../../lib/khetai/khetai.so"
|
|
2
|
-
|
|
3
|
-
board = ["L2", "--", "--", "--", "A2", "X2", "A2", "P1", "--", "--",
|
|
4
|
-
"--", "--", "P2", "--", "--", "--", "--", "--", "--", "--",
|
|
5
|
-
"--", "--", "--", "p3", "--", "--", "--", "--", "--", "--",
|
|
6
|
-
"P0", "--", "p2", "--", "S2", "S3", "--", "P1", "--", "p3",
|
|
7
|
-
"P1", "--", "p3", "--", "s1", "s0", "--", "P0", "--", "p2",
|
|
8
|
-
"--", "--", "--", "--", "--", "--", "P1", "--", "--", "--",
|
|
9
|
-
"--", "--", "--", "--", "--", "--", "--", "p0", "--", "--",
|
|
10
|
-
"--", "--", "p3", "a0", "x0", "a0", "--", "--", "--", "l0"]
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
move = KhetAI.move(board, 1, 25, 5)
|
|
14
|
-
puts move.to_s
|