C 言語 第 5 週 コメント

C 言語 第 5 週 コメント
Q: 昔のゲームの紹介はとてもおもしろかった。
A: JNetHack の最初のバージョンはかなり昔に作られたものですが、現在に至るまで、継
続的にバグの修正や新しい OS などへの移植が続けられていて、今でも根強い人気のある
RPG ゲームです。不思議なダンジョンシリーズとゲームの概要はほぼ同じですし、ゲーム
の本質的な面白さに関しては、それらの綺麗なグラフィックスで見た目の良さを取り繕っ
ているゲームに対して決して劣っているものではありません。元ネタにされるだけのこと
はあるな、という大変充実した内容です。
テキストだけでも、これだけ面白いゲームが作れるんだというとても良い見本なので、興
味があれば是非挑戦してみてください。

Wikipedia / NetHack


SourceForge.JP / JNetHack プロジェクト


http://sourceforge.jp/projects/jnethack/
ガイドブック


http://ja.wikipedia.org/wiki/NetHack
http://www.jnethack.org/guide.htm
Google 検索: JNetHack スポイラー

https://www.google.co.jp/search?q=JNetHack+%E3%82%B9%E3%83%9D%E3
%82%A4%E3%83%A9%E3%83%BC
Windows 用の最新版は以下のファイルのようです。

jnethack-3.4.3-0.11-win.lzh

http://sourceforge.jp/projects/jnethack/downloads/58545/jnethack-3.4.3-0.11-wi
n.lzh/
Q: 先生が授業で紹介して下さったゲームは少し興味が持てました。他にもあれば教えて欲
しいです。
A: 楽しいゲームを教える授業じゃないんですけどね。JNetHack もそうですが、世の中に
はプログラムのソースコードが全て公開されていて誰でも手に入れて、遊べる、改造・改
良できる、しかもとても面白いというゲームが結構たくさんあって、以下にそのリストが
あります。

Wikipedia / List of open-source video games

http://en.wikipedia.org/wiki/List_of_open-source_video_games
中でも XPilot や BZFlag はネットワークで繋いだ PC 間で対戦プレイも出来るので(と言
うか、そもそも対戦するためのゲームなので)、かなり白熱すると思います。
1/5
遊ぶのも良いですが、どういう仕組みになっているのかにも興味を持ってもらえるとプロ
グラミングに対する意欲も違ってくるんじゃないかなと思います。
Q: コンピュータ関係の事が苦手で楽しめる余裕がない。
A: 3 週目に、発表してくれた石井君も言っていましたが、思い通りに動いた時は、結構な
達成感があると思いますよ。将棋や囲碁等もそうですが、こういうものは人から面白いと
言われて面白いと感じられるものではありません。何度か、我ながら上手く出来たなと悦
に入るような経験をして、達成感を感じると共に、面白いんだということに気付いてもら
うしかないのんじゃないかと思います。そういう意味では、きっかけは何で構いません。
授業で紹介した sketch やプログラミンをつついて遊んでみるとか、授業で提供しているサ
ンプルプログラムを改造して遊んでみるとか、教科書や参考書に載っている例題を幾つか
こなしてみるとか、あまり最初から苦手意識を持たずに、少しでも楽しめそうなところが
あれば、ほんの少しでも良いので時間を割いて取り組んでみてください。きっと、なにか
しら得るものがあると思います。
Q: 授業中に自分でプログラミングをする時間が少ないです。
A: もちろん、自分で手を動かして、プログラムを変更してみて、作ったプログラムを動か
してみて、ちゃんと動くかどうか確認して、動かないならまた修正して、という作業を繰
り返さないと、いつまでたってもプログラミングが出来るようにならないのはその通りで
す。
今日の授業では、じゃんけんのプログラムを紹介し、後半では、3 回戦バージョンに改造す
るということを実際にやってみました。
じゃんけんのプログラム自体は、ロジックもそれほど複雑ではありませんから、ちょっと
慣れた人、ちょっとかじった人であれば、1 から作ってもらっても、おそらく 2~3 割の人
は 1 コマあれば完成してくれると思います。
改造に関しても、たった数行(for 文と for 文に必要な変数の追加に 3 行、getchar が ENTER
キーも読み取ってしまうため、それを無視させるのに 1 行(switch 無いで処理した場合)、も
しくは 3 行(getchar の前後で処理した場合))の変更でしたから、慣れている人なら、やはり
朝飯前でしょう。
ただ、問題なのは本当に初心者の人や苦手な人です。今回のやった内容で、こういう動作
をするプログラムを 1 から作ってください、このプログラムをこういう動作になるよう改
造してください、と言った場合に、何をどう組み立てて良いのか、何をどう変更すれば良
いのか分からないという人が、多分 2~3 割くらいいるんじゃないかと思います。
そういう意味でも、実際にじゃんけんのプログラムを一から作成すると、どういう処理に
なるか(というのを入力と、入力の変換と、勝敗の判定の 3 つに分けて)、また、改造すると
して、どこをどうやって改造して行けば良いのかと言うのを(まず 3 回繰り返すところを作
2/5
って、動かしてみて、動きのおかしいところを確認して、そこをどうやって修正するとい
うのを)、実際にやって見せていたのですが、
「講義は自分にはなかなか難しいと感じていま
す」や、
「授業でやっていることがあまり理解できあいのと、話についていけないです。」
等のコメントを書いてくれていた人が、やはり何名か出てしましました。
教科書の内容については、
「1 通り終わっています。(2 年次)」と書いてくれているので、2
回目履修の人で、もう少し発展的な内容をやりたいのだと思いますが、とりあえず、今回
のじゃんけんのプログラムを改造して、勝敗の集計機能を追加してみるとか、あっち向い
てほいを追加してみるとか、いろいろ遊んでみてはどうでしょうか?
Q: 講義では rand 関数等の乱数を生成する命令が取り上げられていたのですが、パーリン
ノイズ(perlin noise)を生成するにはどうしたら良いのでしょうか?
A: 以下で紹介されているノイズでしょうか?

Wikipedia / Perlin noise

http://en.wikipedia.org/wiki/Perlin_noise

http://ja.wikipedia.org/wiki/%E3%83%91%E3%83%BC%E3%83%AA%E3%83%
B3%E3%83%8E%E3%82%A4%E3%82%BA
寡聞にして perlin noise という名称は、はじめて知りました。
英語版 Wikipedia の末尾にある外部リンク一覧で「Original source code of Ken Perlin's
'coherent noise function'」と紹介されている以下のページに掲載されているコードが 1997
年に the Academy of Motion Picture Arts and Sciences から Technical Achievement
Award を受賞したオリジナルのコードのようです。

Ken's Academy Award: Noise and Turbulence

http://mrl.nyu.edu/~perlin/doc/oscar.html
また、日本語版 Wikipedia の末尾にある外部リンク一覧で「Ken perlin による改良パー
リンノイズ(2002 年)の Java ソースコード」と紹介されている以下のページに掲載され
ているコードが、2002 年の SIGGRAPH で発表された改良版のコードのようです。

Improved Noise reference implementation

http://mrl.nyu.edu/~perlin/noise/
生成する方法については、単純に上記のコードを持って来て動かせば生成できるはずです
が copyright は書いてあるものの license が明記されていないので、教育・研究目的や個
人的な利用ならともかくとして、第三者に配布するような用途では、まず、著作者である
Ken Perlin 氏にお伺いを立てておかないと、著作権的な問題が生じる可能性があります。
ノイズの雰囲気的には、いわゆるランダムフラクタルによるノイズの一種のようですから、
perlin noise そのものではなくても良いのであれば、中点変位法によるランダムフラクタル
を生成してぼかし処理を入れると、似たような雰囲気のノイズは出来るはずです。
中点変位法は以下のページが参考になるでしょう。
3/5

コンピュータによる画像生成 / 5. シェーディングモデル ./ 5.9 フラクタル


http://nishitalab.org/user/nis/CG/cgtxt/cg5/cg59.htm
神奈川大学理学部情報科学科羽鳥研究室 / 久保田清香 / 中点変位法によるフラクタ
ル3D画像

http://www.info.kanagawa-u.ac.jp/~hatori/study/yousi2004-2.htm
Q: tty_getkey_example2.c をコンパイルすると Error: 外部シンボル _tty_begin が未解
決と出てくるのですが、何か不足しているのでしょうか。(Borland の方で)
A: これはコンパイル時に、tty_getkey.c を一緒にコンパイルするのを忘れている例です。
Borland C++ の場合、以下のように、tty_getkey_example2.c と tty_getkey.c の 2 つのフ
ァイルを一緒にコンパイルしてください。
bcc32 tty_getkey_example2.c tty_getkey.c
Q: time_t_test.c と tty_getkey_example2.c のコンパイルが上手く行きませんでした。1
つのフォルダにプログラムをたくさん入れてコンパイルしても大丈夫ですか?また tty の
方は Cygwin でなければコンパイルできませんか。
A: tty_get_example2.c の方は前の人と同じ状況ではないでしょうか?
もし Borland C++ ではなく Cygwin でコンパイルする場合は、授業で解説したように、
事前に curses の開発用ライブラリをインストールしておく必要があります。またコンパイ
ル時は –lcurses というオプションをコンパイラ(gcc)に渡してやる必要があります。詳細は、
講義資料を参照してください。
time_t_test.c の方が、コンパイルできないのはおかしいですね。ファイル名をミスタイプ
していたりはしないでしょうか?
1 つのフォルダに保存しているファイル数については、人間の側が探しにくいとかそいう理
由以外では全く問題になりませんので安心してください。
Q: もう少し自分で簡単なプログラムを作るところからやりたいです。コンパイル実行だけ
でなく、プログラミングしたいです。
A: どんどんやってもらいたいのですが、授業時間外ではできませんか?
とりあえず、教科書の演習を消化してみて、基本的な文法周りを使えるようにしておきま
しょう。
もう少し面白い課題が欲しいというのであれば、授業で紹介したプログラムを改造すると
ころから始めてみてはどうでしょうか?
1 週目で紹介した wavtest.c や bmptest.c を改造すれば、いろいろな音や画像を作れます
し、今日紹介した、stone-scissors-paper1.c や、tty_getkey_example2.c を改造すれば、
テキスト表示だけではありますが、簡単なゲームを作成することは出来るでしょう。
4/5
4 週目で紹介した閏年の判定ルーチンを使って、カレンダーを作ってみるというのも、曜日
の計算方法とか、日付を曜日に整列させる方法とか、結構パズル的な要素が沢山あって、
ハマると面白い題材です。
もし作ってみたいプログラム等があれば、是非提案してください。
Q: じゃんけんのプログラミングがおもしろかった。
“3 回戦”ではなく“先に 3 回買った方
が勝ち”というプログラムにすると、ゲーム性が増して面白そうだが、これも for 文を使用
すると出来るのだろうか?
A: そうですね、確かに現実のじゃんけんに則すなら 3 勝先取性にすべきでした。
是非改造してみてください。
ループを組むための文は、for 文でも while 文でも良いです。実際 for 文は while 文の短
縮表記のようなもので、以下の 2 つのループは全く同じ処理を行います。
while 文によるループ
int i;
i = 0;
while (i < 10) {
// 何らかの処理
i++;
}
for 文によるループ
int i;
for (i = 0; i < 10; i++) {
// 何らかの処理
}
3 勝先取性にするには、プレイヤー、CPU の双方の勝った回数をカウントしておいて、そ
の回数のどちらかが 3 以上になった時点でループを終了すれば良いです。言い換えると、
どちらも 3 勝に満たない場合ループを続けるということになります。
教科書の演習問題の進捗について
今回、コメントシートに進捗を書いてもらいましたが、1章で止まっている人も結構な数
いました。15 回授業ですから、そろそろ半分くらいは終わっておいて欲しかったのですが、
思ったより進捗が悪いので困っています。授業中にプログラムをしたいという人も結構い
ましたが、せめて教科書の 4 章までは理解を進めておいてもらわないと、条件分岐と繰り
返し処理によるロジックの組み立てが出来ません。
出来れば 1 日 1 節くらいのペースで消化して、せめて 1 週間で 1 章くらいは消化してもら
わないと、前期のうちに内容を消化出来ないと思います。
5/5