斯坦福 cs106A Assignment5

来源:互联网 发布:canon mp288清零软件 编辑:程序博客网 时间:2024/05/29 12:39

在学斯坦福cs106A时编程任务没有习题答案,百度上也难找到4-7的答案, 所有放上自己写的代码(能运行并符合题目要求,因为初学,写的不好看,)供人参考,

因为是初学,英文又不好,代码中用了很多中文,随着学习的深入,个人觉得还是用中文比较好。

Assignment5

/* * File: Yahtzee.java * ------------------ * This program will eventually play the Yahtzee game. * @author zyw23 */import acm.io.*;import acm.program.*;import acm.util.*;public class Yahtzee extends GraphicsProgram implements YahtzeeConstants {public static void main(String[] args) {new Yahtzee().start(args);}public void run() {IODialog dialog = getDialog();nPlayers = MAX_PLAYERS + 1;          //确保while循环开始while (nPlayers > MAX_PLAYERS) {     //检查玩家输入的玩家人数nPlayers = dialog.readInt("几个玩家一起玩(最多4个玩家)");}playerNames = new String[nPlayers];for (int i = 1; i <= nPlayers; i++) {playerNames[i - 1] = dialog.readLine("请输入玩家的名字: " + i);}display = new YahtzeeDisplay(getGCanvas(), playerNames);playGame();}private void playGame() {myinit();for (int i = 0; i < N_SCORING_CATEGORIES; i++) {for (int j = 1; j <= nPlayers; j++) {          玩家进行游戏(j);                    //j代表第几位玩家}}显示赢家();}//进行游戏private void 玩家进行游戏(int nPlayer) {// step 1 投骰子并在界面显示display.printMessage("轮到玩家: " + playerNames[nPlayer - 1] + " ! 请点 \"Roll Dice\" 按钮去摇骰子.");display.waitForPlayerToClickRoll(nPlayer);rollingDice();display.displayDice(dices);//step 2 选择要重新投的骰子重投并在界面显示结果for (int i = 0; i < 2; i++) {display.printMessage("请用鼠标选择要重新摇的骰子, 再点 \"Roll Again\".");display.waitForPlayerToSelectDice();rollingSelectedDice();display.displayDice(dices);}//step 3 存储最终的有效骰子分数,并显示在界面上display.printMessage("请用鼠标选择一个计分的种类.");int category = display.waitForPlayerToSelectCategory();存储被选中的种类值(nPlayer - 1, category - 1);显示界面有效的值(nPlayer, category);}//存储被选中的种类值,所有数据存储在数组playScoresprivate void 存储被选中的种类值(int 第几位玩家, int 数组种类) {     //第几位玩家和种类是数组中的排序playScores[第几位玩家][数组种类] = 判断骰子排列是否匹配种类并赋值(数组种类);countUPPER_SCORE(第几位玩家);countLOWER_SCORE(第几位玩家);total(第几位玩家);}//显示界面已获得的分数与当前所有分数的和private void 显示界面有效的值(int 第几位玩家, int 界面种类) {        //第几位玩家和种类是以"界面"中的排序display.updateScorecard(界面种类, 第几位玩家, playScores[第几位玩家 - 1][界面种类 - 1]);display.updateScorecard(UPPER_SCORE, 第几位玩家, playScores[第几位玩家 - 1][UPPER_SCORE - 1]);display.updateScorecard(LOWER_SCORE, 第几位玩家, playScores[第几位玩家 - 1][LOWER_SCORE - 1]);display.updateScorecard(TOTAL, 第几位玩家, playScores[第几位玩家 - 1][TOTAL - 1]);}//骰子排列是否匹配种类  如果匹配根据种类计算骰子分数后赋值,如不匹配赋值0分.所有分数存储在数组playScoresprivate int 判断骰子排列是否匹配种类并赋值(int 数组种类) {                   //种类是数组中的排序int value = 0;int 界面种类 = 数组种类 + 1;if (界面种类 >= ONES && 界面种类 <= SIXES) {for (int i = 0; i < N_DICE; i++) {if (dices[i] == 界面种类) value += dices[i];}} else if ((界面种类 >= THREE_OF_A_KIND && 界面种类 <= FULL_HOUSE) || 界面种类 == YAHTZEE) {//判断骰子出现相同值的个数在3个以上的四种情况,3个值相同/4个值相同/3个值相同加一对/5个相同.//如果匹配根据种类计算骰子分数后赋值,如不匹配赋值0分.所有分数存储在数组playScoresvalue = kind(界面种类);} else if (界面种类 == SMALL_STRAIGHT || 界面种类 == LARGE_STRAIGHT) {//判断骰子出现4个或5个连续数的两种情况,例如2345/12345.//如果匹配根据种类计算骰子分数后赋值,如不匹配赋值0分.所有分数存储在数组playScoresvalue = 顺子(界面种类);     } else if (界面种类 == CHANCE) {value += 相加所有骰子的值();}return value;}//相加所有骰子的值private int 相加所有骰子的值() {int value = 0;for (int i = 0; i < N_DICE; i++) {value += dices[i];}return value;}//判断骰子出现相同值的个数在3个以上的四种情况,3个值相同/4个值相同/3个值相同加一对/5个相同.//如果匹配根据种类计算骰子分数后赋值,如不匹配赋值0分.所有分数存储在数组playScoresprivate int kind(int 界面种类) {                         //界面种类是以"界面"中的排序int value = 0;if (界面种类 == YAHTZEE) {value = 五个值相同();} else if  (界面种类 == FOUR_OF_A_KIND) {value = 四个值相同();} else if  (界面种类 == THREE_OF_A_KIND) {   //判断3个值相同的情况,分另为两个骰子是否是对子.FULL_HOUSE  THREE_OF_A_KINDvalue = 三个值相同();} else if  (界面种类 == FULL_HOUSE) {value = 三个值相同加一对();}return value;}//判断5个值相同的情况,YAHTZEEprivate int 五个值相同() { boolean 判断 = false;for (int i = 1; i < N_DICE; i++) {if (dices[0] != dices[i]) break;判断 = true;}return 判断 ? 50 : 0;}//判断4个值相同的情况,FOUR_OF_A_KINDprivate int 四个值相同() {boolean 判断 = false;if (判断有几个相同值(dices[0], 4)) {判断 = true;} else if (判断有几个相同值(dices[1], 4)) {判断 = true;} else {判断 = false;}return 判断 ? 相加所有骰子的值() : 0;}//判断是否有几个相同值private boolean 判断有几个相同值(int 相同值, int 相同值数量) {boolean 判断 = false;int  有几个相同值 = 0;for (int i = 0; i < N_DICE; i++) {if (相同值 == dices[i]) 有几个相同值++;}if (有几个相同值 >= 相同值数量) 判断 = true;return 判断;}//判断3个值相同的情况,分另为两个骰子是否是对子.//FULL_HOUSE  THREE_OF_A_KINDprivate int 三个值相同() {                      boolean 判断 = false;if (判断有几个相同值(dices[0], 3)) {判断 = true;} else if (判断有几个相同值(dices[1], 3)) {判断 = true;} else if (判断有几个相同值(dices[2], 3)) {判断 = true;} else {判断 = false;}return 判断 ? 相加所有骰子的值() : 0;}//判断3个值相同的情况,分另为两个骰子是否是对子.//FULL_HOUSE  THREE_OF_A_KINDprivate int 三个值相同加一对() {                      boolean 判断 = false;if (判断有几个相同值(dices[0], 3)) {判断 = 判断另外两个值是否相同(dices[0]);} else if (判断有几个相同值(dices[1], 3)) {判断 = 判断另外两个值是否相同(dices[1]);} else if (判断有几个相同值(dices[2], 3)) {判断 = 判断另外两个值是否相同(dices[2]);} else {判断 = false;}return 判断 ? 25 : 0;}//判断除三个相同值外另外两个值是否相同private boolean 判断另外两个值是否相同(int 三个相同的值) {   boolean 判断 = false;int  一对值1 = 0;int  一对值2 = 0;for (int i = 0; i < N_DICE; i++) {if (三个相同的值 != dices[i]) {if (一对值1 == 0) 一对值1 = dices[i]; else 一对值2 = dices[i];}}if (一对值1 == 一对值2) 判断 = true;return 判断;}//判断骰子出现4个或5个连续数的两种情况,例如2345/12345.//如果匹配根据种类计算骰子分数后赋值,如不匹配赋值0分.所有分数存储在数组playScoresprivate int 顺子(int 界面种类) {int value = 0;if (界面种类 == SMALL_STRAIGHT) {value = 四个顺子();} else if  (界面种类 == LARGE_STRAIGHT) {value = 五个顺子();} return value;}//判断五个顺子private int 五个顺子() {return 是否顺子(骰子中最小值(), 5) ? 40 : 0;}//判断四个顺子private int 四个顺子() {if (是否顺子(骰子中最小值(), 4)) {return 30;} else {return 是否顺子(骰子中最大值(), 4) ? 30 : 0;}}//根据起始值去判断顺子是正序还是倒序,在依据顺序去判断.private boolean 是否顺子(int 起始值, int 几个顺子) {boolean 顺子中的值是否存在 = false;boolean 判断是否顺子 = false;for (int j = 1; j < 几个顺子; j++) {顺子中的值是否存在 = false;for (int i = 0; i < N_DICE; i++) {if (起始值 <= 3) {if (dices[i] == (起始值 + j)) {顺子中的值是否存在 = true;break;}} else {if (dices[i] == (起始值 - j)) {顺子中的值是否存在 = true;break;}}}if (!顺子中的值是否存在) break;}if (顺子中的值是否存在) 判断是否顺子 = true;return 判断是否顺子;}//找出五个骰子中最小值private int 骰子中最小值() {int min = dices[0];for (int i = 1; i < N_DICE; i++) {if (dices[i] < min) {min = dices[i];} }return min;}//找出五个骰子中最大值private int 骰子中最大值() {int max = dices[0];for (int i = 1; i < N_DICE; i++) {if (dices[i] > max) {max = dices[i];} }return max;}//显示赢家private void 显示赢家() {判断有几个赢家();String winners = "";int  最大值玩家 = -1;for (int i = 0; i < winner.length; i++) {if (winner[i] == 1) {winners += playerNames[i] + ",";最大值玩家 = i;} }display.printMessage("恭喜," + winners + "玩家赢得了此轮比赛, 最大分数为: " + playScores[最大值玩家][TOTAL - 1] + " !");}//判断赢家 赢家结果存储在winners.private void 判断有几个赢家() {int maxScores = 0;  //最大值bonus();allTotal();显示每位玩家最终值();//找出total最大值for (int i = 0; i < playScores.length; i++) {if (playScores[i][TOTAL - 1] > maxScores) {maxScores = playScores[i][TOTAL - 1];} }//找出有几位玩家等于最大值.for (int j = 0; j < playScores.length; j++) {if (playScores[j][TOTAL - 1] == maxScores) {winner[j] = 1;                //赢家标记为1.}}}//在界面显示UPPER_SCORE,UPPER_BONUS,LOWER_SCORE,TOTALprivate void 显示每位玩家最终值() {for (int i = 1; i <= nPlayers; i++) {display.updateScorecard(UPPER_BONUS, i, playScores[i - 1][UPPER_BONUS - 1]);display.updateScorecard(TOTAL, i, playScores[i - 1][TOTAL - 1]);}}//对种类1-6求和并存入种类7private void countUPPER_SCORE(int 第几位玩家) {                   //第几位玩家是数组中的排序playScores[第几位玩家][UPPER_SCORE - 1] = 0;for (int i = 0; i < SIXES; i++) {playScores[第几位玩家][UPPER_SCORE - 1] += playScores[第几位玩家][i];}}//对种类9-15求和并存入种类16private void countLOWER_SCORE(int 第几位玩家) {                  //第几位玩家是数组中的排序playScores[第几位玩家][LOWER_SCORE - 1] = 0;for (int i = THREE_OF_A_KIND - 1; i < CHANCE; i++) {playScores[第几位玩家][LOWER_SCORE - 1] += playScores[第几位玩家][i];}}//对所有玩家的种类1-6,8,9-15求和并存入种类17private void allTotal() {for (int i = 0; i < nPlayers; i++) {playScores[i][TOTAL - 1] = playScores[i][UPPER_SCORE - 1] + playScores[i][LOWER_SCORE - 1] + playScores[i][UPPER_BONUS - 1];}}//对单个玩家种类1-6,8,9-15求和并存入种类17private void total(int 第几位玩家) {playScores[第几位玩家][TOTAL - 1] = playScores[第几位玩家][UPPER_SCORE - 1] + playScores[第几位玩家][LOWER_SCORE - 1] + playScores[第几位玩家][UPPER_BONUS - 1];}//判断种类7是否>=63,如果是种类8计入35分数private void bonus() {for (int i = 0; i < nPlayers; i++) {if (playScores[i][UPPER_SCORE - 1] >= 63) playScores[i][UPPER_BONUS - 1] = 35;}}//投骰子 骰子的结果存储在数组dicesprivate void rollingDice() {for (int i = 0; i < N_DICE; i++) {dices[i] = rgen.nextInt(1, 6);}}//投选中的骰子private void rollingSelectedDice() {for (int i = 0; i < N_DICE; i++) {if (display.isDieSelected(i)) dices[i] = rgen.nextInt(1, 6);}}//初始化玩家分数数组与骰子值数组private void myinit() {winner = new int[nPlayers];                     //赢家初始化dices = new int[N_DICE];                        //骰子初始化playScores = new int[nPlayers][N_CATEGORIES];//玩家分数初始化}/* Private instance variables */private int[] winner;          //存储谁是赢家 ,赢家值为1private int nPlayers;          //几个玩家private String[] playerNames;  //玩家名字private YahtzeeDisplay display;//游戏界面private RandomGenerator rgen = new RandomGenerator();private int[]      dices;   //存储投骰子的结果private int[][]    playScores; //存储玩家各个种类的点数}/* * File: YahtzeeConstants.java * --------------------------- * This file declares several constants that are shared by the * different modules in the Yahtzee game. * @author zyw23 */public interface YahtzeeConstants {/** The width of the application window */public static final int APPLICATION_WIDTH = 600;/** The height of the application window */public static final int APPLICATION_HEIGHT = 350;/** The number of dice in the game */public static final int N_DICE = 5;/** The maximum number of players */public static final int MAX_PLAYERS = 4;/** The total number of categories */public static final int N_CATEGORIES = 17;/** The number of categories in which the player can score */public static final int N_SCORING_CATEGORIES = 13;/** The constants that specify categories on the scoresheet */public static final int ONES = 1;public static final int TWOS = 2;public static final int THREES = 3;public static final int FOURS = 4;public static final int FIVES = 5;public static final int SIXES = 6;public static final int UPPER_SCORE = 7;public static final int UPPER_BONUS = 8;public static final int THREE_OF_A_KIND = 9;public static final int FOUR_OF_A_KIND = 10;public static final int FULL_HOUSE = 11;public static final int SMALL_STRAIGHT = 12;public static final int LARGE_STRAIGHT = 13;public static final int YAHTZEE = 14;public static final int CHANCE = 15;public static final int LOWER_SCORE = 16;public static final int TOTAL = 17;  }

0 0
原创粉丝点击