OOP(面向对象编程)困境

时间:2014-02-01 12:56:21

标签: python object pygame

所以我需要一些关于如何使这个代码/程序更多OOP(面向对象编程)的建议/帮助。

我会在这里发布整个代码。我打算制作单独的模块,但我真的是一个菜鸟。

关于游戏的一些背景故事:这是一个游戏,首先是开始游戏画面,然后是难度画面,然后是一级与绵羊和狐狸(player)然后是第二级而不是兔子那里有猪和公猪。计划三级有三种敌人。

所以任何帮助都是值得赞赏的,我只需要一些提示,例如将这些代码转换为面向对象的编码,这种编码更易于阅读,并且不会对CPU造成太大压力。

main.py文件的更多进展:

# -*- coding: utf-8 -*-
#Så jag ska försöka göra koden objekt orienterad så man förstår bättre
#det är samt enklare att läsa.

import pygame, sys, random, math
from rabbits import Rabbit
from pigs import Pig
from boars import Boar
from pygame.locals import *
from threading import Timer

pygame.init()
pygame.mixer.init()
mainClock = pygame.time.Clock()

soundsDict = {"foxSound" : pygame.mixer.sound(sound/foxSound.wav), 
"rabbitSound" : pygame.mixer.Sound('sounds/rabbitSound.wav'), 
"pigSound" : pygame.mixer.Sound('sounds/pigSound.wav'), 
"boarSound" : pygame.mixer.Sound('sounds/boarSound.wav')}

musicDict = {"musicMenu" : pygame.mixer.Sound('music/Who Likes To Party.ogg')}

spriteDict = {"playerImage" : pygame.image.load('textures/Fox.png'), 
"playerImageTwo" : pygame.image.load('textures/Fox2.png'), 
"rabbitImage" : pygame.image.load('textures/topic_rabbit.png'), 
"rabbitImageTwo" : pygame.image.load('textures/topic_rabbit2.png'), 
"pigImage" : pygame.image.load('textures/Pig.png'), 
"pigImageTwo" : pygame.image.load('textures/Pig2.png'), 
"boarImage" : pygame.image.load('textures/Boar.png'), 
"boarImageTwo" : pygame.image.load('textures/Boar2.png')}

buttonDict = {"buttonEasyImage" : pygame.image.load('textures/buttonEasy.png'), 
"buttonNormalImage" : pygame.image.load('textures/buttonNormal.png'), 
"buttonHardImage" : pygame.image.load('textures/buttonHard.png')}



level = 1
while True:
    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

        if level == 1:
            player.update()

            for rabbit in rabbits:
                rabbit.update()

        elif level == 2:
            player.update()

            for pig in pigs:
                pig.update()

    surface.fill((0, 0, 0))

    MOVE_SPEED = 0

    if level == 1:
        # Play level 2 music

        # Draw level 1 state to screen
        Player.update()
        Player.draw()
        for rabbit in rabbits:
            rabbit.draw(surface)

    elif level == 2: #I get a weird indentation error here*
        # Play level 2 music

        # Draw level 2 state to screen
        Player.update()
        Player.draw()
        for pig in pigs:
            pig.draw(surface)
        for boar in boars:
            boar.draw(surface)

    pygame.display.update()
    mainClock.tick(60)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 所以我已经取得了一些进展,只是想要你的意见,如果我正在前进 正确的方向,可以这么说。

这是player.py文件和boars.py文件,例如(更新):

\player.py

# -*- coding: utf-8 -*-
import pygame, sys, random, math

class Player(object):

    def __init__(self):
        self.moveRight = False
        self.moveLeft = False
        self.moveUp = False
        self.moveDown = False
    def process_event(event):
        if event.type == KEYDOWN:
            if event.key == K_SPACE:
                levelOne = False
            if event.key == K_LEFT:
                self.moveRight = False
                self.moveLeft = True
            if event.key == K_RIGHT:
                self.moveRight = True
                self.moveLeft = False
            if event.key == K_UP:
                self.moveDown = False
                self.moveUp = True
            if event.key == K_DOWN:
                self.moveDown = True
                self.moveUp = False
        if event.type == KEYUP:
            if event.key == K_LEFT:
                self.moveLeft = False
            if event.key == K_RIGHT:
                self.moveRight = False
            if event.key == K_UP:
                self.moveUp = False
            if event.key == K_DOWN:
                self.moveDown = False

    def update(self):
        if moveDown and player.bottom < WINDOW_HEIGHT:
            player.top += MOVE_SPEED
        if moveUp and player.top > 0:
            player.top -= MOVE_SPEED
        if moveLeft and player.left > 0:
            player.left -= MOVE_SPEED
        if moveRight and player.right < WINDOW_WIDTH:
            player.right += MOVE_SPEED



    def draw(self, surface):

        windowSurface.blit(playerImage, player)

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

\boars.py

# -*- coding: utf-8 -*-
import pygame, sys, random, math

class Boar(object):

    boarCounter = 0
    NEW_BOAR = 40
    BOAR_SIZE = 64

    boars = []
        for i in range (10):
            boars.append(pygame.Rect(random.randint(0, WINDOW_WIDTH
            - BOAR_SIZE), random.randint (0, WINDOW_HEIGHT - BOAR_SIZE),
            BOAR_SIZE, BOAR_SIZE))

    def __init__(self):
        pass
    def update(self):

        stepMovementNegativeBoar = random.randrange(0, -6, -2)

        stepMovementPositiveBoar = random.randrange(0, 6, 2)

        boarMovement = [((stepMovementNegativeBoar),0), ((stepMovementPositiveBoar), 0)
                          , (0, (stepMovementNegativeBoar)), (0, (stepMovementPositiveBoar))]
        for boar in boars:
            boar.move_ip(*random.choice(boarMovement))

        for boar in boars[:]:

            if player.colliderect(boar):
                windowSurface.blit(boarImageTwo, boar)
                windowSurface.blit(playerImageTwo, player)

            def explosionBoar():
                for boar in boars:
                    if player.colliderect(boar) and (moveLeft == False and
            moveRight == False and moveUp == False and
            moveDown == False):
                         boars.remove(boar)

            if player.colliderect(boar) and (moveLeft == False and
            moveRight == False and moveUp == False and moveDown == False):
                #timer inställningar
                tBoar = Timer(10, explosionPig)
                tBoar.start()

    def draw(self, surface):

        boarCounter += 1
        if boarCounter >= NEW_BOAR:
            boarCounter = 0
            boars.append(pygame.Rect(random.randint(0, WINDOW_WIDTH
        - BOAR_SIZE), random.randint (0, WINDOW_HEIGHT - BOAR_SIZE),
        BOAR_SIZE, BOAR_SIZE))

1 个答案:

答案 0 :(得分:0)

让我们从文件开始。

您可以将代码划分为包含特定于函数的代码的较小文件。例如,你可以有一个显示菜单的文件main,在选择难度后,它会创建一个Game对象并启动游戏。

你可以拥有像Rabbit,Boar等类,它们有方法drawupdate,你可以在其更新方法中保持行为。您也可以将这些类保存在单独的文件中。

所有图像和声音都可以放入词典中。这样你就可以避免使用20个变量,相反,你将拥有1个变量,例如sound_dict将包含像狐狸,兔子等的键。

您还可以拥有一个与其他类具有相同方法的Player类,但也可以使用一个响应播放器输入的方法。我会沿着这些方向做点什么:

def process_event(event):
    if event.type == MOUSEDOWN:
       if event.key == K_LEFT:
           self.x -= MOVESPEED

这样你就可以在游戏中拥有1个事件循环,并调用需要处理它的所有必要对象。它将动作响应移动到各个对象。

for event in pygame.event.get():
    player.process_event(event)

如果你的等级相似,但有不同的敌人,你可能只有游戏循环,并且根据等级,只需根据要玩的等级做好准备。

如果敌人之间没有区别,您可以将它们保存在一个列表中。他们可以做出不同的反应,因为他们的更新方法有不同的东西。

函数使代码更容易阅读,不要害怕使用太多代码。

编辑:

代码看起来好一点,但是你在玩家事件处理中有一些不必要的东西。玩家不应该处理QUIT事件,这应该在主事件循环中完成。

而不是让Boars类具有Boar类,它将拥有1只公猪的信息。野猪将有一个位置。截至目前,您在绘图功能中添加了新的电路板。您应该创建一次Boars列表,并在每个Boar上调用draw方法。

您有一个空的Player __init__方法。由于玩家有状态 - moveRight,moveLeft,您可以通过编写self.moveRight = False来初始化它们。 然后事件处理会将True分配给玩家的self.moveRight。