ساخت بازی با پایتون قسمت چهارم

بازی نهایی
بازی نهایی


ابتدا قسمت سوم رو مشاهده کنید .




در قسمت قبل تا بایندینگ ها(bindings) اومدیم.

این قسمت میریم سراغ اینکه وقتی به دیوار برخورد کنه بازی از اول بشه و وقتی میوه رو می خوره میوه محو بشه .



برای اینکه وقتی به دیوار برخورد میکنه بازی از اول بشه :

اخر کدمون یه حلقه داشتیم برای رفرش شدن صفحه بعد از ()win.update و قبل از ()move مینویسیم :

if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:
    time.sleep(1)
    print('GameOver')
    head.goto(0,0)
    head.direction = 'stop'

خط اول داریم میگیم که اگر سر مار 290 به سمت راست یا چپ یا بالا یا پایین رفت بزارش وسط زمین و حرکتشو قطع کن .

حالا چرا 290 ؟؟

چون اگر صفحتونو مثل من 600 در 600 گرفته باشید، 290 پیکسل از هر طرف دقیقا میشه لبه صفحه .

خط دوم هم میگه که یک ثانیه وایسا

خط سوم توی ترمینال بنویس game over

خط چهار، سر بیار وسط زمین .

خط پنج حرکتشو قطع کن .



حالا میریم سراغ اینکه وقتی سر مار به غذا بر خورد کرد غذا محو بشه .

زیر همون برخورد سر به دیوار مینویسیم( حواستون باشه این نباید داخل اون ایف (if) قبلیه باشه ) :

if head.distance(food) < 20:
    x = random.randint(-290,290)
    y = random.randint(-290,290)
    food.goto(x,y)

برای اینکار گفتیم که اگه فاصله سر مار تا غذا کمتر از 20 پیکسل شد :
اول یه ایکس و وای جدید با رندوم ایجاد کن (نوشتم بین (-290,290) تا نره بیرون صفحه .

بعدشم غذا بره به همون ایکس و وای جدید .

شاید بگید چرا وقتی فاصله کمتر از 20 شد ؟؟

چون دور غذا تقریبا یه 20 پیکسلی هست و برای همین اینجوری بنویسیم بهتره .




حالا میریم سراغ اینکه وقتی به غذا خورد (فاصله با غذا کمتر از 20 پیکسل شد ) یک مربع به بدن مار اضافه بشه .

برای اینکار زیر همون اگر فاصله سر تا غذا ...... مینویسیم (به طوری داخل همون (if) باشه ) :

newsegment = turtle.Turtle()
newsegment.speed(0)
newsegment.shape('square')
newsegment.color('black')
newsegment.penup()
segments.append(newsegment)
score = score +1
print(score)

خط اول میگه یک شکل جدید ایجاد کن به اسم نیو سگمنت (newsegment)

خط دو . سرعتش هم که میزاریم روی 0.

خط سه . شکلش هم مربع

خط چهارم . رنگشو مشکی میزاریم تا معلوم باشه .

خط پنج . اضافه می کنیم به لیست سگمنت (segments) که قبلا ایجاد کرده بودیم .

حالا برای اینکه امتیاز هم به بازی اضافه کنیم یک score = 0 زیر delay مینویسیم .

و توی خط 6 یک امتیاز به کاربر اضافه میشه و امتیاز رو توی اینترنال پرینت میکنه .

حالا اگه برنامه رو اجرا کنیم و یک غذا بخوریم یک مربع سیاه وسط صفحه ایجاد میشه .

پس حالا باید کاری کنیم تا مربع ها بچسبه به سر ( توی قسمت 5)



عکس بازی تا اینجای کار
عکس بازی تا اینجای کار

این هم کد ما تا اینجای کار :

# start

import turtle
import time
import random

delay = 0.1
score = 0

# firt setting
win = turtle.Screen()
win.title('Python Game')
win.bgcolor('green')
win.setup(width=600, height=600)
win.tracer(0)

# snake head
head = turtle.Turtle()
head.speed(0)
head.shape('square')
head.color('white')
head.penup()
head.goto(0,0)
head.direction = 'stop'

# food
food = turtle.Turtle()
food.speed(0)
food.shape('circle')
food.color('red')
food.penup()
food.goto(0,100)

# segments
segments = []

# functions
def goup():
    head.direction = 'up'

def godown():
    head.direction = 'down'

def goright():
    head.direction = 'right'

def goleft():
    head.direction = 'left'

def move():
    if head.direction == 'up':
        y = head.ycor()
        head.sety(y+20)

    if head.direction == 'down':
        y = head.ycor()
        head.sety(y-20)

    if head.direction == 'right':
        x = head.xcor()
        head.setx(x+20)

    if head.direction == 'left':
        x = head.xcor()
        head.setx(x-20)

# bindings
win.listen()
win.(goup, 'w')
win.(godown, 's')
win.(goright, 'd')
win.(goleft, 'a')

while True:
    win.update()

    # wall happend
    if head.xcor() > 290 or head.xcor() < -290 or head.ycor() > 290 or head.ycor() < -290:
        time.sleep(1)
        print('GameOver')
        head.goto(0,0)
        head.direction = 'stop'

    # eat happend
    if head.distance(food) < 20:
        x = random.randint(-290,290)
        y = random.randint(-290,290)
        food.goto(x,y)

        # add segments
        newsegment = turtle.Turtle()
        newsegment.speed(0)
        newsegment.shape('square')
        newsegment.color('black')
        newsegment.penup()
        segments.append(newsegment)
        score = score +1
        print(score)

    move()
    time.sleep(delay)

win.mainloop()

طبق چیزی که قسمت قبل گفتم ویرگول بایندینگ (bindigs) خراب میکنه بنا بر این این قسمت رو از روی عکس زیر ویرایش کنید :

بایندینگ درست
بایندینگ درست

اگر عیبی دیدید یا مشکلی داشتید در قسمت کامنت ها بنویسید .


قسمت پنجم (اخر)