扑克牌游戏软件

实验2 (扑克牌游戏软件)面向对象编程

实验目的

1、掌握如何在Java 程序中描述一个完整的实体概念。了解Java 语言中类的声明和对象的创建与撤销,特别是对象的生存期以及对象状态的概念。

2、继承机制表达了实体与实体之间的is-a 关系,它是面向对象设计的重要特性,而多态性则是该特性带来的程序设计精华。掌握继承机制以及以此为基础的程序多态性。

实验任务

1、编写一个扑克牌游戏软件,首先定义一个单张扑克牌类,包含每张牌的花色与大小,牌的大小1应该表示为A,11~13应分别表示为J、Q和K。然后定义一个整幅牌的类,编写洗牌、发牌与理牌方法。

如果一副扑克牌的张数共54张,即包含了大小王牌,并且为了适应升级玩法,在发牌时每位玩家手头只有12张牌,余下的6张牌为“底牌”,又应该如何实现?

实验指导

/******************** Bridge.java************************/

提示:

如何存放54张牌?可以定义一个Card类,表示一张牌,Card应该有属性“花色”和“大小”,那大小王又怎样描述?然后用一个Cards类存放54张牌,初始时按顺序存放。

洗牌的算法如何?洗牌就是随机从Cards数组中抽出两张牌进行交换,假设交换了500次。

发牌后如何存放玩家的牌?当然也用数组了,不过需要5个数组,其中一个用来放底牌。

• 建模:

一副扑克牌(PlayingCards)

属性:4种花色×13种点数=52张牌deck

行为:洗牌shuffle()、发牌deal()、理牌sort()

单张扑克牌(Card)

属性:花色suit与点数face

行为:显示属性toString()、花色与点数排序次序compareTo()

import java.util.Arrays; //模拟一张扑克牌 class Card implements Comparable<Card> { // 花色(1至4代表方块、梅花、红桃、黑桃) private int suit; // 点数(1至13代表A、2、3、...、10、J、Q、K) private int face; // 构造方法,参数s和f分别表示牌的花色与点数 public Card(int s, int f){ suit = s; face = f; } // 返回用字符串描述的牌面(重定义Object类的方法) public String toString(){ // 先给出花色描述 String suitString = ""; if(suit==1) suitString = "方块"; else if(suit==2) suitString = "梅花"; else if(suit==3) suitString = "红桃"; else if(suit==4) suitString = "黑桃"; // 再给出点数描述 String faceString = ""; if(face == 1) faceString = "A"; else if(face == 11) faceString = "J"; else if(face == 12) faceString = "Q"; else if(face == 13) faceString = "K"; else faceString = Integer.toString(face); return (suitString + faceString); } @Override // 比较两张牌的大小以决定理牌的次序(实现Comparable接口的方法) public int compareTo(Card other) { int value1 = (this.face-1)+(this.suit-1)*13; int value2 = (other.face-1)+(other.suit-1)*13; if(value1 < value2) return -1; else if(value1==value2) return 0; else return 1; }} class Poker{ public static final int FULLCARDNUM = 52; private Card[] fullcard = new Card[FULLCARDNUM]; public Poker(){ initPoker(); } //初始化整副牌 private void initPoker(){ for(int i=0; i<4; i++){ for(int j=0; j<13; j++){ fullcard[i*13+j] = new Card(i+1, j+1); } } } //打印整副牌 public void printPoker(){ for(int i=0; i<4; i++){ for(int j=0; j<13; j++){ System.out.print(fullcard[i*13+j].toString()+ ","); } System.out.println(); } } //洗牌 public void shuffle(){ // 连续多次交换牌 for (int count = 0; count < 200; count++) { // 随机找两张牌的位置 int index1 = (int) (Math.random() * FULLCARDNUM); int index2 = (int) (Math.random() * FULLCARDNUM); // 交换这两张牌 Card temp = fullcard[index1]; fullcard[index1] = fullcard[index2]; fullcard[index2] = temp; } } /* 另外一种常见洗牌方式是随机从一副牌中抽出连续一叠牌,将它们放在剩余牌的最上面,并且不断重复这一过程。(提示:由伪随机数确定数组中的两个位置,然后将数组中间的连续一段元素移到最前面) */ //发牌 public void deal(Card[] east, Card[] south,Card[] west, Card[] north){ // 将牌依次发给4家 for (int index = 0; index < FULLCARDNUM; index++) { int who = index % 4; // 确定发牌给哪一家 int round = index / 4; // 确定正在发第几轮牌 if (who == 0) east[round] = fullcard[index]; else if (who == 1) south[round] = fullcard[index]; else if (who == 2) west[round] = fullcard[index]; else north[round] = fullcard[index]; } // 为4家理牌 sort(east); sort(south); sort(west); sort(north); } // 理牌 public void sort(Card[] cards){ Arrays.sort(cards); } } //桥牌娱乐主程序 public class Bridge { // 定义符号常量以提高程序的可扩充性(一手牌的张数) private static final int SUITMAX = Poker.FULLCARDNUM / 4; // 显示各家手头上的牌面 public static void showHand(Card[] east, Card[] south,Card[] west, Card[] north){ System.out.println("东家的牌:"); for(int i=0; i<SUITMAX; i++) System.out.print(east[i]+" "); System.out.println("\n***********************************************"); System.out.println("南家的牌:"); for(int i=0; i<SUITMAX; i++) System.out.print(south[i]+" "); System.out.println("\n***********************************************"); System.out.println("西家的牌:"); for(int i=0; i<SUITMAX; i++) System.out.print(west[i]+" "); System.out.println("\n***********************************************"); System.out.println("北家的牌:"); for(int i=0; i<SUITMAX; i++) System.out.print(north[i]+" "); System.out.println("\n***********************************************"); } // 主程序 public static void main(String[] args){ // 准备好一副扑克牌 Poker cards = new Poker(); cards.printPoker(); System.out.println("***********************************************"); // 洗牌 cards.shuffle(); cards.printPoker(); System.out.println("***********************************************"); // 发牌 Card[] east = new Card[SUITMAX]; Card[] south = new Card[SUITMAX]; Card[] west = new Card[SUITMAX]; Card[] north = new Card[SUITMAX]; cards.deal(east, south, west, north); // 摊牌 showHand(east, south, west, north); } }


已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页