手记

JAVA入门第三季 简易扑克牌游戏源代码 可以自定义玩家人数 有详细注释

java入门一共三季,看完了以后感觉自己对java的认识还是有增强的,主要还是是靠自己写吧,老师讲的东西是一方面,更重要的还得是自己融会贯通。这次的扑克牌游戏,个人感觉写的方法有很多,我只是在参考了别人的方法以后,自己加入了一些自己的想法,我把想法用注释写上去跟大家分享,请大家多指教
package PokerGame;

//创建Card类,里面存储花色,号码,得分,拿到这张牌的玩家Id与姓名信息
public class Card {
String color;
String num;
String playerid;
String playname;
int score;

public Card(String color, String num, int score, String playerid,
        String playname) {
    // TODO Auto-generated constructor stub
    this.color = color;
    this.num = num;
    this.score = score;
    this.playerid = playerid;
    this.playname = playname;
}

}

package PokerGame;

//创建Player类,里面存储玩家Id与姓名信息
public class Player {

String id;
String name;

public Player(String id, String name) {
    // TODO Auto-generated constructor stub
    this.id = id;
    this.name = name;
}

}
package PokerGame;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.regex.Pattern;

public class GameTest {
// players与playernum存储玩家总数量。
static int players;
static int playernum;
// 实例化GameTest类对象test。
static GameTest test = new GameTest();
// 创建Map对象HashMap,命名为map,用于建立每张卡牌的Score与Card类对象的指向关系,
// 之后选出最大的Score,然后指向拥有最大Score的Card,完成扑克牌比大小。
Map<Integer, Card> map = new HashMap<Integer, Card>();
// 创建List对象ArrayList,命名为player,用于存储玩家信息
List<Player> player = new ArrayList<Player>();
// 创建List对象ArrayList,命名为cardlist,用于存储初创的扑克牌信息。
List<Card> cardlist = new ArrayList<Card>();
// 创建List对象ArrayList,命名为cardlistwash,用于存储洗完之后的扑克牌信息。
List<Card> cardlistwash = new ArrayList<Card>();
// 创建二维数组数列,命名为poker,横坐标用来表示抽扑克牌的次数,纵坐标用来表示玩家的顺序,用于扑克牌比大小。
Card[][] poker = null;
Random random = new Random();
Scanner input = new Scanner(System.in);

public GameTest() {
    // TODO Auto-generated constructor stub
}

// 创建一副扑克牌的方法
public void printcards() {
    System.out.println("---------创建扑克牌---------");
    String[] color = { "黑桃", "红桃", "梅花", "方块" };
    String[] num = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10",
            "J", "Q", "K" };
    // 每个花色轮一遍,每个花色轮13次,按顺序创建Card类对象newcard,
    // 因为现在还不知道哪个玩家拿到哪张牌,所以playerid和playname赋空值,
    // 创建完newcard以后,把newcard加入到cardlist队列中。
    for (int i = 0; i < 4; i++) {
        for (int j = 0; j < 13; j++) {
            Card newcard = new Card(color[i], num[j], ((4 - i) + (j * 4)),
                    null, null);
            cardlist.add(newcard);
        }
    }
    System.out.println("----------创建成功----------");
    // 打印输出cardlist,每打印输出10个Card类对象card了以后,打印输出回车换行,继续输出。
    for (int i = 0; i < cardlist.size(); i++) {
        if (i % 10 == 0 && i != 0) {
            Card card = cardlist.get(i);
            System.out.print(card.color + card.num + ", ");
            System.out.print('\n');
        } else {
            Card card = cardlist.get(i);
            System.out.print(card.color + card.num + ", ");
        }
    }
}

// 打乱一副扑克牌的方法
public void washcards() {
    System.out.println();
    System.out.println("----------洗牌开始----------");
    int num = cardlist.size();
    // 利用for循环52次,每次从cardlist中随机抽出一个Card类对象,
    // 然后将这个对象与cardlistwash进行比较,如果cardlistwash中没有这个对象,
    // 将这个对象加入cardlistwash队列中,并且在cardlist队列中将该对象删除,
    // 并且还要将创建随机数字的范围减一,避免抽不到扑克牌或者重复抽中同一张扑克牌。
    for (int i = 0; i < 52; i++) {
        Card card = cardlist.get(random.nextInt(num));
        if (!cardlistwash.contains(card)) {
            cardlistwash.add(card);
            cardlist.remove(card);
            num--;
        }
    }
    System.out.println("----------洗牌结束----------");
    // 打印输出cardlistwash,每打印输出10个Card类对象card了以后,打印输出回车换行,继续输出。
    for (int i = 0; i < cardlistwash.size(); i++) {
        if (i % 10 == 0 && i != 0) {
            Card card = cardlistwash.get(i);
            System.out.print(card.color + card.num + ", ");
            System.out.print('\n');
        } else {
            Card card = cardlistwash.get(i);
            System.out.print(card.color + card.num + ", ");
        }
    }
}

// 创建玩家信息的方法
public void createplayer() {
    // 利用正则表达式,判断输入的玩家ID符不符合ID的格式,如果不符合,提示重新输入。
    // 每编辑完成一次,players数量减一,直到为零时跳出循环,打印输出player队列
    String pattern = "^[1-9]*[0-9]*$";
    System.out.println();
    System.out.println("----------请输入玩家人数:----------");
    players = input.nextInt();
    playernum = players;
    poker = new Card[2][playernum];
    while (players != 0) {
        System.out.println("----------请输入玩家的ID----------");
        String playerid = input.next();
        boolean isMatch = Pattern.matches(pattern, playerid);
        if (!isMatch) {
            System.out.println("----------您的输入有误,请重新输入----------");
            continue;
        }
        System.out.println("----------请输入玩家的姓名----------");
        String playername = input.next();
        Player newinput = new Player(playerid, playername);
        player.add(newinput);
        players--;
    }
    if (players == 0) {
        System.out.println("----------所有玩家已经编辑完成----------");
        for (int j = 0; j < playernum; j++) {
            System.out.println("玩家" + (j + 1) + "\tID:" + player.get(j).id
                    + "\t姓名:" + player.get(j).name);
        }
    }
}

// 发牌给玩家的方法
public void dealcard() {
    int k = 0;
    System.out.println();
    System.out.println("----------发牌开始----------");
    // 外面的for循环,循环的规则是抽牌的次数,
    // 里面的for循环,循环的规则是玩家抽牌的顺序。
    // 从已经洗好的cardlistwash队列中,从头按顺序去牌,每发一张牌,
    // 为Card类对象poker的playerid与playname赋上拿到这张扑克牌的player的id与name,
    // 同时k值加一,便于发下一张牌。
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < playernum; j++) {
            poker[i][j] = cardlistwash.get(k);
            poker[i][j].playerid = player.get(j).id;
            poker[i][j].playname = player.get(j).name;
            k++;

            System.out.println("玩家" + (j + 1) + "拿牌:" + poker[i][j].color
                    + poker[i][j].num);
        }
    }

    System.out.println("----------发牌结束----------");
}

// 卡牌比较大小的方法
public void comparecard() {
    System.out.println();
    System.out.println("----------开始游戏----------");
    int count = 0;
    // 创建point数组,数组用来存放每一名玩家手上的两张牌
    int[] point = new int[2];
    // 创建finalpoint数组,数组用来存放每一名玩家手上的最大的牌
    int[] finalpoint = new int[playernum];
    while (count < playernum) {
        for (int i = 0; i < 2; i++) {
            point[i] = poker[i][count].score;
            // 建立起socre和poker的指向关系,存放在map中
            map.put(poker[i][count].score, poker[i][count]);
        }
        // 对point数组排序,输出最大的point,存放在finalpoint中
        Arrays.sort(point);
        finalpoint[count] = point[1];
        count++;
    }
    // 循环输出每名玩家手上最大的牌
    for (int i = 0; i < playernum; i++) {
        System.out.println("----------玩家" + (i + 1) + "的最大手牌为----------"
                + map.get(finalpoint[i]).color + ","
                + map.get(finalpoint[i]).num);
    }
    // 对finalpoint数组从小到大排序,输出数组的最后一位,
    // 利用map的指向关系,指向拥有最大score的poker的player,这名player即是即是赢家。
    Arrays.sort(finalpoint);
    System.out.println("----------ID与姓名分别为"
            + map.get(finalpoint[playernum - 1]).playerid + "\t"
            + map.get(finalpoint[playernum - 1]).playname
            + "\t的玩家获得了胜利----------");
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    test.printcards();
    test.washcards();
    test.createplayer();
    test.dealcard();
    test.comparecard();
}

}
效果:

16人推荐
随时随地看视频
慕课网APP