Advertisement
sriyanto

chapter1_02

Dec 28th, 2023 (edited)
501
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.60 KB | None | 0 0
  1. import tkinter as tk
  2.  
  3.  
  4. class GameObject(object):
  5.     def __init__(self, canvas, item):
  6.         self.canvas = canvas
  7.         self.item = item
  8.  
  9.     def get_position(self):
  10.         return self.canvas.coords(self.item)
  11.  
  12.     def move(self, x, y):
  13.         self.canvas.move(self.item, x, y)
  14.  
  15.     def delete(self):
  16.         self.canvas.delete(self.item)
  17.  
  18.  
  19. class Ball(GameObject):
  20.     def __init__(self, canvas, x, y):
  21.         self.radius = 10
  22.         self.direction = [1, -1]
  23.         self.speed = 10
  24.         item = canvas.create_oval(x-self.radius, y-self.radius,
  25.                                   x+self.radius, y+self.radius,
  26.                                   fill='white')
  27.         super(Ball, self).__init__(canvas, item)
  28.  
  29.  
  30. class Paddle(GameObject):
  31.     def __init__(self, canvas, x, y):
  32.         self.width = 80
  33.         self.height = 10
  34.         self.ball = None
  35.         item = canvas.create_rectangle(x - self.width / 2,
  36.                                        y - self.height / 2,
  37.                                        x + self.width / 2,
  38.                                        y + self.height / 2,
  39.                                        fill='blue')
  40.         super(Paddle, self).__init__(canvas, item)
  41.  
  42.     def set_ball(self, ball):
  43.         self.ball = ball
  44.  
  45.     def move(self, offset):
  46.         coords = self.get_position()
  47.         width = self.canvas.winfo_width()
  48.         if coords[0] + offset >= 0 and coords[2] + offset <= width:
  49.             super(Paddle, self).move(offset, 0)
  50.             if self.ball is not None:
  51.                 self.ball.move(offset, 0)
  52.  
  53.  
  54. class Brick(GameObject):
  55.     COLORS = {1: '#999999', 2: '#555555', 3: '#222222'}
  56.  
  57.     def __init__(self, canvas, x, y, hits):
  58.         self.width = 75
  59.         self.height = 20
  60.         self.hits = hits
  61.         color = Brick.COLORS[hits]
  62.         item = canvas.create_rectangle(x - self.width / 2,
  63.                                        y - self.height / 2,
  64.                                        x + self.width / 2,
  65.                                        y + self.height / 2,
  66.                                        fill=color, tags='brick')
  67.         super(Brick, self).__init__(canvas, item)
  68.  
  69.     def hit(self):
  70.         self.hits -= 1
  71.         if self.hits == 0:
  72.             self.delete()
  73.         else:
  74.             self.canvas.itemconfig(self.item,
  75.                                    fill=Brick.COLORS[self.hits])
  76.  
  77.  
  78. class Game(tk.Frame):
  79.     def __init__(self, master):
  80.         super(Game, self).__init__(master)
  81.         self.lives = 3
  82.         self.width = 610
  83.         self.height = 400
  84.         self.canvas = tk.Canvas(self, bg='#aaaaff',
  85.                                 width=self.width,
  86.                                 height=self.height,)
  87.         self.canvas.pack()
  88.         self.pack()
  89.  
  90.         self.items = {}
  91.         self.ball = None
  92.         self.paddle = Paddle(self.canvas, self.width/2, 326)
  93.         self.items[self.paddle.item] = self.paddle
  94.         for x in range(5, self.width - 5, 75):
  95.             self.add_brick(x + 37.5, 50, 2)
  96.             self.add_brick(x + 37.5, 70, 1)
  97.             self.add_brick(x + 37.5, 90, 1)
  98.  
  99.         self.hud = None
  100.         self.setup_game()
  101.         self.canvas.focus_set()
  102.         self.canvas.bind('<Left>',
  103.                          lambda _: self.paddle.move(-10))
  104.         self.canvas.bind('<Right>',
  105.                          lambda _: self.paddle.move(10))
  106.  
  107.     def setup_game(self):
  108.            self.add_ball()
  109.            self.update_lives_text()
  110.            self.text = self.draw_text(300, 200,
  111.                                       'Press Space to start')
  112.            self.canvas.bind('<space>', lambda _: self.start_game())
  113.  
  114.     def add_ball(self):
  115.         if self.ball is not None:
  116.             self.ball.delete()
  117.         paddle_coords = self.paddle.get_position()
  118.         x = (paddle_coords[0] + paddle_coords[2]) * 0.5
  119.         self.ball = Ball(self.canvas, x, 310)
  120.         self.paddle.set_ball(self.ball)
  121.  
  122.     def add_brick(self, x, y, hits):
  123.         brick = Brick(self.canvas, x, y, hits)
  124.         self.items[brick.item] = brick
  125.  
  126.     def draw_text(self, x, y, text, size='40'):
  127.         font = ('Helvetica', size)
  128.         return self.canvas.create_text(x, y, text=text, font=font)
  129.  
  130.     def update_lives_text(self):
  131.         text = 'Lives: %s' % self.lives
  132.         if self.hud is None:
  133.             self.hud = self.draw_text(50, 20, text, 15)
  134.         else:
  135.             self.canvas.itemconfig(self.hud, text=text)
  136.  
  137.     def start_game(self):
  138.         pass
  139.  
  140.  
  141. if __name__ == '__main__':
  142.     root = tk.Tk()
  143.     root.title('Hello, Pong!')
  144.     game = Game(root)
  145.     game.mainloop()
  146.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement