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

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

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

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

Q&A

1回答

853閲覧

javaでゲームを作ろうと思っているがエラーが出る。

kunn

総合スコア2

Java

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

0グッド

0クリップ

投稿2022/12/05 18:54

編集2022/12/05 18:58

前提

プログラミング初心者でです。
javaでトランプのスピードを作ろうと思っていてある程度までは作りこめたのですがTimerTaskなどを使って定期実行が試みているのですがエラーが起きて躓いています。

実現したいこと

playerとcpuとの戦いで両者がともに中央にカードが出せなくなった場合にそれぞれの手札から一枚出すプログラムを作りたいと思っています。

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

Exception in thread "Timer-1" Exception in thread "Timer-2" java.lang.Error: Unresolved compilation problem:
cputArray cannot be resolved

at normalCpu$2.run(normalCpu.java:172) at java.base/java.util.TimerThread.mainLoop(Timer.java:566) at java.base/java.util.TimerThread.run(Timer.java:516)

該当のソースコード

java

class superClass { static int leftCenterCard; static int rightCenterCard; static String[][] array = new String[27][40]; protected boolean player = false; protected boolean cpu = false; void setCarddesign() { for(int i = 0; i < array.length; i++) { for(int j = 0; j < array[0].length; j++) { array[i][j] = " "; } } //トランプの形を作る for(int k = 0; k < 32; k += 8) { if(k == 0 || k == 8) { for(int g = 9; g < 18; g ++) { if(g == 9 || g == 17){ for(int h = 13; h < 20; h++){ if(h == 13 || h == 19) array[g][h + k] = "・"; else array[g][h + k] = " -"; } }else if(10 <= g) { array[g][13 + k] = "|"; array[g][19 + k] = "|"; } } } for(int i = 0; i < 27; i++) { if(i == 0 || i == 6 || i == 20 || i == 26) { for(int h = 6; h < 11; h++){ if(h == 6 || h == 10) array[i][h + k] = "・"; else array[i][h + k] = " -"; } }else if(1<= i && i <= 5 || 21 <= i && i <= 25) { array[i][6 + k] = "|"; array[i][10 + k] = "|"; } } } }; void draw() { //配列全要素を表示 for(int i = 0; i < array.length; i++) { for(int h = 0; h < (40 - (array[0].length / 2)); h++) { System.out.print(" "); } for(int j = 0; j < array[0].length; j++) { System.out.print(array[i][j]); } System.out.println(); } } //トランプが中央に出せるかどうか判断 int judgement(int num) { if(leftCenterCard + 1 == num || leftCenterCard - 1 == num) return 1; else if(rightCenterCard + 1 == num || rightCenterCard - 1 == num) return 2; else if(leftCenterCard == 13 && num == 1|| leftCenterCard == 1 && num == 13) return 1; else if(rightCenterCard == 13 && num == 1 || rightCenterCard == 1 && num == 1) return 2; else return 0; } //中央のカードを新しいカードに変更(左) void setcenterleftcard(String str) { array[13][16] = str; } //中央のカードを新しいカードに変更(右) void setcenterright(String str) { array[13][24] = str; } }

該当のソースコード

java

import java.util.ArrayList; import java.util.Collections; import java.util.Timer; import java.util.TimerTask; class player extends superClass{ private ArrayList<Integer> playerArray = new ArrayList<>(); //配列の何番まで出たかを記憶 private int pickoutcoutp = -1; //持っている手札の配列の番号を記憶 private int arrayNumber1p = 0; private int arrayNumber2p = 0; private int arrayNumber3p = 0; private int arrayNumber4p = 0; //手札の1番目のガードを新しく交換 void setnumberp1() { pickoutcoutp ++; array[23][8] = String.format("%2s", playerArray.get(pickoutcoutp)); arrayNumber1p = pickoutcoutp; } //手札の2番目のガードを新しく交換 void setnumberp2() { pickoutcoutp ++; array[23][16] = String.format("%2s", playerArray.get(pickoutcoutp)); arrayNumber2p = pickoutcoutp; } //手札の3番目のガードを新しく交換 void setnumberp3() { pickoutcoutp ++; array[23][24] = String.format("%2s", playerArray.get(pickoutcoutp)); arrayNumber3p = pickoutcoutp; } //手札の4番目のガードを新しく交換 void setnumberp4() { pickoutcoutp ++; array[23][32] = String.format("%2s", playerArray.get(pickoutcoutp)); arrayNumber4p = pickoutcoutp; } //配列の要素を取得 int getnumberp(int number) { return playerArray.get(number); } //中央に出せるかどうか判断し出せる場合は中央のカードを出し、最後に描画させる void mainFunc(int num) { switch(num) { case 1:{ int number = getnumberp(arrayNumber1p); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[23][8]); leftCenterCard = number; setnumberp1(); }else if(answer == 2) { super.setcenterright(array[23][8]); rightCenterCard = number; setnumberp1(); } checkpoint1(); break; } case 2:{ int number = getnumberp(arrayNumber2p); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[23][16]); leftCenterCard = number; setnumberp2(); }else if(answer == 2) { super.setcenterright(array[23][16]); rightCenterCard = number; setnumberp2(); } checkpoint1(); break; } case 3:{ int number = getnumberp(arrayNumber3p); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[23][24]); leftCenterCard = number; setnumberp3(); }else if(answer == 2){ super.setcenterright(array[23][24]); rightCenterCard = number; setnumberp3(); } checkpoint1(); break; } case 4:{ int number = getnumberp(arrayNumber4p); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[23][32]); leftCenterCard = number; setnumberp4(); } else if(answer == 2){ super.setcenterright(array[23][32]); rightCenterCard = number; setnumberp4(); } checkpoint1(); break; } } } //cpuが中央にカードを出せなくなった場合playerも出せなくなるのを随時確認し両方出せなくなった場合それぞれの手札から中央にカードを出す synchronized void checkpoint() { Timer timer = new Timer(false); TimerTask task = new TimerTask() { @Override public void run() { if(player && cpu) { pickoutcoutp ++; array[13][16] = String.format("%2s", playerArray.get(pickoutcoutp)); System.out.println("新しく交換します"); leftCenterCard = playerArray.get(pickoutcoutp); player = false; timer.cancel(); } } }; timer.schedule(task, 0, 2000); } //手元に出せるカードがあるか確認 void checkpoint1() { int [] card = {getnumberp(arrayNumber1p),getnumberp(arrayNumber2p),getnumberp(arrayNumber3p),getnumberp(arrayNumber4p)}; int count = 0; for(int i :card) { if(leftCenterCard + 1 != i && leftCenterCard - 1 != i && rightCenterCard + 1 != i && rightCenterCard - 1 != i) { count++; } if(count == 4){ player = true; checkpoint(); } } } //トランプの数字を配列に入れる void createcardnumberp() { for(int i = 1; i < 14; i ++) { playerArray.add(i); playerArray.add(i); } Collections.shuffle(playerArray); Collections.shuffle(playerArray); Collections.shuffle(playerArray); firstCardset(); } //場に最初の4枚のカードを出す void firstCardset() { setnumberp1(); setnumberp2(); setnumberp3(); setnumberp4(); array[13][16] = String.format("%2s", playerArray.get(4)); pickoutcoutp ++; leftCenterCard = playerArray.get(4); } }

該当のソースコード

java

import java.util.Scanner; public class startmain { public static void main(String[] args) { Scanner scan = new Scanner(System.in); System.out.println("何をしますか?"); System.out.println("スピード(1)、・・・(2) 、があります!"); // int select = scan.nextInt(); normalCpu cpu = new normalCpu(); player player = new player(); cpu.setCarddesign(); cpu.createcardnumberc(); player.createcardnumberp(); player.draw(); cpu.cpumain(); // System.out.println("スピードをやりましょう!\ncpuの強さを選択してね(1,強い 2,普通)"); for(int i = 0; i < 40; i++){ int num = scan.nextInt(); player.mainFunc(num); player.draw(); } } }

試したこと

TimerTaskなどの使い方がわかっておらず関係ないことをやっているかもしれません。ご了承ください。
waitメソッドや、sleepメソッドなどで排他制御?をしてみようと思いやりましたが、やり方が間違っているせいかエラーが出ます。

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

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

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

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

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

kunn

2022/12/05 18:59

全部のソースプログラムを書き込めなかったのでここに書かせてもらいます ### 該当のソースコード java ```ここに言語名を入力 import java.util.ArrayList; import java.util.Collections; import java.util.Timer; import java.util.TimerTask; class normalCpu extends superClass{ private ArrayList<Integer> cpuArray = new ArrayList<>(); //配列の何番まで出たかを記憶 private int pickoutcoutn = -1; //持っている手札の配列の番号を記憶 private int arrayNumber1c = 0; private int arrayNumber2c = 0; private int arrayNumber3c = 0; private int arrayNumber4c = 0; //手札の1番目のガードを新しく交換 void setnumberc1() { pickoutcoutn ++; array[3][8] = String.format("%2s", cpuArray.get(pickoutcoutn)); arrayNumber1c = pickoutcoutn; } //手札の2番目のガードを新しく交換 void setnumberc2() { pickoutcoutn ++; array[3][16] = String.format("%2s", cpuArray.get(pickoutcoutn)); arrayNumber2c = pickoutcoutn; } //手札の3番目のガードを新しく交換 void setnumberc3() { pickoutcoutn ++; array[3][24] = String.format("%2s", cpuArray.get(pickoutcoutn)); arrayNumber3c = pickoutcoutn; } //手札の4番目のガードを新しく交換 void setnumberc4() { pickoutcoutn ++; array[3][32] = String.format("%2s", cpuArray.get(pickoutcoutn)); arrayNumber4c = pickoutcoutn; } //配列の要素を取得 int getnumberc(int number) { return cpuArray.get(number); } //cpuの手札を出す処理を定期実行 void cpumain() { Timer timer = new Timer(false); TimerTask task = new TimerTask() { @Override public void run() { mostGoodselect(); // System.out.println("hello"); // if(cpu) Thread.sleep(10000); if(cpu) timer.cancel(); } }; timer.schedule(task, 0, 1000); } //手札のそれぞれに点数をつけて一番高いカードのインデックス番号を返す void mostGoodselect() { int cardpoint1 = 0; int cardpoint2 = 0; int cardpoint3 = 0; int cardpoint4 = 0; int count = 1; //お試し //cpuの手札全てをを配列に入れる int [] card = {getnumberc(arrayNumber1c),getnumberc(arrayNumber2c),getnumberc(arrayNumber3c),getnumberc(arrayNumber4c)}; for(int i :card) { if(leftCenterCard + 1 == i || leftCenterCard - 1 == i || rightCenterCard + 1 == i || rightCenterCard - 1 == i) { // mainFunc(count); }else if(leftCenterCard == 13 && i == 1 || leftCenterCard == 1 && i == 13 || rightCenterCard == 13 && i == 1|| rightCenterCard == 1 && i == 13){ mainFunc(count); }else{ checkpoint1(); } count++; } } //中央に出せるかどうか判断し出せる場合は中央のカードを出し、最後に描画させる void mainFunc(int num) { switch(num) { case 1:{ int number = getnumberc(arrayNumber1c); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[3][8]); leftCenterCard = number; setnumberc1(); super.draw(); }else if(answer == 2) { super.setcenterright(array[3][8]); rightCenterCard = number; setnumberc1(); super.draw(); } // checkpoint1(); break; } case 2:{ int number = getnumberc(arrayNumber2c); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[3][16]); leftCenterCard = number; setnumberc2(); super.draw(); }else if(answer == 2) { super.setcenterright(array[3][16]); rightCenterCard = number; setnumberc2(); super.draw(); } // checkpoint1(); break; } case 3:{ int number = getnumberc(arrayNumber3c); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[3][24]); leftCenterCard = number; setnumberc3(); super.draw(); }else if(answer == 2){ super.setcenterright(array[3][24]); rightCenterCard = number; setnumberc3(); super.draw(); } // checkpoint1(); break; } case 4:{ int number = getnumberc(arrayNumber4c); int answer = judgement(number); if(answer == 1){ super.setcenterleftcard(array[3][32]); leftCenterCard = number; setnumberc4(); super.draw(); } else if(answer == 2){ super.setcenterright(array[3][32]); rightCenterCard = number; setnumberc4(); super.draw(); } // checkpoint1(); break; } } } //cpuが中央にカードを出せなくなった場合playerも出せなくなるのを随時確認し両方出せなくなった場合それぞれの手札から中央にカードを出す void checkpoint() { Timer timer = new Timer(false); TimerTask task = new TimerTask() { @Override public void run() { if(cpu) { pickoutcoutn ++; array[13][24] = String.format("%2s", cputArray.get(pickoutcoutn)); System.out.println("新しく交換します"); rightCenterCard = cpuArray.get(pickoutcoutn); //変数cpuをfalseにリセット cpu = false; //cpuの手札を出す処理を定期実行を再実行 cpumain(); timer.cancel(); } // System.out.println(cpu + "c"); } }; timer.schedule(task, 0, 2000); } //手元に出せるカードがあるか確認 void checkpoint1() { int [] card = {getnumberc(arrayNumber1c),getnumberc(arrayNumber2c),getnumberc(arrayNumber3c),getnumberc(arrayNumber4c)}; int count = 0; for(int i :card) { if(leftCenterCard + 1 != i && leftCenterCard - 1 != i && rightCenterCard + 1 != i && rightCenterCard - 1 != i) { count++; } if(count == 4){ cpu = true; checkpoint(); } } } //トランプの数字を配列に入れる // @Override void createcardnumberc() { for(int i = 1; i < 14; i ++) { cpuArray.add(i); cpuArray.add(i); } Collections.shuffle(cpuArray); Collections.shuffle(cpuArray); Collections.shuffle(cpuArray); firstCardset(); } //場に最初の4枚のカードを入れる void firstCardset() { setnumberc1(); setnumberc2(); setnumberc3(); setnumberc4(); array[13][24] = String.format("%2s", cpuArray.get(4)); pickoutcoutn ++; rightCenterCard = cpuArray.get(4); } } ```
jimbe

2022/12/05 19:35

ここに大量のコードは書かないでください。 github 等のネットストレージを利用してそこへのリンクを貼るなどで対応してください。
xebme

2022/12/05 23:36

cputArrayは間違いでcpuArrayが正しくないですか。 コンパイルエラーがあってもIDEがバイトコードを生成することがあるようです。 IDEなしでコマンドラインからコンパイルしてください。 IDEでプロジェクトをリビルドしても良いでしょう。
jimbe

2022/12/06 12:03

まずは一人で(出せなくなるまで)プレイ出来る状態にしたほうが良さそうです。
guest

回答1

0

見た感じだけですが、メソッド内で宣言した変数はメソッドが終われば破棄対象になります。その変数でしか参照されていないオブジェクトも同様で、当然 Timer オブジェクトも同じです。
スレッドが生きていても肝心のオブジェクトが無くなっていたら、問題となるのでは無いでしょうか。

投稿2022/12/05 19:57

編集2022/12/05 19:58
jimbe

総合スコア12632

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

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

kunn

2022/12/06 14:08

回答ありがとうございます。 コメントの欄でコードを書いてしまったことには申し訳ないです。 以降、github 等を使ってやりたいと思います。 プログラミングを始めたばかりで用語の理解がまだ追いついてなく、申し訳ないのですが最初のメソッド内で宣言...放棄対象までは理解できたですが、スレッドが生きていても肝心のオブジェクトがなくなっていたら、、、のところのオブジェクトとは何を指しているんでしょうか?
jimbe

2022/12/06 15:18 編集

normalCpu クラスの checkpoint メソッドで Timer timer = new Timer(false); と作って動かしていますが、メソッドが終われば timer は無くなると思います。 そもそも java でマルチスレッドはそれなりにしっかり動作をイメージして考えないとすぐ訳が分からなくなる部類で、簡単に『この処理はマルチスレッドね』で動作させられるものではありません。 質問へのコメントに書きましたが、まずは cpu は無しで一人で(出せなくなるか全部出すかまで)プレイ出来る状態を完成させては如何でしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問