Трудности с переписыванием кода в соответствии с соглашениями - PullRequest
0 голосов
/ 20 мая 2019

В настоящее время я работаю в свободное время, сотрудничая с другом над их проектом - игрой, похожей на птичку. Первой задачей было переписать код, чтобы сделать его более масштабируемым и легким для чтения. Я добился определенного прогресса, но не могу заставить работать движущиеся части игры.

После некоторого исследования того, как организовать код, на который я наткнулся, в следующем потоке , и это сработало для большей части проекта, пример того, как я структурировал свой код:

game.py в корневом проекте обычно запускает игру, просто выполняя ее. Переписанный код состоит из папок app.py, entities и screens.

Структура:

    .
    |-- app.py
    |-- entities
    |   |-- lean.py
    |   `-- trapper.py
    |-- game.py
    |-- lean.py
    |-- requirements.txt
    |-- screens
    |   `-- game.py
    `-- trapper.py

app.py:

import tkinter as tk
from screens import Game_screen

class Main_application(tk.Frame):
    '''Creates the application frame

    Args:
        parent: The root of the application.
    '''
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, *kwargs)
        self.parent = parent
        # <TODO: The rest of the application >
        self.game_screen = Game_screen(self)


if __name__ == '__main__':
    root = tk.Tk()
    Main_application(root).pack(
        side = 'top',
        fill = 'both',
        expand = True
    )
    root.mainloop()

экраны / game.py

import tkinter as tk
from entities import Lean
from entities import Trapper

gravity = 10
height = 600
width = 400
speed = 35 # (0 == faster | 0 > slower)

class Game_screen(tk.Frame):
    '''Generates the Game Screen.

    Args:
        master: The application frame.
    '''
    def __init__(self, master=None, *args, **kwargs):
        # Background creation
        self.canvas = tk.Canvas(
            master, 
            width = width, 
            height = height, 
            bg ='cyan'
        )
        self.canvas.pack()

        # Player instance
        self.trapper = Trapper(
            width, 
            height, 
            10, 
            10, 
            gravity
        )

        # Obstacle instance
        self.lean = Lean(
            height, 
            30, 
            150, 
            height
        )
        self.init = 0
        self.speed = speed
        self.score = 0

        # Player creation
        self.trapper_obj = self.canvas.create_oval(
            self.trapper.x - self.trapper.size,
            self.trapper.y - self.trapper.size,
            self.trapper.x + self.trapper.size,
            self.trapper.y + self.trapper.size, 
            fill="yellow", 
            tags="trapper"
        )
        master.bind('<Up>', self.comandoUp)

        # Obstacle creation
        self.lean_obj_top = self.canvas.create_polygon(
            self.lean.get_lean_top(),
            fill='purple',
            tags='lean_top'
        )

        # Obstacle creation
        self.lean_obj_bot = self.canvas.create_polygon(
            self.lean.get_lean_bot(),
            fill='purple',
            tags='lean_bot'
        )

        # Score
        self.canvas.create_text(
            (width-60, 20),  
            text='score: {}'.format(
                self.score
            )
        )

        # Start game
        if(self.init == 1): 
            self.trapper.moveUp()
            self.trapper.moveDown()
            self.lean.move(self.trapper.vHor)

        # Side-scroller
        if(self.lean.x < -self.lean.l):
            self.lean = Lean(height, 30, 150, width)

        # Collision
        pos_t = self.canvas.bbox(self.trapper_obj)
        collision = self.canvas.find_overlapping(
            pos_t[0],
            pos_t[1],
            pos_t[2],
            pos_t[3]
        )

        for x in collision:
            tagx = self.canvas.gettags(x)[0]
            if tagx == 'lean_top' or tagx == 'lean_bot':
                print("Hit the pipe")
                quit()
            elif tagx == 'mid':
                self.score += self.lean.score
                if self.lean.score == 1:
                    print(self.score)
                self.lean.score = 0

            if self.trapper.y > height:
                print("Fell off")
                quit()


        # Render and moves scenario
        self.canvas.after(self.speed)
        master.update_idletasks()
        master.update()

    def comandoUp(self, event):
        self.trapper.up = 6
        self.init = 1

Большинство элементов отображаются на экране, но они статичны, и я не мог найти решение в течение всех выходных. Если предоставленной информации недостаточно, я предоставлю ссылку на мой репозиторий для лучшего понимания.

...