前提
プログラミング初心者でです。
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メソッドなどで排他制御?をしてみようと思いやりましたが、やり方が間違っているせいかエラーが出ます。
全部のソースプログラムを書き込めなかったのでここに書かせてもらいます
### 該当のソースコード
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);
}
}
```
ここに大量のコードは書かないでください。
github 等のネットストレージを利用してそこへのリンクを貼るなどで対応してください。
cputArrayは間違いでcpuArrayが正しくないですか。
コンパイルエラーがあってもIDEがバイトコードを生成することがあるようです。
IDEなしでコマンドラインからコンパイルしてください。
IDEでプロジェクトをリビルドしても良いでしょう。
まずは一人で(出せなくなるまで)プレイ出来る状態にしたほうが良さそうです。