From bce092a90a6074271a37d24ea36506f354f3bf1f Mon Sep 17 00:00:00 2001 From: Trevor Date: Sat, 20 Feb 2021 16:51:06 +1000 Subject: [PATCH] Port Chomp to Python --- 26 Chomp/python/chomp.py | 132 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 132 insertions(+) create mode 100755 26 Chomp/python/chomp.py diff --git a/26 Chomp/python/chomp.py b/26 Chomp/python/chomp.py new file mode 100755 index 00000000..56190a9e --- /dev/null +++ b/26 Chomp/python/chomp.py @@ -0,0 +1,132 @@ +#!/usr/bin/env python3 +# CHOMP +# +# Converted from BASIC to Python by Trevor Hobson + + +class Canvas: + """ For drawing the cookie """ + + def __init__(self, width=9, height=9, fill="*"): + self._buffer = [] + for _ in range(height): + line = [] + for _ in range(width): + line.append(fill) + self._buffer.append(line) + self._buffer[0][0] = "P" + + def render(self): + lines = [" 1 2 3 4 5 6 7 8 9"] + row = 0 + for line in self._buffer: + row += 1 + lines.append(" " + str(row) + " " * 5 + " ".join(line)) + return "\n".join(lines) + + def chomp(self, r, c): + if not 1 <= r <= len(self._buffer) or not 1 <= c <= len(self._buffer[0]): + return "Empty" + elif self._buffer[r - 1][c - 1] == " ": + return "Empty" + elif self._buffer[r - 1][c - 1] == "P": + return "Poison" + else: + for row in range(r - 1, len(self._buffer)): + for column in range(c - 1, len(self._buffer[row])): + self._buffer[row][column] = " " + return "Chomp" + + +def play_game(): + """Play one round of the game""" + players = 0 + while players == 0: + try: + players = int(input("How many players ")) + + except ValueError: + print("Please enter a number.") + rows = 0 + while rows == 0: + try: + rows = int(input("How many rows ")) + if rows > 9 or rows < 1: + rows = 0 + print("Too many rows (9 is maximum).") + + except ValueError: + print("Please enter a number.") + columns = 0 + while columns == 0: + try: + columns = int(input("How many columns ")) + if columns > 9 or columns < 1: + columns = 0 + print("Too many columns (9 is maximum).") + + except ValueError: + print("Please enter a number.") + cookie = Canvas(width=columns, height=rows) + player = 0 + alive = True + while alive: + print("") + print(cookie.render()) + print("") + player += 1 + if player > players: + player = 1 + while True: + print("Player", player) + player_row = -1 + player_column = -1 + while player_row == -1 or player_column == -1: + try: + coordinates = [int(item) for item in input( + "Coordinates of chomp (Row, Column) ").split(",")] + player_row = coordinates[0] + player_column = coordinates[1] + + except (ValueError, IndexError): + print("Please enter valid coordinates.") + result = cookie.chomp(player_row, player_column) + if result == "Empty": + print("No fair. You're trying to chomp on empty space!") + elif result == "Poison": + print("\nYou lose player", player) + alive = False + break + else: + break + + +def main(): + print(" " * 33 + "CHOMP") + print(" " * 15 + "CREATIVE COMPUTING MORRISTOWN, NEW JERSEY\n") + print("THIS IS THE GAME OF CHOMP (SCIENTIFIC AMERICAN, JAN 1973)") + if input("Do you want the rules (1=Yes, 0=No!) ") != "0": + print("Chomp is for 1 or more players (Humans only).\n") + print("Here's how a board looks (This one is 5 by 7):") + example = Canvas(width=7, height=5) + print(example.render()) + print("\nThe board is a big cookie - R rows high and C columns") + print("wide. You input R and C at the start. In the upper left") + print("corner of the cookie is a poison square (P). The one who") + print("chomps the poison square loses. To take a chomp, type the") + print("row and column of one of the squares on the cookie.") + print("All of the squares below and to the right of that square") + print("(Including that square, too) disappear -- CHOMP!!") + print("No fair chomping squares that have already been chomped,") + print("or that are outside the original dimensions of the cookie.\n") + print("Here we go...") + + keep_playing = True + while keep_playing: + + play_game() + keep_playing = input("\nAgain (1=Yes, 0=No!) ") == "1" + + +if __name__ == "__main__": + main()