keer_zu 发表于 2019-8-5 10:33

火柴人游戏



有本python的入门书是给小朋友的,上面有个例子,火柴人游戏,代码如下:
(github链接:火柴人)

from tkinter import *
import random
import time

class Game:
    def __init__(self):
      self.tk = Tk()
      self.tk.title("Mr. Stick Man Races for the Exit")
      self.tk.resizable(0, 0)
      self.tk.wm_attributes("-topmost", 1)
      self.canvas = Canvas(self.tk, width=500, height=500, highlightthickness=0)
      self.canvas.pack()
      self.tk.update()
      self.canvas_height = 500
      self.canvas_width = 500
      self.bg = PhotoImage(file="background.gif")
      w = self.bg.width()
      h = self.bg.height()
      for x in range(0, 5):
            for y in range(0, 5):
                self.canvas.create_image(x * w, y * h, image=self.bg, anchor='nw')
      self.sprites = []
      self.running = True

    def mainloop(self):
      while 1:
            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

def within_x(co1, co2):
    if (co1.x1 > co2.x1 and co1.x1 < co2.x2) \
            or (co1.x2 > co2.x1 and co1.x2 < co2.x2) \
            or (co2.x1 > co1.x1 and co2.x1 < co1.x2) \
            or (co2.x2 > co1.x1 and co2.x2 < co1.x1):
      return True
    else:
      return False

def within_y(co1, co2):
    if (co1.y1 > co2.y1 and co1.y1 < co2.y2) \
            or (co1.y2 > co2.y1 and co1.y2 < co2.y2) \
            or (co2.y1 > co1.y1 and co2.y1 < co1.y2) \
            or (co2.y2 > co1.y1 and co2.y2 < co1.y1):
      return True
    else:
      return False

def collided_left(co1, co2):
    if within_y(co1, co2):
      if co1.x1 <= co2.x2 and co1.x1 >= co2.x1:
            return True
    return False

def collided_right(co1, co2):
    if within_y(co1, co2):
      if co1.x2 >= co2.x1 and co1.x2 <= co2.x2:
            return True
    return False

def collided_top(co1, co2):
    if within_x(co1, co2):
      if co1.y1 <= co2.y2 and co1.y1 >= co2.y1:
            return True
    return False

def collided_bottom(y, co1, co2):
    if within_x(co1, co2):
      y_calc = co1.y2 + y
      if y_calc >= co2.y1 and y_calc <= co2.y2:
            return True
    return False

class Sprite:
    def __init__(self, game):
      self.game = game
      self.endgame = False
      self.coordinates = None
    def move(self):
      pass
    def coords(self):
      return self.coordinates

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)

class StickFigureSprite(Sprite):
    def __init__(self, game):
      Sprite.__init__(self, game)
      self.images_left = [
            PhotoImage(file="figure-L1.gif"),
            PhotoImage(file="figure-L2.gif"),
            PhotoImage(file="figure-L3.gif")
      ]
      self.images_right = [
            PhotoImage(file="figure-R1.gif"),
            PhotoImage(file="figure-R2.gif"),
            PhotoImage(file="figure-R3.gif")
      ]
      self.image = game.canvas.create_image(200, 470, image=self.images_left, anchor='nw')
      self.x = -2
      self.y = 0
      self.current_image = 0
      self.current_image_add = 1
      self.jump_count = 0
      self.last_time = time.time()
      self.coordinates = Coords()
      game.canvas.bind_all('<KeyPress-Left>', self.turn_left)
      game.canvas.bind_all('<KeyPress-Right>', self.turn_right)
      game.canvas.bind_all('<space>', self.jump)

    def turn_left(self, evt):
      if self.y == 0:
            self.x = -2

    def turn_right(self, evt):
      if self.y == 0:
            self.x = 2

    def jump(self, evt):
      if self.y == 0:
            self.y = -4
            self.jump_count = 0
            
    def animate(self):
      if self.x != 0 and self.y == 0:
            if time.time() - self.last_time > 0.1:
                self.last_time = time.time()
                self.current_image += self.current_image_add
                if self.current_image >= 2:
                  self.current_image_add = -1
                if self.current_image <= 0:
                  self.current_image_add = 1
      if self.x < 0:
            if self.y != 0:
                self.game.canvas.itemconfig(self.image, image=self.images_left)
            else:
                self.game.canvas.itemconfig(self.image, image=self.images_left)
      elif self.x > 0:
            if self.y != 0:
                self.game.canvas.itemconfig(self.image, image=self.images_right)
            else:
                self.game.canvas.itemconfig(self.image, image=self.images_right)

    def coords(self):
      xy = list(self.game.canvas.coords(self.image))
      self.coordinates.x1 = xy
      self.coordinates.y1 = xy
      self.coordinates.x2 = xy + 27
      self.coordinates.y2 = xy + 30
      return self.coordinates
      
    def move(self):
      self.animate()
      if self.y < 0:
            self.jump_count += 1
            if self.jump_count > 20:
                self.y = 4
      if self.y > 0:
            self.jump_count -= 1
            
      co = self.coords()
      left = True
      right = True
      top = True
      bottom = True
      falling = True
      
      if self.y > 0 and co.y2 >= self.game.canvas_height:
            self.y = 0
            bottom = False
      elif self.y < 0 and co.y1 <= 0:
            self.y = 0
            top = False

      if self.x > 0 and co.x2 >= self.game.canvas_width:
            self.x = 0
            right = False
      elif self.x < 0 and co.x1 <= 0:
            self.x = 0
            left = False

      for sprite in self.game.sprites:
            if sprite == self:
                continue
            sprite_co = sprite.coords()
            if top and self.y < 0 and collided_top(co, sprite_co):
                self.y = -self.y
                top = False
               
            if bottom and self.y > 0 and collided_bottom(self.y, co, sprite_co):
                self.y = sprite_co.y1 - co.y2
                if self.y < 0:
                  self.y = 0
                bottom = False
                top = False

            if bottom and falling and self.y == 0 and co.y2 < self.game.canvas_height and collided_bottom(1, co, sprite_co):
                falling = False
               
            if left and self.x < 0 and collided_left(co, sprite_co):
                self.x = 0
                left = False
                if sprite.endgame:
                  self.game.running = False

            if right and self.x > 0 and collided_right(co, sprite_co):
                self.x = 0
                right = False
                if sprite.endgame:
                  self.game.running = False
            
      if falling and bottom and self.y == 0 and co.y2 < self.game.canvas_height:
            self.y = 4
      
      self.game.canvas.move(self.image, self.x, self.y)

class DoorSprite(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 / 2), y + height)
      self.endgame = True


g = Game()
platform1 = PlatformSprite(g, PhotoImage(file="platform1.gif"), 0, 480, 100, 10)
platform2 = PlatformSprite(g, PhotoImage(file="platform1.gif"), 150, 440, 100, 10)
platform3 = PlatformSprite(g, PhotoImage(file="platform1.gif"), 300, 400, 100, 10)
platform4 = PlatformSprite(g, PhotoImage(file="platform1.gif"), 300, 160, 100, 10)
platform5 = PlatformSprite(g, PhotoImage(file="platform2.gif"), 175, 350, 66, 10)
platform6 = PlatformSprite(g, PhotoImage(file="platform2.gif"), 50, 300, 66, 10)
platform7 = PlatformSprite(g, PhotoImage(file="platform2.gif"), 170, 120, 66, 10)
platform8 = PlatformSprite(g, PhotoImage(file="platform2.gif"), 45, 60, 66, 10)
platform9 = PlatformSprite(g, PhotoImage(file="platform3.gif"), 170, 250, 32, 10)
platform10 = PlatformSprite(g, PhotoImage(file="platform3.gif"), 230, 200, 32, 10)
g.sprites.append(platform1)
g.sprites.append(platform2)
g.sprites.append(platform3)
g.sprites.append(platform4)
g.sprites.append(platform5)
g.sprites.append(platform6)
g.sprites.append(platform7)
g.sprites.append(platform8)
g.sprites.append(platform9)
g.sprites.append(platform10)
door = DoorSprite(g, PhotoImage(file="door1.gif"), 45, 30, 40, 35)
g.sprites.append(door)
sf = StickFigureSprite(g)
g.sprites.append(sf)
g.mainloop()



keer_zu 发表于 2019-8-5 15:35

SELECT * FROM `product_information_table` where ctime between '2019-08-05 15:03:45' and '2019-08-05 15:10:10';
页: [1]
查看完整版本: 火柴人游戏