SSブログ

Java:教科書(上)の復習「すごろく」 [勉強]

あなたとわたし、わたしとあなた、互いに感じるこの官能。
さあみんあいっしょに声をそろえて唄おう、高らかに。
ひぁ うぃー ごー、えぶりぼーでぃ、かもん、ロックンロール。
ゆー あん みー、みー あん ゆー、れっつ、ロックンロール。

こなさん、みんばんは。「スネークマンショー」の「ごきげんいかがワン・トゥ・スリー」から始めてみました。しゃくれアゴです。

ず~っと頭の中で、java javaしながら、どうやってjavaですごろく作るべきかをずっと考えてました。講師から渡された、教科書(上)をすべて終わった上での復習として「すごろく」つくれと。

課題:
「下記の条件を満たす、すごろくゲームを作成してください」
・プレイヤー1とプレイヤー2が交互にサイコロを振る
・サイコロの目は1~6
・止まったマスによって表1のイベントが発生する
・イベントで進んだり戻ったりした後に止まったマスではイベントは発生しない。
 (8マス目に止まり、2マス進むのイベントが発生し、2マス進んで止まった10マス目のイベントは発生しない。)
・21マス目がゴール
・21マスちょうどでなくても21以上進めばゴール
・プレイヤー1かプレイヤー2のどちらかがゴールした時点でゲーム終了。

20100813_java[00].JPG 20100813_java[01].JPG

さて・・・この課題に対する私の回答ソースは・・・・・・

 

 

public class Sugoroku1 {
 public static void main(String[] args) {
  //すごろくの各マスのイベント
  String[] event = new String[22];
   event[0] = "スタート";
   event[1] = "";
   event[2] = "";
   event[3] = "";
   event[4] = "2マス進む";
   event[5] = "3マス戻る";
   event[6] = "";
   event[7] = "スタートに戻る";
   event[8] = "2マス進む";
   event[9] = "1回休み";
   event[10] = "3マス戻る";
   event[11] = "";
   event[12] = "2マス進む";
   event[13] = "";
   event[14] = "スタートに戻る";
   event[15] = "3マス戻る";
   event[16] = "2マス進む";
   event[17] = "";
   event[18] = "2回休み";
   event[19] = "";
   event[20] = "3マス戻る";
   event[21] = "ゴール";
  
  int play1 = 0;  //プレイヤー1のマス位置
  int play2 = 0;  //プレイヤー2のマス位置
  int play1brk = 0;  //プレイヤー1のターン休み
  int play2brk = 0;  //プレイヤー2のターン休み
  
  while (play1 <= 21 || play2 <= 21) {
  if (play1brk != 0) {
   System.out.println("プレイヤー1のターンは休みです");
   System.out.println();
   play1brk--;
   continue;
  }
  System.out.println("プレイヤー1の順番です");
  int play1Dice = (int)(Math.random() *6)+1;
  System.out.println("プレイヤー1のさいころの目は " + play1Dice + "です。");
  play1 += play1Dice;
  if (play1 >= 21) {
   System.out.println("プレイヤー1はゴールしました★");
   System.exit(0);
  }
  System.out.println("プレイヤー1は" + play1 + "マス目に進んだ");
  
  for (int i =play1; i < event.length; i++ ) {
   if (play1 == i) {
    if (event[i].equals("")){
     break;
    } else if (event[i].equals("スタートに戻る")) {
     System.out.println("イベント発生!! " + event[i]);
     play1 = 0;
     break;
    } else if (event[i].equals("2マス進む")) {
     System.out.println("イベント発生!! " + event[i]);
     play1 += 2;
     break;
    } else if (event[i].equals("3マス戻る")) {
     System.out.println("イベント発生!! " + event[i]);
     play1 -= 3;
     break;
    } else if (event[i].equals("1回休み")) {
     System.out.println("イベント発生!! " + event[i]);
     play1brk = 1;
     break;
    } else if (event[i].equals("2回休み")) {
     System.out.println("イベント発生!! " + event[i]);
     play1brk = 2;
     break;
    }
   }
  }
  System.out.println("プレイヤー1の現在地は" + play1 + "マス目です");
  System.out.println();
  
  if (play2brk != 0) {
   System.out.println("プレイヤー2のターンは休みです");
   System.out.println();
   play2brk--;
   continue;
  }
  System.out.println("プレイヤー2の順番です");
  int play2Dice = (int)(Math.random() *6)+1;
  System.out.println("プレイヤー2のさいころの目は " + play2Dice + "です。");
  play2 += play2Dice;
  if (play2 >= 21) {
   System.out.println("プレイヤー2はゴールしました★");
   System.exit(0);
  }
  System.out.println("プレイヤー2は" + play2 + "マス目に進んだ"); 
  
  for (int i = play2; i < event.length; i++ ) {
   if (play2 == i) {
    if (event[i].equals("")) {
     break;
    } else if (event[i].equals("スタートに戻る")) {
     System.out.println("イベント発生!! " + event[i]);
     play2 = 0;
     break;
    } else if (event[i].equals("2マス進む")) {
     System.out.println("イベント発生!! " + event[i]);
     play2 += 2;
     break;
    } else if (event[i].equals("3マス戻る")) {
     System.out.println("イベント発生!! " + event[i]);
     play2 -= 3;
     break;
    } else if (event[i].equals("1回休み")) {
     System.out.println("イベント発生!! " + event[i]);
     play2brk = 1;
     break;
    } else if (event[i].equals("2回休み")) {
     System.out.println("イベント発生!! " + event[i]);
     play2brk = 2;
     break;
    }
   }
  }
  System.out.println("プレイヤー2の現在地は" + play2 + "マス目です");
  System.out.println();
  }
 }
}

 

・・・美しくない。(T-T;;
ぜんぜんJavaっぽくない。ただ、処理を上から順にソース化しただけにしか見えない・・・。
もっとオブジェクト指向言語っぽいソースにしたいです。

ということで、一応課題はクリアできたけど・・・・・・もっとJavaっぽい?ソースに仕上げるべく、もうちょっと頭をしぼってみますね。
では、みなさん。よい週末を!
have a good weekend!!! (^-^)ノシ

 

 

---------------
2010/08/14 23:00頃追記

上記ソースで、欠点がひとつ。
プレイヤー1が1回休みになって、contiue文でループの頭に戻ったら・・・プレイヤー1の順番になっちゃうんですよね。プレイヤー2が1回休みになった場合、うまいことループの頭に戻るから、プレイヤー1の順番になって、その次にプレイヤー2の順番がきて休み判定できるからいいんですが・・・。

そこで、ラベルつきcontiue文とか、あれこれチャレンジしてみたんですけど、コンパイルしたら「ラベルが定義されていません」とかエラーが出ちゃうし。
ちゃんと、

player1: while (true) {
・・・
if (player1brk != 0) {
  System.out.println("プレイヤー1のターンは休みです");
  player1brk--;
  continue player2;
}
}

とか、ラベルの付け方を調べた上でソースに追加したんですけどね。
うまく動作してくれませんでした。(T-T;;

ということで、「すごろく」はまだまだ未完成でした。
一応、オブジェクト指向言語っぽいソースも書いてみたんですけど(クラスとかコンストラクタとか使ってね)、それでもやはり1回休みの処理をうまく実現できませんでした・・・ε=(´o`#)

Web上にはJavaアプレット版のすごろくのソースとかゴロゴロしているんですが、どうもソースが難しくてトレースできずに理解できないという・・・・・・。
ちょっとお手上げ状態です。

 

 


nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:資格・学び

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

Facebook コメント

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。