JAVAプログラミング講座
宇宙のJAVAさん
ノベルゲームをつくっちゃお
転校生を紹介する!
ドバーン!
げ!
Bang!
ぶぎゅ!
さらば、転校生。
君の活躍は、ずっと忘れない・・・
さて、盛り上がった所で講座をはじめます.
はーい!
最初に残念なお知らせがあります。
みゃ?
先日友人にこの講座の感想を聞いた所、「面白い!」という感想がかえってきました。
どうやら、この真面目なJAVA講座
が、ギャグコーナーと勘違いされているようです。
あれ? 「クマ先生のナイスジョークコーナー」だと思ってたも〜
本気でJAVA講座だったのかも〜???
・・・ (ブルータス、おまえもか・・・)
そこで、私も本気になりました。
そんな訳で、今ちまたで大流行の 「ノベルゲーム」 を JAVA で作りましょう!
どういう、本気なんだも〜??
みゃにやら難しそうだみゃん。
さしあたり、どのような考え方でプログラムをしていくのかを中心に講座を進めていきます。
くま先生の ノベルゲームをつくっちゃお(全4回)
第1回 外部のテキストファイルを読み込もう
例のごとく、JAVAプログラムの名前を変えましょう。
今回は「novel.java」という名前にします。
第3部(1)の雛型の JavaBase11.java を novel.java にリネイムしてください。
あと、sample.html
をテキストエディタで開きます。
今回はゲームサイズを 480X360 にします。 アプレット名とサイズを変更してください。
<APPLET CODE="novel.class"
WIDTH=480 HEIGHT=360> </APPLET> |
変更しみゃ!
さてノベルゲームでは、ノベル(文章)が表示されます。
当りまえだも!
プログラムの中にノベル(文章)を書くことも出来るのですが、文章がちょっとでも変わるたびにコンパイルしなくちゃいけないし、大量の文章がプログラムの中に入っているとかっこ悪い気がします。
「あんた、ばかぁ!?」って聞こえてきそうだみゃ
そこで、文章の書いてあるテキストファイルを用意し、JAVAアプレットからそれを読んで、画面にノベルを表示することにします。
さしあたりテキストファイルを作ります。 名前は「start.txt」としましょう。
start.txt
ある日 森の中 くまさんに出会った 花咲く森の道 くまさんに出会った くまさんの言うことにゃ お嬢さんお逃げなさい ところが くまさんが あとから ついてくる お嬢さん お待ちなさい ちょっと 落とし物 あら くまさん ありがとう お礼に歌いましょう |
この名曲の歌詞をさしあたり使いましょう!
さて、ここからプログラミングです。
まずは読み込んだ文字列を収納する変数を、グローバル
艦長 で宣言します。
文字列は String クラスを使います。 読み込む行は1行ではないので、配列宣言します。
public class novel extends Applet { // グローバル変数 String scene[]; |
次に宣言した変数を初期化します。
普通の変数では必要ないのですが、配列宣言した場合は初期化が必要です。
最大で1000行読み込めるように、init() で配列初期化しましょう。
public void init() { // 初期処理 scene = new String[1000]; |
これでこのプログラム内で、scene[0]〜scene[999]
までの1000個の文字列を収納できる変数が使えます。
できたも〜
次に「指定したテキストファイルを読み込んで、scene[]
にテキストを収納する関数」を作ります。
難しそうみゃ。
変数名は「LoadScene」にします。 update()
関数の下にでも作りましょうかね〜
引数でテキストのファイル名を受け取れるようにします。
public void update(Graphics g) { // 再作画処理 paint( g ); } // update() // ----------------------------------------------------------- public void LoadScene( String filename ) { } |
さて早速、LoadScene()
の中身を作っていきます。
まず、全ての scene[] 変数の中身に null を入れて、初期化します。
null
は、「何にも入っていない」ってことです。
public void LoadScene( String filename ) { for(int i=0; i<1000; i++) { scene[i] = null; } |
次にテキストファイルを読み込むための初期設定をします。
外部から日本語を含んだテキストファイルを読むプログラムは次のようになります。
InputStream is = new URL(getCodeBase(), "kuma.txt").openStream(); InputStreamReader myin = new InputStreamReader( is ); BufferedReader ds = new BufferedReader(myin); |
このプログラムでアプレットと同じ場所(フォルダ・ディレクトリ)に置いてある
kuma.txt というテキストファイルを読み込むための準備が完了します。
この初期化後、ds.readLine() という命令で kuma.txt の内容が上から1行ずつ取り出せます。
実際に
LoadScene() にプログラムを書き込みます。
public void LoadScene( String filename ) { BufferedReader ds = null; for(int i=0; i<1000; i++) { scene[i] = null; } try { InputStream is = new URL(getCodeBase(), filename ).openStream(); InputStreamReader myin = new InputStreamReader( is ); ds = new BufferedReader(myin); } catch ( IOException e ) { System.out.println("テキストファイル読み込みエラー " + filename ); } |
try-catch
は、第1章の STORY5 でやりましたね。
動くかどうかわからないプログラムを囲むもんだも〜
そうです。指定したテキストファイルが存在しなかった場合などが考えられますので、この初期化には
try-catch が必要です。
System.out.println() というのは、JAVAコンソールに文字を表示する為の命令です。
もし、このテキストファイル読み込み初期化プログラムが上手く動かなかった場合は、JAVAコンソールに「テキストファイル読み込みエラー」 と表示されます。
次に実際にテキストを読み込みつつ、scene[]
に収納していきます。
うえから次々読んでいくので、for文 を利用します。
BufferedReader ds = null; |
ds.readLine()
という命令のたびに、テキストフィルの内容が1行ずつ読み込まれます。
それを一度 変数 s に入れて、その変数 s を scene[i] に入れているわけです。
for文 でループさせて、全ての文章(最大1000行)を scene[] に収納します。
readLine() も try-catch が必要な命令です。そこで、try-catch で囲ってあります。
if
( s==null ) break; って、なんだみゃ???
それはですね、テキストファイルのすべて行を読み込んで、これ以上読めなくなったら
readLine() は null を返すんです。
そこで null が 変数s に入ったら、テキストファイルを読み切ったということなので、break 命令で for ループ
から抜け出し、テキスト読み込み処理を終了します。
これで
LoadScene() 関数は完成です。
無事、テキストファイルを読み込むことが出来ました!!
無事って言われても、本当に読み込まれたかどうかわからないも〜
それもそうですね。 ではJAVAコンソールに文字を表示する
System.out.println() を使って読み込ませたテキスト文章を表示されてみましょう。
for(int i=0; i<1000; i++) { try { s = ds.readLine(); } catch ( IOException e ) { System.out.println("テキストファイル読み込みエラー" ); } if ( s==null ) break; scene[i] = s; } for(int i=0; i<1000; i++) { if (scene[i] != null) { System.out.println(">" + scene[i] + "\n"); } } |
先ほどのプログラムの下に、ピンクのプログラムを追加します。
これで、読み込んだテキストファイルの文章が JAVAコンソールに表示されます。
if
(scene[i] != null) は要らないんじゃないかも〜
いえ必要です。
もし scene[i] が null だったら、その行をJAVAコンソールに表示するのを止めているのです。
これが無いと、JAVAコンソールに1000行近くの null が表示されてしまいます。
なるほども。
で、このままでは当然
LoadScene() は呼び出されていないので、実行される事はありません。
そこで init() から LoadScene() を実行します。 読み込むテキストファイル名は、当然先ほどの「start.txt」です。
public void init() { // 初期処理 scene = new String[1000]; LoadScene("start.txt"); // マウス処理アクションリスナー定義と登録 addMouseListener(new MouseAction()); } // init() |
動かしたけど、何もでないみゃ。
どうなってるんだみゃ?
さっきも言ったとおり
JAVAコンソール に 読み込んだテキストを表示しています。
アプレットの画面には何も表示されません。
JAVAコンソールって、どうやってみるにゃ?
appletviewer
で sample.html を動かしている場合は、appletviewer を起動したコマンドプロンプト(MS-DOSプロンプト)上に文字が表示されます。
Ineternet Explorer を使っている人は、メニューバーの「表示 (V)」から「Java コンソール (J)」で見られます。
Netscape の場合は、メニューバーの「Communicator (C)」から「ツール (T)」の「Java Console (J)」で見られます。
ほんとだ。 テキストファイルの内容が表示されているも。
アプレットでのテキストファイルの読み込み成功だも〜
あれ? ぼくの
Internet Explorer に「Java コンソール (J)」なんて無いよ。
その場合はメニューバーの「表示
(V)」の「インターネット オプション (O)」を選んでください。
えらんだみゃ。
そしたら、「詳細設定」で「Java
console enabled (Javaコンソールを表示する)」をチェックして、ブラウザを立ち上げなおしてください。
こんどは、OKみゃ。
では次回は、今回ファイルから読み込んだ文章(ノベル)をアプレット画面に表示してみましょう。
では、また次回!
- 第2話につづく -
宇宙のJAVAさん (C) BakuretuKen 2000 |