写了一天,中途遇到种种问题,其中数组越界困扰了半天,总的来说算是对第三季的一个总结了,接下来要开始看I/O流还有MySQL了。
主函数类
package cardsgame;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
/**游戏功能:
* 1、创建一副牌 addCard
* 2、洗牌 shuffleCard
* 3、创建玩家 createPlayer
* 4、比较手牌大小 compareCard
*/
public class PlayGame {
//用来存放创建好的牌的List
public List<Cards> cardsList;
//用来存放创建好的玩家的Map
public Map<Integer, Player> playerMap;
//定义全局变量
public static int player1;
public static int player2;
private Scanner console;
public PlayGame() {
this.cardsList = new ArrayList<Cards>();
this.playerMap = new HashMap<Integer, Player>();
console = new Scanner(System.in);
}
/**
* 创建一副扑克牌addCard,除去大小王,共计52张。
* 先创建一个花色数组,然后创建一个点数数组。
* 通过for双重循环生成带有花色和点数的Poker对象
* 将Poker添加到pokerList中去,创建完成。
* 然后进行验牌,将创建好的牌进行打印输出,防止出老千^_^
*/
public void addCard() {
String[] type = {"", "", "", ""};
String[] nums = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
for (int i = 0; i < 4; i++) {
for (int j = 0; j <13; j++) {
Cards card = new Cards(type[i], nums[j]);
cardsList.add(card);
}
}
System.out.println("█████████████████开始创建扑克牌█████████████████");
//遍历一下创建好的扑克牌
for (Cards card : cardsList) {
System.out.print("[" + card.type + card.num + "]");
}
System.out.println();
System.out.println("█████████████████扑克牌创建完毕█████████████████");
System.out.println();
System.out.println();
}
/**
* 洗牌shuffleCard
* 首先打印一句话,开始洗牌。
* 通过调用Collections.shuffle()方法,对pokerList进行打乱顺序。
* 然后将洗完的牌再次进行打印输出。
*/
public void shuffleCard() {
System.out.println("█████████████████开始洗牌█████████████████");
Collections.shuffle(cardsList);
//遍历一下洗完牌之后的扑克牌
for (Cards card : cardsList) {
System.out.print("[" + card.type + card.num + "]");
}
System.out.println();
System.out.println("█████████████████洗牌完毕█████████████████");
System.out.println();
System.out.println();
}
/**
* 创建玩家
* 先打印输出,开始创建玩家。然后依次提示用户输入玩家ID和姓名
* 如果ID相同或者ID不为整数则抛出异常并提示玩家重新输入
*/
public void addPlayer() {
System.out.println("█████████████████开始创建玩家█████████████████");
for(int i = 0 ;i < 2;){
System.out.println("请输入第" + (i+1) + "位玩家的ID:");
int id = 0;
try{
id = scanInt();
} catch (Exception e) {
System.out.println(e.getMessage());
continue;
}
Player p = playerMap.get(id);
if(p == null) {
System.out.println("请输入玩家的姓名:");
String name = console.next();
playerMap.put(id, new Player(id , name));
//用switch case来对全局变量player1和player2进行赋值
switch(i) {
case 0:
player1 = id;
case 1:
player2 = id;
}
System.out.println("玩家创建成功!");
i++;
} else {
System.out.println("该ID已存在,请重新输入一次!");
continue;//跳出当前,直接回到循环开始
}
}
}
/**
* 防止输入 非整数型的ID
*/
public int scanInt() throws Exception {
try {
int id = console.nextInt();
return id;
} catch (Exception e) {
console = new Scanner(System.in);
throw new Exception("请输入整数类型的ID!");
}
}
/** 运行游戏
* 首先要发牌,然后比较大小
*/
public void playGame() {
System.out.println("█████████████████开始发牌█████████████████");
//发牌有多种方法,可以从上往下开始发,也可以随机发。
//随机发牌可以生成随机数和for循环来实现
//这里按照从上往下顺序发牌,一人一张交替发牌。
playerMap.get(player1).listCards.add(cardsList.get(0));
System.out.println("玩家:" + playerMap.get(player1).name + "拿牌" );
playerMap.get(player2).listCards.add(cardsList.get(1));
System.out.println("玩家:" + playerMap.get(player2).name + "拿牌");
playerMap.get(player1).listCards.add(cardsList.get(2));
System.out.println("玩家:" + playerMap.get(player1).name + "拿牌");
playerMap.get(player2).listCards.add(cardsList.get(3));
System.out.println("玩家:" + playerMap.get(player2).name + "拿牌");
System.out.println("█████████████████发牌完毕█████████████████");
//用Map的get()方法
//通过getKey(ID)找到玩家Player的Value
//然后将Value中的手牌集合的牌(花色和点数)赋值给手牌对象
Cards c1 = playerMap.get(player1).listCards.get(0);
Cards c11 = playerMap.get(player1).listCards.get(1);
Cards c2 = playerMap.get(player2).listCards.get(0);
Cards c22 = playerMap.get(player2).listCards.get(1);
//打印输出一号玩家的手牌
System.out.println("玩家:" + playerMap.get(player1).name + "的手牌为"
+ "[" + c1.type + c1.num + "]"+"[" + c11.type + c11.num + "]");
//打印输出二号玩家的手牌
System.out.println("玩家:" + playerMap.get(player2).name + "的手牌为"
+ "[" + c2.type + c2.num + "]"+ "[" + c22.type + c22.num + "]");
//创建一个比较手牌大小类的对象,来调用Compare方法
CompareToCards ctc = new CompareToCards();
//比较手牌类返回的是一个int类型的值,这个值需要在maxFigure方法中使用
int p1 = ctc.compare(c1, c11);
int p2 = ctc.compare(c2, c22);
//首先比较玩家自己手中的两张牌,得到最大的那张。
//调用maxFigure方法,将玩家1最大的手牌给新创建的Cards对象player1MaxCards
Cards player1MaxCards = ctc.maxFigure(c1, c11, p1);
//调用maxFigure方法,将玩家2最大的手牌给新创建的Cards对象player2MaxCards
Cards player2MaxCards = ctc.maxFigure(c2, c22, p2);
//打印输出玩家1的最大手牌
System.out.println("玩家:" + playerMap.get(player1).name + "最大的手牌为:"
+ "[" + player1MaxCards.type + player1MaxCards.num + "]");
//打印输出玩家2的最大手牌
System.out.println("玩家:" + playerMap.get(player2).name + "最大的手牌为:"
+ "[" +player2MaxCards.type + player2MaxCards.num + "]");
//比较两个玩家的对大手牌,然后输出获胜者及最大的牌
//用过if判断语句实现
if (ctc.compare(player1MaxCards, player2MaxCards) > 0) {
System.out.println("█████████████████获胜者为:"
+ playerMap.get(player1).name + "█████████████████");
} else {
System.out.println("█████████████████获胜者为:"
+ playerMap.get(player2).name + "█████████████████");
}
}
//主函数
public static void main (String[] args) {
//创建PlayGame对象,然后调用方法
PlayGame pl = new PlayGame();
pl.addCard();
pl.shuffleCard();
pl.addPlayer();
pl.playGame();
}
}
扑克牌类
package cardsgame;
//为了简单书写所有变量没有使用private
public class Cards {
//扑克牌花色
public String type;
//扑克牌点数
public String num;
@Override public String toString() {
return type + num ;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((type == null) ? 0 : type.hashCode());
result = prime * result + ((num == null) ? 0 : num.hashCode()); return result; }
@Override public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Cards))
return false;
Cards other = (Cards) obj;
if (type == null) {
if (other.type != null)
return false;
} else if (!type.equals(other.type))
return false;
if (num == null) {
if (other.num != null)
return false;
} else if (!num.equals(other.num))
return false;
return true; }
public Cards(String type, String num) {
this.type = type;
this.num = num;
}
}
``
玩家类
package cardsgame;
import java.util.ArrayList;
import java.util.List;
public class Player {
//玩家ID
public Integer id;
//玩家姓名
public String name;
//玩家手牌List
List<Cards> listCards = new ArrayList<Cards>();
public Player(){
}
public Player(Integer id, String name) {
this.id = id;
this.name = name;
this.listCards = new ArrayList<Cards>();
}
}
手牌比较类
package cardsgame;
import java.util.Comparator;
public class CompareToCards implements Comparator<Cards> {
@Override
//返回值是一个int型数字,返回1即o1比o2大,返回-1即o2比o1大。
//因为只有一副牌,除去大小王,花色按照黑红梅芳从大到小的顺序比较,
//所以不可能出现平局。
public int compare(Cards o1, Cards o2) {
// 创建四种花色,从小到大排序
String pattern = "";
// 创建点数2-A,从小到大排序
String figure = "2345678910JQKA";
// 索引第一张牌的花色
int p1 = pattern.indexOf(o1.type);
// 索引第一张牌的点数
int f1 = figure.indexOf(o1.num);
// 索引第二张牌的花色
int p2 = pattern.indexOf(o2.type);
// 索引第二张牌的点数
int f2 = figure.indexOf(o2.num);
// 开始进行比较,先比较两张牌的大小,再比较花色
if (f1 > f2) {
return 1;
} else if (f1 == f2) {
if (p1 > p2) {
return 1;
} else {
return -1;
}
} else {
return -1;
}
}
//定义k是为了把compare比较出的值传递给maxPoker方法,从而返回最大者
public Cards maxFigure(Cards o1, Cards o2, int k) {
if (k > 0) {
return o1;
} else {
return o2;
}
}
}