拖板车:就是两个玩家出牌。依次叠加,若出现与上面相同的牌,则收取到自己的排队,出牌,继续轮流。
例如1 2 3 6 2 (ABABA)那么A玩家可以收到牌2336到自己的牌堆;
先准备一个工具类主要功能是在数组非0尾增加元素;AAE.java
class AAE{
public static void arrayAddElement(int[] arr,int x){
//对于一个长度固定且足够大的数组增加新元素;这里主要使用集合的功能
//补集运用,这里会用到
int index = returnIndex(arr);//先访问到非0索引
arr[index+1] = x;//将x元素植入数组末尾
}
public static int returnIndex(int[] arr1){
int index = 0;
for(int i =0;i<arr1.length;i++){
if(i==0 && arr1[i]==0){
index = -1;
break;}else if(arr1[i]==0){
index = i-1;
break;
}
}
return index;
}
public static void printArray(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+"\t");
}
System.out.println();
}
//判断元素是否在数组中;是返回true
public static boolean xFind(int[] arr,int x){
boolean flag = false;
for(int i=0;i<arr.length;i++){
if(arr[i]==x){
flag = true;
}
}
return flag;
}
}
游戏程序;这里没有把收到的牌打乱再重新出。;拖板车游戏规则略。
package study.byk.demo;
/*
* --------------拖板车小游戏实验---------------------------
* 1,returnA生成一副牌54张;其中15和30代表大小王。
* 2,生成第一个玩家的牌;2016年5月3日19:53:54已完成
* 3,a,利用集合的思想补集法生成第二个玩家的牌也是27张;b,字典法生成(略)。2016年5月3日20:21:39
* 用a方法生成出现bug;退而求其次,直接生成54张分半给a,b
* 4,玩法开始。playGame数组方法
* */
public class PlayGame {
public static int[] returnA(){
int[] arr0 = new int[54];
for(int i=0;i<52;i++ ){
if((i+1)%13==0){
arr0[i]=13;
}else{
arr0[i] = (i+1)%13;
}
}
arr0[52]=15;
arr0[53]=15;//大王;原来是30;改成15
return arr0;
}
public static void printArray(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
System.out.println();
}
public static int[] cArray(int[] a){
int [] ca= new int[54];
for(int i=0;i<54;i++){
int k =(int) ((a.length-i)*Math.random());
int a1=0; int b1=k;int t=0;//t记录区间中0的个数
while(pdArray0(a,a1,b1)){
t=0;
for(int j=a1;j<=b1;j++){
if(a[j]==0){
t++;
}
}
a1 = b1+1;
b1 = b1+t;
}
ca[i] = a[b1];//除去0元素后的有效长度
a[b1] = 0;
}
return ca;
}
public static boolean pdArray0(int[] arr,int a,int b){
boolean flag = false;
for(int i = a;i<=b;i++){
if(arr[i]==0){
flag = true;//其中有0是true
break;
}
}
return flag;
}
public static void main(String[] args){
int[] a = returnA();
System.out.println("打印整副牌");
printArray(a);
int[] xpai = cArray(a);
System.out.println("打印洗了牌后的整副牌");
printArray(xpai);
int[] apai = new int[27];
int[] bpai = new int[27];
for(int i=0;i<27;i++){
apai[i] = xpai[i];
bpai[i] = xpai[i+27];
}
System.out.println("打印玩家a的手牌");
printArray(apai);
System.out.println("打印玩家b的手牌");
printArray(bpai);
System.out.println("----------游戏开始---------------");
//a玩家的收牌arr1;ar1(待出牌;回合中赢得牌)
int[] ar1 = new int[54];//玩家a的备牌
int[] ar2 = new int[54];
int[] arr0 = new int[20];//稍后修改:不能把0放进去了。
int[] arr1 = new int[54];
int[] arr2 = new int[54];
int i=0;
while(i<27){
arr1[i] = apai[i];
arr2[i] = bpai[i];
i++;
}
letCpai(0,0,0,arr0,arr1,ar1,arr2,ar2);
}
public static int sum(int[] arr){
int s =0;
for(int i=0;i<arr.length;i++){
s = s+arr[i];
}
return s;
}
public static boolean pdArrayH(int[] arr){
boolean flag = false;
int i=AAE.returnIndex(arr);
for(int j=0;j<i;j++){
if(arr[i]==arr[j]){
flag = true;
break;
}
}
return flag;
}
public static void letJpai(int[] arr0,int[] arr,int[] ar){//让进牌的方法
int ii=AAE.returnIndex(arr0);int index=0;
for(int j=0;j<ii;j++){
if(arr0[ii]==arr0[j]){
index = j;
break;
}
}
System.out.println("打印出牌中该玩家吃牌序列");
for(int k=index;k<=ii;k++){
System.out.print(arr0[k]+",");
AAE.arrayAddElement(ar, arr0[k]);//A赢了这一串就把它给备组
arr0[k] = 0;//将出牌的公用数组复位
}
System.out.println();//这里是顺便把它打印下来
}
public static void letCpai(int ai,int bi,int bz,int[] arr0, int[] arr1, int[] ar1,int[] arr2,int[] ar2){
if((sum(arr1)+sum(ar1))==0){
System.out.println("Game Over! 恭喜B玩家!");
}else if((sum(arr2)+sum(ar2))==0){
System.out.println("Game Over! 恭喜A玩家!");
}else{
if(bz==0){
//专门为A在arr1中牌的出列做个参数----ai
if(sum(arr1)!=0){
AAE.arrayAddElement(arr0, arr1[ai]);
System.out.println("A出牌:"+arr1[ai]);//打印A出牌。
arr1[ai] = 0; //直接替换进行进牌;
ai++;
}else if(sum(ar1)!=0){//这里就不洗备选牌了
for(int kk=0;kk<ar1.length;kk++){
arr1[kk] = ar1[kk];
ar1[kk] = 0;
}//都转移完了,接着就是将ai化为0;让第一个元素出列去出牌
ai=0;
AAE.arrayAddElement(arr0, arr1[ai]);
System.out.println("A出牌:"+arr1[ai]);//打印A出牌。
arr1[ai]=0;
ai++;
}else{
System.out.println("--------------------------------");
}//上面的一个大的 if-else里面嵌套了一个小的if-else其中重要的是让A能够出牌做处理
if(pdArrayH(arr0)){
letJpai(arr0, arr1, ar1);//让A进牌;接着就出牌
letCpai(ai,bi,0,arr0,arr1,ar1,arr2,ar2);
}else{
letCpai(ai,bi,1,arr0,arr1,ar1,arr2,ar2);//让B出牌
}
}else{
if(sum(arr2)!=0){
AAE.arrayAddElement(arr0, arr2[bi]);
System.out.println("\t"+"\t"+"B出牌:"+arr2[bi]);//打印B出牌。
arr2[bi] = 0; //直接替换进行进牌;
bi++;
}else if(sum(ar2)!=0){//这里就不洗备选牌了
for(int kk=0;kk<ar2.length;kk++){
arr2[kk] = ar2[kk];
ar2[kk] = 0;
}
bi=0;
AAE.arrayAddElement(arr0,arr2[bi]);
System.out.println("\t"+"\t"+"B出牌:"+arr2[bi]);//打印B出牌。
arr2[bi]=0;
bi++;
}else{
System.out.println("--------------传不到这儿来---------------");
}//上面的一个大的 if-else里面嵌套了一个小的if-else其中重要的是让B能够出牌做处理
if(pdArrayH(arr0)){
letJpai(arr0, arr2, ar2);//让B进牌
letCpai(ai,bi,1,arr0,arr1,ar1,arr2,ar2);
}else{
letCpai(ai,bi,0,arr0,arr1,ar1,arr2,ar2); //让A进牌
}
}
}
}
public static int reChange01(int a){
if(a==0){
return 1;
}else{
return 0;
}
}
}
给出一个运行结果:
打印整副牌
1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,1,2,3,4,5,6,7,8,9,10,11,12,13,15,30,
打印洗了牌后的整副牌
3,9,9,3,4,9,11,13,2,13,4,4,8,30,13,1,5,8,7,15,10,5,6,2,11,12,12,6,2,1,11,7,7,5,9,1,12,10,6,3,3,2,4,6,8,1,11,10,5,12,7,8,10,13,
打印玩家a的手牌
3,9,9,3,4,9,11,13,2,13,4,4,8,30,13,1,5,8,7,15,10,5,6,2,11,12,12,
打印玩家b的手牌
6,2,1,11,7,7,5,9,1,12,10,6,3,3,2,4,6,8,1,11,10,5,12,7,8,10,13,
----------游戏开始---------------
A出牌:3
B出牌:6
A出牌:9
B出牌:2
A出牌:9
打印出牌中该玩家吃牌序列
9,2,9,
A出牌:3
打印出牌中该玩家吃牌序列
3,6,3,
A出牌:4
B出牌:1
A出牌:9
B出牌:11
A出牌:11
打印出牌中该玩家吃牌序列
11,11,
A出牌:13
B出牌:7
A出牌:2
B出牌:7
打印出牌中该玩家吃牌序列
7,2,7,
B出牌:5
A出牌:13
打印出牌中该玩家吃牌序列
13,5,13,
A出牌:4
打印出牌中该玩家吃牌序列
4,1,9,4,
A出牌:4
B出牌:9
A出牌:8
B出牌:1
A出牌:30
B出牌:12
A出牌:13
B出牌:10
A出牌:1
打印出牌中该玩家吃牌序列
1,30,12,13,10,1,
A出牌:5
B出牌:6
A出牌:8
打印出牌中该玩家吃牌序列
8,5,6,8,
A出牌:7
B出牌:3
A出牌:15
B出牌:3
打印出牌中该玩家吃牌序列
3,15,3,
B出牌:2
A出牌:10
B出牌:4
打印出牌中该玩家吃牌序列
4,9,7,2,10,4,
B出牌:6
A出牌:5
B出牌:8
A出牌:6
打印出牌中该玩家吃牌序列
6,5,8,6,
A出牌:2
B出牌:1
A出牌:11
B出牌:11
打印出牌中该玩家吃牌序列
11,11,
B出牌:10
A出牌:12
B出牌:5
A出牌:12
打印出牌中该玩家吃牌序列
12,5,12,
A出牌:9
B出牌:12
A出牌:2
打印出牌中该玩家吃牌序列
2,1,10,9,12,2,
A出牌:9
B出牌:7
A出牌:3
B出牌:8
A出牌:6
B出牌:10
A出牌:3
打印出牌中该玩家吃牌序列
3,8,6,10,3,
A出牌:11
B出牌:13
A出牌:11
打印出牌中该玩家吃牌序列
11,13,11,
A出牌:13
B出牌:7
打印出牌中该玩家吃牌序列
7,13,7,
B出牌:2
A出牌:5
B出牌:7
A出牌:13
B出牌:3
A出牌:4
B出牌:15
A出牌:1
B出牌:3
打印出牌中该玩家吃牌序列
3,4,15,1,3,
B出牌:4
A出牌:9
打印出牌中该玩家吃牌序列
9,2,5,7,13,4,9,
A出牌:4
B出牌:9
A出牌:1
B出牌:7
A出牌:30
B出牌:2
A出牌:12
B出牌:10
A出牌:13
B出牌:4
打印出牌中该玩家吃牌序列
4,9,1,7,30,2,12,10,13,4,
B出牌:11
A出牌:10
B出牌:11
打印出牌中该玩家吃牌序列
11,10,11,
B出牌:7
A出牌:1
B出牌:13
A出牌:8
B出牌:7
打印出牌中该玩家吃牌序列
7,1,13,8,7,
B出牌:3
A出牌:5
B出牌:4
A出牌:6
B出牌:15
A出牌:8
B出牌:1
A出牌:6
打印出牌中该玩家吃牌序列
6,15,8,1,6,
A出牌:5
打印出牌中该玩家吃牌序列
5,4,5,
A出牌:8
B出牌:3
打印出牌中该玩家吃牌序列
3,8,3,
B出牌:4
A出牌:6
B出牌:9
A出牌:12
B出牌:1
A出牌:5
B出牌:7
A出牌:12
打印出牌中该玩家吃牌序列
12,1,5,7,12,
A出牌:2
B出牌:30
A出牌:1
B出牌:2
打印出牌中该玩家吃牌序列
2,30,1,2,
B出牌:12
A出牌:10
B出牌:10
打印出牌中该玩家吃牌序列
10,10,
B出牌:13
A出牌:9
打印出牌中该玩家吃牌序列
9,12,13,9,
A出牌:12
B出牌:4
打印出牌中该玩家吃牌序列
4,6,12,4,
B出牌:11
A出牌:2
B出牌:10
A出牌:3
B出牌:11
打印出牌中该玩家吃牌序列
11,2,10,3,11,
B出牌:7
A出牌:8
B出牌:1
A出牌:6
B出牌:13
A出牌:10
B出牌:8
打印出牌中该玩家吃牌序列
8,1,6,13,10,8,
B出牌:7
打印出牌中该玩家吃牌序列
7,7,
B出牌:3
A出牌:3
打印出牌中该玩家吃牌序列
3,3,
A出牌:11
B出牌:8
A出牌:13
B出牌:3
A出牌:11
打印出牌中该玩家吃牌序列
11,8,13,3,11,
A出牌:9
B出牌:2
A出牌:2
打印出牌中该玩家吃牌序列
2,2,
A出牌:5
B出牌:30
A出牌:7
B出牌:1
A出牌:13
B出牌:2
A出牌:4
B出牌:10
A出牌:9
打印出牌中该玩家吃牌序列
9,5,30,7,1,13,2,4,10,9,
A出牌:6
B出牌:10
A出牌:15
B出牌:4
A出牌:8
B出牌:6
打印出牌中该玩家吃牌序列
6,10,15,4,8,6,
B出牌:12
A出牌:1
B出牌:4
A出牌:6
B出牌:11
A出牌:5
B出牌:2
A出牌:4
打印出牌中该玩家吃牌序列
4,6,11,5,2,4,
A出牌:5
B出牌:10
A出牌:12
打印出牌中该玩家吃牌序列
12,1,5,10,12,
A出牌:1
B出牌:3
A出牌:5
B出牌:11
A出牌:7
B出牌:8
A出牌:12
B出牌:1
打印出牌中该玩家吃牌序列
1,3,5,11,7,8,12,1,
B出牌:6
A出牌:9
B出牌:13
A出牌:12
B出牌:10
A出牌:13
打印出牌中该玩家吃牌序列
13,12,10,13,
A出牌:9
打印出牌中该玩家吃牌序列
9,9,
A出牌:3
B出牌:8
A出牌:3
打印出牌中该玩家吃牌序列
3,8,3,
A出牌:11
B出牌:7
A出牌:8
B出牌:7
打印出牌中该玩家吃牌序列
7,8,7,
B出牌:6
打印出牌中该玩家吃牌序列
6,11,6,
B出牌:10
A出牌:13
B出牌:15
A出牌:3
B出牌:4
A出牌:11
B出牌:8
A出牌:2
B出牌:6
A出牌:2
打印出牌中该玩家吃牌序列
2,6,2,
A出牌:9
B出牌:1
A出牌:5
B出牌:3
打印出牌中该玩家吃牌序列
3,4,11,8,9,1,5,3,
B出牌:5
A出牌:30
B出牌:11
A出牌:7
B出牌:7
打印出牌中该玩家吃牌序列
7,7,
B出牌:8
A出牌:1
B出牌:12
A出牌:13
打印出牌中该玩家吃牌序列
13,15,5,30,11,8,1,12,13,
A出牌:2
B出牌:1
A出牌:4
B出牌:7
A出牌:10
打印出牌中该玩家吃牌序列
10,2,1,4,7,10,
A出牌:9
B出牌:8
A出牌:4
B出牌:7
A出牌:6
B出牌:6
打印出牌中该玩家吃牌序列
6,6,
B出牌:11
A出牌:11
打印出牌中该玩家吃牌序列
11,11,
A出牌:5
B出牌:6
A出牌:2
B出牌:3
A出牌:4
打印出牌中该玩家吃牌序列
4,7,5,6,2,3,4,
A出牌:12
B出牌:4
A出牌:1
B出牌:11
A出牌:5
B出牌:8
打印出牌中该玩家吃牌序列
8,12,4,1,11,5,8,
B出牌:9
打印出牌中该玩家吃牌序列
9,9,
B出牌:1
A出牌:10
B出牌:5
A出牌:12
B出牌:3
A出牌:13
B出牌:7
A出牌:12
打印出牌中该玩家吃牌序列
12,3,13,7,12,
A出牌:10
打印出牌中该玩家吃牌序列
10,5,10,
A出牌:13
B出牌:7
A出牌:9
B出牌:6
A出牌:9
打印出牌中该玩家吃牌序列
9,6,9,
A出牌:3
B出牌:6
A出牌:8
B出牌:8
打印出牌中该玩家吃牌序列
8,8,
B出牌:12
A出牌:3
打印出牌中该玩家吃牌序列
3,6,12,3,
A出牌:2
B出牌:4
A出牌:6
B出牌:1
打印出牌中该玩家吃牌序列
1,13,7,2,4,6,1,
B出牌:11
A出牌:2
B出牌:5
A出牌:13
B出牌:8
A出牌:15
B出牌:9
A出牌:5
打印出牌中该玩家吃牌序列
5,13,8,15,9,5,
A出牌:30
B出牌:9
A出牌:11
打印出牌中该玩家吃牌序列
11,2,30,9,11,
A出牌:8
B出牌:8
打印出牌中该玩家吃牌序列
8,8,
B出牌:8
A出牌:1
B出牌:1
打印出牌中该玩家吃牌序列
1,1,
B出牌:13
A出牌:12
B出牌:7
A出牌:13
打印出牌中该玩家吃牌序列
13,12,7,13,
A出牌:10
B出牌:2
A出牌:2
打印出牌中该玩家吃牌序列
2,2,
A出牌:1
B出牌:4
A出牌:4
打印出牌中该玩家吃牌序列
4,4,
A出牌:7
B出牌:6
A出牌:10
打印出牌中该玩家吃牌序列
10,1,7,6,10,
A出牌:11
B出牌:1
A出牌:11
打印出牌中该玩家吃牌序列
11,1,11,
A出牌:4
B出牌:8
打印出牌中该玩家吃牌序列
8,4,8,
B出牌:8
A出牌:7
B出牌:1
A出牌:5
B出牌:1
打印出牌中该玩家吃牌序列
1,5,1,
B出牌:8
打印出牌中该玩家吃牌序列
8,7,8,
B出牌:4
A出牌:6
B出牌:8
A出牌:2
B出牌:1
A出牌:3
B出牌:5
A出牌:4
打印出牌中该玩家吃牌序列
4,6,8,2,1,3,5,4,
A出牌:12
B出牌:1
A出牌:3
B出牌:8
A出牌:13
B出牌:7
A出牌:7
打印出牌中该玩家吃牌序列
7,7,
A出牌:12
打印出牌中该玩家吃牌序列
12,1,3,8,13,12,
A出牌:10
B出牌:8
Game Over! 恭喜A玩家!