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

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

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

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

Q&A

解決済

6回答

3176閲覧

java  じゃんけんゲーム 順位付け

kisaragizinzin7

総合スコア90

Java

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

0グッド

1クリップ

投稿2015/08/19 03:02

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

3人でじゃんけんをして勝った人から1位から3位までを出して、それを2回戦行うというものを作ったのですが、
現在結果がこのように出ています。

プレイヤー1の各順位の回数は1位0回, 2位1回, 3位1回
プレイヤー2の各順位の回数は1位1回, 2位0回, 3位1回
プレイヤー3の各順位の回数は1位1回, 2位1回, 3位0回

これを1位が多い人順に総合順位を決めたいです。
結果としては
1位プレイヤー3
2位プレイヤー2
3位プレイヤー1
としたいのですが、どうすればいいのでしょうか?
よろしくお願いします!

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

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

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

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

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

guest

回答6

0

ベストアンサー

Playerを配列にして,Comparatorインタフェースを使って並べ替えをするのがわかりやすいかと思います.
Comparatorを使うと,Playerごとの並び順のルールを定義することができます.それを利用して並び替えを簡単に実装できます.
比較する条件は「それぞれのPlayerが何位に何回なったか」なので,この情報をPlayerに持たせる必要があります.
簡単なのは人数分の長さを持つint配列を用意して,一回じゃんけんの順位が決まるごとに,対応する位置の数値を1増やす,という方法です(仮にrankCountとする).
そして,比較ルールを定義するComparator実装クラスを用意します.

java

1public class PlayerComparator implements Comparator<Player>{ 2 @Override 3 public int compare(Player p1, Player p2){ 4 //p1の方が上位(並び順で先に来る)なら負の値,p2のほうが上位なら正の値, 5 //同じなら0を返す様に組む 6 } 7}

これはコメントにもあるように,2つの項目を比較してどちらが先に来るかを判定するメソッドです.
これを用意しておけば,Playerを順位で並び替える時には

java

1Arrays.sort(players, new PlayerComparator());

これ一発でできます.あとは並び替えたあとの配列を順に取り出せば順位ごとに表示できます.

投稿2015/08/19 05:31

swordone

総合スコア20651

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

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

kisaragizinzin7

2015/08/19 08:03

回答ありがとうございます^^ 比較する条件は「それぞれのPlayerが何位に何回なったか」 この比較条件はどこに書いたらいいのでしょうか? よろしくお願いします!
swordone

2015/08/19 08:05

回答をよく読んでください.すでに書いてあります.
kisaragizinzin7

2015/08/19 08:27

すみません>< できました!ありがとうございます。 正負を変えることで、降順、昇順も変えれるんですね。 このComparatorの機能についてお聞きしたいのですが、 public int compare(Player p1, Player p2){ 例えば3人でじゃんけんをして1位になった回数が プレイヤー1が2回、 プレイヤー2が3回、 プレイヤー3が1回 だったとき プレイヤー1とプレイヤー2を比較してプレイヤー1の方が少ない プレイヤー2とプレイヤー3を比較してプレイヤー3の方が少ない プレイヤー3とプレイヤー1を比較してプレイヤー3の方が少ない このことから プレイヤー3、プレイヤー1、プレイヤー2という出力される。 という解釈であっていますでしょうか? すみませんが、よろしくお願いします!
swordone

2015/08/19 08:49 編集

それはComparatorを実装したクラス次第なのでどのようにでもできます. Comparatorは順序付けのルールを定めているに過ぎないので, 一概にこうなる,とは言えません. 実際の並べ替えの手順の話をしているのであれば答えは「NO」です. 「ソート アルゴリズム」で検索するといくつも並べ替え方が出てくるはずです. この場合(Arrays.sort(T[] a, Comparator<? super T> c))のアルゴリズムはドキュメントによると「修正マージソート」というものを使っているそうです.
kisaragizinzin7

2015/08/19 08:59

回答ありがとうございます。 順序付けのルールはプログラム書いた人次第なんですね! では、教えていただいたプログラムは プレイヤー1とプレイヤー2を比較 プレイヤー2とプレイヤー3を比較 プレイヤー3とプレイヤー1を比較 というように全てを比較していると思うのですが、これはComparatorを使用したら必ず全て比較してくれるのでしょうか?
swordone

2015/08/19 09:12

必ずしもすべて比較するわけではありませんし,またその必要もありません. A,B,Cという大小比較できる3要素があるとします. A<B,B<CということがわかればAとCは比較せずとも自ずとA<Cとわかりますよね?
kisaragizinzin7

2015/08/19 09:26

確かにそうですね!! 何度も質問したのに答えてくださってありがとうございました。
guest

0

コメントの回答先を間違えたため
削除しました

投稿2015/08/19 08:33

編集2015/08/19 08:41
j-1

総合スコア13

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

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

0

一位なら100点、二位は50点のように決めて点数にして比較すればシンプルに出来ると思います。
プレイヤー1は50点
プレイヤー2は100点
プレイヤー3は150点
後は大きい順に並べ替えれば、そのまま順位になります。

投稿2015/08/19 05:35

j-1

総合スコア13

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

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

kisaragizinzin7

2015/08/19 08:04

回答ありがとうございます^^ すみませんが、仕様を変更することはできないです。
j-1

2015/08/19 08:35

点数は順番を決める為の一時的なものなので、仕様を変更する必要は無いです。 順番を決める関数かクラス内の一時的なものになります。
kisaragizinzin7

2015/08/19 09:00

そういうことでしたか! その方法でもやってみたいと思います。 ありがとうございます!
guest

0

各順位に対して下記の処理を行う必要があります。
処理1:x位取得回数の最多の抽出
→抽出結果が単一ならx位の決定
→抽出結果が複数なら処理2へ
処理2:x-1位取得回数の最多なものを抽出
→抽出結果が単一ならx位の決定
→抽出結果が複数なら処理3へ
処理3:x-2位取得回数の最多なものを抽出
→x位の決定

上記の内容で質問の内容は満たすと思います。
が、同率一位等を考慮するには更に細かい判定が必要になると思います。

投稿2015/08/19 04:19

yona

総合スコア18155

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

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

guest

0

各プレーヤーの1位2位3位を次のように計算します。
1位×100+2位×10+3位

プレーヤー1>プレーヤー2>プレーヤー3なら
print(プレーヤー1>プレーヤー2>プレーヤー3)
プレーヤー1>プレーヤー3>プレーヤー2なら
print(プレーヤー1>プレーヤー3>プレーヤー2)
プレーヤー2>プレーヤー1>プレーヤー3なら
print(プレーヤー2>プレーヤー1>プレーヤー3)
プレーヤー2>プレーヤー3>プレーヤー1なら
print(プレーヤー2>プレーヤー3>プレーヤー1)
プレーヤー3>プレーヤー1>プレーヤー2なら
print(プレーヤー3>プレーヤー1>プレーヤー2)
プレーヤー3>プレーヤー2>プレーヤー1なら
print(プレーヤー3>プレーヤー2>プレーヤー1)

かな

投稿2015/08/19 04:14

maiko0318

総合スコア876

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

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

kisaragizinzin7

2015/08/19 04:48

回答ありがとうございます^^ 4人5人と増えていった場合はプログラムの量が多くなると思うので、何人でも対応できるようなのはないでしょうか?
maiko0318

2015/08/19 05:15

リストを使えばいいと思います。 LinkedList<String> list = new LinkedList<String>();//定義 list.add(sLine);//追加 sLineに点数とプレイヤーの点数を書き込む Collections.sort(list, new NumberAsc());//ソート String sBuf = (String)list.removeFirst();//取り出し これは追加>ソート>取り出しですが、 2分木リストを使えばソートなしで取り出せます。
guest

0

参加者をオブジェクトとして捉えるのが良いかと思います。

勝敗判定:
それぞれの手を何人が出していたかは関係なく、
自分の手と、その場に出ていた手の種類だけで勝敗判定可能です。

参加者に、場に出た手の種類を通知し、
「自分は勝ったか?」を判別し、勝ち数を覚えておいてもらえば、
成績の管理を他で行う必要がなくなります。

順位付け:
参加者をオブジェクトとして捉えた場合、
最後の順位付けは、参加者をList化しておいて、
それぞれから申告された勝ち数でソートすれば可能です。
ArrayListに登録されたオブジェクトのソート ということで、
参考URLを記載しておきます。
http://www.atmarkit.co.jp/fjava/javatips/140java030.html

投稿2015/08/19 04:02

piotcard

総合スコア69

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

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

kisaragizinzin7

2015/08/19 04:14

回答ありがとうございます^^ 勝ち数というのは、1位になった数、2位になった数・・・、ということでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問