前期の「コンピュータ基礎および演習I」に引き続き、 後期の「コンピュータ基礎および演習II」では、夏休みの課題を課すこととします。 この課題は新規履修者 (1年生) が対象です。 再履修者 (主に2年生以上) はこの課題の提出対象ではありません。
解答は
- ホスト: earth.mlab.im.dendai.ac.jp
- ディレクトリ: /home/submit/1I-Computer2/summer/[学籍番号]
に提出しなさい。ソースファイル (〜.java) のみを提出。 提出は gFTP 等の ftp ソフトを用いて行うこと。
提出期限: 2006年9月15日(金曜日)
パラパラマンガ風にアニメーションを行うプログラムを考えてみよう。
アニメーションのようなものは、本来グラフィック表示する方法が適しているが、 今回はまだ学んでいないので、文字を組み合わせて表示するもので我慢する。
ここでは、次のような方針でアニメーションを行うことを考える。
アニメーションは複数のコマからなっている。 (国内の通常のテレビの規格 (NTSC) では1秒間に約30コマ) 1コマごとに画面の消去とシーンの描画を繰り返し行う。 これを高速に繰り返せば、アニメーションのように見えるはずである。
プログラムの中では、 アニメーションの1コマ1コマの処理を、繰り返しの処理と考えると 次のような考え方でアニメーションを行うことができる。
while (無限の繰り返し) { アニメーションに必要な座標などの計算 画面の消去 アニメーションの1コマの表示 }
そして、これをJavaで書くと、 おおよそ次のような枠組みのプログラムでアニメーションを行うことができる。
注意: 実行中のプログラムを終了するためには、 Ctrl+C (Ctrlキーを押しながら「C」を押す) を押す。 Emacs の shell モードでは表示が乱れることがあるので、 通常の端末エミュレータ (ターミナルエミュレータ) で実行すること。
while(true) { //アニメーションに必要な座標などの計算 ...... ...... // 画面を消去するおまじない System.out.print("\u001b[H\u001b[2J"); // アニメーションの1コマの表示 ...... ...... // 時間稼ぎ (0.2秒) をするためのおまじない try { Thread.sleep(200); } catch(Exception e) { } }
以下の例題1〜3のプログラムを読み実行してアニメーションの原理を理解したあと、 さらにその後に示す「夏休みの課題」を行い提出しなさい。
1から10までの数字をアニメーション的に順番に表示する プログラムを考えよう。
[ ダウンロードして実行してみよう ]
/* 1 から 10 までの数字を表示するようなアニメーションを行うプログラム */ class OneToTenAnimation { public static void main (String[] args) { // 1 から 10 までを数える変数 int x = 0; while(true) { // 1コマごとにxを1ずつ増やす x = x + 1; // 10を越えたら繰り返しを終了する if (x > 10) { break; } // 画面をクリアするおまじない System.out.print("\u001b[H\u001b[2J"); // 数字を表示する System.out.println(x); // 時間稼ぎ (0.2秒) をするためのおまじない try { Thread.sleep(200); } catch(Exception e) { } } } }
次に、ボール「o」を左から右へ移動するようなアニメーションを考えてみよう。 この場合ボール「o」の位置を表す変数 x を用意し、 アニメーションの1コマごとにこの変数の値を変化させる。
ボール「o」を表示する際には、 x の値ぶんの空白を表示しその次に o を表示すれば良い。
[ ダウンロードして実行してみよう ]
/* o→ ..... o のようなアニメーションを行うプログラム */ class BallSlider { public static void main (String[] args) { // 「o」の位置を表す変数 int x = 0; while(true) { // 1コマごとに「o」の位置を右に移動 x = x + 1; // 7つ進んだら繰り返しを終了する if (x > 7) { break; } // 画面をクリアするおまじない System.out.print("\u001b[H\u001b[2J"); // 変数xのぶんだけ空白を表示し、次に「o」を表示する for(int i = 0; i < x; i++) { System.out.print(" "); } System.out.println("o"); // 時間稼ぎ (0.2秒) をするためのおまじない try { Thread.sleep(200); } catch(Exception e) { } } } }
ボール「o」が左右に行ったり来たりするアニメーションを考えてみよう。
この場合、ボールの位置を表す変数 x の他に、 ボールの進む方向を表す変数 direction が必要になる。 ボールを移動させていき、端まで来たら逆の方向に進むようにする。
[ ダウンロードして実行してみよう ]
/* o→ ..... o o ..... ←o のようなアニメーションを繰り返すプログラム */ class KnightRider { public static void main (String[] args) { // 「o」の位置を表す変数 int x = 0; // 進む方向を表す変数 (1: 右, -1: 左) int direction = 1; while(true) { // 進む方向によって「o」の位置を移動 if (direction == 1) x = x + 1; else x = x - 1; // 左端に着いたら進む方向を右に if (x < 0) { x = 0; direction = 1; } // 右端に着いたら進む方向を左に if (x > 7) { x = 7; direction = -1; } // 画面をクリアするおまじない System.out.print("\u001b[H\u001b[2J"); // 「o」を表示する for(int i = 0; i < x; i++) { System.out.print(" "); } System.out.println("o"); // 時間稼ぎ (0.2秒) をするためのおまじない try { Thread.sleep(200); } catch(Exception e) { } } } }
ビリヤードのように2次元平面上をボールが転がっていき、 端までいったら跳ね返るようなアニメーションを行うプログラムを考える。
基本的なアニメーションを行う ひな型のプログラムは以下の通りである。 今回の課題ではこのプログラムを元に機能拡張を行うことになる。
[ ダウンロードして実行してみよう ]
class Ball { public static void main (String[] args) { // 枠のサイズの指定 int width = 46; int height = 20; // ボールの座標 int x = 0; int y = 0; // ボールの速度 (x方向とy方向) int vx = 1; int vy = 1; // ボールの移動をくり返し続ける (プログラムを止めるにはCtrl+Cを押す) while(true) { // ボールを移動 x = x + vx; y = y + vy; // 枠外にはみでたら進む方向を逆にする (速度の正負を反転させる) if (x < 0 || x > width) { x = x - vx; vx = -vx; x = x + vx; } if (y < 0 || y > height) { y = y - vy; vy = -vy; y = y + vy; } // 画面をクリアするおまじない System.out.print("\u001b[H\u001b[2J"); // 枠を書き、ボールを表示する for (int i = 0; i <= width+2; i++) System.out.print("-"); System.out.println(); for (int i = 0; i <= height; i++) { System.out.print("|"); for(int j = 0; j <= width; j++) { // 座標 i,j の位置にボールがあるならば o を表示、 // なければ空白を表示 if (i == y && j == x) System.out.print("o"); else System.out.print(" "); } System.out.print("|"); System.out.println(); } for (int i = 0; i <= width+2; i++) System.out.print("-"); System.out.println(); // 時間稼ぎ (0.2秒) をするためのおまじない try { Thread.sleep(200); } catch(Exception e) { } } } }
ひな型のプログラムを機能拡張し、ボールを示す文字「o」を、 ボールの進む向きによって変化するようにしなさい。
右方向に進んでいるときには「<」が、 左方向に進んでいるときには「>」が表示されるようにしなさい。
プログラム名は FlippingBall とする。
ひな型のプログラムを元に、 各自で考えた追加機能を1つ以上 (複数可) 実現しなさい。 追加機能は各自で自由に考えるものとするが、 例えば、次のような機能のなかから選択することなどが考えられる。
実現した機能の数や実現できた難易度によって評価されるので、 各自工夫を凝らしてがんばって欲しい。
プログラム名は MyBall とする。
提出物は以下のとおり: