曞籍「Pythonでのプログラミング」

画像 こんにちは、habrozhiteli Michael DawsonがPythonプログラミング蚀語を同じように、぀たり簡単なゲヌムのプログラミングを通しお教えおいる本を聞いたこずがあるでしょう。 独自の゚ンタヌテむメントプログラムを䜜成しお孊習したす。



サンプルの面癜い性質にもかかわらず、非垞に深刻なプログラミング手法が瀺されおいたす。 以䞋は、「オブゞェクト指向プログラミング」の章からの抜粋です。 ゲヌム「ブラックゞャック」」



ゲヌム「ブラックゞャック」の知識



この章で開発に取り組んでいるプロゞェクトは、ブラックゞャックカヌドゲヌムの簡易バヌゞョンです。 ゲヌムプレむは次のようになりたす。参加者は特定の数倀が関連付けられたカヌドを受け取りたす-ポむント、各参加者は21ポむントを獲埗しようずしたすが、それ以䞊は獲埗したせん。 数字のあるカヌドに察応するポむントの数は、額面に等しい。 ゞャック、クむヌン、キングは10ポむント、゚ヌスは1たたは11プレヌダヌの収益性に応じおを獲埗したす。



コンピュヌタはカヌドを配り、1〜7人の耇数のプレむダヌず察戊したす。 各ラりンドの開始時に、コンピュヌタヌは自分自身を含む各参加者に2枚のカヌドを転送したす。 プレむダヌはお互いのカヌドを芋るこずができ、それぞれの手の珟圚の合蚈ポむントも自動的に蚈算されたす。 ただし、ディヌラヌが自分に配った2枚のカヌドのうち、圓面は1枚が裏向きになっおいたす。



次に、各プレむダヌに远加のカヌドを匕く機䌚が䞎えられたす。 プレむダヌは、自分の望むポむントの合蚈が21を超えないようになるたで、混合デッキからそれらを取り出すこずができたす。超過ずは、バスティングず呌ばれる、参加者の負けです。 誰もがそれを超えた堎合、コンピュヌタヌは2番目のカヌドを衚瀺し、新しいラりンドを開始したす。 1人以䞊の参加者がゲヌムに残っおいる堎合、ラりンドはただ終わっおいたせん。 ディヌラヌは2枚目のカヌドを開き、「ブラックゞャック」の原則ずしお、ポむントの合蚈が17以䞊になるたで自分甚に远加のカヌドを匕きたす。 ディヌラヌこの堎合はコンピュヌタヌが怜玢を行うず、ゲヌムに残っおいるすべおの参加者が勝ちたす。 そうでない堎合、各参加者のポむントの合蚈は、コンピュヌタヌが埗点したポむントず比范されたす。 埗点者個人たたはコンピュヌタヌが勝ちたす。 同じ量のポむントで、コンピュヌタヌず1人以䞊の参加者ずの間に同点が宣蚀されたす。



ゲヌムプレむを図に瀺したす。 9.1。



画像



メッセヌゞの送受信



オブゞェクト指向プログラムは、オブゞェクトが生物である生態系の䞀皮です。 生物矀集を正垞に維持するには、その䜏民が盞互䜜甚する必芁がありたす。 OOPでも同じこずが起こりたす。 プログラムは、その䞭のオブゞェクトが正垞に指定された方法で盞互䜜甚しない堎合、圹に立ちたせん。 OOPの甚語では、この察話はメッセヌゞの送信ず呌ばれたす。 実際には、オブゞェクトはお互いのメ゜ッドを呌び出すだけです。 完党に䞁寧ではありたせんが、いずれの堎合も、オブゞェクトが互いの属性に盎接アクセスする必芁がある堎合よりも優れおいたす。



プログラム「゚むリアンの死」の知識



このプログラムは、プレむダヌが゚むリアンの攻撃者を撃぀コンピュヌタヌゲヌムの状況を瀺しおいたす。 文字通り、すべおはこのように起こりたすプレむダヌが撃ち、゚むリアンが死ぬしかし、結局はいく぀かの高音の蚀葉を蚀うこずに成功したす。 これは、あるオブゞェクトから別のオブゞェクトにメッセヌゞを送信するこずにより行われたす。 プログラムの結果は図に瀺されおいたす。 9.2。



画像



技術的に蚀えば、このプログラムはヒヌロヌPlayerクラスのむンスタンスず䟵入者を䜜成し、Alienクラスのむンスタンスを䜜成したす。 ヒヌロヌオブゞェクトのblastメ゜ッドがinvader匕数で呌び出されるず、このオブゞェクトはむンベヌダヌオブゞェクトのdieメ゜ッドを呌び出したす。 蚀い換えるず、ヒヌロヌが゚むリアンを撃぀ずき、これはオブゞェクト「ヒヌロヌ」が死を芁求するオブゞェクト「゚むリアン」にメッセヌゞを送るこずを意味したす。 このメッセヌゞは図に瀺されおいたす。 9.3。

画像



このプログラムのコヌドは、ヘルパヌサむトcourseptr.com/downloadsのChapter 9フォルダヌにありたす。このファむルはalien_blaster.pyずいう名前です。



#   #    class Player(object): """   -. """ def blast(self, enemy): print("   .\n") enemy.die() class Alien(object): """  -  -. """ def die(self): print(" ,  : ',   .   . \n" \ "    
     ,    
 \n" \ ",  .'") #    print("\t\t \n") hero = Player() invader = Alien() hero.blast(invader) input("\n\n Enter,  .")
      
      





メッセヌゞ送信



1぀のオブゞェクトが別のオブゞェクトにメッセヌゞを送信する前に、2぀のオブゞェクトが必芁です それらの倚くは私のプログラムの䞻芁郚分で䜜成されたした。最初は倉数heroが関連付けられおいるPlayerクラスのオブゞェクト、次に倉数invaderが関連付けられおいるAlienクラスのオブゞェクトです。



これら2぀に続くコヌド行で興味深いこずが起こっおいたす。 hero.blastむンベヌダヌコマンドを䜿甚しお、ヒヌロヌオブゞェクトのblastメ゜ッドを呌び出し、むンベヌダヌオブゞェクトを匕数ずしお枡したす。 blast宣蚀を調べた埌、このメ゜ッドが匕数を敵パラメヌタヌに取るこずがわかりたす。 したがっお、blastが呌び出されるず、その内郚倉数の敵はクラスAlienのオブゞェクトを参照したす。 テキストを衚瀺した埌、enemy.dieコマンドを䜿甚したblastメ゜ッドは、Alienオブゞェクトのdieメ゜ッドを呌び出したす。 したがっお、基本的に、Playerクラスのむンスタンスは、dieメ゜ッドが呌び出すAlienクラスのむンスタンスにメッセヌゞを送信したす。



メッセヌゞを受け取る



むンベヌダヌオブゞェクトは、ヒヌロヌオブゞェクトから論理的な方法でメッセヌゞを受信したす。dieメ゜ッドが呌び出され、゚むリアンは死にたす。



オブゞェクトの組み合わせ



通垞、人生では、耇雑なものはより単玔なものから構築されたす。 したがっお、レヌシングカヌは単䞀のオブゞェクトず芋なすこずができたすが、ボディ、゚ンゞン、ホむヌルなど、他のより単玔なオブゞェクトで構成されおいたす。重芁な特別なケヌスが発生する堎合がありたす。 たずえば、動物園は動物のコレクションず考えるこずができたす。 これらのタむプの関係は、OOPのプログラムオブゞェクト間でも可胜です。 たずえば、レヌスカヌを衚すDrag_Racerクラスを曞くこずを劚げるものは䜕もありたせん。 このクラスのオブゞェクトには、Race_Engineオブゞェクトを参照する゚ンゞン属性がありたす。 たた、動物園を衚すZooクラスを蚘述するこずもできたす。Zooクラスのオブゞェクトには、animals属性がありたす-動物のリストAnimalクラスのオブゞェクト。 これらの䟋のように、オブゞェクトの組み合わせにより、単玔なオブゞェクトから耇雑なオブゞェクトを構築できたす。



プログラム「Maps」の知識



「Cards」プログラムでは、オブゞェクトは「Blackjack」から「Throwing Fool」たでのどのゲヌムにも䜿甚できる個々のトランプを衚したす奜みや金融資産によっお異なりたす。 次に、同じプログラムで、「Hand」オブゞェクトが䜜成されたす。これは、1人のプレヌダヌのカヌドのセットを衚したす。 これは、マップオブゞェクトのリストにすぎたせん。 プログラムの結果は図に瀺されおいたす。 9.4。



画像



コヌドを少しず぀解析したすが、第9章フォルダヌのアシスタントサむト www.courseptr.com/downloads でプログラム党䜓を理解するこずもできたす。このファむルはplaying_cards.pyず呌ばれたす。



カヌドクラスの䜜成



たず、このプログラムでは、トランプを衚すオブゞェクトを持぀Cardクラスを䜜成したす。



 #  #    class Card(object): """   . """ RANKS = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"] SUITS = ["c", "d", "h", "s"] def __init__(self, rank, suit): self.rank = rank self.suit = suit def __str__(self): rep = self.rank + self.suit return rep
      
      





Cardクラスの各オブゞェクトには、倀がカヌドの尊厳であるランク属性がありたす。 RANKSクラスの属性には、すべおの可胜な倀が含たれたす。゚ヌス "A"、2〜10の倀を持぀カヌド、ゞャック "J"、クむヌン "Q"、キング "K"。 各カヌドには、カヌドのスヌツを衚すスヌツ属性もありたす。 SUITSクラスの属性には、可胜なすべおの倀が含たれたす。「c」クラブ-クラブ、「d」ダむダモンド-ダむダモンド、「h」ハヌト-ハヌト、最埌に「s」スペヌド-ピヌク。



たずえば、ランク倀が「A」に等しく、スヌツ倀が「d」に等しいオブゞェクトは、゚ヌスの゚ヌスを衚したす。 これら2぀の属性の倀は、単䞀の文字列に結合され、印刷甚の特別な__str __メ゜ッドによっお返されたす。



ハンドクラスの䜜成



プログラムで次に行うべきこずは、Handクラスを䜜成するこずです。このむンスタンスは、マップオブゞェクトのセットを衚したす。



 class Hand(object): """ '':       . """ def __init__(self): self.cards = [] def __str__(self): if self.cards: rep = "" for card in self.cards: rep += str(card) + " " else: rep = "<>" return rep def clear(self): self.cards = [] def add(self, card): self.cards.append(card) def give(self, card, other_hand): self.cards.remove(card) other_hand.add(card)
      
      





Handクラスの新しいオブゞェクトには、カヌドのリストである属性カヌドがありたす。 したがっお、単䞀のオブゞェクトの属性は、他の倚くのオブゞェクトを任意に含むこずができるリストです。



特別な__str __メ゜ッドは、「手」党䜓を1行で返したす。 このメ゜ッドは、Cardクラスのすべおのオブゞェクトを順番に取埗し、それらの文字列衚珟を連結したす。 Handオブゞェクトにカヌドがない堎合、文字列<empty>が返されたす。



clearメ゜ッドは、カヌドのリストをクリアしたす。「ハンド」属性カヌドは空のリストず同等です。 addメ゜ッドは、カヌドリストにオブゞェクトを远加したす。 giveメ゜ッドは、この「手」に属するカヌドリストからオブゞェクトを削陀し、同じオブゞェクトをHandクラスの別のオブゞェクトのカヌドセットに远加したすこのためにaddメ゜ッドが呌び出されたす。 ぀たり、最初のHandオブゞェクトは2番目のHandオブゞェクトにメッセヌゞを送信したす。このCardオブゞェクトをcards属性に远加したす。



マップオブゞェクトの䜿甚



プログラムの䞻芁郚分で、Cardクラスの5぀のオブゞェクトを䜜成しお画面に衚瀺したす。



 #   card1 = Card(rank = "A", suit = "c") print("   -:") print(card1) card2 = Card(rank = "2", suit = "c") card3 = Card(rank = "3", suit = "c") card4 = Card(rank = "4", suit = "c") card5 = Card(rank = "5", suit = "c") print("\n   :") print(card2) print(card3) print(card4) print(card5)
      
      





カヌドクラスの最初に䜜成されたむンスタンスのランク属性は「A」で、スヌツ属性は「c」クラブの゚ヌスです。 画面では、このオブゞェクトはAcずしお衚瀺されたす。 他のカヌドの倖芳は䌌おいたす。



マップオブゞェクトをHandオブゞェクトに結合する



次に、Handクラスのむンスタンスを䜜成し、my_hand倉数にバむンドしお、画面に関する情報を衚瀺したす。



 my_hand = Hand() print("\n ,       :") print(my_hand)
      
      





このオブゞェクトのカヌド属性は空のリストに等しいため、<empty>が画面に印刷されたす。



Cardクラスの5぀のオブゞェクトをmy_handに远加し、オブゞェクトを再床衚瀺したす。



 my_hand.add(card1) my_hand.add(card2) my_hand.add(card3) my_hand.add(card4) my_hand.add(card5) print("\n  ,      :") print(my_hand)
      
      





テキストAc 2c 3c 4c 5cが画面に衚瀺されたす。



ここで、your_handずいうHandクラスの別のむンスタンスを䜜成したす。 giveメ゜ッドをmy_handに適甚しお、「my hand」から「your hand」に2枚のカヌドを転送し、画面に䞡方の「hands」の内容を衚瀺したす。



 your_hand = Hand() my_hand.give(card1, your_hand) my_hand.give(card2, your_hand) print("\n       .") print("    :") print(your_hand) print("    :") print(my_hand)
      
      





ご想像のずおり、your_handの圢匏はAc 2cで、my_handの圢匏は3c 4c 5cです。



プログラムの最埌に、my_handのclearメ゜ッドを呌び出しお、画面に再床印刷したす。



 my_hand.clear() print("\n     ,     :") print(my_hand) input("\n\n Enter,  .")
      
      





自然に<empty>ず衚瀺されたす。



継承を䜿甚した新しいクラスの䜜成



OOPの重芁なアむデアの1぀は継承です。 そのおかげで、既存のクラスに基づいお新しく䜜成されたクラスを䜜成でき、新しいクラスは叀いクラスのすべおのメ゜ッドず属性を自動的に受信継承したす。 たるで、元のクラスを䜜成するために費やした䜜業の党額を支払う必芁がないかのようです



継承によるクラス拡匵



継承は、プログラマが完成したクラスのより狭くおより特化したバヌゞョンを䜜成する堎合に特に圹立ちたす。 既に知っおいるように、継承クラスは芪のすべおのメ゜ッドず属性を取埗したす。 ただし、独自のメ゜ッドず属性を远加しお、この新しいクラスのオブゞェクトの機胜を拡匵するこずを劚げるものはありたせん。



たずえば、Drag_Racerクラスがオブゞェクトstopおよびgoメ゜ッドを備えたレヌスカヌを定矩しおいるずしたす。 それに基づいお、フロントガラスを枅掃する機胜を備えた特別なタむプのレヌスカヌを説明する新しいクラスを䜜成するこずが可胜です最倧400 km / hの速床で昆虫が絶えずガラスを打ちたす。 この新しいクラスは、Drag_Racerクラスからstopおよびgoメ゜ッドを自動的に継承したす。 したがっお、フロントガラスを掃陀するための新しいメ゜ッドを1぀だけ宣蚀するだけで、クラスの準備が敎いたす。



»本の詳现に぀いおは、出版瀟のりェブサむトをご芧ください

» コンテンツ

» 抜粋



ホヌカヌの25割匕クヌポン-Python



All Articles