洗牌

2006-10-12 17:23:38 麻将 Views(1013)

写成一个类:

package createpai;

import java.util.Random;

/***********************
生成一定数量的牌
数据结构为一个数组队列,可以调用其前面,或者末尾的牌
产生牌时,先生成一个临时数组的牌,依次赋麻将值,然后随机的取临时数组里面的麻将值到队列里面.
*/
public class CreatePai {
     private int pai[];
     private int front;
     private int rear;
     private int total;

     public CreatePai(int n) {
           total = n;
           pai = new int[n];
           front = 0;
           rear = n - 1;
           SetPai(CreateSeqArray());
     }

     //产生一个临时数组,顺序往里面放牌
     //基本的牌是 9*3*4 = 108 ,只有箭 +12 = 120;有箭有风 再+16=136;有梅兰等等 再+8 = 144
     private int[] CreateSeqArray() {
           int array[] = new int[total];
           int temp = 0;
           int shi = 0;
           for (int i = 0; i < 3; i++) {
                 for (int j = 0; j < 9; j++) {
                       for (int k = 0; k < 4; k++) {
                             array[temp] = shi + j;
                             temp++;
                       }
                 }
                 shi += 10;
           }
           //不同的个数决定了有不同的牌
           if (total >= 120) {
                 for (int i = 0; i < 3; i++) {
                       for (int j = 0; j < 4; j++) {
                             array[temp] = 30 + i;
                             temp++;
                       }
                 }
           }
           if (total >= 136) {
                 for (int i = 0; i < 4; i++) {
                       for (int j = 0; j < 4; j++) {
                             array[temp] = 33 + i;
                             temp++;
                       }
                 }
           }
           if (total == 144) {

           }
           return array;
     }

     //把临时数组的牌装入到数据成员里边
     private void SetPai(int array[]) {
           Random r = new Random();
           int n = 0;
           for (int i = 0; i < total; i++) {
                 do {
                       n = r.nextInt(total);
                 } while (array[n] == -1);

                 pai[i] = array[n];
                 array[n] = -1;
           }
     }

     //顺序得到牌
     public int GetSeqPai() {
           int re = -1;
           if (front <= rear) {
                 re = pai[front];
                 front++;
           }
           return re;
     }

     //逆序得到牌,用于杠的情况
     public int GetAthPai() {
           int re = -1;
           if (rear >= front) {
                 re = pai[rear];
                 rear--;
           }
           return re;
     }

     public static void main(String[] args) {
           CreatePai r = new CreatePai(136);
           for (int i = 0; i < 40; i++) {
                 System.out.print(r.GetSeqPai());
                 System.out.print("\t");
           }
     }
}

Comments

Leave a Comment

Name
Content
Verification Type the characters you see in the picture below