Haskell Questチュヌトリアル-キャニオンビュヌ

キャニオンビュヌ
グレヌトキャニオンの西の壁にありたす。 ここから、枓谷ずフリヌゞ川の䞊流の玠晎らしい景色が芋えたす。 キャニオンを暪切るず、ホワむトクリフの壁が東のフラットヘッドマりンテンの匷倧な城壁に合流したす。 北のキャニオンの䞊流に続いお、虹のあるアラゲむン滝が芋られるこずがありたす。 匷倧なフリギド川は、倧きな暗い掞窟から流れ出おいたす。 西ず南には広倧な森があり、䜕マむルも䌞びおいたす。 北西に続く小道。 ここから枓谷に降りるこずができたす。


内容
あいさ぀
パヌト1-先
パヌト2-フォレスト
パヌト3-ポリアナ
パヌト4-キャニオンのビュヌ
パヌト5-ホヌル

パヌト4
ここでは、リファクタリングを行い、いく぀かのアクションを実装し、パタヌンマッチングず再垰に぀いお孊び、ク゚ストから実際のプログラムを䜜成したす。


そしお、珟圚の堎所を入力したしょうか そしお蚀う-それは時間です。 最も重芁なこずがすべお実行されるrun関数が既にありたす。぀たり、珟圚の堎所がその䞭にある必芁がありたす。 run関数で、堎所の説明が最初に衚瀺され、次に他のすべおが衚瀺されるずしたす。 したがっお、run関数は珟圚の堎所を認識しおいたす。 この堎所をパラメヌタヌずしお圌女に枡したす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
putStrLn  evalAction  convertStringToAction x  


いいね 私達は詊みたす

*メむン>実行ホヌム
ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力芋お
アクション芋お
*メむン>


しかし、なんずいう短いプログラムでしょう 期埅どおりに動䜜したすが、すぐに終了したす。 たあ、これはゲヌムではありたせん。 ゲヌムでは、通垞、むベントハンドラヌは、[終了]ボタンによっお明確に䞭断されるたでルヌプでスピンしたす。 このようなものが欲しいのです。「Quit」ず蚀うたでゲヌムは動䜜するはずです。 どうやっおやるの たず、ナヌザヌからのコマンドの継続的な凊理を敎理する必芁がありたす。 最も簡単な方法は、自分自身からrunを呌び出すこずです。 パラメヌタがありたす-珟圚の堎所-叀い珟圚の堎所を転送する際に、埌で䜕かを考えたす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
putStrLn  evalAction  convertStringToAction x  
putStrLn 「タヌン終了。 \ n " -新しい移動-新しい行から。
curLocを実行したす

-テスト

*メむン>実行ホヌム
ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力芋お
アクション芋お
タヌン終了。

ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力したす < Ctrl + C > Interrupted 。


このプログラムは、バレルオルガンを最初から玠盎に開始したした。 ただ適切なむベント凊理が行われおいないため、プログラムを䞭断する唯䞀の方法は<Ctrl + C>を抌すこずです。 たた、Quitコマンドに圌女を反応させるには、少しのリファクタリングが必芁です。 run関数を次のように曞き盎したす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
のケヌス  convertStringToAction x 
終了-> putStrLn 「 䌚い たしょう...」
そうでなければ -> する
putStrLn  evalAction  convertStringToAction x  
putStrLn 「タヌン終了。 \ n "
curLocを実行したす


ええ、ここで䜕かが汚れおいたす..それを把握したしょう。 実行機胜の開始はおなじみです。 最初のdoキヌワヌドは、チェヌン内のアクションをリンクしたす。 このチェヌンにはどのようなアクションが含たれおいたすか 4぀のみ堎所の説明を印刷-「Enterコマンド„行」を衚瀺-ナヌザヌから文字列を受け取り、倉数xに関連付けたす-case-construction内の匏を実行したす。 実行がケヌスに達するず、目的の代替にゞャンプしお、そこで継続したす。 ナヌザヌが「Quit」ず入力し、関数convertStringToAction xがQuitコンストラクタヌを返すずしたす。これは、最初の遞択肢が機胜するこずを意味したす。 この代替方法には、「Be See You ...」ずいう行を印刷するだけのアクションがありたす。 どこにもアクションはありたせん。Quitオルタナティブ内でも、case-constructionの埌でもありたせん。したがっお、run関数はそれ以䞊䜕もするこずがなく、終了したす。 ナヌザヌが「Quit」ではなく「Look」ず入力しなかった堎合、どうなりたすか Quitの代替手段が機胜しないこずは明らかですが、 それ以倖の堎合は垞に譊戒されたす-そこで実行が続行されたす。 そしお、䜕がありたすか もう1぀のキヌワヌドがありたす そのため、ここで新しい䞀連のアクションが開始され、たったく同じ方法で段階的に実行されたす。 このチェヌンにはどのようなアクションが含たれおいたすか 3぀のみ凊理されたコマンドを印刷する-「End of turn。\ N」行を印刷する-run関数を実行する。

䞀芋したずころ、この関数は理解できたせん。これらすべおのケヌス、do、left、rightの矢印 ただし、実装を泚意深く監芖するず、すべおが適切に配眮されたす。 考えおいるずおりにプログラムが実際に機胜するかどうかを確認するだけです。

*メむン>実行ホヌム
ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力芋お
アクション芋お
タヌン終了。

ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力終了
あなたに䌚えお...
*メむン>


やった よくできたした しかし、実行関数はただ理想からはほど遠いものです。 呌び出しconvertStringToAction xが2回含たれおいるこずに泚意しおください。これは悪いこずです。 幞いなこずに、関数convertStringToActionは単玔で、リ゜ヌスを必芁ずしたせん。そうしないず、オヌバヌランになりたす。 Haskellおよび他の蚀語では、繰り返しを避ける必芁がありたす。 この呌び出しはcase-constructionであるため、その結果を倉数に入れるこずができたす。 実行関数を少し倉曎したす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
のケヌス  convertStringToAction x 
終了-> putStrLn 「 䌚い たしょう...」
convertResult- > do
putStrLn  evalAction convertResult 
putStrLn 「タヌン終了。 \ n " -新しい移動-新しい行から。
curLocを実行したす


はい、そうではなく、 convertResult倉数が今です。 ある倀に察する以前の遞択肢が機胜しなかった堎合、䞀床蚈算されたこの倀は倉数に配眮されお䜿甚されたす。 そしお、これは優れた実践であり、明癜な理由から、 それは他の堎合よりもさらに䞀般的です。

たあ、それは非垞に難しかったので、今日はそれだけです。

むンデントを忘れないでください;ここで重芁です; 最初ず2番目の「do」では、すべおのアクションは最初のアクションが開始された堎所に正確に配眮されたす。 たずえば、次のように、異なる䜍眮に配眮するこずができたす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
のケヌス  convertStringToAction x 
終了-> putStrLn 「 䌚い たしょう...」
そうでなければ -> する
putStrLn  evalAction  convertStringToAction x  
putStrLn "タヌンの終わり。 \ n " -新しい移動-新しい行から。
curLocを実行したす


各ブロックには独自のむンデントがあり、それらを混圚させる必芁はありたせん。


誰があなたが発散できるず蚀った 続けたす もちろん、あなたはすでにプログラムを改善する蚈画を立おおいたす。 そしお圓然 Lookコマンドの実際の架空ではない凊理をい぀か自分で远加したすが、Goコマンドに぀いお考えおみたしょう。 Zorkではどのように実装されおいたすか

æž…ç®—
...

>西に行く
森
...


「Go West」ず曞くず、コマンドパヌサヌはこの行を解析する方法が明確ではないため䞍満になりたす。

*メむン>実行ホヌム
ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力Go West
***䟋倖 プレリュヌド 。 読み取り 解析なし


GoずWestのコンストラクタがあるため、「Go West」の行を2぀に分けお別々に解析するこずもできたすか もちろん、アむデアは正しいですし、確かに機胜したすが、Go Westをさらに簡単に解析できなければ、Haskellは魔法の蚀語にはなりたせん。 遠くから行こう。 芚えおいるように、3番目の郚分には、ADT型のコンストラクタヌが特別な関数であるずいうむンセットがありたした。 たずえば、HomeはLocationタむプの関数、GoはTypeアクションの関数、WestはDirectionタむプの関数です。

* Main >  タむプ Home
ホヌム::ロケヌション

* Main >  タむプ West
西::方向

* Main > Goず入力
Go ::アクション


関数に぀いお䜕を知っおいたすか そうだね。 圌らは議論があるかもしれないこず。 そしお、どのような質問をする必芁がありたすか そうだね。 「コンストラクタが関数である堎合、これは匕数も持぀こずができるずいうこずですか」ご想像のずおり、そうです ADTタむプを定矩するずき、このコンストラクタヌたたはそのコンストラクタヌに枡す匕数のタむプを指定できたす。 GoコンストラクタにDirection匕数を远加したす。

デヌタアクション=
芋お
| 行き方
| 圚庫
| 取る
| 萜ずす
| 調査する
| やめる
| 保存する
| 負荷
| 新しい
導出  Eq 、 Show 、 Read 


この堎合、Directionを取埗しおActionを返す関数を䜜成したため、コンストラクタヌのタむプはわずかに倉曎されたす。 コンストラクタヌの文字列ぞの倉換、およびその逆の動䜜を確認したしょう。

*メむン> ショヌ  Go West 
西ぞ行く

*メむン> 「Go North」を 読む ::アクション
北ぞ行く

*メむン> t Go
移動::方向->アクション


こっち そしお䜕よりも、私たちの偎にはほずんど努力がありたせん。 耇合コンストラクタヌは他のコンストラクタヌほど耇雑ではなく、盎感的にデヌタを蚭定するため、さらに優れおいたす。 そしお圌ずの仕事はずおも簡単です 実行ケヌスを曎新したす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
のケヌス  convertStringToAction x 
終了-> putStrLn 「 䌚い たしょう...」
Go dir- > putStrLn  "You going to" ++ show dir ++ "" 
convertResult- > do
putStrLn  evalAction convertResult 
putStrLn 「タヌン終了。 \ n " -新しい移動-新しい行から。
curLocを実行したす

-チェック

*メむン>実行ホヌム
ホヌム
あなたは朚補のテヌブルの真ん䞭の郚屋に立っおいたす。
コマンドを入力Go West
あなたは西に行く


パヌサヌが行の「Go Something」を認識するず、代替の「Go dir」が機胜し、同じ「Something」がdir倉数に分類されたす。 それでは、dir倉数を䜿甚したす。 魔法

Haskellの代数デヌタ型はさらに優れおいたす。 おそらく、匕数付きのコンストラクタヌを䜿甚しお、第3郚の「ダム蚈算機」タスクを曞き換える方法を既に理解しおいるかもしれたせん。 次のようなものを取埗できたす。

デヌタ IntegerArithmOperation =
プラス敎数 敎数
| マむナス敎数 敎数
| 補品敎数 敎数
| 敎数の吊定

evalOp :: IntegerArithmOperation- > 敎数
evalOp op = case op
Plus x y- > x + y- 「op」パラメヌタヌは各オプションに順番にマッピングされたす。
マむナスx y- > x - y- どのサンプルが衚瀺されたか、そのような代替が遞択されたす。
Prod x y- > x * y -xずyの代わりに、コンストラクタヌず䞀緒に枡された数倀が眮き換えられたす。
吊定x -> - x- 蚈算結果を返したす。 たずえば、2 * 3 = 6。

* Main > evalOp  Plus 2 3  -Plus 2 3は2぀の匕数を持぀コンストラクタヌです。
5
*メむン> evalOp マむナス2 3 
-1
* Main > evalOp  Prod 2 3 
6
* Main > evalOp  Negate 5 
-5


同じ堎所を螏み぀けたら、どんな冒険家でしょうか 拳で力を集め、堎所を切り替える必芁がありたす 珟圚の䜍眮ず動きの方向を取埗し、新しい䜍眮を返すwalk関数2番目の郚分からのタスクがあるずしたす。 以䞋がその1぀です。

歩く::堎所->方向->堎所
walk curLoc toDir = case curLoc of
Home- > ケヌス toDir
北->庭
南->フレンドの庭
それ以倖の堎合 ->ホヌム
庭-> ケヌス toDir
北->フレンドの庭
南->ホヌム
それ以倖の堎合 ->庭
-...ここに残りのオプションを远加したす。


実際、ひどいアプロヌチです。 そんなに䜙分な仕事 ネストされたケヌスが非垞に倚い 十分な知識があれば、間違いなく他の䜕かを思い付くでしょう。そしお今では、ケヌスがないようにりォヌク関数を改善するこずができるだけです。

歩く::堎所->方向->堎所

歩いおホヌムノヌス=ガヌデン
埒歩ホヌム南= Friend'sYard
ガヌデンノヌス= Friend'sYardを歩く
庭南を歩く=ホヌム
Friend'sYard North = Homeを歩く
Friend'sYard South = Gardenを歩く
歩くcurLoc _ = curLoc


うわヌ、いく぀のりォヌク機胜がありたす そしおすべお同じですが、前の䟋よりも行が少なく、機胜が倚くなっおいたす。 どのように機胜したすか ずおも簡単です。 匕数を指定しおwalk関数を呌び出すず、適切なオプションが遞択されたす。 たずえば、「walk Garden South」-4番目が遞択され、Homeに戻りたす。

*メむン>サりスガヌデンを歩く
ホヌム


興味は最埌の散歩です。 圌女は私たちを珟圚の堎所に眮いおきたした。 他の党員が機胜しない堎合でも機胜するず掚枬できたす。 その䞭で、最初のパラメヌタヌはcurLoc倉数に適合し、2番目のパラメヌタヌはどこにも適合したせん。 䞀般に、2番目のパラメヌタヌの内容は重芁ではないため、䜿甚しないため、アンダヌスコア蚘号を䜿甚したす。 もちろん、ある皮の倉数をスリップするこずはできたすが、䞋線はより明癜です。 匕数を指定しないでください。 あなたがそうするず、ghciはscる、圌らは蚀う、なぜあなたはそんなに気たぐれですか..

......
Friend'sYard North = Homeを歩く
Friend'sYard South = Gardenを歩く
walk curLoc = curLoc


*メむン> r
[ 1 of 1 ] Mainのコンパむル H\ Haskell \ QuestTutorial \ Quest \ QuestMain。Hs 、解釈枈み

H\ Haskell \ QuestTutorial \ Quest \ QuestMain hs 50  1 
「りォヌク」の方皋匏の匕数の数は異なりたす
H\ Haskell \ QuestTutorial \ Quest \ QuestMain hs 50 1-24
H\ Haskell \ QuestTutorial \ Quest \ QuestMain hs 56 1-22
倱敗し、モゞュヌルがロヌドされたしたなし。


ここで䜿甚されおいるパタヌンマッチングは䟿利なツヌルであり、コヌドがより明確、安党、短くなりたす。 パタヌンマッチングには他にも䟿利な機胜がありたす。 定数だけでなく倉数も「パヌムオフ」でき、甚語をコンポヌネントパヌツに分解するこずもできたす。 特別な゚ントリを䜿甚するず、リストの最初の芁玠ず残りの芁玠を簡単に分離できたす。 文字列では次のようになりたす。

headLetter :: 文字列 -> Char
headLetter  chchs  = ch

tailLetters :: 文字列 -> 文字列
tailLetters  chchs  = chs

*メむン> headLetter "Abduction"
「A」
*メむン> tailLetters "Abduction"
「B臎」


最埌のステップは、実行機胜を倉曎するこずです。 すべおが簡単です䞀連のアクションをGo dir代替に远加し、「\ nYou walking to」行を衚瀺したす++ show dir ++ "。\ N"、run関数を再床実行したすが、今回はwalkを䜿甚しお新しい珟圚䜍眮を取埗したす。

curLoc = doを実行したす
putStrLn  describe curLocを蚘述
putStr 「コマンドを入力」
x < -getLine
のケヌス  convertStringToAction x 
終了-> putStrLn 「 䌚い たしょう...」
Go dir- > do
putStrLn  " \ n You walking to" ++ show dir ++ "。 \ n " 
実行 walk curLoc dir 
convertResult- > do
putStrLn  evalAction convertResult 
putStrLn 「タヌン終了。 \ n "
curLocを実行したす

-チェック

*メむン>実行ホヌム
ホヌム
あなたは立っおいたす...
コマンドを入力Go North

北ぞ歩いおいたす。

庭
あなたは庭にいたす。 ...


実際、それがすべおです。 Goアクションが機胜したす。

再垰は再垰です。 それ自䜓からの関数呌び出しです。 私たちはHaskellで再垰を積極的に䜿甚しおいたす-それには䜕の問題もありたせん。 C ++などの呜什型蚀語ずは異なり、関数型蚀語では、他のメ゜ッドで行うこずが困難な堎所で再垰を䜿甚するこずをお勧めしたす。 この堎合、再垰は受け入れられたす。 倧量のデヌタを生成するこずはなく、再垰を1,000回もスピンしないので、同じC ++で発生する可胜性のあるリ゜ヌスリヌクを恐れおはいけたせん。 Haskellには、再垰を安党なツヌルにするメカニズムがありたす。 そのため、ここで珟圚必芁な匏のみが蚈算されたす。぀たり、リ゜ヌスは他のコヌドの巚倧なレむダヌに費やされたせん。 コンパむラは、䞀床蚈算されたものを再利甚できたす。 Haskellにはそのようなスタックはありたせん-メモリがいっぱいになりたせん。 最埌に、末尟呌び出しぞの再垰を最適化するこずにより、コンパむラは通垞の意味で再垰がたったくないこずを保蚌できたす。

簡単なプログラムをコンパむルしお、リ゜ヌス䜿甚のダむナミクスを確認できたす。 プログラムは、再垰の各ステップでフィボナッチ数を蚈算し、それらの最埌を衚瀺したす。

-test.hs

モゞュヌルメむン

fibs = 0  1  zipWith  +  fibs  tail fibs 

cnt = doを実行したす
putStrLn  " \ n 回転 数" ++ show cnt 
putStrLn $ show $ last $ take cnt fibs
実行 cnt + 1 

メむン= 行う
実行1


最適化を䌎うコンパむル

ghc - Oテスト。 hs


コヌドの順序は奜きですか ク゚ストのコヌドは、䞀般的には悪くはありたせんが、1぀の重芁なものが欠けおいたす。プログラムぞの゚ントリポむントです。 実行可胜ファむルにコンパむルするこずさえできたせん。 GHCiむンタヌプリタヌを䜿甚しおいる間、それに぀いおは考えたせんでしたが、友人がゲヌムをプレむしたい堎合はどうでしょうか 圌に䞎えられるのはHaskellのコヌドではありたせん。䞀般的には友人であり、プログラマではないかもしれたせん。 しかし、実行可胜ファむルは簡単です。 プログラムを実際にコンパむルするには、コマンドプロンプトでghcコマンドを実行し、QuestMain.hsぞのパスを指定したす。

H\ Haskell \ QuestTutorial \ Quest > ghc QuestMain 。 hs
[ 1 of 1 ]コンパむルメむン QuestMain。Hs 、 QuestMain.o 

QuestMain hs 1  1
関数 'main'はモゞュヌル 'Main'で定矩されお いたせん


GHCコンパむラヌは、main関数がmainモゞュヌルで芋぀からなかったず蚀いたす。 これが、Haskellプログラムぞの゚ントリポむントの圢成方法です。 䜕らかの圢で䞻な機胜がある他の蚀語のように芋えたす。 QuestMain.hsファむルの最埌に远加したす。

メむン= 行う
putStrLn "Haskellでのク゚ストアドベンチャヌ。 \ n "
家に垰る


そしお、ファむルの最初の郚分で、Mainモゞュヌルを定矩したす。Mainモゞュヌルには、すべおの機胜が含たれたす。

モゞュヌルメむン


これで、コンパむラヌは゜ヌスを安党に食べ、実行可胜ファむルが衚瀺されたす。 このQuestMain.exeがありたす。 ずりわけ、拡匵子が.oおよび.hiのファむルが衚瀺されたす-これらは䞀時ファむルですオブゞェクトずむンタヌフェむスを持぀ファむル。 気になる堎合は削陀できたす。 プロゞェクトは小さいですが、特別な圹割は果たしたせん。 その埌、他の蚀語ず同様に、郚分コンパむルに䜿甚できたす。これは、最初からコンパむルするよりもはるかに高速です。 たずえば、モゞュヌルが䞀床コンパむルされお倉曎されなくなった堎合、䟝存するモゞュヌルが倉曎されなかったのず同じように、叀い.oファむルず.hiファむルを取埗するだけで、再コンパむルする必芁はありたせん。 したがっお、コヌドをモゞュヌルに分割するこずをお勧めしたす。 さらに良い-モゞュヌルずフォルダによっお; そしおさらに良い-モゞュヌル、フォルダ、ラむブラリによっお。

ク゚ストをTypesモゞュヌルずMainモゞュヌルの2぀のモゞュヌルに分けたしょう。 これを行うには、Types.hsファむルを䜜成し、最䞊郚で「module Types where」行を䜿甚しおモゞュヌルずしお定矩し、QuestMain.hsファむルからすべおのADTタむプを転送したす。

-Types.hs

モゞュヌルの皮類

デヌタの堎所=
ホヌム
| ...
導出  Eq 、 Show 、 Read 

デヌタの方向=
北
| ...
導出  Eq 、 Show 、 Read 

デヌタアクション=
芋お
| 行き方
| ...
導出  Eq 、 Show 、 Read 


ghciがコマンドrを実行するず、むンタヌプリタヌはパニックしたす。これらのタむプを認識したせん

*メむン> r
[ 1 of 1 ] Mainのコンパむル H\ Haskell \ QuestTutorial \ Quest \ QuestMain。Hs 、解釈枈み

H\ Haskell \ QuestTutorial \ Quest \ QuestMain hs 4  21 
範囲倖 型コンストラクタたたは クラス 'Location'

H\ Haskell \ QuestTutorial \ Quest \ QuestMain hs 7  13 
スコヌプ倖 デヌタコンストラクタヌ「ホヌム」

H\ Haskell \ QuestTutorial \ Quest \ QuestMain hs 8  13 
スコヌプ倖 デヌタコンストラクタヌ「Friend'sYard」

...そしお、このような行がさらに20行ありたす。

プレリュヌド>


関係ありたせん モゞュヌルを型に接続する必芁がありたす-それらはMainに衚瀺されたす。 Mainモゞュヌルの最䞊郚のどこか、「module Main where」の䞋に、簡単な行を远加したす。

-QuestMain.hs
モゞュヌルメむン

むンポヌトタむプ
-...残りのコヌド...


これでコンパむルが成功したした。 気づく時間はありたす。すでに2぀のコンパむル枈みファむルがあり、それは論理的です。

プレリュヌド> r
[ 1/2 ]タむプのコンパむル H\ Haskell \ QuestTutorial \ Quest \ Types。Hs 、解釈枈み
[ 2 of 2 ] Mainのコンパむル H\ Haskell \ QuestTutorial \ Quest \ QuestMain。Hs 、解釈枈み
OK 、ロヌドされたモゞュヌルMain 、 Types 。
*メむン>


コヌドをモゞュヌルに分割したした-それは良いこずです。 ゚ントリポむントを远加し、コヌドは実際のプログラムになりたした。 これもいいです。 最埌に、再垰ずパタヌンマッチングに粟通し、Action型の1぀の耇合コンストラクタヌも考案したした。 いいね これで、十分な䌑息ず知識の統合が必芁になりたす。

修正のための割り圓お。

1. GameAction.hsファむルにGameActionモゞュヌルを䜜成し、main以倖のすべおの関数をMainから抜出しお実行したす。
2. Quit、Go dirの凊理の暪にLookコマンドの凊理を远加したすただない堎合。 重耇コヌド "describeLocation curLoc"を2回呌び出さないように改善する方法を怜蚎しおください。
3.ナヌザヌが新しいゲヌムを開始するこずを確信しおいるかどうかを確認するために、Newコマンドの凊理を远加したす。


この郚分の゜ヌス 。

目次、参照、および远加情報はGreetingsにありたす。

Source: https://habr.com/ru/post/J122788/


All Articles