My Project
nboard.c
Go to the documentation of this file.
1
11#include "options.h"
12#include "search.h"
13#include "util.h"
14#include "ui.h"
15#include "play.h"
16
17#include <stdarg.h>
18
19static Log nboard_log[1];
20
21static void nboard_send(const char *format, ...)
22{
23 va_list args;
24
25 va_start(args, format);
26 vprintf(format, args);
27 va_end(args);
28 putchar('\n'); fflush(stdout);
29
31 fprintf(nboard_log->f, "sent> \"");
32 va_start(args, format);
33 vfprintf(nboard_log->f, format, args);
34 va_end(args);
35 fprintf(nboard_log->f, "\"\n");
36 }
37}
38
39static void nboard_fail(const char *format, ...)
40{
41 va_list args;
42
43 fprintf(stderr, "Error: ");
44 va_start(args, format);
45 vfprintf(stderr, format, args);
46 va_end(args);
47 putc('\n', stderr); fflush(stderr);
48
50 fprintf(nboard_log->f, "error> \"");
51 va_start(args, format);
52 vfprintf(nboard_log->f, format, args);
53 va_end(args);
54 fprintf(nboard_log->f, "\"\n");
55 }
56}
57
58static void nboard_send_move(Result *result)
59{
60 char move[4];
61
62 move_to_string(result->move, WHITE, move);
63 nboard_send("=== %s %.2f %.1f", move, 1.0 * result->score, 0.001 * result->time);
64}
65
66static void nboard_observer(Result *result)
67{
69 fprintf(nboard_log->f, "edax> ");
70 result_print(result, nboard_log->f);
71 putc('\n', nboard_log->f);
72 }
73 nboard_send("nodestats %lld %.2f", result->n_nodes, result->time);
74}
75
81{
82 Play *play = ui->play;
83
84 // other update...
85 play_init(play, ui->book);
86 play->search->options.header = play->search->options.separator = NULL;
87 ui->book->search = play->search;
89 play->search->id = 1;
91 ui->mode = 3;
92 play->type = ui->type;
93
95}
96
102{
104 book_free(ui->book);
105 play_free(ui->play);
107}
108
114{
115 char *cmd = NULL, *param = NULL;
116 Play *play = ui->play;
117
118 // loop forever
119 for (;;) {
120 errno = 0;
121
122 if (log_is_open(nboard_log)) {
123 play_print(play, nboard_log->f);
124 }
125
126 ui_event_wait(ui, &cmd, &param);
127 log_print(nboard_log, "received< \"%s %s\"\n", cmd, param);
128
129 if (*cmd == '\0') {
130
131 } else if (strcmp(cmd, "nboard") == 0) {
132 if (strcmp(param, "1") != 0) nboard_fail("Edax expected \"nboard 1\" protocol");
133
134 } else if (strcmp(cmd, "depth") == 0) {
135 options.level = string_to_int(param, 21);
136 nboard_send("set myname Edax%d", options.level);
137
138 } else if (strcmp(cmd, "game") == 0) {
139 Game game[1];
140 if (parse_ggf(game, param) != param) {
141 game_get_board(game, 60, play->initial_board);
142 play_new(play);
143 } else {
144 nboard_fail("Cannot parse game \"%s\"", param);
145 }
146
147 } else if (strcmp(cmd, "move") == 0) {
148 if (!play_user_move(play, param)) {
149 nboard_fail("Cannot parse move \"%s\"", param);
150 }
151 } else if (strcmp(cmd, "hint") == 0) {
152
153 nboard_send("status Edax is thinking");
154 play_hint(play, string_to_int(param, MAX_MOVE));
155 nboard_send("status Edax is waiting");
156
157 } else if (strcmp(cmd, "go") == 0) {
158 nboard_send("status Edax is thinking");
159 play_go(play, false);
161 nboard_send("status Edax is waiting");
162
163 } else if (strcmp(cmd, "quit") == 0 || strcmp(cmd, "eof") == 0) {
164 free(cmd); free(param);
165 return;
166
167 } else if (strcmp(cmd, "ping") == 0) {
168 nboard_send("pong %s", param);
169
170 } else if (strcmp(cmd, "learn") == 0) {
171 nboard_send("status Edax is learning");
172 play_store(play);
173 nboard_send("status Edax is waiting");
174
175 } else if (play_user_move(play, cmd)) {
176
177 // error: unknown message
178 } else {
179 nboard_fail("unknown command \"%s\" \"%s\"", cmd, param);
180 }
181 }
182}
183
184
void book_free(Book *book)
Free resources used by the opening book.
Definition book.c:1422
void book_save(Book *book, const char *file)
Save an opening book.
Definition book.c:1622
void book_load(Book *book, const char *file)
Load the opening book.
Definition book.c:1471
@ WHITE
Definition const.h:43
#define MAX_MOVE
Definition const.h:18
char * parse_ggf(Game *game, const char *string)
Parse a ggf game from a string.
Definition game.c:664
bool game_get_board(const Game *game, const int ply, Board *board)
Get the board after 'ply' move.
Definition game.c:195
char * move_to_string(const int x, const int player, char *s)
Print out a move.
Definition move.c:76
static void nboard_observer(Result *result)
Definition nboard.c:66
void ui_loop_nboard(UI *ui)
Loop event.
Definition nboard.c:113
static void nboard_send(const char *format,...)
Definition nboard.c:21
static void nboard_send_move(Result *result)
Definition nboard.c:58
static Log nboard_log[1]
Definition nboard.c:19
static void nboard_fail(const char *format,...)
Definition nboard.c:39
void ui_init_nboard(UI *ui)
initialize edax protocol
Definition nboard.c:80
void ui_free_nboard(UI *ui)
free resources used by edax protocol
Definition nboard.c:101
Options options
Definition options.c:22
void play_store(Play *play)
store the game into the opening book
Definition play.c:1175
void play_print(Play *play, FILE *f)
Print the game state.
Definition play.c:1225
void play_hint(Play *play, int n)
Start thinking.
Definition play.c:365
void play_new(Play *play)
Start a new game.
Definition play.c:62
void play_init(Play *play, Book *book)
Initialization.
Definition play.c:27
bool play_user_move(Play *play, const char *string)
Play a user move.
Definition play.c:909
void play_go(Play *play, const bool update)
Start thinking.
Definition play.c:214
void play_free(Play *play)
Free resources.
Definition play.c:52
Edax play control - header file.
void result_print(Result *result, FILE *f)
Print the current search result.
Definition search.c:1106
void search_set_observer(Search *search, void(*observer)(Result *))
set observer.
Definition search.c:1095
bool need_saving
Definition book.h:47
Search * search
Definition book.h:49
Definition game.h:22
LogFile.
Definition util.h:423
FILE * f
Definition util.h:424
int level
Definition options.h:40
char * ui_log_file
Definition options.h:78
char * book_file
Definition options.h:59
Definition play.h:25
Result result[1]
Definition play.h:29
Board initial_board[1]
Definition play.h:27
Search search[1]
Definition play.h:28
int type
Definition play.h:31
Definition search.h:41
int move
Definition search.h:44
unsigned long long n_nodes
Definition search.h:49
int score
Definition search.h:45
long long time
Definition search.h:48
const char * separator
Definition search.h:145
const char * header
Definition search.h:144
int id
Definition search.h:101
struct Search::@25 options
Definition ui.h:31
int type
Definition ui.h:36
Play play[2]
Definition ui.h:32
Book book[1]
Definition ui.h:33
int mode
Definition ui.h:37
void ui_event_wait(UI *ui, char **cmd, char **param)
Wait input.
Definition ui.c:147
User interface header.
int string_to_int(const char *s, const int default_value)
Convert a string into an integer.
Definition util.c:457
Miscellaneous utilities header.
#define log_close(l)
Close an opened log file.
Definition util.h:435
#define log_print(l,...)
Print into the log file.
Definition util.h:442
#define log_open(l, file)
open a log file if allowed.
Definition util.h:429
#define log_is_open(l)
Check if the log stream can be used.
Definition util.h:448