java中用二维数组表示扑克_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 map = new HashMap();

// 创建List对象ArrayList,命名为player,用于存储玩家信息

List player = new ArrayList();

// 创建List对象ArrayList,命名为cardlist,用于存储初创的扑克牌信息。

List cardlist = new ArrayList();

// 创建List对象ArrayList,命名为cardlistwash,用于存储洗完之后的扑克牌信息。

List cardlistwash = new ArrayList();

// 创建二维数组数列,命名为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();

}

}

效果:

AAffA0nNPuCLAAAAAElFTkSuQmCC

AAffA0nNPuCLAAAAAElFTkSuQmCC

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值