Go Fish/Aime: Difference between revisions

From Rosetta Code
Content added Content deleted
(Created page with "{{collection|Go Fish}} The AI will randomly ask a rank known to be in the human's hand (a card in the AI's hand that the human has asked for before and the AI hasn't asked for...")
 
No edit summary
Line 14: Line 14:
l_p_text(l, drand(l_length(l)),
l_p_text(l, drand(l_length(l)),
insert(cut("SHDC", i, 1), 0,
insert(cut("SHDC", i, 1), 0,
character("A23456789TJQK", j)));
"A23456789TJQK"[j]));
}
}
}
}
Line 30: Line 30:
s = pick;
s = pick;
while (r_greater(p, s, s)) {
while (r_greater(p, s, s)) {
if (character(s, 0) == character(pick, 0)) {
if (s[0] == pick[0]) {
i += 1;
i += 1;
} else {
} else {
Line 107: Line 107:
h = r_greater(p, s, d);
h = r_greater(p, s, d);
if (h) {
if (h) {
if (character(s, 0) != character(d, 0)) {
if (s[0] != d[0]) {
h = 0;
h = 0;
} else {
} else {
Line 128: Line 128:
f_line(input, pick);
f_line(input, pick);
if (length(pick) != 1
if (length(pick) != 1
|| index("A23456789TJQK", character(pick, 0)) == -1) {
|| index("A23456789TJQK", pick[0]) == -1) {
o_text("bad choice\n");
o_text("bad choice\n");
} else {
} else {
r_greater(u, pick, s);
r_greater(u, pick, s);
if (character(s, 0) != character(pick, 0)) {
if (s[0] != pick[0]) {
o_plan("you don't have any ", pick, "s\n");
o_plan("you don't have any ", pick, "s\n");
} else {
} else {
Line 171: Line 171:


if (r_greater(c, s, t)) {
if (r_greater(c, s, t)) {
if (character(s, 0) == character(t, 0)) {
if (s[0] == t[0]) {
lb_p_text(l, s);
lb_p_text(l, s);
}
}

Revision as of 11:40, 10 September 2014

Go Fish/Aime is part of Go Fish. You may find other members of Go Fish at Category:Go Fish.

The AI will randomly ask a rank known to be in the human's hand (a card in the AI's hand that the human has asked for before and the AI hasn't asked for before). If there are no known ranks, the AI will ask for the lowest rank it has (the strategy has the virtue of not giving away the player's hand). <lang aime>void shuffle(list l) {

   integer i, j;
   i = 4;
   while (i) {

i -= 1; j = 13; while (j) { j -= 1; l_p_text(l, drand(l_length(l)), insert(cut("SHDC", i, 1), 0, "A23456789TJQK"[j])); }

   }

}

void deal(list, text, record, integer &);

void check_book(list deck, text name, record p, text pick, integer &books) {

   integer i;
   text s;
   i = 0;
   s = pick;
   while (r_greater(p, s, s)) {

if (s[0] == pick[0]) { i += 1; } else { break; }

   }
   if (i == 4) {

books += 1; while (i) { i -= 1; r_greater(p, pick, s); r_delete(p, s); }

if (!r_size(p)) { deal(deck, name, p, books); }

   }

}

void deal(list deck, text name, record p, integer &p_books) {

   if (l_length(deck)) {

text s;

lf_e_text(s, deck); o_text("dealing "); o_space(8 - length(name)); o_text(name); if (!compare(name, "player")) { o_space(1); o_text(s); } o_text("\n"); r_p_integer(p, s, 0); check_book(deck, name, p, delete(s, 1), p_books);

   }

}

void show(text player, integer books, record p) {

   text s;
   o_text(player);
   o_text(": ");
   o_winteger(2, books);
   o_text(" books,");
   if (!compare(player, "P")) {

r_first(p, s); do { o_space(1); o_text(s); } while (r_greater(p, s, s));

   } else {

integer i;

i = r_size(p); while (i) { i -= 1; o_text(" **"); }

   }
   o_newline();

}

integer draw(record p, text s, text &d) {

   integer h;
   h = r_greater(p, s, d);
   if (h) {

if (s[0] != d[0]) { h = 0; } else { r_delete(p, d); }

   }
   return h;

}

integer user(list deck, record e, integer &c_books, record u, integer &u_books,

    record asked, file input)

{

   integer t;
   text pick, s;
   while (1) {

o_text("your pick?\n"); f_line(input, pick); if (length(pick) != 1 || index("A23456789TJQK", pick[0]) == -1) { o_text("bad choice\n"); } else { r_greater(u, pick, s); if (s[0] != pick[0]) { o_plan("you don't have any ", pick, "s\n"); } else { break; } }

   }
   r_a_integer(asked, pick, 0);
   t = draw(e, pick, s);
   if (!t) {

o_plan("computer has no ", pick, "s\n"); deal(deck, "player", u, u_books);

   } else {

do { r_p_integer(u, s, 0); } while (draw(e, pick, s)); if (!r_size(e)) { deal(deck, "computer", e, c_books); }

check_book(deck, "player", u, pick, u_books);

   }
   return t;

}

void mull(record c, record asked, text &pick) {

   list l;
   text s;
   if (r_first(asked, s)) {

do { text t;

if (r_greater(c, s, t)) { if (s[0] == t[0]) { lb_p_text(l, s); } } } while (r_greater(asked, s, s));

   }
   if (l_length(l)) {

pick = l_q_text(l, drand(l_length(l) - 1));

   }

}

integer fnet(list deck, record e, integer &c_books, record u, integer &u_books,

    record asked)

{

   integer t;
   text pick, s;
   r_first(e, pick);
   # seemingly dumb choice: ask the first book
   pick = delete(pick, 1);
   # refine choice to something the user has asked for
   mull(e, asked, pick);
   o_plan("computer asks ", pick, "s\n");
   t = !draw(u, pick, s);
   r_resign(asked, pick);
   if (t) {

deal(deck, "computer", e, c_books);

   } else {

do { r_p_integer(e, s, 0); } while (draw(u, pick, s)); if (!r_size(u)) { deal(deck, "player", u, u_books); }

check_book(deck, "computer", e, pick, c_books);

   }
   return t;

}

integer main(void) {

   integer c_books, u_books;
   list deck;
   file in;
   integer i, u_turn;
   record ai, e, u;
   c_books = u_books = 0;
   u_turn = 1;
   f_affix(in, "/dev/stdin");
   shuffle(deck);
   i = 9;
   while (i) {

deal(deck, "player", u, u_books); deal(deck, "computer", e, c_books); i -= 1;

   }
   while (c_books + u_books != 13) {

show("C", c_books, e); show("P", u_books, u); if (u_turn) { u_turn = user(deck, e, c_books, u, u_books, ai, in); } else { u_turn = fnet(deck, e, c_books, u, u_books, ai); }

   }
   o_plan("Computer has ", c_books, " books.\n");
   o_plan("Player has ", u_books, " books.\n");
   o_plan(__hold(c_books < u_books, "Player", "Computer"), " wins.\n");
   return 0;

} </lang>