-
Notifications
You must be signed in to change notification settings - Fork 0
/
Harp 150_ Example of game project Copy of Py_Pig
1 lines (1 loc) · 10.9 KB
/
Harp 150_ Example of game project Copy of Py_Pig
1
{"cells":[{"cell_type":"markdown","metadata":{"id":"-kDTAWKKpqOl"},"source":["Code adapted from http://www.cs.columbia.edu/~cannon/1006/lecture11.html"]},{"cell_type":"markdown","source":["* coding kinda shows how you think of the code, even though it requires creativity..\n","*"],"metadata":{"id":"SVrndu2V8aPz"}},{"cell_type":"code","source":["import random\n","import time\n","\n","\n","def main():\n"," greeting()\n"," game=Pig()\n"," game.play()\n"," goodbye()\n","\n","\n","def greeting():\n"," '''Displays a greeting for the game Pig'''\n"," print(\"Welcome to Pig Death Match!\")\n"," time.sleep(2)\n"," print(\"The first player to reach more than 20 points wins!\")\n"," print(\"But be careful, if you roll a 1 or 6 your score is reset to zero for that round!\")\n"," time.sleep(2)\n","\n","def goodbye():\n"," '''Displays a goodbye message for the game Pig'''\n"," print()\n"," print()\n"," print(\"Toodles!\")\n","\n","\n","class Pig:\n","\n"," def __init__(self,p1_human=True,p2_human=False):\n"," self.die = Die()\n"," self.p1 = Player(\"Player 1\", p1_human)\n"," self.p2 = Player(\"Player 2\", p2_human)\n","\n"," def play(self):\n"," while self.p1.score < 20 and self.p2.score < 20:\n"," self.p1.move()\n"," if self.p1.score < 20:\n"," self.p2.move()\n"," if self.p1.score > self.p2.score:\n"," print(f\"{self.p1.name} has {self.p1.score}. They win!\")\n"," else:\n"," print(f\"{self.p2.name} has {self.p2.score}. They win!\")\n","\n","class Player:\n","\n"," def __init__(self,name,human_player=False):\n"," self.name = name\n"," self.is_human = human_player\n"," self.score = 0\n"," self.die=Die(6)\n","\n"," def move(self):\n"," if self.is_human:\n"," self.human_move()\n"," else:\n"," self.computer_move()\n","\n"," def human_move(self):\n"," round_score = 0\n"," play_again = \"y\"\n","\n"," while play_again == \"y\":\n"," self.die.roll()\n"," roll=self.die.face\n"," if roll==1 or roll == 6:\n"," print (f\"{self.name} rolled a 1/6. Your turn is over\\n\\n\")\n"," round_score = 0\n"," play_again = \"n\"\n"," else:\n"," print(f\"{self.name} rolled a {roll}\")\n"," round_score=round_score+roll\n"," print(f\"{self.name}'s round score is {round_score}.\")\n"," play_again=input('Do you want to roll again? (y/n)').lower()\n","\n"," self.score+=round_score\n"," print (f\"{self.name}'s turn is over\")\n"," print(f\"{self.name}'s total score is {self.score}\\n\\n\")\n","\n"," def computer_move(self):\n"," round_score=0\n"," play_again = \"y\"\n","\n"," while play_again == \"y\":\n"," self.die.roll()\n"," roll=self.die.face\n"," if roll==1 or roll == 6:\n"," print (f\"{self.name} rolled a 1. Your turn is over\\n\\n\")\n"," round_score=0\n"," play_again = \"n\"\n"," else:\n"," print(f\"{self.name} rolled a {roll}\")\n"," round_score=round_score+roll\n"," if round_score % 2 == 0:\n"," print(f\"{self.name}'s round score is {round_score}.\")\n"," else:\n"," play_again = \"n\"\n"," self.score+=round_score\n"," print(f\"{self.name}'s turn is over\")\n"," print(f\"{self.name}'s total score is {self.score}\\n\\n\")\n","\n","\n","class Die:\n"," def __init__(self,n=6):\n"," self.sides=n\n"," self.roll()\n","\n"," def roll(self):\n"," self.face=int(random.random()*self.sides+1)\n","\n","\n","main()"],"metadata":{"id":"5cTdISDmISdz"},"execution_count":null,"outputs":[]},{"cell_type":"code","execution_count":null,"metadata":{"id":"jEufrILKoOcF"},"outputs":[],"source":["# same code with comments as explanations\n","import random\n","import time\n","# all the modules/packages used are organized at the very beginning of the code together\n","\n","def main(): # controls the flow of the game\n"," greeting()\n"," game=Pig() # creating an object/instance of Pig\n"," game.play() # using the play method of Pig\n"," goodbye()\n","# main function comes first\n","\n","def greeting():\n"," '''Displays a greeting for the game Pig'''\n"," print(\"Welcome to Pig Death Match!\")\n"," time.sleep(2)\n"," print(\"The first player to reach more than 20 points wins!\")\n"," print(\"But be careful, if you roll a 1 or 6 your score is reset to zero for that round!\") # we need to let users know the game rules\n"," time.sleep(2)\n","\n","def goodbye():\n"," '''Displays a goodbye message for the game Pig'''\n"," print() # printing empty line\n"," print()\n"," print(\"Toodles!\")\n","# all functions unrelated to or unencapsulated in the classes are organized together!\n","\n","\n","class Pig: # creating Pig class, where the main functionalities are stored\n","\n"," def __init__(self,p1_human=True,p2_human=False): # default/optional parameter\n"," self.die = Die() # creating an instance of the Die class, by default it is d6\n"," self.p1 = Player(\"Player 1\", p1_human) # creating an instance of the Player class\n"," self.p2 = Player(\"Player 2\", p2_human)\n","\n"," def play(self):\n"," while self.p1.score < 20 and self.p2.score < 20:\n"," self.p1.move() # calling player method\n"," if self.p1.score < 20:\n"," self.p2.move()\n"," if self.p1.score > self.p2.score:\n"," print(f\"{self.p1.name} has {self.p1.score}. They win!\")\n"," else:\n"," print(f\"{self.p2.name} has {self.p2.score}. They win!\")\n","\n","class Player: # creating the player class\n","\n"," def __init__(self,name,human_player=False): # optional/default parameter\n"," self.name = name\n"," self.is_human = human_player # creating an attribute using the default parameter human_player\n"," self.score = 0 # keeping score of each instance by creating it as an instance attribute\n"," self.die=Die(6) # d6 is by default, so we can choose not to input 6 too\n","\n"," def move(self):\n"," if self.is_human: # if self.is_human == True\n"," self.human_move() # calling a method within a method\n"," else:\n"," self.computer_move()\n","\n"," def human_move(self): # the logic of how a human player moves\n"," round_score = 0 # initialization\n"," play_again = \"y\"\n","\n"," while play_again == \"y\": # creating a while loop for at least one round\n"," self.die.roll() # we can use multiple dot notations\n"," roll=self.die.face\n"," if roll==1 or roll == 6: # remember, the rule is that if a player rolls 1 or 6, the score is reset to 0 and end the current round\n"," print (f\"{self.name} rolled a 1/6. Your turn is over\\n\\n\")\n"," round_score = 0\n"," play_again = \"n\" # ending the current round by changing while loop condition\n"," else:\n"," print(f\"{self.name} rolled a {roll}\")\n"," round_score=round_score+roll\n"," print(f\"{self.name}'s round score is {round_score}.\")\n"," play_again=input('Do you want to roll again? (y/n)').lower() # human player can choose how many times they want to keep rolling\n"," # we also have a pretty minimal error handling here. what if user inputs \"cat\"? we can probably improve it.\n"," self.score+=round_score # increment the total score by adding round_score when the round ends\n"," print (f\"{self.name}'s turn is over\")\n"," print(f\"{self.name}'s total score is {self.score}\\n\\n\")\n","\n"," def computer_move(self): # the logic of how computer player moves\n"," round_score=0\n"," play_again = \"y\"\n","\n"," while play_again == \"y\":\n"," self.die.roll()\n"," roll=self.die.face\n"," if roll==1 or roll == 6:\n"," print (f\"{self.name} rolled a 1. Your turn is over\\n\\n\") # \\n means create a new line\n"," # we can add {roll} to cover both 1 and 6 rolls in the message to be accurate\n"," round_score=0 # reset the score for the round to 0\n"," play_again = \"n\" # end the while loop\n"," else:\n"," print(f\"{self.name} rolled a {roll}\")\n"," round_score=round_score+roll\n"," if round_score % 2 == 0: # using modulo operator to check if round_score is an even number\n"," print(f\"{self.name}'s round score is {round_score}.\") # if the round_score is an even number, continue playing\n"," else: # if the round_score is an odd number, end the round\n"," play_again = \"n\"\n"," self.score+=round_score\n"," print(f\"{self.name}'s turn is over\")\n"," print(f\"{self.name}'s total score is {self.score}\\n\\n\")\n","\n","\n","class Die:\n"," def __init__(self,n=6):\n"," self.sides=n\n"," self.roll() # calling a method within a method\n"," # roll() method is always called every time an instance of Die is created/constructed\n","\n"," def roll(self):\n"," self.face=int(random.random()*self.sides+1) # by default n is 6, so self.face by default is always between 1 and 6.\n"," # feel free to look up how random.random() works!\n"," # self.face is a new attribute for class Die that is dynamically created by its method roll() when roll() is called under __init__\n","# three classes and their methods are organized together!\n","\n","main()\n","# at the bottom of your code, call main() to run the game!"]},{"cell_type":"markdown","source":["* What are the winning/losing conditions?\n","\n","> The winning condition is to reach over 20 points before the other player\n","> the losing condition is if the other player reaches 20 points before you\n","* How does the computer move?\n","> it rolls a dice per turn\n","\n","* Why is the class Die defined the way it is?\n","> it's adding another attribute to __init__. It uses self.face to do the rolls.\n","> random.random() picks a number between 0 and 1. its a float number\n","> * self.sides + 1\n","> the coder thinks it works better to include the 6, they added a random. This works because int(random.random()*self.sides+1) will always create an integer. If the\n",">\n","\n","* How does the flow control work in main()?\n","> flow control works in main()"],"metadata":{"id":"M4IgPn5K8jSS"}}],"metadata":{"colab":{"provenance":[{"file_id":"1iWuYRBYuUNegUw-DGomxca8fmagVPRT0","timestamp":1710872391528}]},"kernelspec":{"display_name":"Python 3","name":"python3"},"language_info":{"name":"python"}},"nbformat":4,"nbformat_minor":0}