用来记录玩家ID、姓名、获得的手牌组合以及手牌面值及其对应的索引值
package PlayingCards;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class CardsPlayer {
public String id;
public String name;
public Set<String> cards; //用来记录玩家获得的手牌
public Map values; //用来记录值和索引键值对
//public Set labels; //用来记录获得手牌的索引
//public Set values; //用来记录获得手牌的值
public CardsPlayer(String id, String name){
this.id = id;
this.name = name;
this.cards = new HashSet<String>();
//this.labels = new HashSet();
//this.values = new HashSet();
this.values = new HashMap();
}
}
简易扑克牌游戏主程序
包括生成扑克牌、创建玩家、洗牌和发牌、输出各玩家获得手牌情况并比较手牌大小四部分
package PlayingCards;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
public class PlayingCards {
public String[] value = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
public String[] type = {"黑桃","红桃","梅花","方片"};
public int amount; //用来记录给每个玩家发牌的数量
public int[] values = new int[52]; //用来记录扑克牌的值
public List<String> cards = new ArrayList<String>(); //用来记录生成的扑克牌
public Map<String, CardsPlayer> players = new HashMap<String, CardsPlayer>(); //用来记录玩家信息
public List<String> playersID = new ArrayList<String>(); //用来记录玩家的ID
/*
* 生成扑克牌
* 创建花型和数值数组,遍历数组生成扑克牌
*/
public void createCard(){
System.out.println("---------创建扑克牌---------");
String str;
for (int i=0; i<type.length; i++){
for (int j=0; j<value.length; j++){
str = type[i]+value[j];
if (value[j].equals("J"))
values[i*value.length+j] = 11;
else if (value[j].equals("Q"))
values[i*value.length+j] = 12;
else if (value[j].equals("K"))
values[i*value.length+j] = 13;
else if (value[j].equals("A"))
values[i*value.length+j] = 14;
else if (value[j].equals("10"))
values[i*value.length+j] = 10;
else if (value[j].equals("9"))
values[i*value.length+j] = 9;
else if (value[j].equals("8"))
values[i*value.length+j] = 8;
else if (value[j].equals("7"))
values[i*value.length+j] = 7;
else if (value[j].equals("6"))
values[i*value.length+j] = 6;
else if (value[j].equals("5"))
values[i*value.length+j] = 5;
else if (value[j].equals("4"))
values[i*value.length+j] = 4;
else if (value[j].equals("3"))
values[i*value.length+j] = 3;
else
values[i*value.length+j] = 2;
cards.add(str);
}
}
System.out.println("---------扑克牌创建成功!---------");
System.out.print("为:["+cards.get(0));
for (int i=1; i<cards.size(); i++){
System.out.print(","+cards.get(i));
}
System.out.println("]");
}
/*
* 创建玩家
* 玩家信息包括ID、姓名、手牌组合等
*/
public void createPlayer(){
System.out.println("---------创建玩家---------");
Scanner in = new Scanner(System.in);
String id;
String name;
int i=1;
while(i<3) {
System.out.println("请输入第"+i+"位玩家的ID和姓名:");
System.out.println("输入ID:");
id = in.next();
if (players.get(id) == null){
System.out.println("输入姓名:");
name = in.next();
CardsPlayer p = new CardsPlayer(id,name);
players.put(id, p);
i++;
}else{
System.out.println("该ID已被占用!!!");
continue;
}
}
Set keyList = players.keySet();
for (Object object : keyList) {
playersID.add((String)object);
System.out.println("欢迎玩家:"+players.get(object).name);
}
}
/*洗牌和发牌*/
public void sendCards(){
Random r = new Random();
int[] flags = new int[52]; //用于记录相应位置的牌是否已发出,1为发出,0为未发出
Scanner in = new Scanner(System.in);
System.out.println("请输入每人发牌张数:");
amount = in.nextInt();
System.out.println("--------洗牌结束--------");
System.out.println("--------开始发牌--------");
int label;
for (int i=1; i<=amount; i++){
for (String id:playersID){
do{
label = r.nextInt(cards.size());
}while(flags[label]==1);
players.get(id).cards.add(cards.get(label)); //前一个cards为CardsPlayer类的cards属性,后一个cards为记录生成扑克牌的列表
//players.get(id).labels.add(label);
players.get(id).values.put(values[label],label); //CardsPlayer类的values属性为HashMap,记录手牌的数值和对应cards列表的索引,通过比较数值和索引大小,即可判断出手牌大小
flags[label] = 1;
}
}
System.out.println("--------发牌结束--------");
}
/*输出各玩家获得手牌情况,并比较手牌大小*/
public void cardsObtained(){
Set keyList = players.keySet();
int[][] num = new int[2][amount]; //用来记录玩家获得的手牌的面值,并进行升序排列
String[] id = new String[2]; //用来记录与手牌面值信息对应的玩家ID
int i=0;
for (Object object : keyList) {
System.out.println("玩家"+players.get((String)object).name+"获得的手牌为:");
for (String card:players.get((String)object).cards){
System.out.print(card+"\t");
}
System.out.println();
Set kidKey = players.get((String)object).values.keySet();
int j=0;
for (Object object2 : kidKey) {
num[i][j] = (int)object2;
j++;
}
Arrays.sort(num[i]); //进行升序排列
id[i] = (String)object;
i++;
}
for (int label=amount-1; label>=0; label--){
if (num[0][label] == num[1][label]){
if ((int)players.get(id[0]).values.get(num[0][label]) < (int)players.get(id[1]).values.get(num[1][label])){
System.out.println("玩家"+players.get(id[0]).name+"的牌更大,为"+cards.get((int)players.get(id[0]).values.get(num[0][label])));
break;
}
if ((int)players.get(id[0]).values.get(num[0][label]) > (int)players.get(id[1]).values.get(num[1][label])){
System.out.println("玩家"+players.get(id[1]).name+"的牌更大,为"+cards.get((int)players.get(id[1]).values.get(num[1][label])));
break;
}
}
if (num[0][label] > num[1][label]){
System.out.println("玩家"+players.get(id[0]).name+"的牌更大,为"+cards.get((int)players.get(id[0]).values.get(num[0][label])));
break;
}
if (num[0][label] < num[1][label]){
System.out.println("玩家"+players.get(id[1]).name+"的牌更大,为"+cards.get((int)players.get(id[0]).values.get(num[1][label])));
break;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
PlayingCards pc = new PlayingCards();
pc.createCard();
pc.createPlayer();
pc.sendCards();
pc.cardsObtained();
}
}
进一步优化:
1.CardsPlayer类中可以将扑克牌、扑克牌面值、扑克牌对应的索引记录在一个成员变量里面,定义为HashMap或数组均可
2.主程序中用来记录玩家信息的变量players可定义为CardsPlayer类的数组,这样通过索引即可获得所需信息,简化程序