先给大家上效果图
项目思路
问题一 : 如何区分花色(黑,红,梅,方)?
按照常规逻辑,一副牌54张 如果按照从1-54用数字去代替是不好区分的(比较麻烦,各种if)
我这里就搞了一个数组去存储所有的牌,注意是所有的“牌”,然后搞另外一个数组去存这个数组
的下标,也就是说,我无论是洗牌,发牌,变的都是这个数据的下标,只要在显示的时候把数据
转换回来就可以了,如果还不是很懂,请往下看。
问题二:如何洗牌?
在我们常见的洗牌方法中有一种叫印度洗牌法,它的洗牌规则是这样的:从牌堆中间取出若干
然后放到牌堆顶部,如此循环,牌就洗乱了,那其实我们也可以仿照这样搞一个类似的洗牌方法:
/** 洗牌方法 */
private void randomData() {
for (int i = 0; i < ALL_CARD.length; i++) {
mAllData[i] = i;
}
for (int i = 0; i < ALL_CARD.length; i++) {
int r = mRandom.nextInt(53);
exchange(r,0);
int k = i % 2;
exchange(r,52+k);
}
}
/** 交换方法 */
private void exchange(int p1, int p2){
int temp = mAllData[p1];
mAllData[p1] = mAllData[p2];
mAllData[p2] = temp;
}
这样 mAllData数组里面本来存放的是0-53的数据,就变得乱七八糟了,这要牌就洗好了
问题三 : 如何发牌?
发牌就比较简单了,现实生活中一般是1张1张的发,这里我们就直接一个人发17张(因为牌堆本身就是乱的,
洗了54次牌),然后剩下三张。
/** 发牌方法 */
private void allotData() {
for (int i = 0; i < ALL_CARD.length; i++) {
if (i < 17 ) {
mLeftData.add(mAllData[i]);
}else if(i > 16 && i < 34 ){
mRightData.add(mAllData[i]);
}else if(i > 33 && i < 51 ){
mLocalData.add(mAllData[i]);
}else{
mThreeData.add(mAllData[i]);
}
}
}
问题四: 如何把数据变成“牌”?
到这一步之前我们上边所有的操作,都其实是ALL_CARD数组的下标,就相当我们拿到兑换券了,
直接去找ALL_CARD去把下标兑换成相应的“牌”就可以了;
/** 数据转换方法 */
private void convertData(List<Integer> data) {
for (int i = 0; i < data.size(); i++) {
int temp = data.get(i);
data.set(i, ALL_CARD[temp]);
}
}
项目代码
主要逻辑代码
public class CardMatrix {
public final int[] ALL_CARD = {
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17 };
public int[] mAllData;
public List<Integer> mLeftData;
public List<Integer> mRightData;
public List<Integer> mLocalData;
public List<Integer> mThreeData;
private Random mRandom;
public CardMatrix() {
initData();
randomData();
allotData();
convertData(mLeftData);
convertData(mRightData);
convertData(mLocalData);
convertData(mThreeData);
}
private void initData() {
mRandom = new Random();
mAllData = new int[54];
mLeftData = new ArrayList<Integer>();
mRightData = new ArrayList<Integer>();
mLocalData = new ArrayList<Integer>();
mThreeData = new ArrayList<Integer>();
}
/** 洗牌方法 */
private void randomData() {
for (int i = 0; i < ALL_CARD.length; i++) {
mAllData[i] = i;
}
for (int i = 0; i < ALL_CARD.length; i++) {
int r = mRandom.nextInt(53);
exchange(r,0);
int k = i % 2;
exchange(r,52+k);
}
}
/** 发牌方法 */
private void allotData() {
for (int i = 0; i < ALL_CARD.length; i++) {
if (i < 17 ) {
mLeftData.add(mAllData[i]);
}else if(i > 16 && i < 34 ){
mRightData.add(mAllData[i]);
}else if(i > 33 && i < 51 ){
mLocalData.add(mAllData[i]);
}else{
mThreeData.add(mAllData[i]);
}
}
}
/** 交换数据 */
private void exchange(int p1, int p2){
int temp = mAllData[p1];
mAllData[p1] = mAllData[p2];
mAllData[p2] = temp;
}
/** 数据转换方法 */
private void convertData(List<Integer> data) {
for (int i = 0; i < data.size(); i++) {
int temp = data.get(i);
data.set(i, ALL_CARD[temp]);
}
}
/** 获取方法 */
public List<Integer> getLeftData() {
Collections.sort(mLeftData);
return mLeftData;
}
public List<Integer> getRightData() {
Collections.sort(mRightData);
return mRightData;
}
public List<Integer> getLocalData() {
Collections.sort(mLocalData);
return mLocalData;
}
public List<Integer> getThreeData() {
return mThreeData;
}
/** 重新开始方法 */
public void restart(){
mLeftData.clear();
mRightData.clear();
mLocalData.clear();
mThreeData.clear();
randomData();
allotData();
convertData(mLeftData);
convertData(mRightData);
convertData(mLocalData);
convertData(mThreeData);
}
}
测试方法
public static void main(String[] args) {
CardMatrix m = new CardMatrix()
System.out.println("左边玩家的牌: " + m.getLeftData().toString())
System.out.println("右边玩家的牌: " + m.getRightData().toString())
System.out.println("我自己 的牌: " + m.getLocalData().toString())
System.out.println("最后剩下的牌: " + m.getThreeData().toString())
while(true){
Scanner scnn = new Scanner(System.in)
String str = scnn.next()
if ("0".equals(str)) {
m.restart()
System.out.println("左边玩家的牌: " + m.getLeftData().toString())
System.out.println("右边玩家的牌: " + m.getRightData().toString())
System.out.println("我自己 的牌: " + m.getLocalData().toString())
System.out.println("最后剩下的牌: " + m.getThreeData().toString())
}else{
return
}
}
}
运行项目