###教本のゲームに違う動作を追加したい。
現状、本のコードを書いて動作をトレースするくらいのレベルなので、既存のコードを改変して行く勉強をしている所です。相談相手がいなくて困っています。助言頂けるとありがたいです。
「独学プログラマー」の〈WAR〉というゲーム。
基本ルール:シャッフルしたカードの山を上からPlayer1とPlayer2で引き合い、強さを競うもの。
- 改変はplayerがカードを引く際に山の配列番号を選択出来るようにしたいです。
- 自分なりに考えて、下記のコードに書き換えました。
- classのpopメソッドにinputした引数を渡してみたくてコードを書いたつもりです。
- name1,2を反映したPlease input numberを出力したい。
######改変後 全コード
python
1from random import shuffle 2 3 4class Card: 5 suits = ["spades", 6 "hearts", 7 "diamonds", 8 "clubs"] 9 10 values = [None, None,"2", "3", 11 "4", "5", "6", "7", 12 "8", "9", "10", 13 "Jack", "Queen", 14 "King", "Ace"] 15 16 def __init__(self, v, s): 17 """suit + value are ints""" 18 self.value = v 19 self.suit = s 20 21 def __lt__(self, c2): 22 if self.value < c2.value: 23 return True 24 if self.value == c2.value: 25 if self.suit < c2.suit: 26 return True 27 else: 28 return False 29 return False 30 31 def __gt__(self, c2): 32 if self.value > c2.value: 33 return True 34 if self.value == c2.value: 35 if self.suit > c2.suit: 36 return True 37 else: 38 return False 39 return False 40 41 def __repr__(self): 42 v = self.values[self.value] +\ 43 " of " + \ 44 self.suits[self.suit] 45 return v 46 47 48class Deck: 49 def __init__(self): 50 self.cards = [] 51 for i in range(2, 15): 52 for j in range(4): 53 self.cards.append(Card(i,j)) 54 shuffle(self.cards) 55 56 def rm_card(self): 57 if len(self.cards) == 0: 58 return 59 return self.cards.pop() 60 61 62class Player: 63 def __init__(self, name): 64 self.wins = 0 65 self.card = None 66 self.name = name 67 68 69class Game: 70 def __init__(self): 71 name1 = input("p1 name ") 72 name2 = input("p2 name ") 73 self.deck = Deck() 74 self.p1 = Player(name1) 75 self.p2 = Player(name2) 76 77 def wins(self, winner): 78 w = "{} wins this round" 79 w = w.format(winner) 80 print(w) 81 82 def draw(self, p1n, p1c, p2n, p2c): 83 d = "{} drew {} {} drew {}" 84 d = d.format(p1n, 85 p1c, 86 p2n, 87 p2c) 88 print(d) 89 90 def play_game(self): 91 cards = self.deck.cards 92 print("beginning War!") 93 while len(cards) >= 2: 94 m = "q to quit. Any " + "key to play:" 95 response = input(m) 96 if response == 'q': 97 break 98 num1 = "{}Please input number:".format(name1) 99 num2 = "{}Please input number:".format(name2) 100 renum1 = input(num1) 101 renum2 = input(num2) 102 p1c = self.deck.rm_card(renum1) 103 p2c = self.deck.rm_card(renum2) 104 p1n = self.p1.name 105 p2n = self.p2.name 106 self.draw(p1n,p1c,p2n,p2c) 107 if p1c > p2c: 108 self.p1.wins += 1 109 self.wins(self.p1.name) 110 else: 111 self.p2.wins += 1 112 self.wins(self.p2.name) 113 114 win = self.winner(self.p1, 115 self.p2) 116 print("War is over.{} wins".format(win)) 117 118 def winner(self, p1, p2): 119 if p1.wins > p2.wins: 120 return p1.name 121 if p1.wins < p2.wins: 122 return p2.name 123 return "It was a tie!" 124 125game = Game() 126game.play_game()
#######エラーメッセージ1(.formatなし)
Traceback (most recent call last): File "/home/user/python/war_or_pop.py", line 126, in <module> game.play_game() File "/home/user/python/war_or_pop.py", line 102, in play_game p1c = self.deck.rm_card(renum1) TypeError: rm_card() takes 1 positional argument but 2 were given
#######エラーメッセージ1(.formatあり)
Traceback (most recent call last): File "/home/user/python/war_or_pop.py", line 126, in <module> game.play_game() File "/home/user/python/war_or_pop.py", line 98, in play_game num1 = "{}Please input number:".format(name1) NameError: name 'name1' is not defined
改変前(抜粋)
python
1 p1c = self.deck.rm_card() 2 p2c = self.deck.rm_card()
改変後(抜粋)
num1 = "{}Please input number:".format(name1) num2 = "{}Please input number:".format(name2) renum1 = input(num1) renum2 = input(num2) p1c = self.deck.rm_card(renum1) p2c = self.deck.rm_card(renum2)
#####前回ご回答頂けなかった事もあり、質問の仕方等にもご意見頂ければありがたいです。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/08 03:17 編集