iT邦幫忙

0

java jfugue 音感遊戲

  • 分享至 

  • twitterImage

請問各位java高手

若要求是第一題答對,第二題要再多抽一個音,連同前一題的答案連續播放。
例如第一題是 So,第二題就可能是 So+Re。玩家答題時也要將音符串完
整答對才能繼續進行。

要如何抽取不一樣的亂數並加在前個亂數後呢?

import org.jfugue.player.Player;
import java.util.*;
public class Week16 {
public static void main(String[] args) {
System.out.println("絕對音感記憶遊戲");
System.out.println("請輸入1-8的數字");
Player pp = new Player();
pp.play("C D E F G A B C6");
int ans;
ans=(int)(Math.random()*8);
int ans2=(int)(Math.random()*8);
while(true) {
if (ans==1) {
pp.play("C5qqqq");
}
if (ans==2) {
pp.play("D5qqqq");
}
if (ans==3) {
pp.play("E5qqqq");
}
if (ans==4) {
pp.play("F5qqqq");
}
if (ans==5) {
pp.play("G5qqqq");
}
if (ans==6) {
pp.play("A5qqqq");
}
if (ans==7) {
pp.play("B5qqqq");
}
if (ans==8) {
pp.play("C6qqqq");
}
Scanner sc=new Scanner(System.in);
int guess=sc.nextInt();
if (guess!=ans) {
System.out.println("錯");
break;
}
if (guess==ans) {
System.out.println("對");

			pp.play("ans");

			pp.play("ans2");
		}
		}
		

	

}
}

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
c9103205
iT邦新手 5 級 ‧ 2021-06-30 10:56:34
最佳解答
 public static void main(String[] args) {
        System.out.println("絕對音感記憶遊戲");

        Player pp = new Player();
        pp.play("C D E F G A B C6");

        //出題用的list
        List<Integer> queList = new ArrayList();
        //答題用的list
        List<Integer> ansList = new ArrayList();

        int count = 1;

        while (count > 0) {
            Integer note = (int) (Math.random() * 8);
            queList.add(note);
            play(queList);

            System.out.println("請根據所聽到之音符,輸入1-8的數字");
//            System.out.println("我是作弊的答案: " +queList);

            ansList.clear();
            for (int i = 1; i <= count; i++) {
                Scanner sc = new Scanner(System.in);
                int guess = sc.nextInt();
                ansList.add(guess);
            }

            System.out.println("ansList: " +ansList);
            if (queList.equals(ansList)) {
                System.out.println("本題答對,繼續挑戰!");
                count++;
            } else {
                System.out.println("答錯,請再接再厲QQ");
                count = 0;
            }
        }
    }

    static void play(List<Integer> queList) {
        Player pp = new Player();
        for (Integer ans : queList) {
            if (ans == 1) {
                pp.play("C5qqqq");
            }
            if (ans == 2) {
                pp.play("D5qqqq");
            }
            if (ans == 3) {
                pp.play("E5qqqq");
            }
            if (ans == 4) {
                pp.play("F5qqqq");
            }
            if (ans == 5) {
                pp.play("G5qqqq");
            }
            if (ans == 6) {
                pp.play("A5qqqq");
            }
            if (ans == 7) {
                pp.play("B5qqqq");
            }
            if (ans == 8) {
                pp.play("C6qqqq");
            }
        }
    }

花了一個半小時重寫
盡量把重複的工作拉出來寫一個function,會比較乾淨

我的思路是,按照你的需求
最好的方法就是用兩個 array , list 或 map
一個放題目,一個放答案,再比較是不是一樣內容

本來是用array來寫
但實在太麻煩,改用list
因為list也有equasls這個方法,可以直接比較其內容,很方便~

本題應該是一定要用到巢狀迴圈
如果有其他大神能用一個迴圈就寫出來
還請伺教

我要發表回答

立即登入回答