pythonで作るタイピングゲーム(中級編①)

タイピングゲームを作っていくぞおおおお(~_~;)

↓↓この記事のコードでの完成図↓↓

よくあるタイプの画面構成。

以下コードと説明をΣ(・ω・ノ)ノ!

import sys 
import pygame 
import winsound
import random

#タイトル
title = "金融用語"

#単語辞
word_dict = {
"先物取引":"sakimonotorihiki",
"信用取引":"sinnyoutorihiki",
"現物取引":"genbututorihiki",
}

def shuffledict(d):                            #↓↓↓  辞書型をシャッフルする関数(shuffledict)  ↓↓↓
     keys = list(d.keys())                     #辞書型(d)のキーをリスト(keys)に変換
     random.shuffle(keys)                      #キーリスト(keys)をシャッフル
     new_dict = [(key,d[key]) for key in keys] #キーリスト(keys)に対応するバリューを取り出し,新しい辞書(new_dict)を作成
     return dict(new_dict)                     #新しい辞書(new_dict)を返す

word_dict_r = shuffledict(word_dict) #ここで上の関数を使用してシャッフルする

#辞書からリストに(キー)
word_list = [] 
for i in word_dict_r.keys():
    word_list.append(i)

#辞書からリストに(バリュー)
romaji_list = []
for i in word_dict_r.values():
    romaji_list.append(i)



def dismessage(sf,msg,h):
     sysfont = pygame.font.SysFont("hg正楷書体pro", 50)###フォントの設定
     message  =sysfont.render(msg,True,(250,0,0)) ###文字の色
     message_rect = message.get_rect()###転送する領域
     message_rect.center = (350,h)###表示する位置
     sf.blit(message,message_rect)###上記の設定を反映させる
     pygame.display.update()###画面の更新



def run_game(): #↓↓↓  ゲームのプログラム実行  ↓↓↓
     pygame.init() #初期化
     #時間設定
     clock = pygame.time.Clock() 
     pygame.time.set_timer(pygame.USEREVENT, 1000) 
     
     font_1 = pygame.font.SysFont(None, 20)           #ローマ字に使うフォント設定(font_1)
     font_2 = pygame.font.SysFont("hg正楷書体pro", 40) #タイトルや次の単語に使うフォント設定


     count_c = 0         #正しいタイプ数のカウント(count_c)
     count_m = 0         #ミスタイプ数のカウント(count_m)
     time_counter = 63
    
     screen = pygame.display.set_mode((720, 480)) #画面のサイズ
     screen.fill((200,200,200))
     surface = pygame.display.get_surface()

     displayword = word_list.pop(0) #リストから問題を抽出する
     typeword = romaji_list.pop(0) #リストから問題を抽出する

     for i in range(3,0,-1):
          dismessage(surface,str(i),200)###カウントダウンを3秒間
          screen.fill((200,200,200))###画面の更新
          pygame.time.delay(1000)###一秒まつ

     game = True
     
  
     while game: 
         screen.fill((250, 250, 250)) #背面の色
         sf_title = font_2.render(title, True,(0, 0, 0)) #タイトル(title)のフォント設定(sf_title)
         screen.blit(sf_title, (20, 40))                 #タイトル(title)の表示

         sf_word = font_2.render(displayword,True,(0,0,0)) #標示する言葉の表示
         screen.blit(sf_word,(200,200))

         sf_typeword = font_2.render(typeword,True,(0,0,0)) #実際にタイプする言葉の表示
         screen.blit(sf_typeword,(200,150))  


         #閉じるボタンを押せば終了する
         for event in pygame.event.get(): 
             if event.type == pygame.QUIT: 
                 sys.exit(0) 
                 
                 #時間計測とゲーム続行かの管理
             if event.type == pygame.USEREVENT:
                  time_counter -= 1
                  if time_counter < 0:
                       game = False

          #キーが押されたときの処理
             if event.type == pygame.KEYDOWN: 
          #正解 
                if chr(event.key) == typeword[0]: 
                     typeword = typeword[1:]
                     count_c += 1
          #z,jだけの特例処理
                elif((chr(event.key)=="j") and (typeword[0]=="z")):
                     typeword = typeword[1:]
                     count_c += 1
          #間違い
                else :
                     count_m +=1
                     
          #すべて打ち終わったらの処理
                if len(typeword) ==0:
                     if len(word_list) != 0:  #リストがカラではない限り
                         displayword = word_list.pop(0) #問題を抽出
                         typeword = romaji_list.pop(0) #問題を抽出
                     else :
                          game = False
         else : #時差観計測とタイムリミット表示に使用
               screen.blit(font_1.render("■"*time_counter,True,(250,0,0)),(300,40))
               screen.blit(font_2.render(str(time_counter),True,(250,0,0)),(200,40))
               pygame.display.flip()
               clock.tick(60)
                
         pygame.display.update() #画面の更新 



if __name__ =="__main__":
     run_game()
     

詳しい説明を

下に辞書を用意します。”key”:”value”みたいなやつです。!(^^)!

key : 表示する日本語の言葉

value :実際にタイプするローマ字の言葉

word_dict = {
“先物取引”:”sakimonotorihiki”,
“信用取引”:”sinnyoutorihiki”,
“現物取引”:”genbututorihiki”,
}

以下にほとんど同じ作り方をするものがあるのでそちらを参考に(~_~;)。

今回独自のところを解説していきます。

displayword = word_list.pop(0) #リストから問題を抽出する
typeword = romaji_list.pop(0) #リストから問題を抽出する

popを使ってリストの先頭をリストから削除して返す。

重複を許さない場合、これを用います。

仮に重複を許す場合では、random.choiceを用いることでリスト内からランダムに問題を選ぶことができます。

↓↓問題の管理↓↓

#すべて打ち終わったらの処理
if len(typeword) ==0:
if len(word_list) != 0: #リストがカラではない限り
displayword = word_list.pop(0) #問題を抽出
typeword = romaji_list.pop(0) #問題を抽出
else :
game = False

用意したローマ字問題の長さが0になったら(すべてのローマ字を打ち終えたら)以下の処理を実行

・用意したリストの長さが0でなければ(ほかの問題が残っていれば)

→新たな問題を用意する。

・用意したリストの長さが0であれば(ほかの問題が残っていなければ)

→ゲームを終了する。

今後の課題

・正解タイプのたびにローマ字が一文字づく消えていく

→正解タイプを別の変数に随時保存して文字列の足し算を用いて解決していく。

・UI調節と結果画面の構築

→適度に行っていこうと思う。また、ちょっとしたゲーム性も加えていく予定。

・文字の打ち方の例外対応

→めちゃくちゃ長くなるけどいつか書こうと思います。

感想

ひさしぶりにpythonを書いているから違和感しかないです。

;をどうしてもつけてしまう。

インデントをそろえるのがしんどい。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です