void MoveGenerator::add_king_moves(class MoveList &list, const class Board &board, const int side){ U64 kings = board.bitboards[KING|side]; U64 non_friendly = ~board.bitboards[side]; while(kings){ U8 from = bit_scan_forward(kings); U64 targets = KING_LOOKUP_TABLE[from] & non_friendly; add_moves(from, targets, list, board, NO_FLAGS); kings &= kings - 1; } }
void gen_moves(list_t * list, const board_t * board) { ASSERT(list!=NULL); ASSERT(board!=NULL); ASSERT(!board_is_check(board)); LIST_CLEAR(list); add_moves(list,board); add_en_passant_captures(list,board); add_castle_moves(list,board); // debug ASSERT(list_is_ok(list)); }
void selfplay() { int color = 1; int z,search; for (;;) { if ( color == 1 ) { search = SEARCH_UCT; //SEARCH_PRIMITIVE; } else { search = SEARCH_UCT; } z = get_computer_move(color, search); add_moves(z, color); if ( z == 0 && moves > 1 && record[moves-2] == 0 ) break; if ( moves > 300 ) break; // too long color = flip_color(color); } print_sgf(); }
static int user_parser (char * buff) { char verb_buff[MAX_VERB_BUFF]; sentence_t *s; char *p; int length; char *user_verb = 0; int where; int save_illegal_sentence_action; debug(d_flag, ("cmd [/%s]: %s\n", command_giver->obname, buff)); /* strip trailing spaces. */ for (p = buff + strlen(buff) - 1; p >= buff; p--) { if (*p != ' ') break; *p = '\0'; } if (buff[0] == '\0') return 0; length = p - buff + 1; p = strchr(buff, ' '); if (p == 0) { user_verb = findstring(buff); } else { *p = '\0'; user_verb = findstring(buff); *p = ' '; length = p - buff; } if (!user_verb) { /* either an xverb or a verb without a specific add_action */ user_verb = buff; } /* * copy user_verb into a static character buffer to be pointed to by * last_verb. */ strncpy(verb_buff, user_verb, MAX_VERB_BUFF - 1); if (p) { int pos; pos = p - buff; if (pos < MAX_VERB_BUFF) { verb_buff[pos] = '\0'; } } save_illegal_sentence_action = illegal_sentence_action; illegal_sentence_action = 0; for (s = command_giver->sent; s; s = s->next) { svalue_t *ret; object_t *command_object; if (s->flags & (V_NOSPACE | V_SHORT)) { if (strncmp(buff, s->verb, strlen(s->verb)) != 0) continue; } else { /* note: if was add_action(blah, "") then accept it */ if (s->verb[0] && (user_verb != s->verb)) continue; } /* * Now we have found a special sentence ! */ if (!(s->flags & V_FUNCTION)) debug(d_flag, ("Local command %s on /%s", s->function.s, s->ob->obname)); if (s->flags & V_NOSPACE) { int l1 = strlen(s->verb); int l2 = strlen(verb_buff); if (l1 < l2) last_verb = verb_buff + l1; else last_verb = ""; } else { if (!s->verb[0] || (s->flags & V_SHORT)) last_verb = verb_buff; else last_verb = s->verb; } /* * If the function is static and not defined by current object, then * it will fail. If this is called directly from user input, then * the origin is the driver and it will be allowed. */ where = (current_object ? ORIGIN_EFUN : ORIGIN_DRIVER); /* * Remember the object, to update moves. */ command_object = s->ob; save_command_giver(command_giver); if (s->flags & V_NOSPACE) { copy_and_push_string(&buff[strlen(s->verb)]); } else if (buff[length] == ' ') { copy_and_push_string(&buff[length + 1]); } else { push_undefined(); } if (s->flags & V_FUNCTION) { ret = call_function_pointer(s->function.f, 1); } else { if (s->function.s[0] == APPLY___INIT_SPECIAL_CHAR) error("Illegal function name.\n"); ret = apply(s->function.s, s->ob, 1, where); } /* s may be dangling at this point */ restore_command_giver(); last_verb = 0; /* was this the right verb? */ if (ret == 0) { /* is it still around? Otherwise, ignore this ... it moved somewhere or dested itself */ if (s == command_giver->sent) { char buf[256]; if (s->flags & V_FUNCTION) { sprintf(buf, "Verb '%s' bound to uncallable function pointer.\n", s->verb); error(buf); } else { sprintf(buf, "Function for verb '%s' not found.\n", s->verb); error(buf); } } } if (ret && (ret->type != T_NUMBER || ret->u.number != 0)) { #ifdef PACKAGE_MUDLIB_STATS if (command_giver && command_giver->interactive #ifndef NO_WIZARDS && !(command_giver->flags & O_IS_WIZARD) #endif ) add_moves(&command_object->stats, 1); #endif if (!illegal_sentence_action) illegal_sentence_action = save_illegal_sentence_action; return 1; } if (illegal_sentence_action) { switch (illegal_sentence_action) { case 1: error("Illegal to call remove_action() [caller was /%s] from a verb returning zero.\n", illegal_sentence_ob->obname); case 2: error("Illegal to move or destruct an object (/%s) defining actions from a verb function which returns zero.\n", illegal_sentence_ob->obname); } } } notify_no_command(); illegal_sentence_action = save_illegal_sentence_action; return 0; }
void gtp_loop() { char str[STR_MAX]; char sa[TOKEN_MAX][STR_MAX]; char seps[] = " "; char *token; int x,y,z,ax, count; setbuf(stdout, NULL); setbuf(stderr, NULL); for (;;) { if ( fgets(str, STR_MAX, stdin)==NULL ) break; // prt("gtp<-%s",str); count = 0; token = strtok( str, seps ); while ( token != NULL ) { strcpy(sa[count], token); count++; if ( count == TOKEN_MAX ) break; token = strtok( NULL, seps ); } if ( strstr(sa[0],"boardsize") ) { // int new_board_size = atoi( sa[1] ); send_gtp("= \n\n"); } else if ( strstr(sa[0],"clear_board") ) { init_board(); send_gtp("= \n\n"); } else if ( strstr(sa[0],"quit") ) { break; } else if ( strstr(sa[0],"protocol_version") ) { send_gtp("= 2\n\n"); } else if ( strstr(sa[0],"name") ) { send_gtp("= your_program_name\n\n"); } else if ( strstr(sa[0],"version") ) { send_gtp("= 0.0.1\n\n"); } else if ( strstr(sa[0],"list_commands" ) ) { send_gtp("= boardsize\nclear_board\nquit\nprotocol_version\n" "name\nversion\nlist_commands\nkomi\ngenmove\nplay\n\n"); } else if ( strstr(sa[0],"komi") ) { komi = atof( sa[1] ); send_gtp("= \n\n"); } else if ( strstr(sa[0],"genmove") ) { int color = 1; if ( tolower(sa[1][0])=='w' ) color = 2; z = get_computer_move(color, SEARCH_UCT); add_moves(z, color); send_gtp("= %s\n\n",get_char_z(z)); } else if ( strstr(sa[0],"play") ) { // "play b c4", "play w d17" int color = 1; if ( tolower(sa[1][0])=='w' ) color = 2; ax = tolower( sa[2][0] ); x = ax - 'a' + 1; if ( ax >= 'i' ) x--; y = atoi(&sa[2][1]); z = get_z(x, B_SIZE-y+1); if ( tolower(sa[2][0])=='p' ) z = 0; // pass add_moves(z, color); send_gtp("= \n\n"); } else { send_gtp("? unknown_command\n\n"); } } }