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();
}
}
效果: