Hatena::ブログ(Diary)

Qu記(仮) RSSフィード

2011年 03月 13日

Herbert Tutorial 0 - Herbertの基本ルール

前回の記事にも書いたように、先週Herbert Online Judgeというウェブサイトを公開しました。

これはHerbertというプログラミングパズルゲームのオンラインジャッジサイトですが、この1週間で150名強のユーザー登録、100問強の問題が登録が行われ、なかなか予想以上に賑わっています。

しかし、一方で多くの初心者ユーザーさんからは「Herbertはプログラミング未経験者には難しい」という指摘を頂いており、HOJは情報系・数学系の猛者達による戦場になっているという現状があります。

そこで、このblogでしばらくHerbertのチュートリアルを連載しようと思います。

このチュートリアルは

  • 第0回: Herbertの基本ルール
  • 第1回: s,r,lを使ったフィールドの移動
  • 第2回: 引数なしプロシージャ / 同じ処理を一つにまとめる
  • 第3回: 命令引数プロシージャ / n倍処理
  • 第4回: 無限ループと有限ループ / 再帰と数値引数プロシージャ
  • 第5回: 命令引数プロシージャによる拡張再帰
  • 第6回: 複数引数プロシージャや、多段呼び出しによる複雑な問題の解法
  • 第7回: 疑似ランダムフロー
  • 第8回: コード短縮のテクニックと練習問題

という内容を予定しています。

初心者でも最後まで読めば大体の問題に太刀打ちする力を付けられ、ある程度ルールを把握しているという方は必要な所だけ読んで役立ててもらえるような形にしていきたいと思っています。

なお、要約した内容はhttp://herbert.tealang.info/rule.phpに掲載されていますので、ある程度プログラミングの経験のある方はこちらを読んだ方が手っ取り早いかもしれません。


ということで、以下『Herbertの基本ルール』を解説していきます。


Herbertってどんなゲーム?

Herbertは、プログラミングパズルゲームです。

とは言っても、プログラミングパズルゲームという言葉に聞き覚えのある人は、ほとんどいないのではないでしょうか。実際、僕もHerbert以外に同じカテゴリに属するゲームをあまり挙げられませんから、Herbertは他のゲームに例えることが難しい、かなり特殊なパズルゲームだと言えます。

詳しいルール解説は後に回すとして、このゲームの他にはない面白いところを挙げてみるとすれば、それはプレイヤーは『動きを記述する』という行為によってパズルゲームを解くということです。

プレイヤーはH言語という言葉でロボットを動かすプログラムを記述し、実行します。

プレイヤーが出来るのはそこまでで、あとはロボットがプレイヤーが書いたプログラムを忠実に実行していき、問題を解決していく様子を見ることができるだけです。無論、一度実行されたロボットは、それ以降は何者による意志も確率的過程も介在せず決定論的に動いていきます。

ロボットは完璧にプレイヤーが記述した論理の通りに動きますが、時にプレイヤー自身の想像を超える振舞いを見せることがあります。これはプログラミングの醍醐味と言えるでしょう。

Herbertは、このようにプログラミングのエッセンスを誰もが体験できるゲームです。

これは単純に知的な楽しみにもなりますし、プログラミングを始める上での一つの思考的な取っ掛かりにもなると思います。また、Herbertのプレイを通じて、再帰や関数といったプログラミングの基本的な要件の多くを学ぶこともできます。

Herbert Online Judgeは、このように魅力がたくさん詰まったゲームであるHerbertをたくさんの人に楽しんでプレイしてもらうために作られたサイトなのです。


画面

f:id:quolc:20110314003747p:image

これがHerbertのプレイ画面です。

http://herbert.tealang.info/problem.php?id=3を開くと同じ画面が見られます。)


フィールド

まず画面右の正方形のパネルを見てみましょう。これがフィールドです。

フィールドは25*25の碁盤の目状になっていて、その上にいくつかの種類のオブジェクトが配置されています。


まず、中央部の が、このゲームの主人公?である、Herbertです。

Herbertはプレイヤーが入力したプログラムに従って動くロボットで、碁盤の目の上を一歩ずつ前進することと、左右に90度ずつ回転することができます。


四隅に置かれた ○ は、ターゲットと呼ばれます。

このゲームの目的は、Herbertを動かして全てのターゲットを踏ませることです。


四辺上に長く伸びている黒い領域は、壁とかブロックとか呼ばれます。

この領域にはHerbertは入ることが出来ず、壁に面してHerbertが前進しようとしても、足踏みしてしまいます。

また、フィールドの外周も同様に振る舞うのでHerbertがどこかへと消えてしまうことはありません。


Herbertを十字型に囲んでいる四つのは、トラップと呼ばれます。

トラップを踏むと、それまでに踏んだターゲットの状態が全てリセットされてしまうので、再び踏みなおさなければいけなくなります。

必要に応じて、上手くトラップを避けたりターゲットを踏みなおすようにHerbertを動かさなければいけない、というのがこのゲームのポイントです。


各種情報

画面左上の文字が書いてある部分には、重要な情報が記載されています。

Pointsは、ターゲットの総数と、(Herbertが動いている間)今までに踏んだターゲットの数が表示されています。

Bytesは、自分が書いたプログラムのバイト数と、上限バイト数とが表示されています。

バイト数というのはプログラムの長さの事で、問題ごとの上限に収まるよう、プレイヤーは頭を捻って十分に短いプログラムを書かなくてはいけません。


コーディングエリア

画面左側の四角い領域が、プログラムを書く場所です。

プログラムは半角英数字(と一部の記号)を使って記述します。

具体的なプログラムの記法については次回以降解説します。


コントロールエリア

コーディングエリア下のボタンなどが並んだ部分です。

プログラムが書けたら、一番左の「▶」(実行ボタン)を押すことでHerbertがプログラムを読んで動き始めます。

動いているHerbertを止めたり、動き終わったHerbertを初期状態に戻すには二番目の「■」(停止ボタン)を押します。

その右の「>」(ステップボタン)を押すと、Herbertを1動作ずつ停止させながら動かすことができます。

一番右側のスライダーで、Herbertの動く速度を調整する事が出来ます。

自分のプログラムの振舞いを慎重に確かめたければゆっくり動かせば良いですし、たくさんHerbertが動かないと解けない問題の場合、速く動かせば良いでしょう。


情報ウィンドウ

一番下の横長の領域です。ここには色々な情報が表示されます。

例えば、実行しようとしたプログラムが間違っていた場合には"Invalid Code"などと表示されたり、問題をクリアした際にランキング登録が完了したときにその旨教えてくれたりします。


以上で画面と大体のルールの解説は終わりです。

HOJには他にもランキングなどが表示されていますが、これは今は説明の必要はないので、遊びながら覚えてもらえればよいのではないかと思います。


それでは、最後に試しにHerbertを動かしてみましょう。

http://herbert.tealang.info/problem.php?id=1 を開いて、コーディングエリアに


ssss

と打ち込んで、実行ボタンを押してみましょう。

Herbertが4歩前進して、上方のターゲットを踏んでくれましたか?

"Cleared!"とポップアップが出たら、このチュートリアルは完了です。


なお、この際"Please login before submit your solution."と情報ウィンドウに表示されたと思いますが、ランキングに名前を登録するにはHOJにプレイヤー登録しておく必要があります。

今後プレイするつもりがあれば、ブラウザ画面右上の「register」からユーザー登録して、ログインしておきましょう。

ランキングに自分の名前が出ると、プレイに張り合いが出て楽しくなりますよ!


次回は、今回打ち込んだプログラム(次回以降は「コード」と表記します。)の解説をしつつ、初歩的なプログラムの記法を覚えたいと思います。

それでは、さようなら。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証