前提
プログラミング初心者でです。
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メソッドなどで排他制御?をしてみようと思いやりましたが、やり方が間違っているせいかエラーが出ます。
