wxPythonでモナ危機一髪ゲーム

Pythonとは全く関係ないのであるが、たまたまMonaOSの本を手にした。

MONA―2ちゃんねる発祥の手作りOS

MONA―2ちゃんねる発祥の手作りOS

OSを一から作ろうなどという、大それた考えは自分にはないのだが、ひげぽんさんがOSを作っていくプロセスには興味がある。ぱらぱらとめくっただけであるが、GUIで簡単なゲームを作っているのが目に留まった。詳しく見たわけではないが、黒ヒゲ危機一髪のパロディ版ということなので、こんな感じであろうかと、wxPythonで作ってみた。

9つのボタンが並んでおり、どれか一つをはずれとする。はずれの数字は乱数で決める(randomモジュール使用)。はずれの番号を避けて、8つのボタンすべて押すことができれば勝ちとする。
実行画面は写真のようになる(勝利した場合!)。ソースは以下の通り。

まずは、_main_tree.py。こちらがメインのコード。

#----------------------------------------------------------------------------
# Name:         _main_tree.py
# Purpose:      gkiki
#----------------------------------------------------------------------------
import wx
import MainFrame

class Application(wx.App):
    def OnInit(self):
        frame = MainFrame.MainFrame(None, -1)
        frame.Show(True)
        self.SetTopWindow(frame)
        return True

def main():
    import time

    app = Application(0)
    print "inf> Application started on %s" % time.ctime(time.time())
    app.MainLoop()

if __name__ == '__main__':
    main()

次に、MainFrame.py。

#----------------------------------------------------------------------------
# Name:         MainFrame.py
# Purpose:      gkiki
#----------------------------------------------------------------------------

import random
import wx

class MainFrame(wx.Frame):
       
    def __init__(self, id, title):
        width, height = 250, 130
        wx.Frame.__init__(self, id, title="gkiki",
                          size=wx.Size(width, height))
        Pan = wx.Panel(self, -1)
        self.cnt = 0
        
        ### buttons
        Btn1 = wx.Button(Pan, -1, "1")
        Btn2 = wx.Button(Pan, -1, "2")
        Btn3 = wx.Button(Pan, -1, "3")
        Btn4 = wx.Button(Pan, -1, "4")
        Btn5 = wx.Button(Pan, -1, "5")
        Btn6 = wx.Button(Pan, -1, "6")
        Btn7 = wx.Button(Pan, -1, "7")
        Btn8 = wx.Button(Pan, -1, "8")
        Btn9 = wx.Button(Pan, -1, "9")

        hszr1 = wx.BoxSizer(wx.HORIZONTAL)
        hszr2 = wx.BoxSizer(wx.HORIZONTAL)
        hszr3 = wx.BoxSizer(wx.HORIZONTAL)
        vszr1 = wx.BoxSizer(wx.VERTICAL)

        hszr1.Add(Btn1, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr1.Add(Btn2, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr1.Add(Btn3, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr2.Add(Btn4, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr2.Add(Btn5, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr2.Add(Btn6, 0, wx.ALIGN_LEFT|wx.ALL, 2)            
        hszr3.Add(Btn7, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr3.Add(Btn8, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        hszr3.Add(Btn9, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        vszr1.Add(hszr1, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        vszr1.Add(hszr2, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        vszr1.Add(hszr3, 0, wx.ALIGN_LEFT|wx.ALL, 2)
        
        Pan.SetSizer(vszr1)
        vszr1.Fit(Pan)

        Pan.Bind(wx.EVT_BUTTON, self.OnButton)

        ## random number
        self.a = random.randint(1,9)

    def OnButton(self, event):
        btn = event.GetEventObject()
        if btn.GetLabel() == unicode(self.a):
            print "you lose!"
            btn.SetLabel("NG")
            btn.SetForegroundColour("RED")
            dlg = wx.MessageDialog(self, "You Lose!", "",
                                   style=wx.OK)
            dlg.ShowModal()
        else:
            self.cnt += 1
            btn.SetLabel("OK")
            btn.SetForegroundColour("BLUE")
            if self.cnt == 8:
                dlg = wx.MessageDialog(self, "You Win!", "",
                                       style=wx.OK)
                dlg.ShowModal()