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

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

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

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

Q&A

解決済

1回答

1011閲覧

Javaにて、2枚のカードを比較する処理を行いたい

sosoooooo3

総合スコア2

Java

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

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

0グッド

1クリップ

投稿2021/08/14 08:24

現在、numが0の場合gameDate.setCard_one(num);に格納、numが0以外の場合gameDate.setCard_two(num);に格納という流れでソースコードを記載しているのですが、Eclipseのデバッグモードにて、参照画像の赤枠部分を押下した際、0の判定となりgameDate.setCard_one(num);に格納されることを確認、次に青枠部分のどれかを押下した場合も0となっており、gameDate.setCard_one(num);に格納されてしまいます。

以下配列で確認した際、場合だと、numが一致しないため延々とゲームが終わらない状態になってしまいます。

java

1int[][] number = { 2 {0,1,2,3,4,5,6,7,8,9,10,11,12}, 3 {13,14,15,16,17,18,19,20,21,22,23,24,25}, 4 {26,27,28,29,30,31,32,33,34,35,36,37,38}, 5 {39,40,41,42,43,44,45,46,47,48,49,50,51} 6};

参考画像
参考画像

現状、いい案が思い浮かばず詰まってしまっている状態のため、
お手数ですが、良き案がございましたらご教示いただけますと幸いです。

Cardclick_Listener.java

java

1package pair_matching; 2 3import java.awt.event.MouseEvent; 4import java.awt.event.MouseListener; 5 6public class Cardclick_Listener implements MouseListener{ 7 private CardLabel card_label; 8 private GameDate gameDate; 9 10 public Cardclick_Listener(CardLabel card_label, GameDate gameDate) { 11 this.card_label = card_label; 12 this.gameDate = gameDate; 13 } 14 15 @Override 16 public void mouseClicked(MouseEvent e) { 17 boolean open = card_label.isOpen(); 18 int num = card_label.getNumber(); 19 int posi = card_label.getPosition(); 20 int CardOne = gameDate.getCard_one(); 21 int CardTwo = gameDate.getCard_two(); 22 23 // カードの表裏チェック 24 if(open == true) { 25 ; // 裏面にしない 26 }else if(open == false){ 27 card_label.setOpen(true); 28 if(posi > 0) { 29 // numが0か0以外の判定 30 if(num == 0) { 31 // 0の場合:GameDateのCard_oneに格納 32 gameDate.setCard_one(num); 33 }else{ 34 // 0以外:GameDateのCard_twoに格納 35 gameDate.setCard_two(num); 36 } 37 } 38 39 } 40 41 if(CardOne == CardTwo) { 42 ; // 一旦処理終了 43 }else if(CardOne != CardTwo){ 44 // カードを裏面に戻す 45 // gameDate.setCard_one , gameDate.setCard_twoをリセット 46 } 47 } 48 49 @Override 50 public void mousePressed(MouseEvent e) { 51 } 52 @Override 53 public void mouseReleased(MouseEvent e) { 54 } 55 @Override 56 public void mouseEntered(MouseEvent e) { 57 } 58 @Override 59 public void mouseExited(MouseEvent e) { 60 } 61 62}

GameDate.java

java

1package pair_matching; 2 3public class GameDate { 4 private int card_one; 5 private int card_two; 6 7 public int getCard_one() { 8 return card_one; 9 } 10 public void setCard_one(int card_one) { 11 this.card_one = card_one; 12 } 13 public int getCard_two() { 14 return card_two; 15 } 16 public void setCard_two(int card_two) { 17 this.card_two = card_two; 18 } 19 20}

CardLabel.java

java

1package pair_matching; 2 3import javax.swing.ImageIcon; 4import javax.swing.JLabel; 5 6public class CardLabel extends JLabel{ 7 private int number; 8 private int position; 9 private boolean open = false; 10 private ImageIcon open_icon; 11 private ImageIcon reverse_icon; 12 13 // コンストラクタの作成 14 public CardLabel(ImageIcon open_icon, ImageIcon revers_icon, int number, int position) { 15 this.open_icon = open_icon; 16 this.reverse_icon = revers_icon; 17 this.number = number; 18 this.position = position; 19 20 // 裏面のセット 21 setIcon(revers_icon); 22 } 23 24 public int getNumber() { 25 return number; 26 } 27 28 public boolean isOpen() { 29 return open; 30 } 31 32 public void setOpen(boolean open) { 33 if(open == true) { 34 this.setIcon(open_icon); 35 }else { 36 this.setIcon(reverse_icon); 37 } 38 this.open = open; 39 } 40 41 public int getPosition() { 42 return position; 43 } 44 45}

CardList.java

java

1package pair_matching; 2 3~ 中略 ~ 4 5public class CardList extends JPanel{ 6 ArrayList<CardLabel> cards = new ArrayList<>(); 7 private GameDate gameDate = new GameDate(); 8 // ラベルをリストにする -> リストの各ラベルにImageIconをセット -> リストをコレクションシャッフル 9 boolean flg = false; 10 11 final int club = 0; 12 final int diamond = 1; 13 final int heart = 2; 14 final int spade = 3; 15 16 /* カード画像 */ 17 // 裏面 18 ImageIcon card_back = new ImageIcon("image/card_back.png"); 19 // 表面 20 ImageIcon[][] card_array = new ImageIcon[4][13]; 21 String filename; 22 23 // カード位置 24 int[][] Array2 = { 25 {1,2,3,4,5,6,7,8,9,10,11,12,13}, 26 {14,15,16,17,18,19,20,21,22,23,24,25,26}, 27 {27,28,29,30,31,32,33,34,35,36,37,38,39}, 28 {40,41,42,43,44,45,46,47,48,49,50,51,52} 29 }; 30 31 // jの数値 32 int[][] number = { 33 {0,1,2,3,4,5,6,7,8,9,10,11,12}, 34 {13,14,15,16,17,18,19,20,21,22,23,24,25}, 35 {26,27,28,29,30,31,32,33,34,35,36,37,38}, 36 {39,40,41,42,43,44,45,46,47,48,49,50,51} 37 }; 38 39 public CardList() { 40 setPreferredSize(new Dimension(1150, 550)); 41 42 // Card_image 43 for(int i = 0; i < card_array.length; i++) { 44 for(int j = 0; j < card_array[i].length; j++) { 45 filename = "image/card"; 46 switch(i) { 47 case club: 48 filename = filename + "_club_"; 49 break; 50 case diamond: 51 filename = filename + "_diamond_"; 52 break; 53 case heart: 54 filename = filename + "_heart_"; 55 break; 56 case spade: 57 filename = filename + "_spade_"; 58 break; 59 } 60 // ファイル名に数字を足す -> 拡張子を足す 61 filename = String.format(filename + "%02d", j+1); 62 filename = filename + ".png"; 63 card_array[i][j] = new ImageIcon(filename); 64 CardLabel tmp_label = new CardLabel(card_array[i][j],card_back,number[i][j],Array2[i][j]); 65 // tmp_labelを押下したら、ひっくり返るのはtmp_label 66 tmp_label.addMouseListener(new Cardclick_Listener(tmp_label, gameDate)); 67 add(tmp_label); 68 cards.add(tmp_label); 69 } 70 } 71 Collections.shuffle(cards); 72 73 } 74 75}

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

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

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

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

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

jimbe

2021/08/14 08:54

どこかで神経衰弱を作るのが流行っているのでしょうか。
jimbe

2021/08/14 11:26

そもそも GameDate が何の為にあるのか、何を処理しようとしているのかが分かりません。「GameDate」という名前は「ゲーム日付」となりますが、2つのラベルを持つだけで何の処理もありませんし、何なのでしょうか。
jimbe

2021/08/14 11:47

以下のように num を表示させてみましたが、それぞれクリックした位置の値が表示されました。 if (posi > 0) { System.out.println("num=" + num); //デバッグ用表示 // numが0か0以外の判定
sosoooooo3

2021/08/14 12:51

ご返答ありがとうございます。 「GameDate」は、カードを選択した時の値を格納しているものになります。 1枚目を選択したら、GameDateの「setCard_one」に格納。2枚目を選択したらGameDateの「setCard_two」に格納し、それを比較して同じカードか違うカードかの判断を行いたいのです。
jimbe

2021/08/14 13:02 編集

> 1枚目を選択したら、GameDateの「setCard_one」に格納 しかし、CardLabel.number が 0 かどうかで one に入れるか two に入れるかというコードを(意図して)書かれたのですよね。number は CardLabel オブジェクトの生成個所を見ると全 CardLabel オブジェクトで違う値(0~51)が入るようにされています。一枚目の選択はプレイヤーがするのですから、 number = 0 であると決まっている訳では無いと思うのですが…。 この number というフィールドは何を意味するつもりで作成されたものでしょうか。
jimbe

2021/08/14 13:08

もしお時間などありましたら、別の方の神経衰弱のご質問で回答として動作するコードを載せたことが有りますので、参考にして頂けると幸いです。 https://teratail.com/questions/354099
sosoooooo3

2021/08/15 06:34

ありがとうございます。 参考にさせていただきます。
guest

回答1

0

ベストアンサー

ゲームを進行管理する変数必要です。

暫定的に、GameDateに設置してみてはいかがでしょう?

GameDate.java

Java

1package pair_matching; 2 3public class GameDate { 4 5 private int PlayCount; // ゲーム進行管理用 6 private int card_one; 7 private int card_two; 8 9 public int getPlayCount() { 10 return playCount; 11 } 12 public void setPlayCount(int playCount) { 13 this.playCount = playCount; 14 } 15 public int getCard_one() { 16 return card_one; 17 } 18 public void setCard_one(int card_one) { 19 this.card_one = card_one; 20 } 21 public int getCard_two() { 22 return card_two; 23 } 24 public void setCard_two(int card_two) { 25 this.card_two = card_two; 26 } 27 28}

その上で、Cardclick_Listener.javaを修正します。

修正箇所

Java

1 if(posi > 0) { 2 // numが0か0以外の判定 3 if(num == 0) { 4 // 0の場合:GameDateのCard_oneに格納 5 gameDate.setCard_one(num); 6 }else{ 7 // 0以外:GameDateのCard_twoに格納 8 gameDate.setCard_two(num); 9 } 10 }

修正後

Java

1 if(gameDate.getPlayCount() == 0) { 2 // 0の場合:GameDateのCard_oneに格納 3 gameDate.setCard_one(num); 4 }else{ 5 // 0以外:GameDateのCard_twoに格納 6 gameDate.setCard_two(num); 7 } 8 gameDate.setPlayCount(gameDate.getPlayCount() + 1);

ちなみに後々の判定のために、numberは一気通貫の番号で無く、カードの番号通りにした方が良いかも。

投稿2021/08/15 04:53

TetsujiMiwa

総合スコア1124

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問