見出し画像

【Python】Pythonでルーレットを作る

今回はPythonのTkinterを使ってMVCモデルを実装し、1~6の人生ゲーム式ルーレットを実装しました。
絶賛Python勉強初心者ということでまずは簡単なものからやってみました。

画像1

MVCモデル

MVCとは


✔Model
✔View
✔Controller


のイニシャルです。ともに


✔Model:データを保持する
✔View:入出力をおこなう
✔Controller:ModelとViewをつなぐ役割

上記をもとにクラスインスタンスをせいせいしてお互い参照できるようにインスタンスを生成した後に引数を追加する設定にて行っています。今回のルーレットでは

✔Model:角度、針が止まったところの数、針が止まった/回っている判定
✔View:キャンバス、ルーレット盤、針、テキスト表示、スペースキーで実行判定
✔Controller:Modelにあるデータが変化し、Viewの表示が変わる設定

にて実装を行っています。

コード

は、こちら。

import tkinter as tk
import math

class Model():
   def __init__(self):
       self.a = 0
       self.judgeText = 0
       self.stopflag = False
   def flagModel(self):
       if self.stopflag == False:
           self.stopflag = True
       else:
           self.stopflag = False
   def judgeModel(self):
       if 150 <= self.a and self.a < 210:
           self.judgeText = 1
       elif 90 <= self.a and self.a < 150:
           self.judgeText = 2
       elif 30 <= self.a and self.a < 90:
           self.judgeText = 3
       elif 0 <= self.a and self.a < 30 or 330 <= self.a and self.a < 360:
           self.judgeText = 4
       elif 270 <= self.a and self.a < 330:
           self.judgeText = 5
       elif 210 <= self.a and self.a < 270:
           self.judgeText = 6

class View():
   def __init__(self, master, m, c):
       self.master = master
       self.m = m
       self.c = c
       self.canvas = tk.Canvas(self.master, width=500, height=500)
       self.canvas.pack()
       r=0
       for i in range(6):
           self.canvas.create_arc(75,75,425,425,start=r,extent=60,fill="skyblue",width=2)
           r +=60
       j=1
       for z in [90,150,210,270,330,30]:
           x = ((200*(3**(1/2)))/3)*math.cos(math.radians(z))+250
           y = -100*math.sin(math.radians(z))+250
           self.canvas.create_text(x,y,text=j,font=("Helvetica", 50, "bold"),fill="blue")
           j+=1
       self.master.after(10, self.update)
       self.master.bind("<space>",self.c.flag_judge)
   def update(self):
       self.c.update()
       if self.m.stopflag == False:
           self.canvas.create_line(250,250,-125*math.sin(math.radians(self.m.a))+250,125*math.cos(math.radians(self.m.a))+250,fill="red",width=5,tag="player")
       else:
           self.canvas.create_text(450,450,text=self.m.judgeText,font=("Helvetica", 50, "bold"),fill="blue",tag="judgeText")
       self.master.after(10, self.update)

class Controller():
   def __init__(self, master, m):
       self.master = master
       self.m = m
   def flag_judge(self, event):
       self.m.flagModel()
       self.m.judgeModel()
   def update(self):
       if self.m.stopflag == False:
           self.v.canvas.delete("player")
           self.v.canvas.delete("judgeText")
           self.m.a = (self.m.a+10)%360

class Application(tk.Frame):
   def __init__(self, master):
       super().__init__(master)
       self.pack()
       master.geometry("500x500")
       master.title("ルーレット")
       self.m = Model()
       self.c = Controller(master, self.m)
       self.v = View(master, self.m, self.c)
       self.c.v = self.v

def main():
   win = tk.Tk()
   app = Application(master = win)
   app.mainloop()

if __name__ == "__main__":
   main()

最後に

スペースキーを押下してルーレットを回す/止まる機能ができました。

画像2


今後はこの機能を拡張して、自分好みにカスタマイズする挑戦をしたいと思います。成功したらまた記事にします。

ではまた。

この記事が参加している募集

私の常日頃の生活をベースに、皆さんの役に立てたり、探しているものを紹介できたらと思っています。今後もよろしくお願いします!