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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

3513閲覧

python3 トランプを引いたらデッキから削除したい

Untitled_Sample

総合スコア192

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2017/12/21 13:02

デッキからユーザーに引いたカードを移して、
ユーザー手札から、存在するカードをデッキから削除したい。

#問題
削除するカードがが有りませんと、エラーが出てしまいます。

どうしたら良いでしょうか?
教えて頂きたいです。

python

1cards=['♠A', '♥A', '♣A', '♦A', '♠2', '♥2', '♣2', '♦2', '♠3', '♥3', '♣3', '♦3', '♠4', '♥4', '♣4', '♦4', '♠5', '♥5', '♣5', '♦5', '♠6', '♥6', '♣6', '♦6', '♠7', '♥7', '♣7', '♦7', '♠8', '♥8', '♣8', '♦8', '♠9', '♥9', '♣9', '♦9', '♠10', '♥10', '♣10', '♦10', '♠J', '♥J', '♣J', '♦J', '♠Q', '♥Q', '♣Q', '♦Q', '♠K', '♥K', '♣K', '♦K'] 2 3use01=[] 4use02=[] 5 6def Sample04(): 7 use01.append(random.sample(cards, 2)) 8 9 for i in use01: 10 for i2 in i: 11 cards.remove(i2) 12 #cards.remove(use01[0][i]) 13 14 15for i in range(6): 16 Sample04() 17 18 19print(use01,len(cards))

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

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

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

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

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

guest

回答3

0

引いたカードを削除するのではなく、カードを一枚ずつイテレートするという発想で。

python

1from itertools import islice 2from random import shuffle 3 4 5cards=['♠A', '♥A', '♣A', '♦A', '♠2', '♥2', '♣2', '♦2', '♠3', '♥3', '♣3', '♦3', '♠4', '♥4', '♣4', '♦4', '♠5', '♥5', '♣5', '♦5', '♠6', '♥6', '♣6', '♦6', '♠7', '♥7', '♣7', '♦7', '♠8', '♥8', '♣8', '♦8', '♠9', '♥9', '♣9', '♦9', '♠10', '♥10', '♣10', '♦10', '♠J', '♥J', '♣J', '♦J', '♠Q', '♥Q', '♣Q', '♦Q', '♠K', '♥K', '♣K', '♦K'] 6 7 8def Deck(): 9 D = cards[:] 10 shuffle(D) 11 yield from D 12 13 14deck = Deck() 15user01 = list(islice(deck, 6)) 16user02 = list(islice(deck, 6)) 17 18print('user01:', *user01) 19print('user02:', *user02) 20print('rest:', *deck)

投稿2017/12/21 14:25

YouheiSakurai

総合スコア6142

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

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

0

もうちょっとスマートに書けそうな気がします。

Python

1import random 2 3def make_deck(): 4 return [ 5 '♠A', '♠2', '♠3', '♠4', '♠5', '♠6', '♠7', '♠8', '♠9', '♠10', '♠J', '♠Q', '♠K', 6 '♥A', '♥2', '♥3', '♥4', '♥5', '♥6', '♥7', '♥8', '♥9', '♥10', '♥J', '♥Q', '♥K', 7 '♦A', '♦2', '♦3', '♦4', '♦5', '♦6', '♦7', '♦8', '♦9', '♦10', '♦J', '♦Q', '♦K', 8 '♣A', '♣2', '♣3', '♣4', '♣5', '♣6', '♣7', '♣8', '♣9', '♣10', '♣J', '♣Q', '♣K', 9 'JOKER', 'JOKER' 10 ] 11 12def draw_from_deck(deck, hand, n=1): 13 for i in range(n): 14 card = random.choice(deck) 15 hand.append(card) 16 deck.remove(card) 17 18 return hand 19 20def main(): 21 deck = make_deck() 22 hand = draw_from_deck(deck, [], 5) 23 print('deck:', deck) 24 print('hand:', hand) 25 26if __name__ == '__main__': 27 main()

実行結果

deck: ['♠A', '♠2', '♠3', '♠4', '♠5', '♠7', '♠8', '♠9', '♠10', '♠J', '♠Q', '♠K', '♥A', '♥2', '♥3', '♥4', '♥5', '♥6', '♥7', '♥8', '♥9', '♥10', '♥J', '♥Q', '♥K', '♦A', '♦2', '♦3', '♦4', '♦5', '♦6', '♦7', '♦9', '♦10', '♦J', '♦Q', '♦K', '♣A', '♣3', '♣4', '♣5', '♣6', '♣7', '♣8', '♣9', '♣10', '♣Q', '♣K', 'JOKER'] hand: ['♦8', '♣J', 'JOKER', '♣2', '♠6']

カードのソートなどを見据えると、適切にクラス化するとさらに良さそうですね。

投稿2017/12/21 13:28

LouiS0616

総合スコア35660

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

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

mkgrei

2017/12/21 13:31

本当は人間のように一枚ずつ取り出す必要はなかったです。 シャッフルして、スライスすることと等価です。
LouiS0616

2017/12/21 13:33

おっしゃる通りかと思います。 最初はsetで実装するのが妥当かと考えたのですが、そうするとジョーカーの扱いが面倒なんですよね。 実行速度も大してくわないので、直感的に一枚ずつ引くのもありかと思ったのです。
mkgrei

2017/12/21 13:37

手札を追加するときにも使用できる汎用的な実装で素晴らしいと思います。
guest

0

ベストアンサー

use01の中身を書き出して、監視してみてください。
2ラウンド目で、1ラウンド目に取り除いたカードを再度削除しようとするはずです。

投稿2017/12/21 13:10

mkgrei

総合スコア8560

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問