/* * 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(); }