在某次的恶劣的JAVA上机中,菜鸟博主嗅到了一丝蔑视的味道——上个班的这个作业听说好像有点难!
怎么会!
看我!
……
好吧我看了,我好像也写不出来~
当然事实可能是有点难度了,毕竟对于JAVA初学者来说做这样个东西确实会有点难的。
上机作业打开的那一瞬间,我首先捕获到了 21点。呃,二十一点是什么东西!(博主承认在电影里确实描绘过这种****的场景,当然纯洁的博主自然是不会受***的“熏陶”的)。在经历过一系列的求助度娘之后,博主用自己可怜的理解力截取了一些有用的信息:发牌、庄家、闲家、黑杰克、爆了……好吧为了保护自己残存的脑细胞,博主选择自动过滤一些字眼,然后就用来设计自己的上机作业。
作业也没有要求完全模拟二十一点游戏,只要求是随机产生纸牌和判断结果,所以博主很自觉地忽略掉了庄家和闲家的概念,为此一下代码将不含有复杂的思路!仅仅是脑力缺失人士的个人成果展。
代码如下:
public class PlayingCard {
private int[] card = new int[52]; //总牌
private boolean[] cardFlag = new boolean[52]; //标记被抽到过的牌
public PlayingCard() {
this.CardInit(); //初始化
}
public int DealCard() { //用于产生随机牌的方法
int card = 0;
while (true) { //为了保证出来的随机数是有用的
card = Deal();
if(card != -1) {
return card;
}
else
continue;
}
}
private int Deal() {
int cardNum = (int)(Math.random() * 51 + 1); //产生随机数
while (true) {
if (cardFlag[cardNum] == false) {
cardFlag[cardNum] = true; //牌已经被抽到过
return card[cardNum];
}
else return -1;
}
}
private void CardInit() {
for (int i = 0;i < 52;i++) {
int Num = (i + 4) / 4; //给牌赋值
if (Num >= 10){
Num = 10; // 10、J、Q、K 都作为 10
}
card[i] = Num; //赋值
cardFlag[i] = false; //牌的初始状态为未抽到过
}
}
}
这个是为纸牌创建的一个类,主要是用来定义纸牌、初始化纸牌和随机产生纸牌的类,没有难以理解的地方,主要原因是博主脑容量有限。
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
public class MainProcess {
static String[] player = new String[]{"p1","p2","p3","p4"}; //创建四个玩家
static int NumberAmount[] = new int[4]; //储存每个玩家的牌的总和
static boolean[] playerFlag = new boolean[]{true,true,true,true}; //记录玩家是否死掉
static boolean[] repeatFlag = new boolean[]{false,false,false,false};
static boolean[] CardNeed = new boolean[]{true,true,true,true}; //记录玩家是否要牌
public static void main(String[] args) {
RequireDealCard(); //调用发牌方法
Result(); //调用判断输赢方法
Scanner sc = new Scanner(System.in);
sc.next();
}
public static void RequireDealCard() {
PlayingCard pc = new PlayingCard(); //创建纸牌对象
Scanner sc = new Scanner(System.in);
int[][] card = new int[player.length][44]; //记录玩家的手牌
for (int i = 0;i < player.length;i++) { //首轮发牌
try{
card[i][0] = pc.DealCard();
card[i][1] = pc.DealCard();
NumberAmount[i] = card[i][0] + card[i][1];
System.out.printf("The person %s gets his cards,which are %d and %d.\n and the point-number of he is %d.\n\n",player[i],card[i][0],card[i][1],NumberAmount[i]);
}
catch (Exception e){
System.out.printf(e.toString());
}
}
boolean DontNeedFlag[] = new boolean[player.length];
int DontNeed = 0;
while (DontNeed != 4) {
for (int i = 0; i < player.length; i++) {
if (playerFlag[i] && CardNeed[i]) { //如果玩家还活着
System.out.printf("\ndoes %s needs any cards?\n[0-20]",player[i]); //
int cardAmount = sc.nextInt(); //输入发牌的张数,玩家是否要求发牌
if (!(cardAmount == 0)) {
int CardLength = FindNotZero(card[i]);
System.out.printf("%s gets %d card(s),\nand there are ",player[i],cardAmount);
for (int j = CardLength; j < (cardAmount + CardLength); j++) {
card[i][j] = pc.DealCard(); //调用随机发牌方法
System.out.printf("%-4d",card[i][j]); //输出玩家刚刚拥有的牌
NumberAmount[i] += card[i][j]; //计算玩家所有的手牌和
}
CardLength = FindNotZero(card[i]);
System.out.printf("\n%s has ",player[i]);
for (int j = 0; j < (CardLength); j++) {
System.out.printf("%-4d",card[i][j]); //输出玩家所有的手牌
}
}
else { //玩家不要牌了
int CardLength = FindNotZero(card[i]);
System.out.printf("\n%s has ",player[i]);
for (int j = 0; j < CardLength; j++) {
System.out.printf("%-4d",card[i][j]);
}
CardNeed[i] = false;
}
System.out.printf("\nsum is %d.",NumberAmount[i]);
if (NumberAmount[i] > 21) { //如果玩家牌和超过21就死掉
playerFlag[i] = false; //玩家死亡标志
System.out.printf("\n\t%s is killed.",player[i]);
CardNeed[i] = false;
NumberAmount[i] = 0; //将玩家的手牌和置为空,便于后面的统计输出
}
System.out.println();
}
else if (playerFlag[i] && !CardNeed[i]) {
if (i == 4) {
break;
}
else
continue;
}
}
for (int i = 0; i < player.length; i++) { //统计有多少个人不要牌了
if (!DontNeedFlag[i]) {
if (!CardNeed[i]) {
DontNeedFlag[i] = true;
DontNeed++;
}
}
}
}
}
public static void Result() {
//所有人都死了,平局
//只有一个人或者两个人死了,比较大小谁更接近 21
//只有一个人活着,他就是赢家
int count = 0; //记录有多少个玩家还未死亡
for (int i = 0; i < playerFlag.length; i++) {
if(playerFlag[i] == true) {
count++;
}
}
if(count > 1) { //如果有两个以上玩家活着
//主要是为了怕有两个人的点数一样
if(CheckRepeat(NumberAmount)) {
System.out.printf("\n\n\t\tThe winners are ");
for (int i = 0; i < player.length; i++) {
if (repeatFlag[i]) {
System.out.printf("%3s",player[i]);
}
}
}
else {
System.out.printf("\n\n\t\tThe winner is %s.",player[Arrays.binarySearch(NumberAmount,getMax(NumberAmount))]);
}
}
else if(count == 1) { //如果只有一个人活着
for (int i = 0; i < playerFlag.length; i++) {
if (playerFlag[i]) { //寻找那个活着的玩家
System.out.printf("\n\n\t\tThe winner is %s.",player[i]);
}
}
}
else if (count == 0) { //全死了
System.out.printf("\n\n\t\tNo winner!");
}
}
public static int getMax(int[] arr){ //获取最大的那个人的纸牌
int max = arr[0];
for(int i = 1;i < arr.length;i++){
if(arr[i] > max){
max = arr[i];
}
}
return max;
}
public static boolean CheckRepeat(int[] arr) { //检测是否有多个赢家
int m = Arrays.binarySearch(NumberAmount,getMax(NumberAmount));
boolean flag = false;
//两层循环来判断是否有重复的元素
for (int i = 0; i < arr.length; i++) {
if(arr[i] == arr[m]) {
flag = true;
repeatFlag[i] = true;
}
}
return flag;
}
public static int FindNotZero(int[] arr) { //返回的是当前数组的开始为0的那一位元素
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
return i;
}
}
return arr.length;
}
}
对的,这个就是主类了,主要包含~很多东西~,至于为什么要塞那么多东西给主类,这就是用多了C语言留下来的后遗症,大学嘛,不都是这样教的~。
写完这个东西之后,博主觉得自己可牛*了,这么个东西都给弄出来了,自我感觉良好,亟待一杯咖啡。