• cs106a编程方法学 作业解答(4)


    /*
     * File: Yahtzee.java
     * ------------------
     * This program will eventually play the Yahtzee game.
     */
    
    import acm.io.*;
    import acm.program.*;
    import acm.util.*;
    
    public class Yahtzee extends GraphicsProgram implements YahtzeeConstants {
        
        public void run() {
            IODialog dialog = getDialog();
            nPlayers = dialog.readInt("Enter number of players");
            playerNames = new String[nPlayers];
            for (int i = 1; i <= nPlayers; i++) {
                playerNames[i - 1] = dialog.readLine("Enter name for player " + i);
            }
            display = new YahtzeeDisplay(getGCanvas(), playerNames);
            playGame();
        }
    
        private void playGame() {//初始化玩家得分
            int[] upperscore=new int[nPlayers];
            int[] lowerscore=new int[nPlayers];
            int[] totalscore=new int[nPlayers];
            for(int i=0;i<nPlayers;i++){
                upperscore[i]=0;
                lowerscore[i]=0;
                totalscore[i]=0;
            }
            int[][] catearray=new int[nPlayers][17];//用来标示某位玩家的某种计分类别是否被选取过,没被用过对应值记为0
            for(int i=0;i<nPlayers;i++){
                for(int j=0;j<17;j++){
                    catearray[i][j]=0;
                }
            }
            for(int k=0;k<13;k++){//一共进行13轮        
                for(int player=1;player<=nPlayers;player++){//当前掷骰子的玩家
                    roll(dice,player);//掷骰子的过程
                    while(true){
                            display.printMessage("choose a category to count your scores");
                            int category= display.waitForPlayerToSelectCategory();
                            if(catearray[player-1][category]==0){//判断是否用过该类计分方法
                                    int score=countingscore(dice,category);//计算该轮得分
                                    display.updateScorecard(category, player, score);//添加分数到对应格子
                                    if(category<=6){
                                    upperscore[player-1]+=score;
                                    }
                                    if(category>=9){
                                    lowerscore[player-1]+=score;
                                    }
                                    totalscore[player-1]=upperscore[player-1]+lowerscore[player-1];
                                    display.updateScorecard(7, player, upperscore[player-1]);
                                    display.updateScorecard(16, player,lowerscore[player-1] );
                                    display.updateScorecard(17, player, totalscore[player-1]);
                                    catearray[player-1][category]=1;//标记该类为已用
                                    break;
                            }
                            else{
                                display.printMessage("Choose another category,this has been used!");
                                
                            }
                    }
                        
                    
                }
    
            }
            for(int i=1;i<=nPlayers;i++){
                if(upperscore[i-1]>=63){
                    upperscore[i-1]+=bonus;
                    totalscore[i-1]+=bonus;
                    display.updateScorecard(7, i, upperscore[i-1]);
                    display.updateScorecard(17, i, totalscore[i-1]);
                }
            }
            int winner=1;//标识得分最高玩家
            int maxscore=0;
            for(int i=0;i<nPlayers;i++){
                if(totalscore[i]>maxscore){
                    maxscore=totalscore[i];
                    winner=i+1;
                }
            }
            display.printMessage("The winner is "+playerNames[winner - 1]+" ! ");
        }
            
        
        private void roll(int[] dice,int player){
            display.printMessage(playerNames[player - 1]+"'s turn");
            display.waitForPlayerToClickRoll(player);
            
            for(int i=0;i<5;i++){
                dice[i]=rgen.nextInt(1,6);
            }
            display.displayDice(dice);
            display.printMessage("select the dices you wanna reroll,if none,click roll dice");
            display.waitForPlayerToSelectDice();
            for(int i=0;i<5;i++){
                if (display.isDieSelected(i)){
                    dice[i]=rgen.nextInt(1,6);
                }
            }
            display.displayDice(dice);
            display.printMessage("select the dices you wanna reroll,if none,click roll dice");
            display.waitForPlayerToSelectDice();
            for(int i=0;i<5;i++){
                if (display.isDieSelected(i)){
                    dice[i]=rgen.nextInt(1,6);
                }
            }
            display.displayDice(dice);
        }
        private int countingscore(int[] dice,int category){
            
            int score=0;
            int sum=0;
            int[] count=getcount(dice);
            for(int i=0;i<5;i++){
                sum=sum+dice[i];
            }
            if(checkcategory(dice,category)){
                for(int i=1;i<=6;i++){
                    if(category==i){
                        score=i*count[i-1];
                    }                
                }
                if(category==9){
                    score=sum;
                }
                if(category==10){
                    score=sum;
                }
                if(category==15){
                    score=sum;
                }
                if(category==11){
                    score=25;
                }
                if(category==12){
                    score=30;
                }
                if(category==13){
                    score=40;
                }
                if(category==14){
                    score=50;    
                }                                
            }
            else score=0;
            return score;
        }
        private int[] getcount(int[] dice){
            int[] count=new int[6];
            for(int i=0;i<6;i++){
                count[i]=0;
                for(int j=0;j<5;j++){
                    if(dice[j]==i+1){
                        count[i]++;
                    }
                }
                
            }
            return count;
            
        }
        private boolean checkcategory(int[] dice,int category){//判定骰子结果是否和类别相符合
            int[] count=getcount(dice);
            boolean result=false;
            for(int i=0;i<6;i++){
                if(count[i]==5&&category==14){
                    result=true;
                }
                if(count[i]>=3&&category==9){
                    result=true;
                }
                if(count[i]>=4&&category==10){
                    result=true;
                }
            }
            if((count[0]-3)*(count[1]-3)*(count[2]-3)*(count[3]-3)*(count[4]-3)*(count[5]-3)==0&&(count[0]-2)*(count[1]-2)*(count[2]-2)*(count[3]-2)*(count[4]-2)*(count[5]-2)==0){
                if(category==11){
                    result=true;
                }
            }
            if(category==12){
                if(count[0]*count[1]*count[2]*count[3]!=0){
                    result=true;
                }
                if(count[1]*count[2]*count[3]*count[4]!=0){
                    result=true;
                }
                if(count[2]*count[3]*count[4]*count[5]!=0){
                    result=true;
                }
            }
            if(category==13){
                if(count[0]*count[1]*count[2]*count[3]*count[4]!=0){
                    result=true;
                }
                if(count[1]*count[2]*count[3]*count[4]*count[5]!=0){
                    result=true;
                }
                
            }
            if(category==15){
                result=true;
            }
            if(category>=1&&category<=6){
                result=true;
            }
            
            return result;
        }
            
    
    
    /* Java main method to ensure that this program starts correctly */
        public static void main(String[] args) {
            new Yahtzee().start(args);
        }
    
    /* Private instance variables */
        
        private int bonus=35;
        private int[] dice=new int[5];
        private int nPlayers;
        private String[] playerNames;
        private YahtzeeDisplay display;
        private RandomGenerator rgen = RandomGenerator.getInstance();
    
    }
  • 相关阅读:
    UE如何区分PDSCH中传输的DCCH和DTCH呢?
    LTE RLC 子层
    LTE的两篇微文
    TD-LTE中S1接口不支持的功能有哪些
    LTE系统消息SIB
    【转载】LTE – TTI Bundling技术
    关于lte上行闭环功控,下面哪个信道不能进行闭环功控
    lte每个小区有多少个可用的随机接入前导码
    LTE的物理小区标识(PCI)
    (转)MVC一个页面多个submit
  • 原文地址:https://www.cnblogs.com/livingisgood/p/4046322.html
Copyright © 2020-2023  润新知