मैं कछुए का उपयोग करके पीएसी-मैन गेम बनाने की कोशिश कर रहा हूं। जब मैं अपना कोड चलाता हूं तो यह छोटे बिंदु दिखाता है। कछुए को घुमाते समय ऊपर की ओर जाने के लिए w दबाएं और आप खिलाड़ी के नीचे छोटी बिंदी पा सकते हैं।

from turtle import *

class creator(Turtle):
    def __init__(self, row, col, sprit, colorcode, width, height):
        Turtle.__init__(self)
        self.row=row
        self.col=col
        self.colorcode=colorcode
        self.sprit=sprit
        x, y=self.coords(row, col)
        self.color(colorcode)
        self.shape(sprit)
        self.shapesize(width, height, 0)
        self.pu()
        self.speed(0)
        self.goto(x, y)

    def coords(self, row, col):
        x=(-250+(col*25))
        y=(137.5-(row*25))
        return x, y

    def left(self):
        if ((self.xcor()-25, self.ycor()) not in game.running.walls):
            if ((self.xcor()-25, self.ycor()) in game.running.foods):
                foodcol=int(((self.xcor()-25)+250)/25)
                foodrow=int((137.5-self.ycor())/25)
                game.food[foodrow, foodcol].hideturtle()
                game.score+=1
                game.running.writer.clear()
                game.running.writer.write('score:{}'.format(game.score), font=('Arial',18,'bold'),move=False)
            self.goto(self.xcor()-25, self.ycor())

    def right(self):
        if ((self.xcor()+25, self.ycor()) not in game.running.walls):
            if ((self.xcor()+25,self.ycor()) in game.running.foods):
                foodcol=int(((self.xcor()+25)+250)/25)
                foodrow=int((137.5-self.ycor())/25)
                game.food[foodrow,foodcol].hideturtle()
                game.score+=1
                game.running.writer.clear()
                game.running.writer.write('score:{}'.format(game.score), font=('Arial', 18, 'bold'), move=False)
            self.goto(self.xcor()+25, self.ycor())

    def up(self):
        if ((self.xcor(), self.ycor()+25) not in game.running.walls):
            if ((self.xcor(), self.ycor()+25) in game.running.foods):
                foodcol=int(((self.xcor())+250)/25)
                foodrow=int((137.5-(self.ycor()+25))/25)
                game.food[foodrow, foodcol].hideturtle()
                game.score+=1
                game.running.writer.clear()
                game.running.writer.write('score:{}'.format(game.score), font=('Arial', 18, 'bold'), move=False)
            self.goto(self.xcor(), self.ycor()+25)

    def down(self):
        if ((self.xcor(), self.ycor()-25) not in game.running.walls):
            if ((self.xcor(), self.ycor()-25) in game.running.foods):
                foodcol=int(((self.xcor())+250)/25)
                foodrow=int((137.5-(self.ycor()-25))/25)
                game.food[foodrow, foodcol].hideturtle()
                game.score+=1
                game.running.writer.clear()
                game.running.writer.write('score:{}'.format(game.score), font=('Arial', 18, 'bold'), move=False)
            self.goto(self.xcor(), self.ycor()-25)
class running:
    def __init__(self, game):
        self.game=game
        self.writer=Turtle(visible=False)
        self.writer.pu()
        self.writer.color('blue')
        self.writer.goto(240, 140)
        print('righthere')
        self.writer.write('score:{}'.format(game.score), font=('Arial', 18, 'bold'), move=False)
        self.walls=[]
        self.foods=[]
        self.setup(game)
        listen()
        onkey(game.player[9, 9].left, 'a')
        onkey(game.player[9, 9].right, 'd')
        onkey(game.player[9, 9].up, 'w')
        onkey(game.player[9, 9].down, 's')

    def setup(self, game):
        self.game=game
        for row in range(11):
            for col in range(20):
                if level[row][col]==1:
                    self.walls.append((game.wall[row, col].xcor(), game.wall[row, col].ycor()))
##                elif level[row][col]==2:
##                    self.enemy[(row, col)]=creator(row, col, 'triangle', 'red',1,1)
##                elif level[row][col]==3:
##                    self.player[(row, col)]=creator(row, col, 'circle', 'yellow',1,1)
                elif level[row][col]==0:
                    self.foods.append((game.food[row, col].xcor(), game.food[row,col].ycor()))
##                
class pacman:
    def __init__(self):
        self.wall={}
        self.player={}
        self.food={}
        self.enemy={}
        self.score=0
        win.tracer(False)
        self.setup()
        win.tracer(True)
        self.running=running(self)

    def setup(self):
        for row in range(11):
            for col in range(20):
                if level[row][col]==1:
                    self.wall[(row, col)]=creator(row, col, 'square', 'blue',1,1)
                elif level[row][col]==2:
                    self.enemy[(row, col)]=creator(row, col, 'triangle', 'red',1,1)
                elif level[row][col]==3:
                    self.player[(row, col)]=creator(row,col, 'circle', 'yellow',1,1)
                else:
                    self.food[(row,col)]=creator(row, col, 'circle', 'white',0.1,0.1)

        
level=[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
       [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
       [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
       [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
       [1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1],
       [1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 1],
       [1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1],
       [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
       [1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
       [1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
       [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]

win =Screen()
win.bgcolor('black')
game=pacman()
win.mainloop()
0
pavan krishna 18 पद 2020, 14:55

2 जवाब

सबसे बढ़िया उत्तर

मैंने आपके कार्यक्रम के लगभग हर पहलू पर फिर से काम किया और पीली कलाकृतियों (पॅकमैन का ही हिस्सा) के लिए अपराधी का पता नहीं लगा सका। इसलिए, मैंने पूरे कार्यक्रम के लिए tracer() को छोड़कर कोड पर एक बैंड-सहायता लगाई। और स्पष्ट स्क्रीन update() कॉल करना।

[संपादित करें: @ एनजेन का जवाब गड़बड़ के स्रोत की पहचान करता है।]

मैंने list कैश के बजाय मूल dict की जांच करके आपके अनावश्यक इकाई स्थान तर्क को भी बदल दिया। इसने तर्क को सरल बनाया, और कुछ संभावित फ़्लोटिंग पॉइंट मुद्दों को समाप्त कर दिया। और, सूचियों की जाँच करने की तुलना में शब्दकोशों की जाँच वास्तव में तेज़ है।

साथ ही कोड को सरल और स्थिर करने के लिए कई अन्य परिवर्तन:

from turtle import Screen, Turtle

FONT = ('Arial', 18, 'bold')

class Creator(Turtle):
    def __init__(self, row, col, sprite, colorcode, width, height):
        super().__init__(shape=sprite)
        self.row = row
        self.col = col

        self.color(colorcode)
        self.shapesize(width, height)
        self.penup()
##      self.speed('fastest')
        self.goto(self.coords(row, col))

    @staticmethod
    def coords(row, col):
        x = col * 25 - 250
        y = 137.5 - row * 25

        return x, y

    @staticmethod
    def inv_coords(x, y):
        col = round((x + 250) / 25)
        row = round((137.5 - y) / 25)

        return row, col

    def go_left(self):
        screen.onkey(None, 'a')  # disable handler inside handler

        position = self.xcor() - 25, self.ycor()

        key = self.inv_coords(*position)

        if key not in game.wall:

            if key in game.food:
                game.food[key].hideturtle()
                game.increment_score()

            self.goto(self.coords(*key))
            screen.update()

        screen.onkey(self.go_left, 'a')

    def go_right(self):
        screen.onkey(None, 'd')

        position = self.xcor() + 25, self.ycor()

        key = self.inv_coords(*position)

        if key not in game.wall:

            if key in game.food:
                game.food[key].hideturtle()
                game.increment_score()

            self.goto(self.coords(*key))
            screen.update()

        screen.onkey(self.go_right, 'd')

    def go_up(self):
        screen.onkey(None, 'w')

        position = self.xcor(), self.ycor() + 25

        key = self.inv_coords(*position)

        if key not in game.wall:

            if key in game.food:
                game.food[key].hideturtle()
                game.increment_score()

            self.goto(self.coords(*key))
            screen.update()

        screen.onkey(self.go_up, 'w')

    def go_down(self):
        screen.onkey(None, 's')

        position = self.xcor(), self.ycor() - 25

        key = self.inv_coords(*position)

        if key not in game.wall:

            if key in game.food:
                game.food[key].hideturtle()
                game.increment_score()

            self.goto(self.coords(*key))
            screen.update()

        screen.onkey(self.go_down, 's')

class Running:
    def __init__(self, game):
        self.game = game

        self.writer = Turtle(visible=False)
        self.writer.penup()
        self.writer.color('blue')
        self.writer.goto(240, 140)
        self.writer.write("score:{}".format(game.score), font=FONT)

##      self.setup()

        screen.onkey(game.player[9, 9].go_left, 'a')
        screen.onkey(game.player[9, 9].go_right, 'd')
        screen.onkey(game.player[9, 9].go_up, 'w')
        screen.onkey(game.player[9, 9].go_down, 's')
        screen.listen()

    def setup(self):

        for row in range(11):
            for col in range(20):
                if level[row][col] == 0:
                    pass
                elif level[row][col] == 1:
                    pass
##              elif level[row][col] == 2:
##                  self.enemy[(row, col)] = Creator(row, col, 'triangle', 'red', 1, 1)
##              elif level[row][col] == 3:
##                  self.player[(row, col)] = Creator(row, col, 'circle', 'yellow', 1, 1)

class Pacman:
    def __init__(self):
        self.wall = {}
        self.player = {}
        self.food = {}
        self.enemy = {}

        self.score = 0

        screen.tracer(False)
        self.setup()
        screen.update()
        self.running = Running(self)

    def setup(self):
        for row in range(11):
            for col in range(20):
                if level[row][col] == 1:
                    self.wall[(row, col)] = Creator(row, col, 'square', 'blue', 1, 1)
                elif level[row][col] == 2:
                    self.enemy[(row, col)] = Creator(row, col, 'triangle', 'red', 1, 1)
                elif level[row][col] == 3:
                    self.player[(row, col)] = Creator(row, col, 'circle', 'yellow', 1, 1)
                else:
                    self.food[(row, col)] = Creator(row, col, 'circle', 'white', 0.1, 0.1)

    def increment_score(self):
        self.score += 1
        self.running.writer.clear()
        self.running.writer.write("score:{}".format(self.score), font=FONT)

level = [
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    [1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
    [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1],
    [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1],
    [1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1],
    [1, 0, 0, 0, 0, 1, 0, 0, 0, 3, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
]

screen = Screen()
screen.bgcolor('black')
game = Pacman()
screen.mainloop()
0
cdlane 27 पद 2020, 03:50

फिक्स सुपर आसान है, मुश्किल से एक असुविधा:

आप देखिए, यह turtle.shapesize पद्धति में एक छोटी सी गड़बड़ है, आपके पास है

self.shapesize(width, height, 0)

यह 0 है जिसने विधि को उलट दिया। इसके बजाय, 0 को छोड़ दें, या रूपरेखा के लिए डिफ़ॉल्ट मान का उपयोग करें, None:

self.shapesize(width, height)

या

self.shapesize(width, height, None)

कोई tracer बैंड-सहायता की आवश्यकता नहीं है!

1
Ann Zen 22 पद 2020, 00:20