ビデオゲームでプログラミングを学べるか?

ビデオゲームでプログラミングを学べるか?

そして、どのゲームがそれを行う可能性があります...

if(プログラムへの希望 > 10)
続く;
それ以外
戻る;

自分がプログラマーであると人に言うと、そういう目で見られます。ギラギラした目、礼儀正しい笑顔、話題を変えたいという明らかな欲求。運が良ければ、会話の相手が私たちを金持ちにすると主張する次のキラーモバイルアプリのアイデアを売り込まれるかもしれない。運が悪いと、残りの人生で無料の技術サポートを提供することになりかねません。しかし、不可能に聞こえるかもしれませんが、プログラミングは人々が思っている以上に楽しいものになり得るということです。独自のビデオゲームジャンルを正当化するのに十分な面白ささえあります。

では、これらのゲームはどれほど教育的なのでしょうか?本当にゲームでプログラマーになれるのでしょうか? Steam を調べた結果、有望な候補が 3 つ見つかりました。彼らを見て、請求書を支払うためのスキルを本当に教えてくれるのかどうかを見てみましょう。

C# コードの書き方を教えてくれるゲームは明らかにほとんどありませんが、これらのプログラミング ゲームは、概念視覚的な比喩と達成可能なパズルへのプログラミング。したがって、各ゲームで導入されているプログラミングの概念と、後でプログラミング言語を学習し始めた場合に引き継がれる方法でそれらの概念をどの程度うまく教えられるかという観点から、各ゲームをレビューしていきます。また、これらのゲームを概念的な複雑さの昇順に実行して、プログラミングへの完全なコースを形成できるようにします。

また、始める前に、これらのゲームはいずれもコーディングを教えるとは主張していないことを強調しておく必要があります。私たちはそうかもしれないと思うだけです。続いて!

ヒューマン・リソース・マシン

困難:初級~中級

ヒューマン・リソース・マシンすべてはデータ処理に関するものです。 「IN」とマークされたコンベア ベルトは、数字と文字が印刷されたタイルを送り出します。各パズルで定義されている正しいタイルを、「OUT」とマークされたコンベア ベルトに送るのがあなたの仕事です。これを行うには、熱心な従業員が従うべきコマンドのリスト、つまりプログラムを作成します。入ってくるタイルはランダム化されているため、プログラムでは数字と文字のすべての可能な組み合わせを考慮する必要があります。これは、すべてのプログラマーがよく知っている懸念事項です。

HRM は、理解しやすい方法で概念を導入するという優れた機能を備えており、次のコマンドに進む前に、新しい各コマンドに慣れる時間を与えてくれます。さらに良いことに、ワーカーがプログラムを実行する際の時間を遅くして、各コマンドをステップ実行することで、どこが、なぜ期待通りに動作しないのかを正確に確認できるようになります。プログラマがデバッグにどれだけの時間を費やしているかを考えると、プログラムを 1 行ずつ分解することに慣れることは非常に役立ちます。

ただし、アクセシビリティはプログラミングの方程式の一部にすぎません。重要な質問は、HRM をプレイすることでプログラミングの方法を学べるのかということです。それに答えるために、HRM のパズルを強化する概念をもう少し深く掘り下げてみましょう。

コンセプト:基本的な変数

彼らは何ですか?

未知のデータを扱う場合、それが乱数や文字のベルトコンベアであろうと、コンピュータの光速キーボードコマンドであろうと、スタークラフトpro は、これまでに作成されたほぼすべてのプログラムの基本コンポーネントです。プログラムは将来を予測できないため、実行中に未知のデータを保存および参照するための汎用プレースホルダーが必要です。ここで変数が登場します。変数は基本的に、必要に応じて空にしたり補充したりできるデータのラベル付きコンテナです。

どのように教えられているのでしょうか?

HRM では、床タイルは変数の代用として機能します。各パズル ルームの中央では、床が番号のグリッドに分割されており、ベルトコンベアで運ばれてくる数字や文字を一時的に保管できます。コマンドのリストでは、これらのタイルを数値ラベルで参照します。つまり、プログラミングではカウントは 1 ではなく常に 0 から始まるため、0 から始まります。あるいは、「FirstAdder」や「Tally」などの独自のラベルをタイルに与えることもできます。プログラムを理解しやすくするのに役立ちます。これは、特に複数の人が同じコードに取り組んでいる場合、プログラミングにおいて重要なテクニックです。適切な名前の変数は、不正な動作をしているプログラムをすぐに診断するか、コードが一体何をしているのかを思い出すために何時間も費やすかの違いとなる可能性があります。

コンセプト:配列

彼らは何ですか?

変数は単一の値またはオブジェクトを参照するために使用されますが、配列は類似したオブジェクトをまとめてグループ化する必要がある場合に使用されます。たとえば、プレーヤーのインベントリ内のスロットごとに個別の変数を必要とする代わりに、ゲームにはすべてのインベントリ アイテムが格納される単一の「インベントリ」配列が存在する場合があります。このアプローチの利点は、次のようにそれらのアイテムを「在庫」オブジェクトに関連して参照できることです。

、 在庫

、 在庫

... これにより、プレイヤーのインベントリ内のすべてのスロットをチェックするコードを非常に簡単に作成できるようになり、生のパフォーマンスの観点から見ると、配列は個々の変数よりもはるかに高速です。どのように教えられているのでしょうか?

HRM は配列の実装に何の困難も伴いません。ラベルを通じてフロア タイルを直接参照する代わりに、あるタイル内の値を別のタイルを指すラベルとして使用できます。たとえば、タイル「0」の中に数字の 7 が含まれる場合があります。これに対して標準の copyfrom '0' コマンドを使用すると、7 が返されます。代わりに copyfrom を使用する場合

コマンドを実行すると、プログラムは 7 を別のラベルとして使用し、タイル 7 内の値を取得します。少しわかりにくく聞こえるかもしれませんが、あまり心配する必要はありません。配列がどのように機能するかを理解するには、実際に配列が動作しているのを確認する必要があります。重要なのは、HRM を使用すると、テンポの良い多数のパズルでそれを行うことができるということです。

コンセプト:

条件付きステートメント (別名 IF…THEN ステートメント)

彼らは何ですか?プログラムに入力したデータに関係なく、毎回まったく同じ出力を生成するようであれば、プログラムはあまり役に立ちません。それは文字通り自動的にプレイされるゲームのようなもので、プレイヤーの入力をすべて無視し、同じランスルーを何度も繰り返します。プログラムは、2 つの数値のうちどちらが大きいかを決定するなどの単純な場合でも、プレイヤーのクロスボウのボルトがターゲットに命中するかどうかを決定する場合でも、決定を行う必要があります。条件文はプログラムの実際の頭脳であり、私たちの大脳新皮質に相当する人工的なものです。

どのように教えられているのでしょうか?

物事を単純にするために、HRM には 2 種類の条件文のみが含まれています。それは、ゼロの場合にジャンプ、および負の場合にジャンプです。これらのコマンドはワーカーの手にある値をチェックし、条件が true の場合はプログラムの別の部分に「ジャンプ」します。ワーカーが -5 を保持している場合、jump-if-negative コマンドは true として解決され、ジャンプ矢印に従って、指定したプログラムの部分に移動します。ワーカーが 1 を保持している場合、プログラムは通常どおり、行内の次のコマンドに進みます。これは非常に単純に思えるかもしれませんが、後のパズルでは、悪魔自身が考案したフットボールのプレーのように、ジャンプの矢印が交差する一連のジャンプ if コマンドをすべて連携させる必要があります。

コンセプト:

反復 (別名ループ)

それは何ですか?

どのように教えられているのでしょうか?繰り返しはコンピューティングの基礎です。私たちは自分たちで行う時間がないタスクを自動化するプログラムを作成し、そのためにループを使用します。ループでは、同じ巡回ルートに沿って NPC を前後に集めます。ループは、敵が炎上している毎秒ごとに燃焼ダメージを与えます。ループは、車が最高速度に達するまで加速し続けます。これらのプロセスを繰り返すたびに手作業でコーディングするのは非常に非効率であり、プログラミングに関して言えば、非効率は罪です。HRM は、前述の条件ステートメントと標準のジャンプ コマンドを組み合わせて、ループの基本を伝えます。ループには主に for ループと while ループの 2 種類があり、HRM は両方を教えます。一連のコマンドを所定の回数実行する For ループは、ジャンプ イフ ゼロ チェックを満たしてループから「抜け出す」までカウントダウンするカウンターとして 1 つのフロア タイルを使用して実装されます。ループはほぼ同じように機能しますが、設定された回数だけループするのではなく、特定の条件が true の間繰り返します。パズルが難しくなるにつれて、長さが不明なデータのリストを処理するには、両方のタイプのループと配列タイルを組み合わせる必要があります。これは基本的なプログラミングのもう 1 つの基礎であり、HRM はこれに徐々に慣れさせていくのに役立ちます。

評決:

ヒューマン・リソース・マシン

コンベア ベルトや床​​タイルなどのよく知られた概念でフレームワークを構成し、使用するコマンドの少数のリストのみを提供することで、プログラミングの核となる原則へのしっかりとした入門書として役立ちます。色分けされたコマンドと便利なジャンプ矢印はフローチャートの言語を反映しており、プログラムが実行中に何を行っているかを簡単に追跡できます。コピーフロムやバンプなどの特注用語は、最新のプログラミング言語に 1 対 1 で翻訳できるわけではありませんが、それらが教える概念は同じです。 HRM を克服したら、実際にコードを書く方法を学び始める準備が整ったことになります。

ハックアンドスラッシュ2 ページ目では、Double Fine の Hack 'n' Slash について説明します。困難:

中級~上級

ハックアンドスラッシュただし、プログラミングの世界に飛び込む前に、もう少し準備をしておきたいと思うかもしれません。ここが

が登場します。一見すると、典型的なゼルダ風のアクション アドベンチャー ゲームのように見えますが、敵を切り倒すのではなく、剣兼 USB スティックを使って敵を「ハッキング」し、敵の行動を再プログラムします。世界中のほぼすべてのオブジェクトはこの方法で再プログラムでき、コードを書き換えることで実際にゲームをクラッシュさせることができます。これはゲームにとって有益であると同時に不利益でもあります。一方で、あらゆるパズルに驚くほど自由に取り組むことができますが、同時に、なぜ自分の解決策がうまくいかなかったのかが分からないと、非常に不安になることもあります。しかし、公平を期すために言うと、これは一言で言えばプログラミングに相当します。

ハック アンド スラッシュの主な問題は、事実上 2 つの異なるゲームであることです。1 つは変数やルーチンなどの概念を Human Resource Machine よりも深く探究するゼルダ風のパズルラーであり、もう 1 つは完全なコード デバッガーであり、浮く板も何もない状態で、生のコードに取り込まれます。この難易度の急上昇により、Hack 'n Slash はプレイするのが難しいゲームになっていますが、それを乗り越えることができれば、学ぶべき良いことがたくさんあります。

コンセプト:

高度な変数

彼らは何ですか?

前述したように、変数はプログラム内でデータを保存および参照する方法です。 Hack 'n' Slash では、Human Resource Machine の単一の文字と数字よりもはるかに多くのものを保存するために使用され、プログラムの動作を定義する際のその役割がより明確になります。彼らはどのように教えられているのでしょうか?

ハック アンド スラッシュは、いわゆる「型付き」変数を導入することで変数の概念を発展させます。これらは、特定のタイプの値のみ、たとえば数値のみ、または値「true」または「false」のみを保持できる変数です。敵をハッキングすると、いじることができる変数のリストが表示されますが、変更できるのはそのタイプに応じた値のみです。数値変数に文字を格納することはできず、それを超えて数値を増やすこともできません。その定義された制限。これらの暗黙のルールのおかげで、たとえ名前がわからなくても、ブール値、整数、文字列の違いが徐々にわかるようになります。

ただし、Hack 'n' Slash の変数に関するレッスンの核心は、変数の値がプログラムの動作にどのような影響を与えるかを理解することです。変数の値の範囲を試行錯誤することは、特にテストやデバッグの際に、プログラマーにとって良い精神的練習となります。プログラムは、たとえそれがプログラムの動作をおかしくさせるデータを破棄することを意味するとしても、スローされる可能性のあるすべてのデータを処理できる必要があります。ダメージ変数を -1 に設定することで、ハック アンド スラッシュの敵を打ち破るのがいかに簡単かを理解することは、適切なテストの重要性についての貴重な教訓となります。

コンセプト:

構文

それは何ですか?

私たちが相互に通信するために使用する言語と同じように、プログラミング言語にも、単語を組み合わせて文を形成する方法に関するルールがあります。この文法は構文として知られており、各言語に固有の場合もありますが、ほとんどの最新のプログラミング言語は、約 40 年前に C によって確立された規則に従っています。どのように教えられているのでしょうか?

Hack 'n' Slash は後半で構文の概念を導入し、変数の扱いを超えて、裸のコードに直面します。 Lua プログラミング言語に基づいたこのコードは、おそらく理解を容易にするために、その構文に多くの自由が取られています。しかし、実際には、でっち上げられた用語は、ある混乱を別の混乱に置き換えるだけであり、そのプロセスにおける現実世界への適用性は制限されます。幸いなことに、最も一般的な構文要素はそのまま残っており、最新のコードの一般的な構造に慣れることができます。

このような文法規則には、Port と呼ばれるオブジェクトの Value 変数を参照する Port.Value などの用語で使用されるドット構文や、意思決定のための if... then ステートメントの構造が含まれます。これらのしばしば当惑するルールを解読するのを助けるために、ハック アンド スラッシュはコードの視覚化されたバージョンにあなたを導きます。そこでは、変数は色分けされたクリスタルとして表され、それがマシンに入力されてアクションに処理されます。色付きの線はマシン間のプログラムの流れを示していますが、マシンは非常に近くに積み重ねられているため、操作の順序を追うのが難しい場合があります。

コンセプト:

関数/メソッド

彼らは何ですか?

プログラミングには、プログラムの実行時間の 90% がコードの 10% の実行に費やされるという古い格言があります。言い換えれば、プログラムは同じ操作の繰り返しに膨大な時間を費やします。これを利用するために、最も一般的なコードを個別の関数に分割し、プログラムでそのコードを実行する必要があるときはいつでも、funFunction() のようなコマンドで関数を呼び出すだけです。これにより、プログラム全体で同じコードを何度も書き直す必要がなくなり、さらに重要なことに、頻繁に使用される関数を微調整する必要がある場合に、コードの 1 つのチャンクを変更するだけで済むことになります。

どのように教えられているのでしょうか?

コードの視覚化されたバージョンでは最大のマシンの形をとり、機能自体も敵や他のオブジェクトと同じようにハッキングでき、コード内のコードに飛び込むインセプション風のシナリオを実現します。関数のコードに加えられた変更はゲーム全体に伝播し、後々予期せぬ結果を引き起こす可能性があります。これは、プログラミング、特に大規模なプロジェクトではよくある危険であり、たとえ小さな変更でも大きな影響を与えることを警戒することを学ぶことは、プログラミングの良い習慣となります。

評決:ゲームとして、ハック アンド スラッシュには多くの問題があります。プログラミングのチュートリアルとしては、かなり優れています。変数の調整による影響を強調し、関数を物理マシンとして視覚化することで、すべての意欲的なプログラマーにとって非常に貴重な概念をカバーしています。コーディングにどれだけの試行錯誤や挫折が伴うのか、苦労して学ぶ覚悟ができていれば、現代のすべての言語を支えるシステムとプロセスをしっかりと理解できるようになります。

TIS-1003 ページ目は、TIS-100 の恐ろしいアセンブリ言語の世界です。困難:

アドバンス+

TIS-100始めて最初に聞こえるのは

古いCRTのコールドブートです。これが郷愁を誘うかどうかは、ゲームに見せかけたアセンブリ言語コンパイラについてどう感じるかについての良いリトマス試験紙となります。誤解しないでください。TIS-100 は最も熱心なプログラマーのみを対象としています。条件文や反復処理などにまだ慣れていない場合は、学習曲線が急激に変化することになります。たとえ (have_exp == true) であっても、TIS-100 は決して簡単なものではありません。

アセンブリ言語に詳しくない方のために説明すると、アセンブリ言語は 1950 年代から 60 年代に一般的だったプログラミング言語の一種で、70 年代以降には C などの高水準言語に取って代わられました。アセンブリ言語命令は通常、コンピュータが自身と対話するために使用するマシン コードに基づいているため、Java や C# などと比較して読み書きが非常に困難です。それでも、その古風な感性にもかかわらず、TIS-100 は今日でも関連性のある多くの概念に取り組んでいます。

コンセプト:

コミュニケーション

それは何ですか?コミュニケーションは現代のプログラミングの重要な要素です。オンライン リーダーボードからマルチプレイヤー FPS、MMO に至るまで、最近のゲームは、楽しみを促進するためにお互いの会話にますます依存しています。問題は、あるプログラムがいつでも別のプログラムが何をしているかを知ることは事実上不可能であるため、通信の管理が困難になることです。これは、2 人が電話をいじりながら会話をしているようなものだと考えてください。一方の人の注意が自分の電話に集中していると、もう一方の人の言っていることが聞こえない可能性があります。これを解決するために、プログラムはポートとソケット (基本的にはオペレーティング システムによって管理される私書箱) を使用して通信します。プログラムはデータを送信してから業務を開始できますが、新しいメッセージを確認する責任は受信者にあります。

どのように教えられているのでしょうか?

TIS-100 のプログラムはノードに分割されており、各ノードは限られた数の命令のみを実行できます。設定された目標を達成するには、ノード間で大量のデータを共有する必要があります。さらに悪いことに、各ノードは隣接するノードとしか通信できないため、事態はさらに複雑になります。実用的なソリューションを作成するには、各ノードを、それ自身の操作のみを知ることができる個別のプログラムとして考える必要があります。これらすべてを協力させるということは、ネットワーク プログラマが行う必要があるのと同じように、通信プロトコルを確立することを意味します。さまざまなプログラムを説得してうまく連携させるのは、思っているよりも難しいことがすぐにわかります。

コンセプト:

スタック

それは何ですか?
作成しているプログラムが複雑になるにつれて、一度に 2 つのものしか保存できないノード間でのデータの移動は、中国語のささやきゲームになり、エラーの可能性は高まるばかりです。無制限のデータ バケットを備えたスタック ノードの導入により、より大規模なデータ セットを処理する手段が得られますが、追加容量は無料ではありません。デッドロックのような問題を考慮する必要があります。デッドロックでは、1 つのノードが空のスタックが補充されるのを待っていますが、スタックを補充するノードが元のノードからの何かを待機している状態になります。つまり、膠着状態です。次に、複数のデータセットをすべて混同することなく単一のスタックに保存するという問題があります。スタック ノードの使用とデータの手動管理のトレードオフを比較検討することは、プログラマーが定期的に行う検討事項です。配列と同様、スタックは関連するデータをグループ化するためのコンテナです。ただし、スタックは、異なるプログラムまたはプログラムの異なる部分が相互に直接通信せずに同じデータにアクセスする必要がある共有データ環境に適しています。名前が示すように、スタックは後入れ先出し (LIFO) プロトコルに従ってデータを垂直リストに保存します。新しい項目が追加されるとリストの先頭に移動し、項目が削除されるとリストの先頭に移動します。リストの先頭から取得されます。これは、ビュッフェ レストランの皿の山のように考えてください。常連客は上から取り、その上にはきれいな皿が置かれます。または、インターネット ブラウザの [戻る] ボタンと、最近のページ履歴の記録。評決:どのように教えられているのでしょうか?オーバーレイメニュー

マルチコアプログラミング

TIS-100 は過去の遺物のように見えますが、決して時代遅れではありません。から