স্ট্যান্ডার্ড ডেকের তুলনায় আরও জটিল প্লে কার্ড কার্ডের জন্য ক্লাস করার ভাল উপায়?


9

আমি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে অত্যন্ত নতুন, এবং একটি সাধারণ কার্ড গেমটি (যেমনটি প্রথাগত বলে মনে হচ্ছে!) করে অজগরটিতে শেখা শুরু করার চেষ্টা করছি। আমি নিম্নলিখিত উদাহরণটি করেছি যা ভাল কাজ করে, এবং PlayingCard()ক্লাসের উদাহরণ তৈরি করার জন্য ক্লাসের একাধিক উদাহরণ তৈরি করার বিষয়ে শিখিয়েছি Deck():

class PlayingCard(object):
    def __init__(self, suit, val):
        self.suit = suit
        self.value = val

    def print_card(self):
        print("{} of {}".format(self.value, self.suit))

class Deck(object):
    def __init__(self):
        self.playingcards = []
        self.build()

    def build(self):
        for s in ["Spades", "Clubs", "Diamonds", "Hearts"]:
            for v in range(1,14):
                self.playingcards.append(PlayingCard(s,v))

deck = Deck()



আমি আরও জটিল কার্ড দিয়ে এখনই কিছু তৈরি করতে চাই, কেবলমাত্র একটি স্ট্যান্ডার্ড 52 ডেক নয় (যা সুন্দরভাবে বৃদ্ধি করার মান রয়েছে)। আমার মনে যে ডেকটি মনে আছে তা হ'ল একচেটিয়া কার্ড খেলা:

এখানে চিত্র বর্ণনা লিখুন

এখানে 3 টি মৌলিক ধরণের কার্ড রয়েছে - অ্যাকশন কার্ড, প্রপার্টি কার্ড এবং অর্থ কার্ড। অ্যাকশন কার্ডগুলি বিভিন্ন ক্রিয়া সম্পাদন করে, সম্পত্তি কার্ডগুলি বিভিন্ন রঙের সেটগুলির সাথে সম্পর্কিত এবং মানি কার্ডগুলিতে বিভিন্ন মান থাকতে পারে। অতিরিক্ত হিসাবে, সম্পত্তি কার্ডগুলি "ওয়াইল্ডকার্ড" হতে পারে এবং দুটি সেটগুলির মধ্যে একটির অংশ হিসাবে ব্যবহার করা যেতে পারে। শেষ অবধি, প্রতিটি কার্ডেরও সমান অর্থের মান থাকে (প্রতিটি কার্ডের উপরের কোণায় নির্দেশিত)। ভাড়া অ্যাকশন কার্ডগুলিতে কার্ডটি কেবল কার্ডটিতে বর্ণিত রঙের সম্পত্তিতে প্রয়োগ করা যেতে পারে।

আমার প্রশ্নটি কেবলমাত্র এই জাতীয় পরিস্থিতিটি কীভাবে পরিচালনা করবেন এবং ক্লাস ভিত্তিক পাইথন প্রোগ্রামে এই বিভিন্ন কার্ডগুলি অন্তর্ভুক্ত করার একটি দুর্দান্ত উপায় কী হবে? আমার কি আমার একক PlayingCard()শ্রেণি রাখা উচিত , এবং কেবলমাত্র অনেকগুলি ইনপুট থাকে, যেমন PlayingCard(type="PROPERTY", value="3M")। অথবা এটা যেমন পৃথক ক্লাস তৈরি করতে ভাল হবে ActionPlayingCard(), PropertyPlayingCard(), ইত্যাদি? নাকি এর চেয়ে ভাল উপায় আছে? আমি যেমন বলেছি, আমি এখানে আমার শেখার শুরুতে আছি, এবং কীভাবে উচ্চ স্তরের নকশার ক্ষেত্রে এই ধরণের পরিস্থিতিগুলি সংগঠিত করব।

অনেক ধন্যবাদ.


আপনি যদি দেখতে পান যে বিভিন্ন ধরণের কার্ডের মধ্যে কিছু বৈশিষ্ট্য ভাগ করা থাকে তবে আপনি উত্তরাধিকার, এমনকি একটি বিমূর্ত শ্রেণি ব্যবহার করতে পারেন। আপনি কারখানার প্যাটার্নটি সম্পর্কে পড়তে এবং ব্যবহার করতে পারেন যাতে আপনি কার্ডের
ধরণটি

@ টোমেরিকু এটি উল্লেখ করার জন্য আপনাকে ধন্যবাদ - আপনি উল্লিখিত কারখানার ধরণ সম্পর্কে আমি কিছুটা পড়েছি। যেহেতু আমি এটি বুঝতে পারি, এটি সর্বাধিক কার্যকর যখন আপনি আগেই জানেন না যে কোন শ্রেণীর অবজেক্টগুলি আপনার তৈরি করতে হবে (সম্ভবত কেবল রানটাইমের সময় জানা)। তবে, যেহেতু এই ক্ষেত্রে আমি জানি যে পুরো ডেকটি দেখতে কেমন হওয়া উচিত (প্রতিটি ধরণের কার্ডের মধ্যে কতগুলি, তারা প্রতিটি কী করে ইত্যাদি), এখানে কি কারখানার প্যাটার্ন প্রযোজ্য?
teeeeee

উত্তর:


3

আপনি যখন ওওপি-তে কোনও সমস্যার মুখোমুখি হন , আপনি সাধারণত আচরণ এবং বৈশিষ্ট্যগুলি পুনরায় ব্যবহারযোগ্য উপায়ে মডেল করতে চান, অর্থাত্ আপনাকে বিমূর্ততা সম্পর্কে চিন্তাভাবনা করা উচিত এবং এর ভিত্তিতে আপনার শ্রেণিবদ্ধক্রমকে সংগঠিত করতে হবে।

আমি নিম্নলিখিত মত কিছু লিখতে হবে:

class Card:
    def __init__(self, money_value=0):
        self.money_value = money_value

class ActionCard(Card):
    def __init__(self, action, money_value=0):
        super().__init__(money_value=money_value)

        self.action = action

class RentActionCard(ActionCard):
    def __init__(self, action, color, money_value=0):
        super().__init__(action, money_value=money_value)

        self.color = color

    def apply(self, property_card):
        if property_card.color != self.color:
            # Don't apply
        # Apply

class PropertyCard(Card):
    def __init__(self, color, money_value=0):
        super().__init__(money_value=money_value)

        self.color = color

class WildcardPropertyCard(PropertyCard):
    def __init__(self, color, money_value=0):
        super().__init__(color, money_value=money_value)

class MoneyCard(Card):
    def __init__(self, money_value=0):
        super().__init__(money_value=money_value)

পাইথন একটি গতিময় টাইপ করা ভাষা হওয়ার কারণে , ওওপি আমার মতে ন্যায্যতা প্রমাণ করা কিছুটা কঠিন, যেহেতু আমরা কেবল হাঁসের টাইপিং এবং গতিশীল বাইন্ডিংয়ের উপর নির্ভর করতে পারি , তাই আপনি যেভাবে আপনার শ্রেণিবিন্যাসকে সংগঠিত করছেন তা কম গুরুত্বপূর্ণ।

যদি আমি এই সমস্যা মডেল ছিল সি # উদাহরণস্বরূপ, আমি একটি সন্দেহ ব্যবহার না করে অনুক্রমের উপরে দেখিয়েছেন কারণ আমি নির্ভর করতে পারে হবে পলিমরফিজম বিভিন্ন ধরনের প্রতিনিধিত্ব করতে এবং আমার যুক্তি প্রবাহ কি কার্ডের প্রকার বিশ্লেষণ করা হচ্ছে তার উপর ভিত্তি করে গাইড।

চূড়ান্ত মন্তব্য দুটি:

  1. পাইথনে খুব শক্তিশালী অন্তর্নির্মিত প্রকার রয়েছে তবে বেশিরভাগ সময় নতুন কাস্টম প্রকারগুলি ব্যবহার করে যা আপনার জীবনকে সহজ করে তোলে।
  2. আপনি এর থেকে উত্তরাধিকারী হবে না objectএ ধরনের যেহেতু পাইথন 3 থেকে উত্তরাধিকারী (যা শুধুমাত্র এক আজকের হিসাবে বজায় থাকে)object ডিফল্টরূপে।

তবে, দিনের শেষে, একটি সঠিক উত্তর নেই, সর্বোত্তম উপায় হ'ল উভয় পদ্ধতির চেষ্টা করে দেখতে এবং আপনি কী থেকে বেশি আরামদায়ক হন।


7

এগুলিকে আমরা "ডিজাইন সিদ্ধান্ত" বলি। প্রায়শই "সঠিক" উপায়টি মতের বিষয়। একজন শিক্ষানবিস হিসাবে, আমি মনে করি যে তারা কীভাবে কাজ করে তা উভয় বাস্তবায়নের চেষ্টা করা শিক্ষামূলক হবে। আপনি যে কোনওটিকেই বেছে নিন না কেন সেখানে বাণিজ্য বন্ধ থাকবে। আপনাকে সিদ্ধান্ত নিতে হবে যে সেই বাণিজ্যগুলির মধ্যে কোনটি সবচেয়ে গুরুত্বপূর্ণ। আপনি আরও অভিজ্ঞতা অর্জন করার সাথে সাথে এই ধরণের সিদ্ধান্ত নেওয়ার বিষয়ে অবহিত করা হবে।


হ্যাঁ, ধন্যবাদ, আমি যেমন বলেছি ঠিক তেমনই করছি - কেবলমাত্র এমন লোকের দিকনির্দেশের সন্ধান করছি যারা স্বভাবতই ভাল দৃষ্টিভঙ্গি জানার জন্য যথেষ্ট অভিজ্ঞ, এবং কেন আশা করি তা বুঝতে পেরেছেন।
teeeeee

2

আপনি উত্তরাধিকার ব্যবহার করতে পারে। এখানেই আপনি একটি প্রধান শ্রেণি তৈরি করেন তারপরে সাব-ক্লাস রয়েছে যা এখনও মাদার ক্লাসের ফাংশন এবং মান ধারণ করে তবে সেই নির্দিষ্ট শ্রেণির জন্য অতিরিক্ত মান এবং ফাংশন থাকতে পারে।

class Apple:
    def __init__(self, yearMade):
        pass

    def ring(self):
        print('ring ring')

class iPhone(Apple):
    def __init__(self, number)
        number = number

    def func():
        pass

এখন আইফোন ক্লাসটির অ্যাপল ক্লাস এবং তার নিজস্ব ফাংশন হিসাবে একই কাজ রয়েছে। যদি আপনি উত্তরাধিকার সম্পর্কে আরও জানতে চান তবে আমি কিছু গবেষণা করার পরামর্শ দিই।


@tieeee প্রতিটি কার্ডের একটি মূল্য রয়েছে বলে আপনি সেগুলি বাণিজ্য করতে সক্ষম হন এবং সেগুলি খেলতে পারবেন, আপনি এই ইভেন্টগুলি পরিচালনা করতে কোনও শ্রেণিতে ফাংশন / পদ্ধতি তৈরি করতে পারেন এবং তারপরে একটি সাব ক্লাসে নির্দিষ্ট কার্ডগুলির জন্য অতিরিক্ত বৈশিষ্ট্য এবং ফাংশন থাকতে পারে।
মরিয়ার্টিপি

0

একচেটিয়া ব্যবহারের জন্য, আমি গেমের ল্যান্ডিং পয়েন্ট অব ভিউ ডিজাইন করব। কার্ড নয়। কার্ডগুলি কেবল বাস্তব বিশ্বের জন্য অবতরণের প্রতিনিধিত্ব করে।


সম্প্রসারিত করুন.
teeeeee
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.