質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2109閲覧

独学プログラマーのコードを変えたい

NNA

総合スコア10

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2019/10/26 15:41

編集2019/10/26 19:51

独学プログラマーの本に載っているコードの中で
WarGameというのがあります。

player1,2の名前を入力すると自動でトランプを選び、どっちの数が大きいか、大きかったら勝ちで勝った人の名前が表示されるのを繰り返し、最終的に勝った回数が多い人の名前が表示されます。

**
コードの中で疑問があります。**

名前を入力した後、

ゲームを始めます。終わるときはq、startはq以外を入力

と表示されます。

もし、いきなり終了を選択した場合、

ゲームを終わります。【ひきわけが勝ちました。】

となります。
ゲームを繰り返したあと、最後に表示される文章と同じですが、すぐ終了した場合は引き分けとなり、それ以外は勝った人の名前がはいります。
もしこれを一回目ゲームを始める前に終了するときは
【ひきわけ。】で終わるにはどうしたらいいですか?

本には日本語で載っていますが、本で紹介されているサイトの英語版のコードです。

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\ 54 .append(Card(i, 55 j)) 56 shuffle(self.cards) 57 58 def rm_card(self): 59 if len(self.cards) == 0: 60 return 61 return self.cards.pop() 62 63 64class Player: 65 def __init__(self, name): 66 self.wins = 0 67 self.card = None 68 self.name = name 69 70 71class Game: 72 def __init__(self): 73 name1 = input("p1 name ") 74 name2 = input("p2 name ") 75 self.deck = Deck() 76 self.p1 = Player(name1) 77 self.p2 = Player(name2) 78 79 def wins(self, winner): 80 w = "{} wins this round" 81 w = w.format(winner) 82 print(w) 83 84 def draw(self, p1n, p1c, p2n, p2c): 85 d = "{} drew {} {} drew {}" 86 d = d.format(p1n, 87 p1c, 88 p2n, 89 p2c) 90 print(d) 91 92 def play_game(self): 93 cards = self.deck.cards 94 print("beginning War!") 95 while len(cards) >= 2: 96 m = "q to quit. Any " + \ 97 "key to play:" 98 response = input(m) 99 if response == 'q': 100 break 101 p1c = self.deck.rm_card() 102 p2c = self.deck.rm_card() 103 p1n = self.p1.name 104 p2n = self.p2.name 105 self.draw(p1n, 106 p1c, 107 p2n, 108 p2c) 109 if p1c > p2c: 110 self.p1.wins += 1 111 self.wins(self.p1.name) 112 else: 113 self.p2.wins += 1 114 self.wins(self.p2.name) 115 116 win = self.winner(self.p1, 117 self.p2) 118 print("War is over.{} wins" 119 .format(win)) 120 121 def winner(self, p1, p2): 122 if p1.wins > p2.wins: 123 return p1.name 124 if p1.wins < p2.wins: 125 return p2.name 126 return "It was a tie!" 127 128game = Game() 129game.play_game() 130

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ゲームの終了判定をしている部分に着目して下さい。

Python

if response == 'q':
break

ここで単にbreakするのではなく、
適当にメッセージを出力してから関数から脱出してやれば良いです。

teratailでのコードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押して下さい。
Python

特にPythonの場合、インデントが崩れるとコードの意味が変わってしまいます。

投稿2019/10/26 15:55

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NNA

2019/10/26 16:08

ありがとうございます!!!!!やってみます。 コードの書き方も指摘していただきありがとうございます。書き直してみました!!!!!!!!
KojiDoi

2019/10/26 17:15

書き直ってないじゃん。
dodox86

2019/10/27 01:55

いつも拝見して思いますが、LouiS0616さんの「teratailでのコードの書き方について」の動画gif付きの説明、teratail公式で使ってもらいたいですね。ヘルプやFAQの冒頭に。
LouiS0616

2019/10/27 06:49

@dodox86 さん お褒め頂き光栄です。 今のところ四種類用意してあるので、必要ならじゃんじゃん転用して貰って大丈夫です。 ![Python](56957fe805d9d7befa7dba6a98676d2b.gif) ![Java](f4ed904eff3506b68bb6e4c2b205ebd1.gif) ![C](4c6e48a3bd0707d89f61b901fd1f8915.gif) ![C++](e378967f71829feb9e6187e5be60349f.gif) > teratail公式で使ってもらいたいですね。ヘルプやFAQの冒頭に。 以前似たような要望を出したのですが、特に変化は無いんですよね。
dodox86

2019/10/27 07:02

> 今のところ四種類用意してあるので、必要ならじゃんじゃん転用して貰って大丈夫です。 !!何と!LouiS0616さん、どうもありがとうございます。適時、使わせていただこうと思います。よろしくお願いします。
tanishi_a

2019/10/28 15:18

こういうときにコメント欄にもいいねボタンが欲しい!と思います。横から失礼しました
guest

0

もともとのWar is over.It was a tie! winsというメッセージもいまいちなので、後ろの方を、

Python

1 2 print("War is over. "+win) 3 4 def winner(self, p1, p2): 5 if p1.wins > p2.wins: 6 return p1.name + " wins." 7 if p1.wins < p2.wins: 8 return p2.name + " wins." 9 return "It was a tie!"

ですかね。
少し考えれば、全然難しい話ではないです。

投稿2019/10/27 16:51

編集2019/10/30 05:55
otn

総合スコア84499

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NNA

2019/10/30 04:55

ありがとうございました!!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問