デジタルコンテンツ1
最終レポート
森のどうぶつさんを救え!
orzJr. 2014/07/28
■メンバー
西崎 絵麻 5412077 坂口 早紀 5412022 石井 悠加里 5412047 川口 美香 5412057■作品の狙いやアイデア
プレイヤーに制限時間付きの計算問題を解いてもらい、正確に素早く計算問題を解く力を養う。 単なる計算ゲームではなく楽しい計算ゲームとして遊んでもらいたい。従って、ピンポンゲームの他にボーナスステー ジを用意することで単なる計算ゲームではなく応用を効かせたゲームとなる。最終的にはゲームスコアを表示し、より スコアを上げたいと思わせ何度もゲームを行ってもらうのが狙い。■プログラムの仕様
・Main クラス ・void setup() それぞれのクラスのインスタンスを生成している ・void draw() 問題が選択されているとき下記の処理を行う スコアが一定の条件を満たしている場合ランダムでボーナスステージを選択する。 ボーナスステージのインスタンスが null でない場合、ボーナスステージの問題等を描画しボーナスステージが 終了したらボーナスステージのインスタンスを再び null する。 ボーナスステージにいかない場合、以下の処理を行う。 問題、ボール、ボールの残り個数やカウント数、スコアを表示する。 バーの表示は、問題が正解(solved が true)の場合のみの表示となる。 さらに、ボールとバーがぶつかった場合、問題を次の問題に設定しスコアを加え、条件に該当する際ボール のスピードを上げる。 不正解(solved が false)の場合は問題が解けるまで表示するので、そのまま問題を表示する。 ボールが画面を超えてしまった場合、Ball Miss!と表示し、アイテムの効果をなくし、残りのボールの数を減ら す。 ボールが指定した一定の位置まで到達したらボールが画面上から再び登場する。 そして、アイテムの描画をする。 ボールの残りの数が 0 になったら gameover 画面の描画をする。 ・void keyPressed() キーを使用するのは、難易度の選択、ボーナスステージでの解答、バーの移動、問題の解答、gameover 画 面での top に戻る際使用する。 難易度選択では指定したキーを押すと難易度が選択できる。 ボーナスステージでは、入力した解答が正解ならばスコアをアップするメソッドを呼び出し元のスコアに加えて いる。 バーの移動では、指定したキーを押すと右、左に動くようになっている。 問題では、入力した解答が正解ならばスコアをアップするメソッドを呼び出し、不正解した場合はスコアをダウ ンするメソッドを呼び出し、元のスコアに加えている。
Gameover では、Enter を押すと home 画面に戻るようになっている。 ・Ball クラス このクラスはボールの表示や動き、バーとの接触判定、残機の管理をする。 ボールの x 座標, y 座標、ボールの速さの dx, dy、 バーがボールを跳ね返した回数の cnt、バーがボールに当たったかの判定結果である check ボールの残機数の life のアクセサメソッドを含む。 ・void move() 画面の端までいったら速さの符号を反転させて跳ね返るようにする 画面下方よりもボールが下にいってしまったら、cnt を 0 にする ・void displayBall() ボールのサイズや色を決定し表示 ・void speedUp(int x) cnt を引数として、それが 5 で割り切れる、且つ、dx, dy の絶対値が 5 以下だったら dx, dy を1増やすので最高速度の絶対値は dx, dy とも 6
・void displayInfo()
バーとボールが何回跳ね返った回数をテキストで、残機数をグラフィックで表示 ・boolean isCheck(Bar bar0)
バーとボールが接触しているかを判定し、接触しているならば跳ね返し、check に記憶する ・void life() ボールのライフを1減らす ・Bar クラス バーの長さを変える。バーの表示、動作をさせる。 バーの X 座標、Y 座標、長さのアクセサメソッドを含む。 ・void display() バーの表示 ・void move(int dx) Main クラスの keyPressed()メソッドを利用して、 押されたキーが‘d’のとき右に、‘a’のとき左にバーの移動をさせる ・Program クラス 簡単、ふつう、難しい問題を作成するために、共通部分を抜き出し、一般化し「問題」として扱いやすいように抽象ク ラスとして作成した。それぞれの問題クラスで処理が異なるものは抽象メソッドとして作成し、処理が同じものは Program クラスで作成した。
・abstract void backIgmg()
背景の画像を設定するための抽象メソッド ・abstract Program next()
次の問題を設定するための抽象メソッド ・boolean isCheck()
入力した解答が正解か判定する ・int getAnswer()
問題の解答を返す
・void setAnswer(int answer) 問題の解答を設定する ・int getScore() プラスするスコアの値を返す ・int loseScore() マイナスするスコアの値を返す ・void display() 問題の表示、正解か不正解かの視覚的表示 ・EasyProgram クラス Program クラスの継承、1 桁同士の足し算、引き算の問題を設定する ・void setProgram() 演算子の設定、決定した演算子によって問題の解答を設定
・void backImg() 指定した画像を背景に設定 ・EasyProgram next() 次の問題を作成(インスタンス生成) ・NormalProgram クラス Program クラスの継承、1~50 足し算、引き算、1 桁同士掛け算の問題を設定する ・void setProgram() ランダムで足し算か引き算か掛け算を設定するメソッドを呼び出し選択する ・void setProblemPlus() 足し算の問題設定、ユーザーに求めている解答も設定する ・void setProblemMinus() 引き算の問題設定、ユーザーに求めている解答も設定する ・void setProblemMult() 掛け算の問題設定、ユーザーに求めている解答も設定する ・void backImg() 指定した画像を背景に設定 ・NomalProgram next() 次の問題を作成(インスタンス生成) ・HardProgram クラス Program クラスの継承、2 桁の足し算、引き算、1 桁と 2 桁の掛け算の問題を設定する ・void setProgram() ランダムで足し算か引き算か掛け算を設定するメソッドを呼び出し選択する ・void setProblemPlus() 足し算の問題設定、ユーザーに求めている解答も設定する ・void setProblemMinus() 引き算の問題設定、ユーザーに求めている解答も設定する ・void setProblemMult() 掛け算の問題設定、ユーザーに求めている解答も設定する ・void backImg() 指定した画像を背景に設定 ・HardProgram next() 次の問題を作成(インスタンス生成) ・Score クラス スコアの計算、表示をする。 ・int getScore() 現時点のスコアを返す ・void setScore(int score)
引数の値が 0 以上のとき、値をスコアに代入する ・void addScore() スコアを追加する 1 回ボールを跳ね返すと 100 点追加、 5 回ボールを跳ね返すごとに追加される値が 100 点アップ ・void display() スコアを画面に表示。 ・Top クラス トップ画面を表示させ、ゲームの難易度選択をする。 ・void display() トップ画面の背景画像を表示 ・void select(char key))
Main クラスの keyPressed()メソッドを利用して 押されたキーが‘d’のとき下にに、‘a’のとき上に画像が移動する。 Enter を押したら選択した難易度の問題が始まる。 選択された問題クラスのインスタンスを生成している。 ・boolean isSelect() 問題の難易度が選択されているか否かの判定をする。 ・End クラス このクラスはゲームオーバー画面を表示する。 ライフの数が0になったら、Main クラスの draw 関数で呼び出される。 ・void display() end 画面と最終スコアの表示 ・void reHome() 各値を初期化して、Enter キーで Top 画面に戻りリトライ可能 ・Item クラス このクラスは各アイテムのクラスの親クラスである。 このクラスはアイテムの動きを管理する。具体的には、アイテムを落下させ、バーに当たったかの判定を行う。 ・int getX() アイテムの x 座標を取得 ・int getY() アイテムの y 座標を取得 ・void move() アイテムを落下させる ・boolean isCheck(Bar bar)
アイテムがバーに接触したかの判定
・SpeedDownItem クラス (Item クラスを継承) このクラスはボールのスピードを一時的に遅くする。
このアイテムに対応するグラフィックを表示 ・void action() 現在のボールのスピードを一旦保存し、現在のスピードの 2/3 のスピードに変更 ・void restore() 元のスピードに戻す。 この際、速さの向きを気にするため、絶対値をとったものに符号をつける。 ・ScoreUpItem クラス (Item クラスを継承) このクラスはスコアに加点する。 ・void display() このアイテムに対応するグラフィックを表示 ・void action() 現在のスコアに 2000 点追加する ・void restore() なにもしない ・PlusOneItem クラス (Item クラスを継承) このクラスはボールの残機を追加する。 ・void display() このアイテムに対応するグラフィックを表示 ・void action() 現在の残機数に1機追加する ・void restore() なにもしない ・SpeedUPItem クラス (Item クラスを継承) このクラスはボールのスピードを一時的に速くする。 ・void display() このアイテムに対応するグラフィックを表示 ・void action() 現在のボールのスピードを一旦保存し、現在のスピードの 2 倍のスピードに変更 ・void restore() 元のスピードに戻す この際、速さの向きを気にするため、絶対値をとったものに符号をつける ・ShortenBar クラス (Item クラスを継承) このクラスはバーの長さを一時的に短くする。 ・void display() このアイテムに対応するグラフィックを表示 ・void action() 現在のバーの長さを一旦保存し、現在の長さを 50 に変更 ・void restore()
元の長さに戻す ・LengthenBar クラス (Item クラスを継承) このクラスはバーの長さを一時的に長くする。 ・void display() このアイテムに対応するグラフィックを表示 ・void action() 現在のバーの長さを一旦保存し、現在の長さを 50 に変更 ・void restore() 元の長さに戻す ・ItemSelect クラス このクラスはアイテムの管理を行う。 画面に表示するアイテムを1種類選び、それを表示させたりアイテムの効果を発動させたり、 アイテムよっては効果をリセットする。 ・Item itemGenerater() 乱数を発生させ、その数に対応したアイテムを返す。 ・void display() アイテムが生成されてない、且つ、ボールがバーに4回当たるごとにアイテムを生成し表示する そのアイテムがバーに当たったら、効果を発動し、制限時間を設定する ・void reset() 制限時間がなくなったら、Item クラスの restore メソッドを呼び出す ・BonusStage クラス うるう年判定、素数判定、降順に答えろといった 3 つのボーナスステージを作成するので、共通部分を抜き出し、 一般化し「ボーナスステージ」として扱いやすいように抽象クラスとして作成した。 ・int getAnswer() 問題の解答を返す ・void setAnswer(int answer)
問題の解答を設定する ・void isCheck() 問題に答えているか否かを判断、答えた場合は入力した解答と解答が一致するか否か判断 ・int getScore() プラスするスコアの値を返す ・void display() 問題の表示、正解か不正解かの視覚的表示 ・LargeOrder クラス BonusStage の継承、4 つの式の答えが大きい順番に数字を入力していく問題の作成 ・void setProblem1() 1 つ目の問題の作成 ・void setProblem2()
2 つ目の問題の作成 ・void setProblem3() 3 つ目の問題の作成 ・void setProblem4() 4 つ目の問題の作成 ・void setLargeNumber() 4 つの問題の解答を大きい順番にソートし、大きい順番に添え字格納し解答となる 4 桁の数字を格納 ・void backImg() 指定した画像を背景に設定 ・void displayProblem() 作成した 4 つの問題を表示 ・LeapYear クラス BonusStage の継承、うるう年とうるう年でないものを設定し問題を作成する ・int getLeapYear() うるう年を返す ・int getNotLeapYear() うるう年でないものを返す ・void setLeapYear() うるう年の設定 ・void setNotLeapYear() うるう年でないものの設定 ・void backImg() 指定した画像を背景に設定 ・void displayProblem() 作成した 4 つの問題を表示 ・PrimeNomber クラス BonusStage の継承、素数と素数でないものを設定し問題を作成する ・int getPrimeNumber() 素数を返す ・int getNotPrimeNumber() 素数でないものを返す ・void setPrimeNumber() 素数の設定 ・void setNotPrimeNumber() 素数でないものの設定 ・boolean isPrime() 素数か判断する ・void backImg() 指定した画像を背景に設定 ・void displayProblem()
作成した 4 つの問題を表示 ・NumberInput クラス このクラスは Program クラスや BonusStage クラスでの解答を入力をするためのクラス ・String getText() 入力している text を返す ・void addChar() 打ち込まれたものを text に追加していく、数字、-、backspace を認識する ・boolean hasNumber() 数字が打ち込まれているか否かを判定する ・int getNumber() 文字列で用意した数字を整数に直し、その整数の値を返す ・void display() 入力画面の表示 ■プログラムの実行の様子 最初の難易度選択の画面 葉が動くようになっており、難易度を選択する
normal モード画面 easy モード画面 hard モード画面 以下では、normal モードのみを見本とする。 正解画面 不正解画面 問題が消え、バーが出現 問題は消えず、バーも出現しない 左上のカウンタ説明 Count バーでボールを跳ね返した回数 Score 現在のスコア 右上のハートの数はボールの残機数を表す 画面中央に問題が現れ、正解するとバーが現れる。 問題を解いている最中にバーは表示されない。
ボールの動き バーに当たったとき ボールを落としたとき ボーナスステージ 素数を選択するステージ うるう年を選択するステージ 4つの式の答えを大きい順に選ぶステージ アイテム落下 バーが出現しているときのみ、 バーとアイテムを接触させて取得できる。 取得したアイテムによって、様々な効果が発動する。 バーやボールの状態を変えるアイテムの場合 一定時間経つと元の状態に戻る。
GameOver 画面 Enter キーを押すと、はじめの難易度選択画面に戻り、リトライできる ■試用結果 当初の作品の完成イメージでは、問題が表示され、問題を解いたらバーが表示されて、バーとボールが接触すると 次の問題が表示されていくものである。さらに当初のアイテムの仕様は問題を正解した場合、2,3回の頻度でアイテ ムが出現する仕様でボールがバーに到達するまでにアイテムが落ちてくるようになる仕様であった。ボーナスステー ジは、3 種類程度作成し、知識問題や少し難しい問題を用意し、あとどのくらいでボーナスステージに行けるかをメー ターで表示しユーザーに視覚的に分かるようにする予定であった。 実際に作成し、問題やアイテムの種類や表示、ボーナスステージの種類や表示は企画書を実現できた。しかし、ア イテムの出現がボールとバーが接触するまでに到達する予定であったが実現できず、連続して正解している場合 3 回に 1 回落ちてくる仕様にした。しかし、実際に実行し、なかなかアイテムが取れないので、アイテムを取り逃した場 合次のアイテムが出現するようにした。アイテムの効果の継続時間などを考慮し 4 回に 1 回でてくるように仕様を変 更した。さらにボーナスステージではメーターを表示させる予定であったが実現できず、メーターは表示せず一定の スコアになると自動的にボーナスステージに行くといった仕様になった。 実際にメンバーがこのゲームを実行し、問題の難易度やアイテムの出現確率、ボーナスステージの出現確率やスコ ア設定などを微調整し、ほどよくゲームを続けられるようになっている。 そして、問題解いている間ボールが動くのでいち早く問題を解こうといった気持ちになり、1 回でも問題に不正解する とボールが落ちてくる確率が高くなるため、間違えないように正確にかつ素早く問題を解こうといった気持ちになった。 ボーナスステージでは、うるう年、素数においては知識があれば確実に解ける問題ではあったが降順に並び替える 問題においては高い計算力がないと解けないものとなった。アイテムにおいてはなかなか入手が困難であるが、取れ なくてもすぐにアイテムが降ってくるため、アイテムを取ろうという気持ちになった。 ■今後の課題 ・現状では正解するまで同じ問題が出されているが問題に不正解したら違う問題を出したい。 ・現状では1種類のボールだが、色々な種類の動物のボールを使えるようにしたい。 ・draw 関数の中身をもう少し簡潔にしたい。 ・前回のスコアやハイスコアなどをつくると、より繰り返し遊んでもらえるようになると思った。