2014-02-01 1 views
-1

Так что мне нужен совет/помощь в том, как сделать этот код/​​программу более ООП (объектно-ориентированное программирование).ООП (объектно-ориентированное программирование) dilemma

Я отправлю здесь весь код. Я планировал создавать отдельные модули, но я на самом деле это noob.

Немного предыстории об игре: Это игра с первым стартовым игровым экраном, затем экран сложности, а затем уровень один с овцами и лисой (player), а затем уровень 2 вместо кроликов - свиньи и кабаны. Планирование также третьего уровня с тремя типами врагов.

Итак, любая помощь приветствуется, мне просто нужны некоторые советы и т. Д., Чтобы преобразовать этот код в объектно-ориентированное кодирование, которое легче читать и не так сильно нагружает процессор.

дальнейший прогресс в файле 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

Боюсь, что лучше начать и скопировать используемые части из приведенного выше кода. Прежде чем вы это сделаете, прочитайте ООП, объектно-ориентированное программирование, которое является официальным названием для того, что вы называете OOC, я думаю. У вас будет больше хитов. – bastijn

ответ

0

Давайте начнем с файлов.

Вы можете разделить свой код на более мелкие файлы, содержащие код, специфичный для функции. Например, у вас может быть основной файл, который отобразит меню, и после выбора сложности он создаст объект игры и начнет игру.

У вас могут быть такие классы, как Rabbit, Boar и т. Д., Которые будут иметь методы draw и update, где вы можете сохранить свое поведение в методе их обновления. Вы также можете сохранить классы в отдельных файлах.

Все изображения и звуки могут быть помещены в словари. Таким образом, вы избежите иметь 20 переменных, вместо этого у вас будет 1 переменная, например sound_dict, которая будет содержать ключи, такие как лиса, кролик и т. Д.

Вы также можете иметь класс Игрока, который будет иметь те же методы, что и другие классы , но также и метод, который будет отвечать на вход проигрывателя. Я хотел бы сделать что-то вдоль этих линий:

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) 

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

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

Функции делают код намного легче читать, не бойтесь использовать слишком много их.

EDIT:

Код выглядит немного лучше, но у вас есть какие-то ненужные вещи в обработке You события игрок. Игрок не должен обрабатывать событие QUIT, это должно быть сделано в цикле основного события.

Вместо класса Boars есть класс Boar, который будет иметь информацию 1 кабан. У кабана будет положение. На данный момент вы добавляете новые доски в свою функцию рисования. Вы должны создать список боров один раз и вызвать метод рисования для каждого кабана.

У вас есть пустой плеер __init__ метод. Поскольку у игрока есть состояния - moveRight, moveLeft, вы можете их инициализировать, написав self.moveRight = False. Затем обработка событий назначила бы True для self.moveRight игрока.

+0

Взгляните на прогресс, пожалуйста. @Bartlomiej Lewandowski – alsetalokin

+0

Вы хотите сказать, что это словарь? 'soundsDict = {" foxSound ":" pygame.mixer.sound (sound/foxSound.wav) "}' – alsetalokin

+0

закрыть, прямо сейчас у вас есть словарь с ключом, а значение - обе строки, вы хотите, чтобы тип значения быть звуком, так что это будет работать: 'soundsDict = {" fox ": pygame.mixer.sound (" sound/foxSound.wav ")}' –