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();

}
原文地址:https://www.cnblogs.com/livingisgood/p/4046322.html