这是一个简单到不能再简单的扑克牌游戏,但是要实现它还是要花费一些功夫,特别是在能力不足的情况下。我用了将近一天才完成这个作品,已经优化了很多细节。不过部分细节如ID姓名占用并没有考虑,原因是在这个游戏里ID并没有什么卵用,而玩家名字只要不是故意也不会重复。主要考虑的是异常处理还有代码美观(觉得不好看随便批评哈)
/**
* 扑克牌类
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Poker implements Comparable<Poker>{
char suits; //花色
Integer number; //点数
char alphabet; //字母(仅限部分卡牌)
String suitsOrder = " "; //花色大小顺序
List<Poker> pokers = new ArrayList<Poker>(); //扑克牌集合
// 生成整套扑克牌(除大小王)
void creatPoker() {
for(int i=0; i<4; i++) {
for(int j=2; j<15; j++) {
Poker poker = new Poker();
switch(i) {
case 0: poker.suits = '';break;
case 1: poker.suits = '';break;
case 2: poker.suits = '';break;
case 3: poker.suits = '';break;
}
poker.number = j;
if(poker.number > 10) {
switch(poker.number) {
case 11: poker.alphabet = 'J';break;
case 12: poker.alphabet = 'Q';break;
case 13: poker.alphabet = 'K';break;
case 14: poker.alphabet = 'A';break;
}
}
pokers.add(poker);
}
}
}
// 按初始顺序打印扑克牌集合
void printPoker() {
for(Poker poker : pokers) {
if(poker.number > 10) {
System.out.print("["+poker.suits+poker.alphabet+"]");
}else
System.out.print("["+poker.suits+poker.number+"]");
}
}
// 洗牌
void shuffle() {
Collections.shuffle(pokers);
}
@Override
// 重写扑克牌比较方法
public int compareTo(Poker o) {
// TODO 自动生成的方法存根
Integer index1 = suitsOrder.indexOf(this.suits);
Integer index2 = suitsOrder.indexOf(o.suits);
if(this.number == o.number) {
return index1.compareTo(index2);
}else
return this.number.compareTo(o.number);
}
@Override
// 重写扑克牌转字符串方法
public String toString() {
if(number > 10)
return "" + suits + alphabet; //最简易的转String方式
else return "" + suits + number;
}
}
/**
* 玩家类型
*/
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Player implements Comparable<Player>{
String name;
int id;
List<Poker> pokers = new ArrayList<Poker>();
// 返回玩家手中最大的牌
Poker maxPoker() {
Collections.sort(pokers);
return pokers.get(1);
}
@Override
// 根据手持最大牌对玩家进行排序
public int compareTo(Player o) {
// TODO 自动生成的方法存根
return maxPoker().compareTo(o.maxPoker());
}
}
/**
* 游戏操作界面
*/
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
public class GameInterFace {
public static void main(String[] args) {
// TODO 自动生成的方法存根
System.out.println("-----创建扑克牌-----");
Poker poker = new Poker();
poker.creatPoker();
System.out.println("-----扑克牌创建成功-----");
poker.printPoker();
System.out.println("\n-----开始洗牌-----");
poker.shuffle();
System.out.println("-----洗牌结束-----");
System.out.println("-----创建玩家-----");
Player player1 = new Player();
Player player2 = new Player();
Scanner input = new Scanner(System.in);
System.out.println("请输入第1位玩家的ID和姓名:");
System.out.print("输入ID:");
inputTo(player1); //输入异常处理后赋值给玩家1
System.out.print("输入姓名:");
player1.name = input.next();
System.out.println("请输入第2位玩家的ID和姓名:");
System.out.print("输入ID:");
inputTo(player2);
System.out.print("输入姓名:");
player2.name = input.next();
System.out.println("---欢迎玩家"+player1.name+"和"+player2.name);
System.out.println("-----开始发牌-----");
System.out.println("---玩家:"+player1.name+"-拿牌");
player1.pokers.add(poker.pokers.get(0));
System.out.println("---玩家:"+player2.name+"-拿牌");
player2.pokers.add(poker.pokers.get(1));
System.out.println("---玩家:"+player1.name+"-拿牌");
player1.pokers.add(poker.pokers.get(2));
System.out.println("---玩家:"+player2.name+"-拿牌");
player2.pokers.add(poker.pokers.get(3));
System.out.println("-----发牌结束-----");
System.out.println("-----开始游戏-----");
System.out.println("玩家"+player1.name+"最大手牌为:"+player1.maxPoker().toString());
System.out.println("玩家"+player2.name+"最大手牌为:"+player2.maxPoker().toString());
List<Player> playerList = new ArrayList<Player>();
playerList.addAll( Arrays.asList(player1,player2)); //添加到玩家列表
Collections.sort(playerList); //根据比较规则排序
Player winner = playerList.get(1);
System.out.println("-----玩家:"+winner.name+"获胜!-----");
System.out.println("---玩家各自的手牌为:");
System.out.println(player1.name+":"+player1.pokers.toString());
System.out.println(player2.name+":"+player2.pokers.toString());
input.close();
}
// 异常处理输入信息后赋值给参数对应ID
static void inputTo(Player player) {
Scanner input = new Scanner(System.in);
while(true) {
try {
player.id = input.nextInt();
break; //若正常执行则跳出循环
}catch(InputMismatchException e) {
System.out.println("格式错误!请输入长度10以下的纯数字");
input.nextLine(); //接收一整行的错误信息
}
}
}
}
最后,终于可以跟Java入门季说再见了。感谢三位老师的引路,我要开始迈向新的征程了!
热门评论
上文的花色图案不能正常显示,相关代码如下:
String suitsOrder = "♦ ♣ ♥ ♠";
for(int i=0; i<4; i++) {
for(int j=2; j<15; j++) {
Poker poker = new Poker();
switch(i) {
case 0: poker.suits = '♦';break;
case 1: poker.suits = '♣';break;
case 2: poker.suits = '♥';break;
case 3: poker.suits = '♠';break;