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

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

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

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

1回答

1259閲覧

Java エラーが表示された。

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

1クリップ

投稿2022/07/30 06:25

編集2022/07/30 22:01

前提

Javaの初心者です。
トランプでHigh&lowを作成しております。
引いたカードの情報を取得ができません。数字とマークがうまく取得ができず、実行しても必ず「0」になってしまいます。
ゲーム画面の作成まではできております。
数字とマークを取得できるようにするにはどのようにすればよいのでしょうか。
よろしくお願いいたします。

実現したいこと

カードを引いて数字とマークを取得できるようになりたい。

発生している問題・エラーメッセージ

Cannot invoke "Kensyu.Card$Deck.GetCard()" because "deck" is null

カードを引いた情報を取得できない。

該当のソースコード

Java

1Main.Java クラス 2package Kensyu1; 3 4import Kensyu1.Card.Deck; 5 6 7public class Main { 8 private static Deck Deck() { 9 // TODO 自動生成されたメソッド・スタブ 10 return null; 11 } 12 public static void main(String[] args) { 13 // 山札を生成 14 Deck deck = Deck(); 15 16 // 姉がカードを引く 17 Sensyu ane = new Sensyu(); 18 ane.Draw(deck); 19 20 // 弟がカードを引く 21 Sensyu otouto = new Sensyu(); 22 otouto.Draw(deck); 23 24 // ゲーム画面を生成 25 new Gamegamen(ane, otouto); 26 27 return; 28 } 29 30 31 32} 33 34Sensyu.java クラス 35package Kensyu1; 36 37import Kensyu1.Card.Deck; 38 39public class Sensyu { 40 41 // メンバ変数定義 42 // 選手が持っているカード情報 43 private Card card_info; 44 45 // 初期化処理 46 public Sensyu(){ 47 card_info = new Card(); // オブジェクトを生成 48 49 // カード情報を初期化 50 card_info.no = 0; // 数字 51 card_info.suit = 0; // マーク 52 } 53 54 // カードを1枚引く 55 public void Draw(Deck deck) 56 { 57 // 引いたカード情報を取得 58 card_info = deck.GetCard(); 59 return; 60 } 61 62 //カードの数字を取得 63 public int GetNo(){ 64 return card_info.no; 65 } 66 67 //カードのマークを取得 68 public int GetSuit(){ 69 return card_info.suit; 70 } 71 72} 73 74Deck.java クラス 75 76package Kensyu; 77 78import java.util.ArrayList; 79import java.util.Arrays; 80import java.util.Collections; 81import java.util.List; 82class Card{ 83 84 int suit; // マーク(0:スペード/1:ハート/2:ダイヤ/3:クラブ) 85 int no; // 数字(A=1/J=11/Q=12/K=13) 86 87 public class Deck { 88 //カード枚数 89 final int GOUKEI_CARD = 52; 90 91 // メンバ変数定義 92 // カードリスト(山札) 0~51の要素を入れ、それぞれマークと数字を割り当てる 93 // 0 ~12:スペードA~K / 13~25:ハートA~K / 26~38:ダイヤA~K / 39~51:クラブA~K 94 private List<Integer> card_list; 95 96 // 次に取り出すカード番号(1枚引くごとに1加算する) 97 private int card_index = 0; 98 99 // 初期化処理 100 public Deck() 101 { 102 // 次に取り出すカード番号を初期化 103 card_index = 0; // 1枚目 104 105 // 山札を初期化 106 card_list = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51)); 107 108 // 山札をシャッフルする 109 Collections.shuffle(card_list); 110 } 111 112 // 山札からカードを1枚取り出し、そのカードのマークと数字をリターンする 113 public Card GetCard() 114 { 115 Card card_info = new Card(); // カード情報格納用 116 int card_no = 0; // カード番号 117 118 // カードを一枚取り出して、カード番号(0~51のいずれか)を取得 119 card_no = (int) card_list.get(card_index); // リストの先頭要素を取り出す 120 121 // 1枚取り出したのでカード番号を1加算 122 card_index++; 123 124 // 山札をすべて引いた場合、山札を初期化する 125 if( GOUKEI_CARD <= card_index ) 126 { 127 card_index = 0; // 先頭に戻す 128 Collections.shuffle(card_list); // 山札をシャッフルする 129 } 130 131 card_info.suit = card_no / 13; // マーク=カード番号を13で割った商 132 card_info.no = (card_no % 13) + 1; // 数字=カード番号を13で割った余り+1 133 134 return card_info; 135 } 136 } 137 138} 139

試したこと

カード情報で数字とマークをそれぞれ取得するように記載をしてみましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

実行環境 JavaSE-16(P)(Java16)

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

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

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

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

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

TN8001

2022/07/30 09:17

これですよね?(率直に言ってクソいです) [Javaでゲーム開発!サンプルプログラム付きでわかりやすく解説 | 侍エンジニアブログ](https://www.sejuku.net/blog/129948) 変にいじらずにそのままやったらどうですか。
退会済みユーザー

退会済みユーザー

2022/07/30 09:47

一度試しに実施してみました。うまくいかないようでしたので修正して行ってます。
TN8001

2022/07/30 10:16

> 一度試しに実施してみました。うまくいかないようでしたので修正して行ってます。 元々がひどいのも問題ですが、それを勘でいじっても動くようにはなりません。 こちらで試した手順は以下です。 記事通りに4つのファイルに5つのクラスを作りました。 class Deckの private List card_list; がエラーでしたので private List<Integer> card_list; に修正しました。 画像ファイル4つを作成(32*32位がいい)し、適切な場所に配置しました。 以上で動作は確認できました。
TN8001

2022/07/30 10:16

なんなんだこいつ
dodox86

2022/07/30 13:01

無言で退会。こんなのばっかり。他人のコードを流用してちゃんと修正するのは一定以上のスキルが必要なはずなのですけど、勘でいじって動いて勘違いしたままでOKなんでしょうね。
guest

回答1

0

MainクラスのDeckメソッドでnullを返しているからです。
ここでDeckオブジェクトを返す必要があります。

現状で無理くりやるなら

package Kensyu; public class Main { private static Card.Deck Deck() { // TODO 自動生成されたメソッド・スタブ return (new Card()).new Deck(); } public static void main(String[] args) { // 山札を生成 Card.Deck deck = Deck(); //省略 return; } }

投稿2022/07/30 06:32

編集2022/07/30 08:52
RiaFeed

総合スコア2701

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

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

退会済みユーザー

退会済みユーザー

2022/07/30 06:39

ご回答ありがとうございます。nullの部分を「Deck」に変更して実行してみました。 private static Deck Deck() { return Deck() ; 実行した結果が Exception in thread "main" java.lang.StackOverflowErrorが表示されて at Kensyu.Main.Deck(Main.java:8)がたくさん出てきました。 こちらはどう変えたらよいかわかりますでしょうか。
RiaFeed

2022/07/30 07:09 編集

それはDeckオブジェクトを返しているのではなく、MainクラスのDeckメソッドを延々と呼び出している形(再帰呼び出し)になってスタックオーバーフローしています。 Deckクラスがどういうクラスなのかコードがないのでわかりませんが、newすればいいんじゃないでしょうか。
退会済みユーザー

退会済みユーザー

2022/07/30 07:34

Deckクラスのコードは下記になります。 package Kensyu; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; class Card{ int suit; // マーク(0:スペード/1:ハート/2:ダイヤ/3:クラブ) int no; // 数字(A=1/J=11/Q=12/K=13) public class Deck { //カード枚数 final int GOUKEI_CARD = 52; // メンバ変数定義 // カードリスト(山札) 0~51の要素を入れ、それぞれマークと数字を割り当てる // 0 ~12:スペードA~K / 13~25:ハートA~K / 26~38:ダイヤA~K / 39~51:クラブA~K private List<Integer> card_list; // 次に取り出すカード番号(1枚引くごとに1加算する) private int card_index = 0; // 初期化処理 public Deck() { // 次に取り出すカード番号を初期化 card_index = 0; // 1枚目 // 山札を初期化 card_list = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51)); // 山札をシャッフルする Collections.shuffle(card_list); } // 山札からカードを1枚取り出し、そのカードのマークと数字をリターンする public Card GetCard() { Card card_info = new Card(); // カード情報格納用 int card_no = 0; // カード番号 // カードを一枚取り出して、カード番号(0~51のいずれか)を取得 card_no = (int) card_list.get(card_index); // リストの先頭要素を取り出す // 1枚取り出したのでカード番号を1加算 card_index++; // 山札をすべて引いた場合、山札を初期化する if( GOUKEI_CARD <= card_index ) { card_index = 0; // 先頭に戻す Collections.shuffle(card_list); // 山札をシャッフルする } card_info.suit = card_no / 13; // マーク=カード番号を13で割った商 card_info.no = (card_no % 13) + 1; // 数字=カード番号を13で割った余り+1 return card_info; } } }
jimbe

2022/07/30 07:43 編集

コードは質問を編集して追加してください。 カードの中にデッキがあるのは、現実的に見て変では無いでしょうか。
退会済みユーザー

退会済みユーザー

2022/07/30 07:41

上記のコードを質問の所に記入いたしました。
退会済みユーザー

退会済みユーザー

2022/07/30 07:52

デッキクラスはカードの山札ですのでカードのことを書いておりますが、何か変なところありますでしょうか。 私の認識違いでしたら申し訳ございません。
RiaFeed

2022/07/30 08:07 編集

カードを表すクラスとデッキを表すクラスは別にした上でデッキを表すクラスをnewして下さい。 仮に中に入れる(内部クラスにする)としてもデッキはカードの集まりですから逆にしたほうがいいのですが、 現状の認識では内部クラスを利用すること自体控えたほうがいいと思います。 この使い方ではそもそも内部クラスにする意味がないですし、なんならカードクラスも要らないんじゃないかと。
退会済みユーザー

退会済みユーザー

2022/07/30 08:47

すみません。私の知識不足でこれから新たにクラスを作成するのは難しいかと思っております。 現状のコードで完成まではいけないのでしょうか。 質問の所に現状私の方で表示できるゲーム画面を追記いたしました。 よろしくお願いいたします。
退会済みユーザー

退会済みユーザー

2022/07/30 09:28 編集

数字の取得ができるようになりました。 たまに数字を表示する部分の背景が赤くなったりしますが、こちらは何かの不具合になるのでしょうか。 別の質問になるのですが、数字は表示できたのですが、♠などのアイコンは表示ができておりません。 フォルダにアイコンの写真を格納してそのフォルダのパスをコードに記入をしているのですがうまくぃません。 case 0: // スペード icon = new ImageIcon("C:\\pleiades\\workspace\\High&Low\\src\\Kensyu1\\img/spade.jpg"); return icon; 上記のように記入をしてるのですが、ダメなのでしょうか。 よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問