Go Fish/Aime: Difference between revisions

From Rosetta Code
Content added Content deleted
No edit summary
No edit summary
Line 4: Line 4:
shuffle(list l)
shuffle(list l)
{
{
integer i, j;
integer c, e;


for (, c in b_draft("SHDC")) {
i = 4;
for (, e in b_draft("A23456789TJQK")) {
while (i) {
l.p_text(drand(~l), data().append(e).append(c));
i -= 1;
}
j = 13;
while (j) {
j -= 1;
l_p_text(l, drand(l_length(l)),
insert(cut("SHDC", i, 1), 0,
"A23456789TJQK"[j]));
}
}
}
}
}
Line 29: Line 23:
i = 0;
i = 0;
s = pick;
s = pick;
while (r_greater(p, s, s)) {
while (rsk_greater(p, s, s)) {
if (s[0] == pick[0]) {
if (s[0] == pick[0]) {
i += 1;
i += 1;
} else {
} else {
break;
break;
}
}
}
}


if (i == 4) {
if (i == 4) {
books += 1;
books += 1;
while (i) {
while (i) {
i -= 1;
i -= 1;
r_greater(p, pick, s);
rsk_greater(p, pick, s);
r_delete(p, s);
p.delete(s);
}
}


if (!r_size(p)) {
if (!~p) {
deal(deck, name, p, books);
deal(deck, name, p, books);
}
}
}
}
}
}
Line 54: Line 48:
deal(list deck, text name, record p, integer &p_books)
deal(list deck, text name, record p, integer &p_books)
{
{
if (l_length(deck)) {
if (~deck) {
text s;
text s;


lf_e_text(s, deck);
lf_e_text(s, deck);
o_text("dealing ");
o_form("dealing /w8/", name);
if (!compare(name, "player")) {
o_space(8 - length(name));
o_(" ", s);
o_text(name);
}
if (!compare(name, "player")) {
o_space(1);
o_text("\n");
o_text(s);
p[s] = 0;
check_book(deck, name, p, delete(s, 1), p_books);
}
o_text("\n");
r_p_integer(p, s, 0);
check_book(deck, name, p, delete(s, 1), p_books);
}
}
}
}
Line 76: Line 67:
text s;
text s;


o_text(player);
o_form("~: /w2/ books", player, books);
o_text(": ");
o_winteger(2, books);
o_text(" books,");


if (!compare(player, "P")) {
if (!compare(player, "P")) {
for (s in p) {
r_first(p, s);
o_(" ", s);
do {
o_space(1);
}
o_text(s);
} while (r_greater(p, s, s));
} else {
} else {
call_n(~p, o_text, " **");
integer i;

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


Line 105: Line 85:
integer h;
integer h;


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


Line 125: Line 105:


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


r_a_integer(asked, pick, 0);
asked.a_integer(pick, 0);


t = draw(e, pick, s);
t = draw(e, pick, s);
if (!t) {
if (!t) {
o_plan("computer has no ", pick, "s\n");
o_("computer has no ", pick, "s\n");
deal(deck, "player", u, u_books);
deal(deck, "player", u, u_books);
} else {
} else {
do {
do {
r_p_integer(u, s, 0);
u[s] = 0;
} while (draw(e, pick, s));
} while (draw(e, pick, s));
if (!r_size(e)) {
if (!~e) {
deal(deck, "computer", e, c_books);
deal(deck, "computer", e, c_books);
}
}


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


Line 166: Line 145:
text s;
text s;


if (r_first(asked, s)) {
for (s in asked) {
text t;
do {
text t;


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


if (l_length(l)) {
if (~l) {
pick = l_q_text(l, drand(l_length(l) - 1));
pick = l[drand(~l - 1)];
}
}
}
}
Line 190: Line 167:
text pick, s;
text pick, s;


r_first(e, pick);
e.first(pick);
# seemingly dumb choice: ask the first book
# seemingly dumb choice: ask the first book
pick = delete(pick, 1);
pick = delete(pick, 1);
# refine choice to something the user has asked for
# refine choice to something the user has asked for
mull(e, asked, pick);
mull(e, asked, pick);
o_plan("computer asks ", pick, "s\n");
o_("computer asks ", pick, "s\n");
t = !draw(u, pick, s);
t = !draw(u, pick, s);
r_resign(asked, pick);
asked.resign(pick);
if (t) {
if (t) {
deal(deck, "computer", e, c_books);
deal(deck, "computer", e, c_books);
} else {
} else {
do {
do {
r_p_integer(e, s, 0);
e[s] = 0;
} while (draw(u, pick, s));
} while (draw(u, pick, s));
if (!r_size(u)) {
if (!~u) {
deal(deck, "player", u, u_books);
deal(deck, "player", u, u_books);
}
}


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


Line 226: Line 203:
u_turn = 1;
u_turn = 1;


f_affix(in, "/dev/stdin");
in.stdin;


shuffle(deck);
deck.shuffle;


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


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


o_plan("Computer has ", c_books, " books.\n");
o_("Computer has ", c_books, " books.\n");
o_plan("Player has ", u_books, " books.\n");
o_("Player has ", u_books, " books.\n");
o_plan(__hold(c_books < u_books, "Player", "Computer"), " wins.\n");
o_(c_books < u_books ? "Player" : "Computer", " wins.\n");


return 0;
return 0;

Revision as of 17:30, 8 May 2018

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 c, e;
   for (, c in b_draft("SHDC")) {
       for (, e in b_draft("A23456789TJQK")) {
           l.p_text(drand(~l), data().append(e).append(c));
       }
   }

}

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 (rsk_greater(p, s, s)) {
       if (s[0] == pick[0]) {
           i += 1;
       } else {
           break;
       }
   }
   if (i == 4) {
       books += 1;
       while (i) {
           i -= 1;
           rsk_greater(p, pick, s);
           p.delete(s);
       }
       if (!~p) {
           deal(deck, name, p, books);
       }
   }

}

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

   if (~deck) {
       text s;
       lf_e_text(s, deck);
       o_form("dealing /w8/", name);
       if (!compare(name, "player")) {
           o_(" ", s);
       }
       o_text("\n");
       p[s] = 0;
       check_book(deck, name, p, delete(s, 1), p_books);
   }

}

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

   text s;
   o_form("~: /w2/ books", player, books);
   if (!compare(player, "P")) {
       for (s in p) {
           o_(" ", s);
       }
   } else {
       call_n(~p, o_text, " **");
   }
   o_newline();

}

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

   integer h;
   h = rsk_greater(p, s, d);
   if (h) {
       if (s[0] != d[0]) {
           h = 0;
       } else {
           p.delete(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 (~pick != 1 || place("A23456789TJQK", pick[0]) == -1) {
           o_text("bad choice\n");
       } else {
           rsk_greater(u, pick, s);
           if (s[0] != pick[0]) {
               o_("you don't have any ", pick, "s\n");
           } else {
               break;
           }
       }
   }
   asked.a_integer(pick, 0);
   t = draw(e, pick, s);
   if (!t) {
       o_("computer has no ", pick, "s\n");
       deal(deck, "player", u, u_books);
   } else {
       do {
           u[s] = 0;
       } while (draw(e, pick, s));
       if (!~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;
   for (s in asked) {
       text t;
       if (rsk_greater(c, s, t)) {
           if (s[0] == t[0]) {
               l.append(s);
           }
       }
   }
   if (~l) {
       pick = l[drand(~l - 1)];
   }

}

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

    record asked)

{

   integer t;
   text pick, s;
   e.first(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_("computer asks ", pick, "s\n");
   t = !draw(u, pick, s);
   asked.resign(pick);
   if (t) {
       deal(deck, "computer", e, c_books);
   } else {
       do {
           e[s] = 0;
       } while (draw(u, pick, s));
       if (!~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;
   in.stdin;
   deck.shuffle;
   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_("Computer has ", c_books, " books.\n");
   o_("Player has ", u_books, " books.\n");
   o_(c_books < u_books ? "Player" : "Computer", " wins.\n");
   return 0;

} </lang>