【Python-OpenCV】深層強化学習(DDPG)用のゲームを作成してみた

こんにちは、ヒガシです!

 

以前の記事にて深層強化学習アルゴリズムであるDDPGを紹介しましたが、それを実際に使ってみたくなったので、まずはそのための環境構築をしようと思います。

(OpenGymなんかを使っても良いですが、やはり自分で環境からつくっていった方が圧倒的に勉強になると思いますので、今回は自分で環境を作ってみようと思います。)

 

※今回の記事ではいったん強化学習のことはおいといて、まずは人間が楽しめる形にしたいと思います。その後次回の記事でClass化して強化学習させてみようと思います。

 

というわけで今回作るゲームの内容は以下の動画の通りです。

 

こんな感じであるスタート地点から適当な場所をクリックすることで、そのクリック位置で現在地との差が加速度となり、その加速度をもとに速度、位置を更新しながら進んでいく、同じ加速度で数ステップ進み、またクリックして加速度を更新する。そして黒いところにはいってしまうとゲームオーバーって感じですね。

 

というわけで今回はこのゲームの作り方をご紹介していこうと思います。

 

スポンサーリンク

必要なライブラリ一覧

★OpenCV

★numpy

いつもの2つだけですね。

 

OpenCVについては以下でインストール方法、使い方等簡単にご紹介していますので、使ったことがないひとは参考にしてみてください。

【Python-OpenCV】インストール方法、バージョン確認、使用時の注意点

Python-openCVの基本操作9つ!読み込み⇒加工⇒保存まで!

 

スポンサーリンク

サーキット走行的なゲームの作り方

それでは冒頭に紹介したサーキット走行的なゲームの作り方をご紹介します。

 

以下のプログラムを実行するだけでOKです。

#ライブラリインポート
import cv2
import numpy as np
#ベース画像作成
img1=np.zeros((1000,1000),np.uint8)
cv2.rectangle(img1,(140,140),(860,860), color=255,thickness=120)
img1[:500,:]=0
img2=np.zeros((1000,1000),np.uint8)
cv2.circle(img2,(500,500),radius=360,color=255,thickness=120)
img2[500:,:]=0
img=img1+img2
counter=0
dt=0.2

#ゲームのメイン部分
def play_game(event, x, y, flags, params):
    global counter,img2,x1,y1,vx,vy,img,L,vmax
    if event == cv2.EVENT_LBUTTONDOWN and counter==0:
        x1,y1=500,140
        vx,vy=-10,5
        L=0
        vmax=30
        img2=np.copy(img)
        counter=1
        cv2.circle(img2,(x1,y1),radius=10,color=100,thickness=-1)
        cv2.imshow('window', img2)
    elif event == cv2.EVENT_LBUTTONDOWN and counter==1:
        ax,ay=(x-x1)*0.1,(y-y1)*0.1
        img2=np.copy(img)
        for i in range(8):
            vx,vy=dt*ax+vx,dt*ay+vy
            x1,y1=vx*dt+x1,vy*dt+y1
            vabs=np.sqrt(vx**2+vy**2)/vmax
            vx,vy=min(max(vx/vabs,-vmax),vmax),min(max(vy/vabs,-vmax),vmax)
            L+=np.sqrt(abs(vx*dt)**2+abs(vy*dt)**2)
            cv2.circle(img2,(int(x1),int(y1)),radius=10,color=200-i*30,thickness=2)
            cv2.imshow('window', img2)
            if img[int(y1),int(x1)]==0:
                counter=0
                cv2.putText(img2, 'Game Over',(310, 500),cv2.FONT_HERSHEY_SIMPLEX,fontScale=2.0,color=255,thickness=4)
                cv2.imshow('window', img2)
        ins_strx,ins_stry='vx='+str(round(vx,1)),'vy='+str(round(vy,1))
        cv2.putText(img2, ins_strx ,(30, 50),cv2.FONT_HERSHEY_SIMPLEX,fontScale=1.0,color=255,thickness=2)
        cv2.putText(img2, ins_stry ,(30, 100),cv2.FONT_HERSHEY_SIMPLEX,fontScale=1.0,color=255,thickness=2)
        cv2.putText(img2, 'L='+str(round(L,1)) ,(30, 150),cv2.FONT_HERSHEY_SIMPLEX,fontScale=1.0,color=255,thickness=2)
        cv2.imshow('window', img2)
cv2.imshow('window', img)
cv2.setMouseCallback('window', play_game)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

ぜひ完走目指してあそんでみてください。

 

スポンサーリンク

おわりに

というわけで今回はpython-openCVを使って、サーキット走行的なゲームを作成してみました。

冒頭にも書いたとおり、次は今回のプログラムを強化学習に適用してみようと思います。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました