kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

30分チャレンジ〜6日目〜

kazuma.です。

今回の30分チャレンジは「pythonでサイコロを振る」をやります。

ただ今回は自分で考えたりしてると時間が30分では足りないので・・。
コードを書いて20分かからないぐらいでした。

今回はPythonの本から抜き出ししてやってみたいと思います。


実行した結果が下の画像です。
f:id:kazumalab:20150715012108p:plain


今回は
button.py[class Button]
diece.py[class diece] ダイス綴り間違ってます。ごめんなさい(´Д` )
roller.py[main]

この3つのコードを書いて実装しました。

まずはbutton.pyから書いてみました。

button.py
from  graphics import *

class Button:
    def __init__(self,win,center,width,height,label):

        w,h = width /2.0 , height /2.0
        x,y = center.getX(),center.getY()
        self.xmax, self.xmin = x+w , x-w
        self.ymax, self.ymin = y+h , y-h
        p1 = Point(self.xmin , self.ymin)
        p2 = Point(self.xmax , self.ymax)

        self.rect = Rectangle(p1,p2)
        self.rect.setFill('lightgray')
        self.rect.draw(win)
        self.label = Text(center,label)
        self.label.draw(win)
        self.deactivate()

    def clicked(self, p):
        return (self.active and self.xmin <= p.getX() <= self.xmax and self.ymin <= p.getY() <= self.ymax)



    def getLabel(self):
        return self.label.getText()

    def activate(self):
        self.label.setFill('black')
        self.rect.setWidth(2)
        self.active = True

    def deactivate(self):
        self.label.setFill('darkgrey')
        self.rect.setWidth(1)
        self.active = False
        


次はサイコロの出目を操作し、表示するコードです。

diece,py
from graphics import *


class Diece:

    def __init__(self,win,center,size):
        self.win = win
        self.background = "white"
        self.foreground = "black"
        self.psize = 0.1 * size
        hsize = size / 2.0
        offset = 0.6 * hsize

        cx,cy = center.getX(),center.getY()
        p1 = Point(cx-hsize,cy-hsize)
        p2 = Point(cx+hsize,cy+hsize)

        rect = Rectangle(p1,p2)
        rect.draw(win)
        rect.setFill(self.background)


        self.pip1 = self.__makePip(cx-offset,cy-offset)
        self.pip2 = self.__makePip(cx-offset,cy)
        self.pip3 = self.__makePip(cx-offset,cy+offset)
        self.pip4 = self.__makePip(cx,cy)
        self.pip5 = self.__makePip(cx+offset,cy-offset)
        self.pip6 = self.__makePip(cx+offset,cy)
        self.pip7 = self.__makePip(cx+offset,cy+offset)

        self.setValue(1)

    def __makePip(self,x,y):
        pip = Circle(Point(x,y),self.psize)
        pip.setFill(self.background)
        pip.setOutline(self.background)
        pip.draw(self.win)
        return pip




    def setValue(self,value):
        self.pip1.setFill(self.background)
        self.pip2.setFill(self.background)
        self.pip3.setFill(self.background)
        self.pip4.setFill(self.background)
        self.pip5.setFill(self.background)
        self.pip6.setFill(self.background)
        self.pip7.setFill(self.background)

        if value == 1:
            self.pip4.setFill(self.foreground)
        elif value == 2:
            self.pip1.setFill(self.foreground)
            self.pip7.setFill(self.foreground)
        elif value == 3:
            self.pip1.setFill(self.foreground)
            self.pip7.setFill(self.foreground)
            self.pip4.setFill(self.foreground)
        elif value == 4:
            self.pip1.setFill(self.foreground)
            self.pip3.setFill(self.foreground)
            self.pip5.setFill(self.foreground)
            self.pip7.setFill(self.foreground)
        elif value == 5:
            self.pip1.setFill(self.foreground)
            self.pip3.setFill(self.foreground)
            self.pip4.setFill(self.foreground)
            self.pip5.setFill(self.foreground)
            self.pip7.setFill(self.foreground)
        elif value == 6:
            self.pip1.setFill(self.foreground)
            self.pip2.setFill(self.foreground)
            self.pip3.setFill(self.foreground)
            self.pip5.setFill(self.foreground)
            self.pip6.setFill(self.foreground)
            self.pip7.setFill(self.foreground)


今度はmainのプログラムです。ここで各コードを読み込み引数を受け渡し(?)、実装しています。

from random import randrange
from graphics import GraphWin ,Point

#ここでクラス読み込み
from button import Button
from diece import Diece


def main():

    win = GraphWin("Dice Roller")
    win.setCoords(0,0,10,10)
    win.setBackground("yellow")

    die = Diece(win,Point(5,7),2)
    rollButton = Button(win,Point(5,4.5),6,1,"Roll Dice")
    rollButton.activate()
    quitButton = Button(win,Point(5,1),2,1,"Quit")

    pt = win.getMouse()
    while not quitButton.clicked(pt):
        if rollButton.clicked(pt):
            value1 = randrange(1,7)
            die.setValue(value1)
            quitButton.activate()
        pt = win.getMouse()

    win.close()
main()

本ではサイコロは2つ並べてあるのですが、必要ないので1つにしています。

解説は・・・時間がないので割愛します。