Python ile Tuğla Kırma Oyunu
PYTHON PROGRAMLAMA VE OYUNLAR
Python ile class ve fonksiyon yapıları nasıl kullanılır ? Python programlama dili nedir ? Python tkinter kütüphanesi nasıl kullanılır ? Python ile oyun nasıl yapılır ? Bu ve benzeri sorulara yanıt aradığımız bu yazımızda youtube kanalımızda yayımladığımız tuğla kırma oyunu kodlarını sizlerle paylaşıyoruz.
Başlayalım.
PYTHON DİLİ OYUN KODLARI
Python resmi websitesinde tanımlanan class , instance gibi kavramların örneklerine hızlıca bakalım.
class Dog:
kind = 'canine' # class variable shared by all instances
def __init__(self, name):
self.name = name # instance variable unique to each instance
>>> d = Dog('Fido')
>>> e = Dog('Buddy')
>>> d.kind # shared by all dogs
'canine'
>>> e.kind # shared by all dogs
'canine'
>>> d.name # unique to d
'Fido'
>>> e.name # unique to e
'Buddy'Yukardaki örnekte basitçe class ve instance yapılarını nasıl kullanabileceğimizi görebilirsiniz.
Şimdide oyun kodlarını inceleyelim.
import tkinter as tk
class PlayComponent(object):
def __init__(self, canvas, item):
self.item = item
self.canvas =canvas
def move(self, x,y):
self.canvas.move(self.item,x,y)
def position(self):
return self.canvas.coords(self.item)
def delete(self):
self.canvas.delete(self.item)
class Paddle(PlayComponent):
def __init__(self, canvas, x, y):
self.height =5
self.width =100
self.ball = None
item = canvas.create_rectangle(x-self.width/2,
y-self.height/2,
x+self.width/2,
y+self.height/2,
fill='green')
super(Paddle,self).__init__(canvas, item)
def set_ball(self,ball):
self.ball = ball
def move(self, dist):
coord = self.position()
width = self.canvas.winfo_width()
if coord[2] +dist <=width and coord[0] +dist >=0:
super(Paddle, self).move(dist, 0)
if self.ball is not None:
self.ball.move(dist,0)
class Brick(PlayComponent):
colorArray = {1: 'lightsteelblue', 2: 'royalblue', 3:'blue'}
def __init__(self, canvas, x, y, hits):
self.width = 60
self.heigt = 20
self.hits = hits
color = Brick.colorArray[hits]
item = canvas.create_rectangle(x-self.width/2,
y-self.heigt/2,
x+self.width/2,
y+self.heigt/2,
fill = color, tag = 'brick')
super(Brick,self).__init__(canvas, item)
def hit(self):
self.hits -= 1
if self.hits ==0:
self.delete()
else:
self.canvas.itemconfig(self.item, fill=Brick.colorArray[self.hits])
class Ball(PlayComponent):
def __init__(self, canvas, x, y):
self.radius= 6
self.speed = 8
self.direction = [-1,1]
item = canvas.create_oval(x - self.radius,
y - self.radius,
x + self.radius,
y + self.radius,
fill='red')
super(Ball, self).__init__(canvas, item)
def update(self):
coord = self.position()
width = self.canvas.winfo_width()
if coord[1] <=0:
self.direction[1]*= -1
if coord[2] >=width or coord[0] <=0:
self.direction[0] *=-1
x = self.direction[0]*self.speed
y = self.direction[1]*self.speed
self.move(x, y)
def intersect(self,components):
coord = self.position()
x = (coord[0] + coord[2])*0.5
if len(components) == 1:
component = components[0]
coord = component.position()
if x < coord[0]:
self.direction[0] =-1
elif x> coord[2]:
self.direction[0] = 1
else:
self.direction[1]*=-1
elif len(components)>1:
self.direction[1]*=-1
for component in components:
if isinstance(component, Brick):
component.hit()
class Game(tk.Frame):
def __init__(self, master):
super(Game,self).__init__(master)
self.lives = 3
self.width = 1000
self.height = 400
self.canvas = tk.Canvas(self, bg = 'cornsilk',
width = self.width,
height = self.height)
self.canvas.pack()
self.pack()
self.items = {}
self.ball = None
self.paddle = Paddle(self.canvas, self.width/2, 320)
self.items[self.paddle.item] = self.paddle
for x in range(100, self.width - 100, 60):
self.display_brick(x+20, 50,2)
self.display_brick(x+20, 70, 1)
self.display_brick(x+20, 120, 1)
self.hud = None
self.init_game()
self.canvas.focus_set()
self.canvas.bind('<Left>',
lambda _:self.paddle.move(-30))
self.canvas.bind('<Right>',
lambda _:self.paddle.move(30))
def init_game(self):
self.update_lives_text()
self.display_ball()
self.text = self.draw_text(self.width/2, self.height/2, 'Press "S" for start')
self.canvas.bind('<s>', lambda _: self.start_game())
def display_ball(self):
if self.ball is not None:
self.ball.delete()
paddle_coords = self.paddle.position()
x = (paddle_coords[0] + paddle_coords[2])*0.5
self.ball = Ball(self.canvas,x,310)
self.paddle.set_ball(self.ball)
def display_brick(self, x, y, hits):
brick = Brick(self.canvas, x, y, hits)
self.items[brick.item]=brick
def draw_text(self, x, y, text, size='50'):
font = ('Arial', size)
return self.canvas.create_text(x, y, text=text, font=font)
def update_lives_text(self):
text = 'Lives: %s' %self.lives
if self.hud is None:
self.hud= self.draw_text(50, 20, text, 15)
else:
self.canvas.itemconfig(self.hud, text=text)
def start_game(self):
self.canvas.unbind('<s>')
self.canvas.delete(self.text)
self.paddle.ball = None
self.game_loop()
def game_loop(self):
self.verify_inter()
num_bricks = len(self.canvas.find_withtag('brick'))
if num_bricks == 0:
self.ball.speed = None
self.draw_text(self.width/2, self.height/2, "You Win!")
elif self.ball.position()[3] >=self.height:
self.ball.speed = None
self.lives-=1
if self.lives == 0:
self.draw_text(self.width/2, self.height/2, "You Lost.Game Over!")
else:
self.after(1000, self.init_game())
else:
self.ball.update()
self.after(50, self.game_loop)
def verify_inter(self):
ball_coords = self.ball.position()
items = self.canvas.find_overlapping(*ball_coords)
objects = [self.items[x] for x in items if x in self.items]
self.ball.intersect(objects)
if __name__ =='__main__':
root = tk.Tk()
root.title('Tuğla Kırma')
game = Game(root)
game.mainloop()
Kodların tamamı ve diğer ilgili kod parçalarını şu linkten indirebilirsiniz.
Python , C# gibi diller ile ilgili daha fazla örnek uygulama ve eğitim döküman/videoları için bizimle iletişime geçin ve geribildirim verin.
Sizden gelecek hertürlü bildirim bizim için bir sonraki çalışmaların kaynağı olacaktır.
PYTHON TUĞLA KIRMA OYUNU SONUÇ
Python ile yazılmış tuğla kırma oyunu kodlarını sizlerle paylaştık. Umuyorum sizler için faydalı bir video ve aynı zamanda yazı olmuştur.Bizi takipte kalın.
İyi Çalışmalar
Yanıtlar & Tartışma (1)
Bu makaleye yanıt vermek veya fikirlerinizi paylaşmak için giriş yapın.
Giriş Yap / Kayıt Olmuhammed can demir
oyununuza hile kodladım :) import tkinter as tk class PlayComponent(object): def __init__(self, canvas, item): self.item = item self.canvas = canvas def move(self, x, y): self.canvas.move(self.item, x, y) def position(self): return self.canvas.coords(self.item) def delete(self): self.canvas.delete(self.item) class Paddle(PlayComponent): def __init__(self, canvas, x, y): self.height = 5 self.width = 100 self.ball = None item = canvas.create_rectangle(x - self.width / 2, y - self.height / 2, x + self.width / 2, y + self.height / 2, fill='green') super(Paddle, self).__init__(canvas, item) def set_ball(self, ball): self.ball = ball def move(self, dist): coord = self.position() width = self.canvas.winfo_width() if coord[2] + dist = 0: super(Paddle, self).move(dist, 0) if self.ball is not None: self.ball.move(dist, 0) def set_width(self, new_width): coord = self.position() cx = (coord[0] + coord[2]) * 0.5 cy = (coord[1] + coord[3]) * 0.5 self.width = new_width self.canvas.coords(self.item, cx - self.width / 2, cy - self.height / 2, cx + self.width / 2, cy + self.height / 2) class Brick(PlayComponent): colorArray = {1: 'lightsteelblue', 2: 'royalblue', 3: 'blue'} def __init__(self, canvas, x, y, hits): self.width = 60 self.heigt = 20 self.hits = hits color = Brick.colorArray[hits] item = canvas.create_rectangle(x - self.width / 2, y - self.heigt / 2, x + self.width / 2, y + self.heigt / 2, fill=color, tag='brick') super(Brick, self).__init__(canvas, item) def hit(self): self.hits -= 1 if self.hits == 0: self.delete() else: self.canvas.itemconfig(self.item, fill=Brick.colorArray[self.hits]) class Ball(PlayComponent): def __init__(self, canvas, x, y): self.radius = 6 self.speed = 8 self.direction = [-1, 1] self.paused = False item = canvas.create_oval(x - self.radius, y - self.radius, x + self.radius, y + self.radius, fill='red') super(Ball, self).__init__(canvas, item) def update(self): if self.paused: return coord = self.position() width = self.canvas.winfo_width() if coord[1] = width or coord[0] <= 0: self.direction[0] *= -1 x = self.direction[0] * self.speed y = self.direction[1] * self.speed self.move(x, y) def intersect(self, components): coord = self.position() x = (coord[0] + coord[2]) * 0.5 if len(components) == 1: component = components[0] coord = component.position() if x coord[2]: self.direction[0] = 1 else: self.direction[1] *= -1 elif len(components) > 1: self.direction[1] *= -1 for component in components: if isinstance(component, Brick): component.hit() class Game(tk.Frame): def __init__(self, master): super(Game, self).__init__(master) self.lives = 3 self.width = 1000 self.height = 400 self.infinite_lives = False self.wide_paddle = False self.canvas = tk.Canvas(self, bg='cornsilk', width=self.width, height=self.height) self.canvas.pack() self.pack() self.items = {} self.ball = None self.paddle = Paddle(self.canvas, self.width / 2, 320) self.items[self.paddle.item] = self.paddle for x in range(100, self.width - 100, 60): self.display_brick(x + 20, 50, 2) self.display_brick(x + 20, 70, 1) self.display_brick(x + 20, 120, 1) self.hud = None self.cheat_label = None self.init_game() self.canvas.focus_set() self.canvas.bind('', lambda _: self.paddle.move(-30)) self.canvas.bind('', lambda _: self.paddle.move(30)) # --- HİLELER --- # I → Sonsuz Can self.canvas.bind('<i>', lambda _: self.cheat_infinite_lives()) # Space → Topu Durdur / Devam Ettir self.canvas.bind('', lambda _: self.cheat_toggle_pause()) # K → Tüm Tuğlaları Kır self.canvas.bind('', lambda _: self.cheat_kill_all()) # W → Geniş Paddle Aç/Kapat self.canvas.bind('', lambda _: self.cheat_wide_paddle()) def init_game(self): self.update_lives_text() self.display_ball() self.text = self.draw_text(self.width / 2, self.height / 2, 'Press "S" to Start') self.canvas.bind('<s>', lambda _: self.start_game()) def display_ball(self): if self.ball is not None: self.ball.delete() paddle_coords = self.paddle.position() x = (paddle_coords[0] + paddle_coords[2]) * 0.5 self.ball = Ball(self.canvas, x, 310) self.paddle.set_ball(self.ball) def display_brick(self, x, y, hits): brick = Brick(self.canvas, x, y, hits) self.items[brick.item] = brick def draw_text(self, x, y, text, size='50'): font = ('Arial', size) return self.canvas.create_text(x, y, text=text, font=font) def update_lives_text(self): label = ('Lives: ∞' if self.infinite_lives else 'Lives: %s' % self.lives) if self.hud is None: self.hud = self.draw_text(50, 20, label, 15) else: self.canvas.itemconfig(self.hud, text=label) def show_cheat_msg(self, msg): if self.cheat_label: self.canvas.delete(self.cheat_label) self.cheat_label = self.draw_text(self.width / 2, self.height - 20, msg, 14) self.after(2000, self._clear_cheat_msg) def _clear_cheat_msg(self): if self.cheat_label: self.canvas.delete(self.cheat_label) self.cheat_label = None # ── HİLE FONKSİYONLARI ────────────────────────────────────────────────── def cheat_infinite_lives(self): """I tuşu → Sonsuz can açar/kapatır.""" self.infinite_lives = not self.infinite_lives self.update_lives_text() state = 'AÇIK ✓' if self.infinite_lives else 'KAPALI ✗' self.show_cheat_msg(f'[HİLE] Sonsuz Can: {state}') def cheat_toggle_pause(self): """Space → Topu dondurur / serbest bırakır.""" if self.ball and self.ball.speed: self.ball.paused = not self.ball.paused state = 'DURDURULDU ⏸' if self.ball.paused else 'DEVAM ▶' self.show_cheat_msg(f'[HİLE] Top: {state}') def cheat_kill_all(self): """K tuşu → Tüm tuğlaları anında kırar.""" brick_items = self.canvas.find_withtag('brick') for item in brick_items: if item in self.items: self.items[item].delete() del self.items[item] self.show_cheat_msg('[HİLE] Tüm Tuğlalar Kırıldı! 💥') def cheat_wide_paddle(self): """W tuşu → Paddle'ı 200px genişletir / normale döndürür.""" self.wide_paddle = not self.wide_paddle new_width = 200 if self.wide_paddle else 100 self.paddle.set_width(new_width) state = 'GENİŞ ↔' if self.wide_paddle else 'NORMAL' self.show_cheat_msg(f'[HİLE] Paddle: {state}') # ──────────────────────────────────────────────────────────────────────── def start_game(self): self.canvas.unbind('<s>') self.canvas.delete(self.text) self.paddle.ball = None self.game_loop() def game_loop(self): self.verify_inter() num_bricks = len(self.canvas.find_withtag('brick')) if num_bricks == 0: self.ball.speed = None self.draw_text(self.width / 2, self.height / 2, "You Win! 🎉") elif self.ball.position()[3] >= self.height: self.ball.speed = None if not self.infinite_lives: self.lives -= 1 if self.lives == 0 and not self.infinite_lives: self.draw_text(self.width / 2, self.height / 2, "You Lost. Game Over!") else: self.after(1000, self.init_game) else: self.ball.update() self.after(50, self.game_loop) def verify_inter(self): ball_coords = self.ball.position() items = self.canvas.find_overlapping(*ball_coords) objects = [self.items[x] for x in items if x in self.items] self.ball.intersect(objects) if __name__ == '__main__': root = tk.Tk() root.title('Tuğla Kırma') game = Game(root) game.mainloop() I = Sonsuz CanCan azalmaz, Lives: ∞ gösterir Space = Top Dondur/DevamTopu istediğin yerde dondurur K = Tüm Tuğlaları KırAnında tüm tuğlaları patlatır W = Geniş PaddlePaddle'ı 100px → 200px yapar iyi oyunlar!