代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
Java
】
控制台的21点游戏
作者:
逆风飞翔
/ 发布于
2012/8/3
/
522
<div>package com.systop.blackjack;</div> import java.util.Scanner;</div> <div>/** * 21点游戏 * * * 改进说明 * 1.改进当玩家连续要牌至爆分时,游戏仍继续进行的 bug , * 在玩家连续要牌已爆分时将flag置为true, * 同时在电脑智能控制函数comPlayer中对电脑是否继续要牌是加入flag判定 * 从而达到玩家先爆分时,电脑不会爆分,玩家输 * * 2.当一局游戏完成(开牌或爆分)时,由玩家决定是否继续游戏,并重新决定投注数额, * 当玩家选 N 是打印当前用户积分,返回主页面由用户选择是否继续或退出程序 * * 3.将money的操作放到player方法中,将玩家信息展示的实现放在player类中 * 减少对player类属性的直接操作,在player类中将其属性权限设为private * * 4.当玩家输入投注金额大于剩余金额时,提示用户金额不足显示当前金额,并提示用户重新输入投注金额 * * @author yh * */ public class BlackJack {</div> <div>Player player = new Player();// 玩家 Player computer = new Player();// 电脑 Dealer deck = new Dealer();// 获取一副牌 Scanner input; boolean flag = false;//玩家是否已爆分 int yourChoice;// 用户选择 /** * 构造方法,输出菜单并完成所有方法调用 */ public BlackJack() { //player = new Player(); //computer = new Player(); //deck = new Dealer(); //String str = null; input = new Scanner(System.in);</div> <div>while (true) { player.playAgain();// 清空玩家手中的牌 computer.playAgain(); // 初始化游戏界面 System.out.println("*********************************************"); System.out.println("** **"); System.out.println("** 黑杰克-全世界都在用它赚钱 **"); System.out.println("** **"); System.out.println("*********************************************"); System.out.println(" 1.开始游戏 "); System.out.println(" 2.查看比分 "); System.out.println(" 3.结束游戏 "); System.out.println("请选择:"); int choice = input.nextInt(); switch(choice){ case 1: start(); break; case 2: checkStore(); break; case 3: System.exit(0); break; default: break; } } } <div>/** * 游戏开始,在这里完成第一把的投注于发出第一张牌, 然后玩家选择是投注加倍金额,发下一张牌还是PASS或者看牌 */ public void start() { int money = 20;// 投注金额 System.out.println("请输入你要投注的金额(最小面值20):"); money = input.nextInt(); int left = player.touZhu(money);</div> if(left == 0){//当玩家金额不足时提示用户重新输入投注金额 start(); } //if(money <= player.cash){ // //if (money < 20) { //System.out.println("您输入的金额过小,系统自动将投注金额设置为20"); //money = 20;// 强制最小投注为20 //} //}else{ //System.out.println("你的剩余金额不足,剩余金额为"+player.cash); //start(); //} System.out.println(); System.out.println("开始发牌。。。。。"); player.setHand(deck.getCard()); computer.setHand(deck.getCard()); do { System.out.println("您得到的牌是:" + player.getHandList()); System.out.println("您的选择:1.加倍;2.PASS;3.再要一张;4.开牌;5.退回上级菜单"); yourChoice = input.nextInt();</div> <div>switch (yourChoice) { case 1: yourDouble(money); break; case 2: yourPass(money); break; case 3: getCardAgain(); if(computePoint(player) > 21){//加入是否爆分判断,从而控制当玩家连续要牌爆分结束当局游戏 System.out.println("你爆分了"); flag = true;//将玩家爆分标志置为true,在winOrLose函数判断中会根据此标志选择 //yourChoice = 0; winOrLose(money); } break; case 4: winOrLose(money); break; case 5: break; default: break; } } while (yourChoice != 5 && yourChoice != 0); } <div>/** * 查看玩家得分 */ public void checkStore() { System.out.println(player); } <div>/** * 玩家投注加倍 * * @param money */ public void yourDouble(int money) { money *= 2;// 投注金额加倍</div> <div>// 判断输赢 winOrLose(money); } <div>/** * 点数计算 * * @param player * 游戏参与者 * @return */ public int computePoint(Player player) { // 由于A的积分特殊,需要单独运算 int point = 0; int numOfA = 0;//A的个数 Card[] cards = player.hand.cards; for(int i = 0,length = cards.length;i < length && cards[i] != null;i ++){ //提前取到cards.lengtg,避免每次对length进行计算,有利于提高效率 String face = cards[i].getFace(); if(face.equals("A")){ numOfA++; point += 11; }else if(face.equals("J")||face.equals("Q")||face.equals("K")||face.equals("A")){ point += 10; }else{ point += Integer.parseInt(face); } } while(point > 21 && numOfA > 0){//当玩家爆分且手中有A时,A依次按1点记,点数小于21点或没有A再看做11点时结束 point -= 10; numOfA --; } return point; } <div>/** * 选择pass后计算输赢 * * @param money */ public void yourPass(int money) { // 判断输赢 winOrLose(money); } <div>/** * 再发一张 */ public void getCardAgain() { player.setHand(deck.getCard()); } <div>/** * 选择开牌后判断输赢 * * @param money */ public void winOrLose(int money) { int playerPoint = computePoint(player);// 获得玩家点数 int comPoint = comPlayer();// 获得电脑点数</div> <div>//输赢判断(根据输赢更新'钱'与'输赢次数') //改动后 钱 和 输赢 次数的操作都放在player类中进行 if(playerPoint <= 21 && comPoint <= 21){ if(playerPoint > comPoint){ showResult(playerPoint, comPoint); player.youWin(money); }else if(playerPoint == comPoint){ showResult(playerPoint, comPoint); System.out.println("PUSH"); }else{ showResult(playerPoint, comPoint); player.youLose(money); } }else if(playerPoint > 21 && comPoint <= 21){ showResult(playerPoint, comPoint); System.out.println(",你爆分了"); player.youLose(money); }else if(playerPoint <= 21 && comPoint > 21){ showResult(playerPoint, comPoint); System.out.println(",电脑爆分了"); player.youWin(money); }else{ showResult(playerPoint, comPoint); System.out.println(",都爆分了"); player.push(); } player.hand.clear();//清空玩家及电脑手中的牌 computer.hand.clear(); //System.out.println();//开始下一局 //System.out.println("开始发牌。。。。。"); //player.setHand(deck.getCard()); //computer.setHand(deck.getCard()); System.out.println("是否继续游戏:(Y/N)");//当一局完成后,由玩家控制是否继续游戏 String con = input.next(); if(con.equals("Y") || con.equals("y")){ this.start();//游戏继续,重新选择赌注金额 }else if(con.equals("N") || con.equals("n")){ yourChoice = 0;//在start的do-while循环中用到此判断,置0后可退出while循环 this.checkStore();//输出玩家当前积分状况,系统会继续循环,询问玩家是否继续游戏 }else{ yourChoice = 0; checkStore(); } } /** * 结果的展示 * */ public void showResult(int playerPoint, int comPoint){ System.out.println("电脑"+comPoint+"分,"+"你"+playerPoint+"分"); } <div>/** * 电脑玩家的控制 * * @return */ public int comPlayer() { int comPoint = this.computePoint(computer); System.out.println("电脑开始:" + computer.getHandList()); while (comPoint != 0 && comPoint <= 18 && computer.getSize() < 3 && !flag) {// 人工智能:如果电脑手上的点数小于18点就发牌 computer.setHand(deck.getCard());// 再发一张牌给电脑</div> <div>System.out.println("再发一张,电脑手中:" + computer.getHandList()); comPoint = computePoint(computer);// 重新计算分数 } return comPoint; } public static void main(String[] args) { new BlackJack(); } } </div> <div></div> <div>package com.systop.blackjack;</div> <div>/** * 扑克牌类 * @author yh * */ public class Card {</div> <div>//牌面值数组 String[] faces = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"}; //花色数组 String[] suits = {"黑桃", "红桃", "梅花", "方块"}; //牌的总数 int maxCards = faces.length * suits.length; //这张牌的点数 int value = 0; //构造方法 public Card() { value = 0;//用0创建一章默认纸牌 } //构造方法,创建第n张牌 public Card(int n) { value = n; } //返回表示纸牌面值的字符串 public String getFace() { return faces[value % faces.length]; } //返回表示纸牌花色的字符串 public String getSuit() { return suits[value % suits.length]; } //返回当前纸牌的花色及面值 public String toString() { return getSuit() + getFace(); } }
试试其它关键字
21点游戏
同语言下
.
List 切割成几份 工具类
.
一行一行读取txt的内容
.
Java PDF转换成图片并输出给前台展示
.
java 多线程框架
.
double类型如果小数点后为零则显示整数否则保留两位小
.
将图片转换为Base64字符串公共类抽取
.
sqlParser 处理SQL(增删改查) 替换schema 用于多租户
.
JAVA 月份中的第几周处理 1-7属于第一周 依次类推 29-
.
java计算两个经纬度之间的距离
.
输入时间参数计算年龄
可能有用的
.
C#实现的html内容截取
.
List 切割成几份 工具类
.
SQL查询 多列合并成一行用逗号隔开
.
一行一行读取txt的内容
.
C#动态修改文件夹名称(FSO实现,不移动文件)
.
c# 移动文件或文件夹
.
c#图片添加水印
.
Java PDF转换成图片并输出给前台展示
.
网站后台修改图片尺寸代码
.
处理大图片在缩略图时的展示
逆风飞翔
贡献的其它代码
(
1
)
.
控制台的21点游戏
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3