void domove() { PLAY *pp; int i, j; bool goodplay; pp = &Player[Play]; if (Play == PLAYER) getmove(); else calcmove(); Next = FALSE; goodplay = TRUE; switch (Movetype) { case M_DISCARD: if (haspicked(pp)) { if (pp->hand[Card_no] == C_INIT) { if (Card_no == 6) Finished = TRUE; else error("no card there"); } else { if (is_safety(pp->hand[Card_no])) { error("discard a safety?"); goodplay = FALSE; break; } Discard = pp->hand[Card_no]; pp->hand[Card_no] = C_INIT; Next = TRUE; if (Play == PLAYER) account(Discard); } } else error("must pick first"); break; case M_PLAY: goodplay = playcard(pp); break; case M_DRAW: Card_no = 0; if (Topcard <= Deck) error("no more cards"); else if (haspicked(pp)) error("already picked"); else { pp->hand[0] = *--Topcard; #ifdef DEBUG if (Debug) fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); #endif acc: if (Play == COMP) { account(*Topcard); if (is_safety(*Topcard)) pp->safety[*Topcard-S_CONV] = S_IN_HAND; } if (pp->hand[1] == C_INIT && Topcard > Deck) { Card_no = 1; pp->hand[1] = *--Topcard; #ifdef DEBUG if (Debug) fprintf(outf, "DOMOVE: Draw %s\n", C_name[*Topcard]); #endif goto acc; } pp->new_battle = FALSE; pp->new_speed = FALSE; } break; case M_ORDER: break; } /* * move blank card to top by one of two methods. If the * computer's hand was sorted, the randomness for picking * between equally valued cards would be lost */ if (Order && Movetype != M_DRAW && goodplay && pp == &Player[PLAYER]) sort(pp->hand); else for (i = 1; i < HAND_SZ; i++) if (pp->hand[i] == C_INIT) { for (j = 0; (j < HAND_SZ) && (pp->hand[j] == C_INIT); j++) ; if (j == HAND_SZ) j = 0; pp->hand[i] = pp->hand[j]; pp->hand[j] = C_INIT; } if (Topcard <= Deck) check_go(); if (Next) nextplay(); }
void startsingleplayer(){ const int player=ORDER; clearscreen(); moveto(0,0); setbold(true); tprintf("Order & Chaos -- Single player"); setbold(false); Board *board=makeboard(); int curx=0,cury=0; bool aiturn=false; Move mv; int win=-1; while(true){ moveto(2,2); tprintboard(board); redraw(); if(win!=-1)break; if(aiturn){ aiturn=false; moveto(0,N+3); tprintf("Calculating..."); redraw(); mv=calcmove(board,!player); applymove(board,mv); win=checkwin(board); if(win!=-1)break; moveto(0,N+3); tprintf(" "); continue; } moveto(2+2*curx,2+cury); redraw(); int key=tgetkey(); int stone; switch(key){ case 'q': moveto(0,N+3); setbold(true); tprintf("Really quit? [y/N] "); setbold(false); redraw(); key=tgetkey(); if(key=='y'||key=='Y')return; moveto(0,N+3); tprintf(" "); break; case 'h': case KEY_LEFT: if(curx>0)curx--; else bel(); break; case 'j': case KEY_DOWN: if(cury<N-1)cury++; else bel(); break; case 'k': case KEY_UP: if(cury>0)cury--; else bel(); break; case 'l': case KEY_RIGHT: if(curx<N-1)curx++; else bel(); break; case 'x': stone=XX; if(false){ case 'o': stone=OO; } if(!isempty(board,N*cury+curx)){ bel(); break; } mv.pos=N*cury+curx; mv.stone=stone; applymove(board,mv); win=checkwin(board); if(win!=-1)break; aiturn=true; break; default: bel(); break; } } moveto(0,N+3); setbold(true); const char *plstr=win==ORDER?"Order":"Chaos"; if(win==player)tprintf("You (%s) won! Congratulations!",plstr); else tprintf("The AI (%s) won! Better next time...",plstr); setbold(false); redraw(); tgetkey(); }