Programımdaki nesneye yönelik yaklaşımım hakkında

Metin tabanlı bir macera oyunu üzerinde çalışıyorum. RPG özellikleri olacak bir oyun. Bunun için nesneye yönelik yaklaşımı benimsedim ve bir şablon yarattım. Nedense bir şeyleri verimsiz ve karmaşık yaptığıma dair bir his var içinde. Şablonu daha temiz, daha anlaşılabilir yapabilir miyim?

class Game:
    def __init__(self, lang):
        self.lang = lang

    class Character:
        def __init__(self, health, base_power, base_armor):
            self.health = health
            self.power = base_power
            self.armor = base_armor

    class Player(Character):
        def __init__(self, *args):
            super().__init__(*args)

        def get_item(self):
            pass
        
        class Event:
            class Weapon:
                def attack(self):
                    pass

            class Food:
                def eat(self):
                    pass

            class Potion:
                def drink(self):
                    pass

    class Monster(Character):
        def __init__(self, *args):
            super().__init__(*args)

    class Room:
        pass

    class Level:
        def level1(self):
            pass

        def level2(self):
            pass

        def level3(self):
            pass

    @classmethod
    def save_game(cls):
        pass

    @classmethod
    def get_records(cls):
        pass
1 Beğeni

Inner Classes in Python

class tanımlamadan önce her zaman 2 satır boşluk gelir diye okumuştum. Bir de Event sınıfı altındaki Pot, Eşya, Yemek sınıfları neden oyuncu sınıfında, karakter sınıfında olması gerekmiyor mu ?

  1. Grouping of two or more classes. Suppose you have two classes Car and Engine. Every Car needs an Engine. But, Engine won’t be used without a Car. So, you make the Engine an inner class to the Car. It helps save code.

Burda anlatılandan yola çıkabilirsin benim için yararlı olmuştu bu yazı

1 Beğeni

Sablon dedigin nedir?


Onun disinda, sirasiz:

  • Her seyin Game class’inin icinde olmasina gerek yok.
  • get_item fonksiyonu ne yapacak?
  • Event’in Player icinde olmasina gerek yok.
  • Weapon/Food/Potion’in Event altinda olmasina gerek yok.
  • level1/level2/level3 fonksiyonlari ne yapacak?
  • save_game/get_records niye classmethod?
  • get_records ne yapacak?
  • Siniflarin cogu bos, silinebilirler.

Siniflar henuz bos oldugu icin tasarim hakkinda bir sey soylemek zor. Birbirlerinin altina koyarak ifade etmek istedigin bir iliski varsa, bu iliskinin ne oldugunu anlamadim.

3 Beğeni

Bir eşya bulunduğunda bunun alınmasını sağlayacak.

get_records metodu bir dosyaya kaydedilen seviye durumu, eşyalar, can, zırh gibi kaydedilen değerleri tekrar alarak oyun kayıtlarını alacak.

Yazdığım kodları atıyorum:

main.py

import pyramid
from time import sleep

lang = input("Please choose language (en) | Lütfen dil seçiniz (tr) : ")

if lang.lower() == "en":
    print("Welcome to the PYRAMID. This is a text based adventure game.\n"
          "Created with Python\n"
          "Created by primearc\n"
          "Have Fun!")
elif lang.lower() == "tr":
    game = pyramid.Game("tr")
    game.clear()
    print(game.banner)
    print("\nPYRAMID'e hoş geldin. Bu metin tabanlı bir macera oyunu"
          "\nPython ile oluşturulu"
          "\nprimearc tarafından oluşturuldu"
          "\nİyi eğelenceler!")
    sleep(7)
    game.clear()
    game.level1()
else:
    print("Invalid/Geçersiz")

pyramid.py:

from time import sleep
import os


class Game:
    def __init__(self, lang):
        self.lang = lang
        self.banner = """"
        
 888888ba  dP    dP  888888ba   .d888888  8888ba.88ba  dP 888888ba  
 88    `8b Y8.  .8P  88    `8b d8'    88  88  `8b  `8b 88 88    `8b 
 a88aaaa8P' Y8aa8P   a88aaaa8P'88aaaaa88  88   88   88 88 88     88 
 88           88     88   `8b. 88     88  88   88   88 88 88     88 
 88           88     88     88 88     88  88   88   88 88 88    .8P 
 dP           dP     dP     dP 88     88  dP   dP   dP dP 8888888P  
oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
        """


        if self.lang == "tr":
            self.help = "Komutlar için: yardım\nÇanta içeriği için: çanta\nSeviye, can, güç, zırh, ağırlık hakkında bilgi almak için: bilgi"

            self.level1txt = ["Ço. çok soğuk. Resmen donacak gibisin. Julia, George... Acaba şu an neredeydiler?"
                          " Umarım şu anda sağdırlar. Yıkıntının şiddetiyle kafana bir taş gelmiş olmalı. Bacağın titriyor."
                          " Üzerinde yırtık bir tişört ve pantalondan başka bir şey yok. Sırt çantan ise yanında değil.",

                          "Ayağa kalkıyorsun, büyük kum rengi taşlar etrafını çevrelemiş, şu anda piramidin ortasında mısın yoksa"
                          " kenarlarında mısın anlamak mümkün görünmüyor. Etraf kapkaranlık. Duvara ellerini sürterek yürürken ayağına"
                          " yumuşak bir şey takılıyor.",

                          " Çantanı buldun. El yordamıyla içinden el fenerini buluyorsun. Işığı açtığın vakit neler olduğunu anlıyorsun."
                          " Piramit çökmüş, taşlar mahzenin yarısına yığılmış. Önce ekibine sesleniyorsun ama ses yok. En iyisi buradan"
                          " çıkmanın bir yolunu bulmak!"]

        elif lang == "en":
            pass

        else:
            pass

    def command(self):
        cmd = input("> ")
        if cmd == "help" or "yardım":
            print(self.help)
            return self.command()
        elif cmd == "backpack" or "çanta":
            #print
            return self.command()
        elif "info" or "bilgi":
            #print
            return self.command()
        else:
            return cmd

    def level1(self):
        for i in range(3):
            self.lettering(self.level1txt[i], 0.07)
        self.clear()
        self.lettering(self.banner, 0.005)

    def level2(self):
        pass

    def level3(self):
        pass

    class Character:
        def __init__(self, health, base_power, base_armor):
            self.health = health
            self.power = base_power
            self.armor = base_armor

    class Player(Character):
        def __init__(self, health, base_power, base_armor):
            super().__init__(health, base_power, base_armor)
            self.pack = []

        def get_item(self):
            pass

        def calc(self):
            pass

        class Event:
            class Weapon:
                def __init__(self, damage, name):
                    self.damage = damage
                    self.name = name

                def attack(self):
                    pass

            class Food:
                def __init__(self, restoration, name, weight):
                    self.restoration = restoration
                    self.name = name
                    self.weight = weight

                def eat(self):
                    pass

            class Potion:
                def __init__(self, power, restoration, weight):
                    self.power = power
                    self.restoration = restoration
                    self.weight = weight

                def drink(self):
                    pass

    class Monster(Character):
        def __init__(self, health, base_power, base_armor, ability):
            super().__init__(health, base_power, base_armor)
            self.ability = ability



    @classmethod
    def save_game(cls):
        pass

    @classmethod
    def get_records(cls):
        pass

    @staticmethod
    def lettering(text, time):
        for t in text:
            print(t, end='', flush=True)
            sleep(time)
        print("\n", flush=False)
        sleep(3)

    @staticmethod
    def clear():
        os.system('cls' if os.name == 'nt' else 'clear')

Şu an tam olarak bitmedi. Önce komut çıktılarını gösteren command() fonksiyoununu tamamlayıp yazılan komuta göre çıktı göstereceğim.

Daha sonra yiyecek, iksir gibi nesneleri oluşturup bunu oyunun içine dahil edeceğim.

Seviyenin geçilip geçilmediğini kontrol edeceğim.

En son da İngilizce çevirileri yapacağım.

Yani load_game mi?

O zaman dogru yerde fakat ismini acquire_, obtain_ vs olarak degistirmek isteyebilirsin; bu fonksiyon Player’dan item aliyor, hatta item gibi bir property’i oldugu gibi donduruyor gibi duruyor. (“get” ve "set"in malesef boyle ozel manalari var)


Soyledigim her sey hala gecerli gibi.

2 Beğeni