30分チャレンジ〜6日目〜
kazuma.です。
今回の30分チャレンジは「pythonでサイコロを振る」をやります。
ただ今回は自分で考えたりしてると時間が30分では足りないので・・。
コードを書いて20分かからないぐらいでした。
今回はPythonの本から抜き出ししてやってみたいと思います。
実行した結果が下の画像です。
今回は
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つにしています。
解説は・・・時間がないので割愛します。