// Copyright BASIC version - Creative Computing, Morristown, New Jersey // Copyright Arena version - 2006 J.L. Bezemer int enter () { return ((int) (fgets (stdin))); } int start (int m) { print ("This is a game called '23 matches'.\n\n"); print ("When it is your turn, you may take one, two, or three\n"); print ("matches. The object of the game is not to have to take\n"); print ("the last match.\n\n"); print ("Let's flip a coin to see who goes first.\n"); print ("If it comes up heads, I will win the toss.\n\n"); if (rand (0, RAND_MAX) & 1) { print ("Heads! I win! Ha! Ha!\n"); print ("Prepare to lose, meatball-nose!!\n"); print ("I take 2 matches\n"); m -= 2; } else { print ("Tails! You go first.\n"); } return (m); } bool move_not_ok (int a, int m) { if ((a > m) || (a > 3) || (a < 1)) { print ("Very funny! Dummy!\n"); print ("Do you want to play or goof around?\n"); } return ((a > m) || (a > 3) || (a < 1)); } int user_moves (int m) { printf ("The number of matches is now %d\n", m); print ("Your turn -- you may take 1, 2 or 3 matches.\n"); do { print ("How many do you wish to remove? "); a = enter (); } while (move_not_ok (a, m)); printf ("There are now %d matches remaining.\n", m - a); return (a); } bool user_wins (int m) { if (m < 2) { print ("\nYou won, floppy ears!\n"); print ("Think you're pretty smart!\n"); print ("Let's play again and I'll blow your shoes off!!\n"); } return (m < 2); } int computer_moves (int m, int u) { c = m < 5 ? m - 1 : 4 - u; printf ("\nMy turn! I remove %d matches.\n", c); return (c); } bool computer_wins (int m) { if (m < 2) { print ("You poor boob! You took the last match! I gotcha!!\n"); print ("Ha! Ha! I beat you!!!\n"); print ("Goodbye loser!\n"); } return (m < 2); } void game (int m) { for (;;) { u = user_moves (m); m -= u; if (user_wins (m)) exit (0); c = computer_moves (m, u); m -= c; if (computer_wins (m)) exit (0); } } void matches (int m) { m = start (m); game (m); } matches (23);