kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

Python勉強〜番外編2〜

kazumaです。

番外編2号です!

今回は今までの勉強からコマンドライン上でする簡単なゲームを作ってみようと思います。

仕様:
自分と相手に1〜9までの手持ち番号があります。その中から1つ数字を選び、相手はその時ランダムで1つ選びます。
それを同時に出し、数字の大きい方が勝ちです。さらには一度使った数字は使えません。手持ち数字が無くなるまで繰り返し行い、最後に何回勝てたかを表示して終わりとなります。

サンプル実行結果 :  
Your number [1, 2, 3, 4, 5, 6, 7, 8, 9]
Teki number [1, 2, 3, 4, 5, 6, 7, 8, 9]
Select your number  >> 3
Select Teki number >>  1
Win!!


コードは大まかにこんな感じ・・・

1・まずは自分と相手の手持ちを指定し、表示させます。
2・数字を選ぶので、inputを使い入力させるようにします。
3・相手の数字を乱数で選ぶようにします。
4・選んだカード同士て大きさを比べ大きいPlayerを勝ちとします。
*引き分けの場合はDrowとします。
5・選んだ数字をリストから消します。
6・1〜5を9回繰り返す。

このコードを書くとこんな感じになりました。

import random

def main():
    
    x = [1,2,3,4,5,6,7,8,9]
    y = [1,2,3,4,5,6,7,8,9]

    for i in range(9):
        print "Your number",x
        print "Teki number",y
        Yourselect = input("Select your number  >> ")
        Tekiselect = random.randrange(1,10)
        print "Select Teki number >> ",Tekiselect 
        a = x.pop(Yourselect-1)
        b = y.pop(Tekiselect-1)
    
        if a > b :
            print "Win!!"
        if a < b :
            print "Lose..."
        if a == b :
            print "Drow!?"
    
main()

本当は関数わけしたかったのですが、今回はまだそこまで行けてないので、これでお許しください!

さて、実行しましたが・・・ここで問題が!

乱数は1〜9までの自動生成なので、一度使用したものまで選ばれます。
従って乱数部分を変更しなくてはなりません。


先ほどの文ではいろいろ問題があったので下記のコードに書き換えました。

import random

def main():
    
    x = [1,2,3,4,5,6,7,8,9]
    y = [1,2,3,4,5,6,7,8,9]
    wincount = 0

    for i in range(9):
        
        Yourselect = 0
        Tekiselect = 0
        
        print "Turn : ",i+1
        print "Your number",x
        print "Teki number",y
        
        Yourselect = input("Select your number  >> ")
        yourselectEl = x.index(Yourselect)
        
        Tekiselect = random.choice(y)
        tekiselectEl = y.index(Tekiselect)
        print "Select Teki number >> ",Tekiselect
        
        a = x.pop(yourselectEl)
        b = y.pop(tekiselectEl)

        
        if a > b :
            wincount = wincount + 1
            print "Win!!"
            print "   "
        if a < b :
            print "Lose..."
            print "   "
        if a == b :
            print "Drow!?"
            print "   "

    print "Your Win " ,wincount
    
main()

まず初めにこのコードを書いてわかったことが、yourselectに毎回inputするようにしてたのですが、
ループで入力すると、置き換わるのではなく足されるということに気づきました。
ですので毎回Yourselect , Tekiselect を初期化するようにしました。

次に、

yourselectEl = x.index(Yourselect)

は、inputした数字の入っている要素を調べるために、indexを使用しています。これをtekiselectElも同様にしています。削除されると要素番号も変わっていくためこのコードを書くことにしました。

#以前のコード
Tekiselect = random.randrange(1,9)

#今のコード
Tekiselect = random.choice(y)

今回のゲームでは一度使ったものは使えない(要素ごと削除な)ので以前のコードだと削除された数値も出ることとなりますので『そんな要素はない!!』とはじかれてしまいます。

ですがchoice(y)を使うことで List y に入っている数値の中からランダムで選んでくれるという優れものです。
よって要素ごと消されても消された数値がランダム生成されることはありません。


あとはpopでListから取り出していき、その取り出したもの(a , b)をif文で調べて勝ち負け or 引き分けを表示するようにしました。

実行結果最終行:
Turn :  9
Your number [9]
Teki number [5]
Select your number  >> 9
Select Teki number >>  5
Win!!
   
Your Win  4