1

私はカードゲームを作成しています。最後に到達したら、より多くのラウンドをプレイできるようにしたいのですが、リプレイすると、変数を再度通過する必要があります..スコアをリセットします。複雑なコードのまったく新しいブロックなしで修正する方法を探しています。本当に簡単な修正が欠けていることを願っています。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Imports

import time


def play_game():

    # Variables

    acard = int()
    bcard = int()
    apoints = int()
    bpoints = int()

    # Repeat

    repeat = True

    # Hand out cards

    print 'Cards have been served'
    input('\nPress Enter to Reveal')

    # Cards Turn

    time.sleep(0.5)
    t = time.time()
    acard = int(str(t - int(t))[2:]) % 13
    print '\nYour card value is ' + str(acard)

    time.sleep(0.1)

    t = time.time()
    bcard = int(str(t - int(t))[2:]) % 13

    # Number Check & Point Assign

    time.sleep(2)
    if acard > 5:
        apoints += 1
        print '\nYour points have increased by one, your total is now ' \
            + str(apoints)
    if acard < 5:
        apoints -= 1
        print '\nYour points have decreased by one, your total is now ' \
            + str(apoints)
    if bcard > 5:
        bpoints += 1
        print '\nYour opponent got ' + str(bcard) \
            + ', their points have increased by one,\ntheir total is now ' \
            + str(bpoints)
    if bcard < 5:
        bpoints -= 1
        print '\nYour opponent got ' + str(bcard) \
            + ', their points have decreased by one,\ntheir total is now ' \
            + str(bpoints)

    # Card Reset

    bcard = 0
    acard = 0

    # Shuffle

    input('\nPress enter to shuffle deck')
    print '\nCards being shuffled'
    time.sleep(1)
    print '.'
    time.sleep(1)
    print '.'
    time.sleep(1)
    print '.'
    print 'Cards have been shuffled'
    global enda
    global endb
    enda = apoints
    endb = bpoints


# Loop

time.sleep(1)
answer = 'y'
while answer.lower() == 'y':
    play_game()
    answer = input('\nDo you wish to play again? (Y/N)')

# Scores

if enda > endb:
    print '\nYou Win!'
    print '\nScores'
    print 'You: ' + str(enda) + ' Opponent: ' + str(endb)

if endb > enda:
    print '\nYou Lost!'
    print '\nScores'
    print 'You: ' + str(enda) + ' Opponent: ' + str(endb)
4

6 に答える 6

1

最も簡単な変更は、これらの変数を「グローバル」にすることです。

たとえば、次のようになります。

a = 5

def myfunc():
    print a
    a = 7

myfunc()

ainへの割り当てmyfunc()により、Python は関数内で 2 番目のローカル変数を宣言していると見なされるためa、機能しません。これを行うことで、グローバル変数を使用できます。

a = 5

def myfunc():
    global a
    print a
    a = 7

myfunc()

これは、関数内へのすべての参照aがグローバルに定義された を参照することを明示的に示していますa

混乱を招く可能性があるのは、関数に代入していない場合a、関数の外側で定義された変数が関数のスコープ内として扱われることです。

a = 5

def myfunc():
    print a

myfunc()

(これは数字の 5 を出力します。)

編集:クラスの使用を推奨するもう1つの答えは、多くの利点を提供するソリューションです。複雑なプログラムで多くのグローバル変数を使用すると、これらの変数に 1 つの名前空間を共有させ、ある関数が別の関数に与える可能性のある副作用をあまり明確にしないため、保守性が低下します。特定の変数が変更されている場所を簡単に確認できます。

ただし、問題に対してクラスベースのアプローチを採用する場合は、オブジェクト指向プログラミングと設計の言語に慣れるために時間を費やすのが最善でしょう。コンセプトを理解するまで、この記事を書いていることは明確ではないかもしれません。

あなたのコードでは、これらの変数をグローバルにすると、この部分が変わります:

def play_game():

    # Variables

    acard = int()
    bcard = int()
    apoints = int()
    bpoints = int()

これに:

acard = int()
bcard = int()
apoints = int()
bpoints = int()

def play_game():

    # Variables

    global acard
    global bcard
    global apoints
    global bpoints

# etc.

もう1つの考え:次のようなものを使用する

apoints = int()

変数を整数として「宣言」したいので、おそらくあなたが思っているような効果はありません。これを行うことは、Python で完全に有効です。

apoints = int()
print(apoints)

apoints = 5.0
print(apoints)

apoints = "My string"
print(apoints)

そのためapoints、int を作成しても、変数が常に整数になるわけではありません。変数に明示的な値を割り当てた方がよいでしょう:

apoints = 0

この Python 変数型付けの特性は、「ダック型付け」と呼ばれます。

http://en.wikipedia.org/wiki/Duck_typing

于 2013-09-18T20:36:42.573 に答える
1

クラスベースのプログラミングに変換されたコードは次のとおりです。

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Imports

import time

class Play_Game:

    def __init__(self):
        self.apoints = 0
        self.bpoints = 0

    def play_game(self):

        repeat = True
        print 'Cards have been served'
        raw_input('\nPress Enter to Reveal')

        # Cards Turn

        time.sleep(0.5)
        t = time.time()
        acard = int(str(t - int(t))[2:]) % 13
        print '\nYour card value is ' + str(acard)

        time.sleep(0.1)

        t = time.time()
        bcard = int(str(t - int(t))[2:]) % 13

        # Number Check & Point Assign

        time.sleep(2)
        if acard > 5:
            self.apoints += 1
            print '\nYour points have increased by one, your total is now ' \
                + str(self.apoints)
        elif acard < 5:
            self.apoints -= 1
            print '\nYour points have decreased by one, your total is now ' \
                + str(self.apoints)
        elif bcard > 5:
            self.bpoints += 1
            print '\nYour opponent got ' + str(bcard) \
                + ', their points have increased by one,\ntheir total is now ' \
                + str(self.bpoints)
        elif bcard < 5:
            self.bpoints -= 1
            print '\nYour opponent got ' + str(bcard) \
                + ', their points have decreased by one,\ntheir total is now ' \
                + str(self.bpoints)
        else:
            pass

        # Shuffle

        raw_input('\nPress enter to shuffle deck')
        print '\nCards being shuffled'
        time.sleep(1)
        print '.'
        time.sleep(1)
        print '.'
        time.sleep(1)
        print '.'
        print 'Cards have been shuffled'
        return

    def check_winner(self):
        if self.apoints > self.bpoints:
            print '\nYou Win!'
            print '\nScores'
            print 'You: ' + str(self.apoints) + ' Opponent: ' + str(self.bpoints)

        else:
            print '\nYou Lost!'
            print '\nScores'
            print 'You: ' + str(self.apoints) + ' Opponent: ' + str(self.bpoints)
        return


if __name__ == '__main__':

    time.sleep(1)
    answer = 'y'
    current_game = Play_Game()
    while answer.lower() == 'y':
        current_game.play_game()
        current_game.check_winner()
        answer = raw_input('\nDo you wish to play again? (Y/N)')
于 2013-09-18T21:04:28.483 に答える
1

これを行う最善の方法は、おそらくクラスを作成し、各ラウンドで一貫性を保ちたいすべての変数を格納することです。また、これが複雑なコード ブロックになりすぎるとは思いません。

class GameVariables(object):

      def __init__(self):
           self.acard = 0
           self.bcard = 0
           self.apoints = 0
           self.bpoints = 0

      def reset(self):
           self.acard = 0
           self.bcard = 0
           self.apoints = 0
           self.bpoints = 0

    #need to initialize class.
    gamevar = GameVariables()

ただし、他の人が述べているように、変数 = を int() に設定する必要はありません。より良いアプローチは、それをある数値に等しく設定することです:

self.acard = 0

これにより、クラスが初期化された後、クラスに含まれるリセットメソッドを呼び出すまで、変数は変更されません。

これを行うには、他の関数と同じように呼び出しますが、クラス名を前に付けます。

gamevar.reset() #this will reset variables.

これは、ゲームがより大きく、より複雑になった場合に特に役立ちます。お役に立てれば。

于 2013-09-18T20:36:23.217 に答える
1

呼び出しごとに変数が初期化されるのは、関数の性質上です。ポイントは、毎回同じように機能することです。

変数を保持し、関数に関連付ける場合は、オブジェクトを使用します。これにより、巨大なコードの塊を小さな関数に分割することもできます。

于 2013-09-18T20:36:35.160 に答える
0

変数を関数の外に移動し、+= を使用している変数を 0 に設定します。関数で acard と bcard の値を設定しているため、グローバル変数を設定する必要はありません。変化:

def play_game(apoints: int, bpoints: int):
    ...


if __name__ == __main__:
    apoints = 0
    bpoints = 0
    play_game(apoints, bpoints)
于 2013-09-18T20:34:41.500 に答える