手记

Java入门第三季——简易扑克牌游戏

这是一个简单到不能再简单的扑克牌游戏,但是要实现它还是要花费一些功夫,特别是在能力不足的情况下。我用了将近一天才完成这个作品,已经优化了很多细节。不过部分细节如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入门季说再见了。感谢三位老师的引路,我要开始迈向新的征程了!

5人推荐
随时随地看视频
慕课网APP

热门评论

上文的花色图案不能正常显示,相关代码如下:

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;

查看全部评论