質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

1664閲覧

java

kisaragizinzin7

総合スコア90

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2015/08/05 06:28

javaでじゃんけんゲームを作っています。

コード int i = 0; if(judge_main.losernum == 1){ System.out.println("勝った人でじゃんけん"); i = 1; } else if(judge_main.winnernum == 1){ System.out.println("負けた人でじゃんけん"); i = 2; } else{ System.out.println("勝った人でじゃんけんして、そのあと負けた人でじゃんけん"); i = 1; i = 2; } if (i == 1){ judge_main.playernum = judge_main.winnernum; players_main = judge_main.winner_list; } else if(i == 2){ judge_main.playernum = judge_main.losernum; players_main = judge_main.loser_list; }

そのじゃんけんゲームの一部分のプログラムです。
上のプログラムで、

else{
System.out.println("勝った人でじゃんけんして、そのあと負けた人でじゃんけん");

この時に
i == 1、i == 2の両方の処理をしたくて、

else{
System.out.println("勝った人でじゃんけんして、そのあと負けた人でじゃんけん");

のところにi =1, i = 2を両方書いたのですが、i = 2を書いているので上書きされてi == 2の処理しかできないようになっています。

i == 1, i == 2両方の処理を行えるようにするにはどうすればいいのでしょうか?
説明がわかりにくいと思いますがよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

swordoneさんと似たような解答です。
こういうバリエーションもあるよって感じです:
ローカル変数しか使っていないので、
気にしているメンバの上書きの心配は一切ありません。
(というかstaticメソッドだからメンバも何も無い。)

java

1//playersをジャンケンさせて順位でソートする 2public static List<Player> playJanken(List<Player> players){ 3 4 if(players.size() < 2){ 5 return players; 6 } 7 List<Player> winners; 8 List<Player> losers ; 9 10 /* 11 この辺りで勝敗処理 12 winnersとlosersに振り分け 13 */ 14 15 //勝者グループのplayJankenの後ろに敗者グループのplayJankenを結合 16 List<Player> result = playJanken(winners); 17 result.addAll(playJanken(losers)); 18 return result; 19}

投稿2015/08/06 03:32

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2015/08/07 01:32

回答ありがとうございます^^ コードもありがとうです! ローカル変数でするとできました!
guest

0

ベストアンサー

なんかまた面倒なことしてますね・・・
前の質問からの引き続きとして回答しますが,「再帰」で考えるとこの手の問題は簡単になります.
「勝ったPlayer組」と「負けたPlayer組」に分けたあと,
それぞれの組でもう一度じゃんけんし,勝敗を決め,
また2組に分け,繰り返します.
一人だけの組ではじゃんけんせずに終了します.
「じゃんけんする」という手続きは人数が変わってるだけで基本的に同じはずなので,
こう考えればコードを組みやすくなるのではないでしょうか.

イメージが湧きにくいかもしれないので,概要をコードで書いてみました.

java

1//list:じゃんけんするPlayerのリスト,firstRank:この組の最上位が,全体で何位か 2public static void playJanken(List<Player> list, int firstRank){ 3 4 //listにいるPlayerでじゃんけんを行い,勝ち負けを決定する 5 //(一人の場合には,そのPlayerの順位がfirstRankで確定して終了) 6 7 List<Player> winnerList = new ArrayList<Player>(); 8 List<Player> loserList = new ArrayList<Player>(); 9 10 //勝ったPlayerをwinnerListに,負けたPlayerをloserListに入れる 11 12 //再帰でじゃんけん続行 13 playJanken(winnerList, firstRank); //勝った人でじゃんけん 14 playJanken(loserList, firstRank + winnerList.size()); //負けた人でじゃんけん.勝った人の人数分,順位が下がる 15}

これで何が起こるかというと,
まず全員でじゃんけんし,勝ち負けで分けます(1).
その後,勝ち組でじゃんけんします.この時,新たにplayJankenメソッドが呼ばれます.
そしてまた勝ち負けで分かれます(2)が,
この(1)のloserListと(2)のloserListは別に管理されていて,互いに干渉しません(上書きされません).
メソッドから別のメソッドのローカル変数には干渉できませんよね?それと同じです.
これを繰り返して行くといずれ最初の勝ち組の処理が終わるので,負け組の処理に入れます.

投稿2015/08/05 08:58

編集2015/08/06 02:25
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2015/08/06 00:15

この方法しか思いつかなくて・・・ すみませんです>< 勝った組と負けた組に分けたのですが、それぞれの組でもう一度じゃんけんさせるところがわかりません。 例えばプレイヤーが5人として、まずじゃんけんをして勝った人3人負けた人2人として勝った組と負けた組に分ける。 勝ち[プレイヤー1 プレイヤー4 プレイヤー5] 負け[プレイヤー2 プレイヤー3] ここで勝った組でもう一度じゃんけんをすると、 勝ち[プレイヤー4] 負け[プレイヤー1 プレイヤー5] その時点で結果が上書きされて負けた組でじゃんけんをしても[プレイヤー2 プレイヤー3]でのじゃんけんではなく、[プレイヤー1 プレイヤー5]でのじゃんけんになってしまいます。 [プレイヤー2 プレイヤー3]でじゃんけんをするために勝った組と負けた組で同時進行で処理するような機能みたいなのがあればいいのですが、何かいい方法はないでしょうか?
swordone

2015/08/06 00:18

同時進行する意図はなんでしょうか? じゃんけんを進めて最終的に順位が決定すればいいと思っていましたが・・・
swordone

2015/08/06 00:34

ちなみに再帰で考えた時,「負けた組」が「上書きされる」ということはありません. 一回「クイックソート」について調べてどこかでソースコードを見てみてください. 再帰を上手く使ったアルゴリズムなので参考になると思います. リストの上書きとは違う話になりますが,境界の値がどのように取られるかをよく見てください.
kisaragizinzin7

2015/08/06 00:44

勝ち負けの結果を上書きされないようにするためです。 私の考えでは players_mainという配列があります(プレイヤー5人なら5個格納されている)。 「じゃんけんをして判定して勝ち組負け組に分ける処理」を行う。 勝ち組winnerlist 負け組loserlistの配列を作ってそこに分ける。 勝ち組で再度じゃんけんを行う場合winnerlistをplayers_mainに代入して、同じように「じゃんけんをして判定して勝ち組負け組に分ける処理」を行う。 このときに勝ち組winnerlist 負け組loserlistの配列が上書きされてしまい、1回目のじゃんけんの結果の負け組loserlist配列が消えてしまうので、二組の配列を同時進行で「じゃんけんをして判定して勝ち組負け組に分ける処理」を行えるようにしたいと思いました。 この考え方は間違っているのでしょうか? じゃんけんを進めて最終的に順位が決定すればいいと思っていましたが・・・ > そのように考えています! プレイヤー5人なら、1位から5位を決めようと考えています。
swordone

2015/08/06 00:58

winnerList,loserListがクラスのメンバであれば上書きされてしまいますが, 再帰にしてローカル変数にしてしまえば上書きは起きません. 最初にじゃんけんした結果 勝ち[プレイヤー1 プレイヤー4 プレイヤー5] 負け[プレイヤー2 プレイヤー3]・・・1 で,この勝ち組で再度じゃんけんした時 勝ち[プレイヤー4] 負け[プレイヤー1 プレイヤー5]・・・2 で,この1と2は再帰で生まれた「別のメソッド」の中のローカル変数なので 互いに影響しません. 別のメソッドと言うと語弊があるかもしれませんが,要は「1回目のじゃんけん」と「2回目のじゃんけん」で勝ち,負けリストは別に管理するので,上書きはされません.
kisaragizinzin7

2015/08/07 01:32

コードまでありがとうございます^^ ローカル変数にしたらできました。 ありがとうございました。
guest

0

コードやゲームの内容がさっぱりわかりませんが、それには目をつぶります。

単純にi=3などして、後半の判定処理を1つ増やすわけにはいかないのでしょうか?

投稿2015/08/05 06:37

mtempa

総合スコア129

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kisaragizinzin7

2015/08/05 06:46

回答ありがとうございます^^ 内容まったく載せなくてすみません。 これだけで大丈夫だと思ってしまいました。 int i = 0; if(judge_main.losernum == 1){ System.out.println("勝った人でじゃんけん"); i = 1; } else if(judge_main.winnernum == 1){ System.out.println("負けた人でじゃんけん"); i = 2; } else{ System.out.println("勝った人でじゃんけんして、そのあと負けた人でじゃんけん"); i = 3; } if (i == 1){ judge_main.playernum = judge_main.winnernum; players_main = judge_main.winner_list; } else if(i == 2){ judge_main.playernum = judge_main.losernum; players_main = judge_main.loser_list; } else{ judge_main.playernum = judge_main.winnernum; players_main = judge_main.winner_list; judge_main.playernum = judge_main.losernum; players_main = judge_main.loser_list; } こういうことですかね?
kisaragizinzin7

2015/08/05 06:48

これでは最後の else{ judge_main.playernum = judge_main.winnernum; players_main = judge_main.winner_list; judge_main.playernum = judge_main.losernum; players_main = judge_main.loser_list; } この部分でjudge_main.playernumとplayers_mainが上書きされてしまうので、質問のところに載せたプログラムと同じ結果になってしまいます><
mtempa

2015/08/05 06:48

そうです。 その処理は満足のいく動作ではないのでしょうか?
kisaragizinzin7

2015/08/05 07:10

上に書いた通り、上書きされてしまうので満足のいく動作ではないです。
mtempa

2015/08/05 07:35

では、 常に配列で結果を返すようにして メインの処理の方で、配列数分じゃんけん処理を行うようにするとかですかね? メイン側が一切書き換えられないのならちょっと私の手に余ります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問