開発環境
- OS X El Capitan - Apple (OS)
- Emacs (Text Editor)
- Python 3.5 (プログラミング言語)
Python for Kids: A Playful Introduction to Programming (Jason R. Briggs (著) 、No Starch Press)のPart Ⅲ.(Mr. Stick Man Races for the Exit)、Chapter 16.(Developing the Mr. Stick Man Game)、Programming Puzzles #2: Two-Image Checkerboard(No. 4652)を解いてみる。
Programming Puzzles #2: Two-Image Checkerboard(No. 4652)
コード(Emacs)
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import tkinter
import random
import time
class Game:
def __init__(self):
self.tk = tkinter.Tk()
self.tk.title('Mr. Stick Man Races for the Exit')
self.tk.resizable(0, 0)
width = 500
height = 500
self.tk.wm_attributes('-topmost', 1)
self.canvas = tkinter.Canvas(self.tk, width=width, heigh=height,
highlightthickness=0)
self.bg = tkinter.PhotoImage(file='background1.gif')
self.bg2 = tkinter.PhotoImage(file='background2.gif')
w = self.bg.width()
h = self.bg.height()
for x in range(0, 5):
for y in range(0, 5):
# Checkboard
if ((x + y) % 2) == 1:
self.canvas.create_image(x * w, y * h,
image=self.bg, anchor='nw')
else:
self.canvas.create_image(x * w, y * h,
image=self.bg2, anchor='nw')
self.canvas.pack()
self.tk.update()
self.sprites = []
self.running = True
self.canvas_height = width
self.canvas_width = height
def mainloop(self):
while True:
if self.running == True:
for sprite in self.sprites:
sprite.move()
self.tk.update_idletasks()
self.tk.update()
time.sleep(0.01)
class Coords:
def __init__(self, x1=0, y1=0, x2=0, y2=0):
self.x1 = x1
self.y1 = y1
self.x2 = x2
self.y2 = y2
class Sprite:
def __init__(self, game):
self.game = game
self.endgame = False
self.coordinates = None
def move(self):
pass
def coords(self):
return self.coodinates
class PlatformSprite(Sprite):
def __init__(self, game, photo_image, x, y, width, height):
Sprite.__init__(self, game)
self.photo_image = photo_image
self.image = game.canvas.create_image(x, y, image=self.photo_image,
anchor='nw')
self.coordinates = Coords(x, y, x + width, y + height)
def within_x(co1, co2):
if (co2.x1 < co1.x1 < co2.x2) or \
(co2.x1 < co1.x2 < co2.x2) or \
(co1.x1 < co2.x1 < co1.x2) or \
(co1.x1 < co2.x2 < co1.x2):
return True
return False
def within_y(co1, co2):
if (co2.y1 < co1.y1 < co2.y2) or \
(co2.y1 < co1.y2 < co2.y2) or \
(co1.y1 < co2.y1 < co1.y2) or \
(co1.y1 < co2.y2 < co1.y2):
return True
return False
def collided_left(co1, co2):
if within_y(co1, co2):
if co2.x1 <= co1.x1 <= co2.x2:
return True
return False
def colided_right(co1, co2):
if within_y(co1, co2):
if co2.x1 <= co1.x2 <= co2.x2:
return True
return False
def collided_top(co1, co2):
if within_x(co1, co2):
if co2.y1 <= co1.y1 <= co2.y2:
return True
return False
def collided_bottom(y, co1, co2):
if within_x(co1, co2):
y_calc = co1.y2 + y
if co2.y1 <= y_calc <= co2.y2:
return True
return False
if __name__ == '__main__':
game = Game()
platform1 = PlatformSprite(game, tkinter.PhotoImage(file='platform1.gif'),
0, 480, 100, 10)
platform2 = PlatformSprite(game, tkinter.PhotoImage(file='platform1.gif'),
150, 440, 100, 10)
platform3 = PlatformSprite(game, tkinter.PhotoImage(file='platform1.gif'),
300, 400, 100, 10)
platform4 = PlatformSprite(game, tkinter.PhotoImage(file='platform1.gif'),
30, 160, 100, 10)
platform5 = PlatformSprite(game, tkinter.PhotoImage(file='platform2.gif'),
175, 350, 66, 10)
platform6 = PlatformSprite(game, tkinter.PhotoImage(file='platform2.gif'),
50, 380, 66, 10)
platform7 = PlatformSprite(game, tkinter.PhotoImage(file='platform2.gif'),
170, 120, 66, 10)
platform8 = PlatformSprite(game, tkinter.PhotoImage(file='platform2.gif'),
45, 60, 66, 10)
platform9 = PlatformSprite(game, tkinter.PhotoImage(file='platform3.gif'),
170, 250, 32, 10)
platform10 = PlatformSprite(game, tkinter.PhotoImage(file='platform3.gif'),
230, 200, 32, 10)
game.sprites.append(platform1)
game.sprites.append(platform2)
game.sprites.append(platform3)
game.sprites.append(platform4)
game.sprites.append(platform5)
game.sprites.append(platform6)
game.sprites.append(platform7)
game.sprites.append(platform8)
game.sprites.append(platform9)
game.sprites.append(platform10)
game.mainloop()
0 コメント:
コメントを投稿