const char *move_to_str(const board_t *board, const move_t *move) { assert((bitcount(*move)) >= 2); if (bitcount(*move) == 2) { int i = lowbit(*move & board->stones[0]), j = lowbit(*move & ~board->stones[0]); strcpy(move_buf, pos_to_str(i)); strcat(move_buf, "-"); strcat(move_buf, pos_to_str(j)); } else { bitboard_t occupied = board->stones[0] | board->stones[1]; int f; if (*move & board->stones[0]) { f = lowbit(*move & board->stones[0]); strcpy(move_buf, pos_to_str(f)); format_move(move_buf + 2, f, *move ^ BIT(f), occupied ^ BIT(f)); } else for(f = 0; f < FIELDS; ++f) { strcpy(move_buf, pos_to_str(f)); if (format_move(move_buf + 2, f, *move ^ BIT(f), occupied ^ BIT(f))) break; } } return move_buf; }
int main(int argc, char* argv[]) { if(argc != 3) usage(); float scale = atof(argv[1]); FILE* fin = fopen(argv[2],"r"); Agraph_t* g = agread(fin, (Agdisc_t*)NULL); Agnode_t* n; for(n = agfstnode(g); n; n = agnxtnode(g,n)) { char* pos = agget(n,"pos"); double x,y; sscanf(pos,"%lf,%lf",&x,&y); x *= scale; y *= scale; char* s = pos_to_str(x,y); agset(n,"pos",s); free(s); } agwrite(g,stdout); agclose(g); return 0; }
int main(int argc, char* argv[]) { struct marsopts opts = init(argc, argv); Agraph_t* g = agread(opts.fin, (Agdisc_t*)NULL); Agnode_t* n; mat z; init_graph(g); z = mars(g, opts); mat_scalar_mult(z, opts.scale); if(opts.viewer) { viewer(argc, argv); } else { for(n = agfstnode(g); n; n = agnxtnode(g,n)) { int id = getid(n); char* s = pos_to_str(&z->m[mindex(id, 0, z)], z->c); agset(n,"pos",s); free(s); } agwrite(g, opts.fout); } mat_free(z); clean_up(g); agclose(g); return 0; }
bool format_move(char *buf, int f, bitboard_t todo, bitboard_t occupied) { int n, g, h; if (todo == BIT(f)) return true; for (n = 0; moves_jumps[f][n] >= 0; ++n) { if ( !(occupied & BIT(h = moves_jumps[f][n])) && ((occupied & todo) & BIT(g = (f + h)/2)) ) { *buf = '*'; strcpy(buf + 1, pos_to_str(h)); if (format_move(buf + 3, h, todo ^ BIT(g), occupied)) return true; } } return false; }