読者です 読者をやめる 読者になる 読者になる

意表を突いても勝てない

サンムーンでたら頑張る

【Python】プロゲートとドットインストール(12回まで)で得た知識を使ってゲームを作った【まとめ】

夏休み明けて大学生活が始まり暇だったので、予てから興味のあったPythonの勉強を始めた。

【自己紹介】
・工学部3年
・基礎から勉強したのはCだけ
・オーバウォッチが好き

プロゲート

prog-8.com

での勉強は楽しく、分かりやすかったが無料でできる範囲は少なく

ドットインストールへ以降した
http:// http://dotinstall.com/


しかしこちらは演習形式ではなくただ文法について学ぶだけだったので

飽きてしまい、「簡単なゲームを考えてそれの実現に向けて勉強しよう!」と

考えた。

【簡単なゲーム】(単語作りゲーム,一人用)

1.プレイヤーは最初にひらがなの書かれたカードを5枚配られる。

2.プレイヤーはその中から1枚ずつ場に出して行き単語をつくる。

3.単語を作ったら判定してもらいコンピュータが知っている単語なら正解、なければ不正解とする

4.正解ならば場に出したカードは手札から捨てる、不正解ならば手札に戻しカードを一枚引く

5.手札を空にできたターンを競う

「補足」

・「ば」「ぁ」などは「は」「あ」とする
・カードの指定方法は要素番号の直接入力、確定・判定は100を入力

【必要(だと考えた)処理】

・特定の文字を除くひらがな全てをリストに入れる←できた

・リストからランダムに指定の数の要素を取り出す←いきなり指定の数取り出すとリストになるので1つずつ取り出した。

・無料の辞書データベースを使って単語の正誤判定←見つからなかったので自分で作った=単語数が少ない

・データベースの読み込み←txtファイルを使ったので使用してない

・単語の正誤判定←tango==listとすると上手くいかなかったので in を使ったところ部分一致でも正解となってしまう。←改行文字の扱いが問題かも

【とりあえず作ったコード】

import random
import codecs

def diff(a,b):#リストの差を出す関数 
    set_ab = set(a) - set(b)
    return list(set_ab)

hands=[]#手札用リスト 
turn=1 
#正誤判定用リスト読み込み
f=codecs.open('write.txt','r','utf-8')
lines = f.readlines() 
f.close()

#ひらがなをリストに挿入
hira=[unichr(i) for i in range(12354, 12435)]
#除去したいひらがなをリストに挿入       
out_hira=[unichr(j) for j in(12355,12357,12359,12361,12364,12366,12368,12370,12372,12374,
     12376,12378,12380,12382,12384,12386,12387,12389,12391,12393,
     12400,12401,12403,12404,12406,12407,12409,12410,12412,12413,
     12419,12421,12423,12430,12432,12433,12434)]      
#欲しいひらがなのみのリスト  
cards=diff(hira,out_hira)
#手札にカードを5枚配る 
for i in range(0,5):
    draw_card=random.choice(cards)
    hands.append(draw_card)



#手札が尽きるまで繰り返す
while 0<len(hands):
    print(str(turn)+"ターン目")
    turn=turn+1
    tango=u""#場に出したカードひらがなを繋いだもの
    ans_num=""#場に出したいカードの要素番号
    cho_hands=[]#場に出したカードのリスト
    
    #手札表示
    for i in range(0,len(hands)):
        print hands[i],
    
    while 1:
        ans_num=raw_input('please choice number: ')#要素番号なので0から
        if int(ans_num) >len(hands) and tango=="" :
            tango=u"無入力"
            break
        elif int(ans_num) >len(hands):
            break
        tango=tango+hands[int(ans_num)]
        cho_hands.append(hands[int(ans_num)])
        print (u"現在の単語:"+tango)
        
    for line in lines:#単語がリスト内に部分的にでもあれば
        if tango in line:
            print "正解"
            hands=diff(hands,cho_hands)#使ったカードを手札から減らす
            break
    else:
        draw_card=random.choice(cards)
        hands.append(draw_card)#カードをランダムに一枚引く
        print(u"吾輩の辞書に"+tango+u"という文字はない!")

【問題点】
・Python2.7で開発をしたためunicode関連で困りまくった、その場その場の処置なので理解していない
・手札より1枚多い数を指定するとエラーが出る
・無入力で決定すると文字列をintしてしまうことになりエラーが出る。
・正解時の比較にタプルを使用しているため重複文字が消える
・コードが汚い、もっと綺麗にできるはず
・辞書の単語数が少なくゲームが成り立たない

【今後】
なんだかんだ動くのでUIをつけたい(たくさんツールがあってどれがいいかわからない、VSみたいにデザインをGUIで作れると嬉しい)
辞書の単語数を増やす(なにか良い方法があれば教えてください)
単語の完全一致にする(これは多分できるかも)
コードをきれいにする(こんな書き方があるよってあれば教えてください)


【開発環境】
Win10 64bit
Anaconda
python 2.7