0

IRC用のポーカーゲームボットを作ろうとしていますが、カードの扱いに頭を悩ませているようには見えません。

このアルゴリズムは非常に非効率的であることは知っていますが、現在のPythonスキルを使用して思いつくことができる最高のものです。どんな改善でも大歓迎です!

プレーヤーは、キーがプレーヤーのニックネームであり、値がプレーヤーが持っている金額である辞書です。

コードを実行するときに、プレーヤーが1人しかない場合は、必要に応じて5枚のカードが提供されます。しかし、プレイヤーが2人いる場合、それぞれ4〜6枚のカードが生成されます。私はまだ他のプレイヤーでテストしていません。

事前に初期化された変数のいくつか:

numberOfPlayers = 0 #The numerical value of the amount of players in the game
players = {} #The nickname of each player and the amount of money they have
bets = {} #How much each player has bet
decks = 1 #The number of decks in play
suits = ["C","D","H","S"] #All the possible suits (Clubs, Diamonds, Hearts, Spades)
ranks = ["2","3","4","5","4","6","7","8","9","J","Q","K","A"] #All the possible ranks (Excluding jokers)
cardsGiven = {} #The cards that have been dealt from the deck, and the amount of times they have been given. If one deck is in play, the max is 1, if two decks are in play, the max is 2 and so on...
hands = {} #Each players cards

コード:

def deal(channel, msgnick):
    try:
        s.send("PRIVMSG " + channel + " :Dealing...\n")
        for k, v in players.iteritems():
               for c in range(0, 5):
                suit = random.randrange(1, 4)
                rank = random.randrange(0,12)
                suit = suits[suit]
                rank = ranks[rank]
                card = rank + suit
                print(card)
                if card in cardsGiven:
                    if cardsGiven[card] < decks:
                        if c == 5:
                            hands[k] = hands[k] + card
                            cardsGiven[card] += 1
                        else:
                            hands[k] = hands[k] + card + ", "
                            cardsGiven[card] += 1
                    else:
                        c -= 1
                else:
                    if c == 5:
                        hands[k] = hands[k] + card
                        cardsGiven[card] = 1
                    else:
                        hands[k] = hands[k] + card + ", "
                        cardsGiven[card] = 1
            s.send("NOTICE " + k + " :Your hand: " + hands[k] + "\n")
    except Exception:
        excHandler(s, channel)

例や詳細な説明が必要な場合は、お問い合わせください:)

4

6 に答える 6

4

forループ

for c in range(0, 5):

...

    c -= 1

残念ながら、これforはPythonでのループの動作方法ではありません。cをデクリメントしても、ループが再度回避されることはありません。forループは、ループが開始する前に修正されたアイテムのセットを反復処理します(たとえばrange(0,5)、ループ中に変更されない5つのアイテムの固定範囲です)。

実行していることを実行する場合は、ループを使用する必要があります(ループ中に変更できるwhile変数と条件を介して機能します)。

c = 0
while c < 5:
    c += 1

    ...

    c -= 1

range()ナンバリング

if c == 5:

からにrange(N)続く数列を生成するため、このケースは現在ヒットしません-たとえば、を生成します。0N-1range(5)0,1,2,3,4

于 2012-12-29T18:06:47.943 に答える
2

私はitertools.productカードの可能な価値をリストに入れ、それをシャッフルして、あなたが望むプレイヤーごとに一度に5枚のカードを取るために使用します。

from itertools import product
from random import shuffle

suits = ["C","D","H","S"] 
ranks = ["2","3","4","5","4","6","7","8","9","J","Q","K","A"]

cards = list(r + s for r, s in product(ranks, suits))
shuffle(cards)

print cards[:5], cards[5:10] # change this into a suitable for loop to slice
['4D', 'KC', '5H', '9H', '7D'] ['2D', '4S', '8D', '8S', '4C']

そして、次のレシピを使用して、itertoolsプレーヤーの数に応じて次の5枚のカードを取得できます。

def grouper(n, iterable, fillvalue=None):
    from itertools import izip_longest
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

hand = grouper(5, cards) 
for i in xrange(5): # deal for 5 players...
    print next(hand) # each time we call this, we get another 5 cards

('4D', 'KC', '5H', '9H', '7D')
('2D', '4S', '8D', '8S', '4C')
('AD', '2H', '4S', 'KS', '9S')
('6H', 'AH', '4H', '5S', 'KD')
('6S', 'QD', '3C', 'QC', '8H')
于 2012-12-29T18:36:34.290 に答える
0
#! /usr/bin/python3.2

import random

players = ['Alice', 'Bob', 'Mallroy']
suits = ["C","D","H","S"]
ranks = ["2","3","4","5","4","6","7","8","9","J","Q","K","A"]
decks = 2
cards = ['{}{}'.format (s, r)
         for s in suits
         for r in ranks
         for d in range (decks) ]

random.shuffle (cards)
for player in players:
    print ('{}\'s hand is {}'.format (player, cards [:5] ) )
    cards = cards [5:]
于 2012-12-29T18:55:57.637 に答える
0

これを実現するためにスライスを使用する簡単な方法は次のとおりです。

num_players = 5
num_cards_per_player = 5
remaining_cards = list(range(100)) # Imagine a list backing a Deck object
num_cards_to_deal = num_players * num_cards_per_player
cards_to_deal, remaining_cards = (remaining_cards[0:num_cards_to_deal],
        remaining_cards[num_cards_to_deal:])
cards_for_each_player = [cards_to_deal[player_num::num_players] for
        player_num in range(num_players)]
cards_for_each_player
[[0, 5, 10, 15, 20], [1, 6, 11, 16, 21], [2, 7, 12, 17, 22], [3, 8, 13, 18, 23], [4, 9, 14, 19, 24]]

特定の種類のデッキの場合、Deck オブジェクトを実装し、上記のコードをメソッドで使用するためにわずかに変更して使用できます。デッキ オブジェクトは、十分な数のカードが残っていない場合を処理する必要があります :)。これは、プレイしているゲームに固有の可能性があります。

于 2012-12-29T18:29:28.770 に答える
0
from random import randint

# This code below creates a deck
cards = []
for suit in ["diamond","club","heart","spade"]:
    for card in ['A','2','3','4','5','6','7','8','9','10','J','Q','K']:
        cards.append(card+' '+suit)
# To deal the cards we will take random numbers
for i in range(5):
    a = randint(0,len(cards)-1)
    print cards(a)
    del cards[a] # We will delete the card which drew

最初にデッキを作成し、乱数を取り、randintその乱数でカードを引きます

私はフロップとハンドを描くプログラムを持っています

def create_card():
    cards = []
    for suit in   [r'$\diamondsuit$',r'$\clubsuit$',r'$\heartsuit$',r'$\spadesuit$']:
        for card in  ['A','2','3','4','5','6','7','8','9','10','J','Q','K']:
            cards.append(card+suit)
    return cards

def create_board_and_hand():
    cards = create_card()
    board = []
    for i in [0,1,2,3,4]:
    a  = randint(0,len(cards)-1)
    board.append(cards[a])
    del cards[a]
    hand = []
    for i in [0,1]:
        a  = randint(0,len(cards)-1)
        hand.append(cards[a])
        del cards[a]
    return board,hand

board,hand = create_board_and_hand()
于 2016-01-21T05:58:44.080 に答える