pythonで作る自作タイピングソフト(簡易版)コード全文有

美佳タイプのようなソフトをpython・pygameを用いて再現していきます。(◎_◎;)

まずは完成図を

下のコードでできるもの

*必要な下準備として、pygameのインストールがあります

↓コード↓ 詳しい説明はまた記事にでもしようと思います。


import sys 
import pygame 
import random
from pygame.locals import *

#入力する用語と画面に表示する用語を辞書を用いて用意する。
test_dict_1 = {
"ごとうぶんのはなよめ":"gotoubunnnohanayome",
"ぶりーち":"buri-ti",
"なると":"naruto",
"わんぴーす":"wannpi-su",
"きめつのやいば":"kimetunoyaiba",
"だいやのえーす":"daiyanoe-su",
"ぎんたま":"ginntama",
"このすば":"konosuba",
"さえないひろいんのそだてかた":"saenaihiroinnnosodatekata",
"ぐらんぶる":"gurannburu",
"かぐやさまはこくらせたい":"kaguyasamahakokurasetai",
"ひろあか":"hiroaka",
"じじじ":"zizizi"
}

#毎回問題の順番が変わるように辞書をシャッフルする関数を作る。
#引数にうえで用意した辞書を入れる。
def shuffledict(d):
     keys = list(d.keys())
     random.shuffle(keys)
     new_dict = [(key,d[key]) for key in keys]
     return dict(new_dict)

#ここで実際にシャッフル
test_dict_new = shuffledict(test_dict_1)

#表示用の日本語リストを作る。
display_list = []
for i in test_dict_new.keys():
     display_list.append(i)

#実際にタイプするローマ字リストを作る。
type_list = []
for i in test_dict_new.values():
     type_list.append(i)

#上記で用意したリストをスペースで区切りつつ一つの文章に結合する。joinの使用。
type_list_all = " ".join(type_list)
display_list_all = " ".join(display_list)

#一列40文字の下準備
separate = display_list_all[:40]
separate_2 = display_list_all[40:80]
separate_3 = display_list_all[80:120]
separate_4 = display_list_all[120:160]


#実際のゲーム設定。
def run_game(): 
     """ ゲーム実行 """ 
     pygame.init() 
     #画面の大きさ、フォントの設定
     screen = pygame.display.set_mode((720, 480)) 
     font_2 = pygame.font.SysFont("hg正楷書体pro", 40)
     font_3 = pygame.font.SysFont("hg正楷書体pro", 19)

     #時間計測用に用意
     pygame.time.set_timer(pygame.USEREVENT, 1000) 
     clock = pygame.time.Clock() 
     time_counter = 0

     #正解タイプ数と間違いタイプ数
     word = type_list_all
     count_c = 0
     count_m = 0

     #ゲームの開始終了に使用
     game = True
     result = False

     while game:
         #背面の色(白色)
         screen.fill((250, 250, 250)) 

         #画面の装飾
         screen.blit(font_3.render("●"*3,True,(255,0,255)),(200,20))
         screen.blit(font_3.render("もきちタイプ",True,(0,200,150)),(280,20))
         screen.blit(font_3.render("●"*3,True,(255,0,255)),(420,20))
         screen.blit(font_3.render("Escapeを押すと終了します。",True,(0,200,150)),(360,400))

         #ローマ字部分の表示
         sf_word = font_2.render(word[:5], True, (0, 0, 0))  
         screen.blit(sf_word, (300,50)) 
         screen.blit(font_3.render(separate,True,(0,0,0)),(1,210))
         screen.blit(font_3.render(separate_2,True,(0,0,0)),(1,260))
         screen.blit(font_3.render(separate_3,True,(0,0,0)),(1,310))
         screen.blit(font_3.render(separate_4,True,(0,0,0)),(1,360))

         #一分間のタイプ数計算用
         speed_per_minute = round(((count_c)/(time_counter+1))*60,1)
 

         #画面の装飾
         screen.blit(font_2.render("ローマ字=",True,(0,0,0)),(100,60))
         screen.blit(font_3.render("制限時間60秒",True,(0,200,150)),(40,110))
         screen.blit(font_3.render("経過時間{}秒".format(time_counter),True,(255,0,255)),(40,140))
         screen.blit(font_3.render("最高入力速度",True,(0,200,150)),(450,110))
         screen.blit(font_3.render("入力速度",True,(0,200,0)),(490,140))
         screen.blit(font_3.render("打鍵数{}回/分".format(speed_per_minute),True,(255,0,255)),(250,140))
         screen.blit(font_3.render("ミスタイプ {}".format(count_m),True,(0,200,0)),(480,170))

         #絶対必要要注意↓
         pygame.display.update()
        
         ###タイピングソフトの中身↓###

         #閉じるボタンを押せば終了する
         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 > 60:
                       result = True
                       game = False

          #キーが押されたときの処理
             if event.type == pygame.KEYDOWN: 
          #正解 
                if chr(event.key) == word[0]: 
                     word = word[1:]
                     count_c += 1
          #z,jだけの特例処理
                elif((chr(event.key)=="j") and (word[0]=="z")):
                     word = word[1:]
                     count_c += 1
          #間違い
                else :
                     count_m +=1
                     
          #すべて打ち終わったらの処理
                if word == "":
                     result = True
                     game = False

             else :
                  clock.tick(60)
                  
if __name__ == "__main__":
     run_game()

今回のコードでは本家同様、打ち方が限定されています。

タイピングソフトであればそれでもいいのかもしれないですが、寿司打のようなタイピングゲームを作るのならば文字の対応はしていきたいですね(p_-)

タイピングシステム自体は下の部分のみでできているので、意外と簡単なシステムですね。

ゲームエンジン(Unity)を用いない場合はwhile/for分のループでゲームを回している。←pythonでゲーム作りするからならではの発見です。

         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 > 60:
                       result = True
                       game = False

          #キーが押されたときの処理
             if event.type == pygame.KEYDOWN: 
          #正解 
                if chr(event.key) == word[0]: 
                     word = word[1:]
                     count_c += 1
          #z,jだけの特例処理
                elif((chr(event.key)=="j") and (word[0]=="z")):
                     word = word[1:]
                     count_c += 1
          #間違い
                else :
                     count_m +=1
                     
          #すべて打ち終わったらの処理
                if word == "":
                     result = True
                     game = False

             else :
                  clock.tick(60)

全部の文字を対応させようとすると、想像以上に配列操作を行うことになります。いいプログラムの練習になると思うので自分のサイトのタイピングゲームの作り方もまた載せていこうと思います。(笑)。

コメントを残す

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