所以我需要一些关于如何使这个代码/程序更多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))
答案 0 :(得分:0)
让我们从文件开始。
您可以将代码划分为包含特定于函数的代码的较小文件。例如,你可以有一个显示菜单的文件main,在选择难度后,它会创建一个Game对象并启动游戏。
你可以拥有像Rabbit,Boar等类,它们有方法draw
和update
,你可以在其更新方法中保持行为。您也可以将这些类保存在单独的文件中。
所有图像和声音都可以放入词典中。这样你就可以避免使用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。