新入社員、Javaのメソッド化に苦戦する
- 2016.06.03
- 新入社員研修
こんにちは。シンメトリック新入社員の田中です。6月に入り、研修課題の締め切りまであと1か月になりました。入社したときに比べると、少し成長したかなと思っています。
新入社員、メソッド化に挑戦する
今週からは、置ける駒がなければ自動的に相手のターンに移行する、2人とも置ける駒がなければ試合が終了するなどの処理を書いていこうと考えました。 そこで今までのコードに新しい処理を書き足していこうと考えました。
しかし、現在のコードは、処理をずらーっと書いているだけなので非常に見にくく、また新しく機能を追加するとほかの処理に影響が出て、エラーの嵐が発生する状態になっていました。
先輩方のアドバイスにより、新しく処理を追加して書いていくより、まずはそれぞれの処理をメソッド化し、呼び出すという形にして、処理の変更や追加をやりやすくしようと考えました。
新入社員、メソッド化に手こずる
今まではよく分からなかったため、メソッド化については少し避けていました。なので書き方が分からず、調べることから始めましたが参考書やネットなどを読んだだけでは分かりませんでした。
「public??private??static??void??調べてもよう分からへん。」てな感じでした。
実際、今もこれらは分かってはいませんが、何度も書くことによってメソッド化が出来るようになりました。
ここで苦労したのが、今のぐちゃぐちゃのコードをどのようにして分解するか、またどうやってそれを組み立ていくのかでした。 今のコードは分からないながらも分からながらも書いた、動くのが奇跡のようなコードです。
この絶妙なバランスで保たれているコードを崩して、書き直そうとすると当然のごとくとエラーが出まくりました。
せっかく今まで頑張って書いたオセロのコードが動かなくなったりしたため、何度も元に戻した方がいいのではないかと考えることもありました。
ある程度オセロは対戦が出来るまでになっていたので、後戻りしてしまった感じがして非常に悲しかったです。
新入社員、メソッドを駆使する
しかし、一旦メソッドの書き方、使い方が分かると非常に便利だということが分かりました。
今まで長々と書いていた処理や、何度も使う処理が、メソッドを呼び出すだけで良くなったので、どのようにして動いているか見やすくなりました。
public boolean finish(){//ゲーム終了かどうかの判定
int x,y;
for(x=0; x<8; x++){
for(y=0; y<8; y++){
if(board[x][y]==0){//盤に駒が置かれていない
return true;//ゲーム続行
}
}
}
return false;//ゲーム終了
}
public int shouhai(){//勝敗の判定
if( !finish ()) {
if(nb > nw) {//黒と白の駒の数を比較
winner =1;
}else if(nb < nw) {
winner =2;
}else if(nb == nw) {
winner =0;
}
}
return winner;
}
例えば上のようなメソッドを作っておけば、boolean finishがfalseであれば試合を終了し、shouhaiメソッドを呼ぶ、というように簡単に表現できるようになります。
また、新しく処理を追加する際も、簡単になりました。
このメソッド化を使って新しく処理を追加していきました。
今回追加したのは、置ける場所がなければ自動的に相手のターンになる処理、黒と白の駒をカウントする処理、マス目に置ける場所がなければ試合が終了する処理、勝敗を判定する処理です。
あとは今回の課題の要件であるタイマー機能の実装をしました。
新入社員、タイマーで手こずる
このオセロ課題では、いくつか要件が設けられており、その一つが持ち時間15秒を過ぎると負けという機能です。 15秒過ぎると負けになるのは少し厳しい感じがしますが。
タイマーの機能はサーバ側で管理するほどではないので、JavaScriptの方で書きました。タイマー機能の実装はすぐに出来そうだと考えていましたが、少し時間がかかってしまいました。 なぜなら、タイマーはそれぞれのブラウザで別々に動くので、それをどう分けて表示させるかが分からなかったからです。
というのも、JavaScriptの方ではプレーヤーの情報を保持していなかったため、ブラウザ側ではプレーヤーの判別ができませんでした。
これまで、サーバ側のJavaの方でプレーヤーの情報やターンの情報を全て管理し、JavaScriptの方ではJavaの情報をブラウザに伝えるだけという方針でやっていました。 そのため、JavaScriptの方でもプレーヤーの情報を保持するという発想が思いつかず、時間がかかってしまったのです。
ようやくタイマーの機能を実装することが出来ました。また、JavaScript側でもプレーヤーの情報を持つことが出来たので、他の処理ももっと簡単に出来そうです。
新入社員、バグを修正する
これらの機能を実装することによって、最低限の機能を備えたオセロが完成しました。実際に想定通りに動いてくれるかを確認したところ、いくつかバグがありましたが、メソッド化をしたおかげですぐに原因を特定することが出来ました。
メソッドすごい。
見つけられていないだけでまだまだバグはたくさんありそうですが、取りあえずこれでゲーム部分は終わりにしたいと思います。
次からはデータベースを使ったランキング表などを作っていきたいと思います。
あと1か月しかありませんが、納得のいくオセロが出来るように頑張りたいと思います。