`
microjava
  • 浏览: 309279 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

几种不同的算法实现小时候玩的扑克牌游戏

阅读更多
   记得小时候看到别人玩的一个游戏,给他一定个数有大小次序的扑克牌,指定每次置底的个数,经过他调整次序后,可以先置底再出一张牌,依此类推,直到扑克牌全部出来,可以实现从大到小或者从小到大一个个出来,是怎么出来的呢?当时觉得很神奇,长大后经过思考和查阅知道了方法,并用几种算法实现了!
 
   以下是用java实现的程序:


/**
 * 功能说明:扑克牌游戏,先出一张牌后置一张牌到底部,依次类推
 * 使其按1 2 3 4顺序出列
 * 采用逆推法和改错法
 */
package com.mcfeng.base;

/**
 * @author microjava
 * 
 * 2008-12-29上午12:46:15
 * 
 */
public class Pukepai {

	private final static int PAI_NUM = 13;

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		// 测试
		// System.out.println(adNum(13));

		// 排序第一个参数为牌的个数,第二个参数为置底个数(目前只支持1)第三个参数0代表先出牌1代表先置底
		sort(13, 1, 0);
		
		//逆推法
		sortByNitui(13,3,true);
		
		//唐粒子的方法
		/*int num = 3;
		while(num++ < 1000) {
			sort(num, 1, 0);
			sortByTang(num);
		}
		*/

	}

	/**
	 * 得出 n + n/2 + n/4 + ... + 1 的和 有小数的补整
	 */
	public static int adNum(int n) {
		int m = 0;
		for (int i = n; i > 0;) {
			// System.out.println(i);
			m += i;
			if (i == 1)
				break;
			if (i % 2 == 0)
				i = i / 2;
			else
				i = (i / 2) + 1;

		}
		return m;
	}

	/**
	 * 改错法
	 * 扑克牌排序,三个参数的意思分别为: paiNum牌个数 hNum每次置地步牌的个数 l出牌或置底顺序(0为先出牌,1为先置底)
	 */
	public static int[] sort(int paiNum, int hNum, int l) {
		if(paiNum <= 1)  {
			int [] res = {1};
			return res;
		}

		int total = adNum(paiNum);
		int[] a = new int[total]; // 初始的加长数组 可以存放置底的牌 长度由 n + n/2 +
		// n/4 + ... + 1得出
		int[] b = new int[paiNum]; // 逆推序列数组

		int[] c = new int[paiNum]; // 正确顺序数组

		//初始化数组
		for (int i = 0; i < paiNum; i++) {
			a[i] = i + 1;
			
		}

		//按照规则排序
		int st = 0;                     //定义起点
		int bj = 0;                     //逆推序列数组标号
		int aj = paiNum;                //加长存放起始标号
		while(true) {
			b[bj++] = a[st++];
			if(a[st + 1] == 0) {
				b[bj] = a[st];
				break;
			}
			a[aj++] = a[st++];
		}
		
		//由逆推序列得出正确序列
		for (int i = 0; i < b.length; i++) {
			c[b[i] - 1] = i + 1;
		}

		System.out.println("改错法排出的序列");
		for (int i : c) {
			System.out.print(i + " ");
		}
		return c;

	}
	
	/**
	 * 逆推法
	 * 扑克牌排序,三个参数的意思分别为: paiNum牌个数 
	 * hNum每次置地步牌的个数 flag出牌或置底顺序(true为先出牌,false为先置底)
	 * */
	public static int[] sortByNitui(int paiNum,int hNum,boolean flag) {
		int[] a = new int[paiNum];  //初始数组
		int[] b = new int[paiNum];  //正确数组
		
		//初始化序列
		for (int i=0;i<paiNum;i++) {
			a[i] = paiNum - i;
		}
		
		int ed = paiNum - 1,st = 0;
		//逆推排序 一张牌置底的时候
		/*while(ed >= 0) {
			b[ed] = a[st];
			if(ed == 0 && l == 0) break;
			if(ed < paiNum - 1) {
				int temp =b[paiNum - 1];
				for(int i = paiNum - 2;i >= ed;i--) {
					b[i + 1] = b[i];
				}
				b[ed] = temp;
				
			}
			
			st++;
			ed--;
			
		}*/
		
		//逆推排序 两张牌置底的时候
		int[] temp = new int[hNum];
		while(ed >= 0) {
			
			b[ed] = a[st];
			
			if(ed == 0 && flag) break;
			
			if(ed >= paiNum - hNum && ed < paiNum -1 && hNum > 2) {
				int temphNum = hNum%(st + 1);
				
				for(int i = 0;i< temphNum; i++) {
					temp[i] = b[paiNum - i -1];
				}
			
				for(int i = paiNum - 1 - temphNum;i >= ed;i--) {
					b[i + temphNum] = b[i];
				}
				
				for(int i =0;i<temphNum;i++) {
					b[ed + i] = temp[temphNum - i - 1];
				}
				
			}
			
			else if(ed < paiNum - hNum) {
				
				for(int i = 0;i< hNum; i++) {
					temp[i] = b[paiNum - i -1];
				}
			
				for(int i = paiNum - 1 - hNum;i >= ed;i--) {
					b[i + hNum] = b[i];
				}
				
				for(int i =0;i<hNum;i++) {
					b[ed + i] = temp[hNum - i - 1];
				}
				
			}
			
			st++;
			ed--;
		}
		
		/*System.out.println("\n逆推法排出的序列:");
		for (int i : b) {
			System.out.print(i + " ");
		}*/
		return b;
		
	}

	/**
	 * 唐粒子的方法
	 */

	public static void sortByTang(int num) {
		int sum, j = 0, k = num;
		int head = 0, tail = 0;
		System.out.println();
		sum = adNum(k);
		System.out.println(sum);
		head = 0;
		tail = k;
		int[] init = new int[sum];
		System.out.println("init:" + sum);
		
		//初始化
		for (int i = 0; i < k; i++)
			init[i] = i + 1;
		for (int i = 0; i < k; i++) {
			System.out.print(init[i]);
			System.out.print(" ");
		}
		
		int[] a = new int[k + 1];
		while (head != tail) {
			a[j++] = init[head];
			if (head + 1 == tail) {
				//a[j] = init[tail];
				break;
			}
			init[tail++] = init[head + 1];
			head += 2;
		}
		System.out.println();
		System.out.println("after del:");
		for (int i = 0; i < j; i++) {
			System.out.print(a[i]);
			System.out.print(" ");
		}
		int[] out = new int[k];
		for (int i = 0; i < k; i++)
			out[a[i] - 1] = i + 1;
		System.out.println();
		System.out.println("result:");
		for (int i = 0; i < k; i++) {
			System.out.print(out[i]);
			System.out.print(" ");
		}
	}

}

2
0
分享到:
评论
2 楼 microjava 2009-11-04  
junlas 写道
不明白这个游戏是什么意思?楼主能再解释的详细点吗。。


A,2,3,4,5..J,Q,K,13张扑克牌,从上面拿一张放在最下面(重复n次,默认n=1),再从上面拿一张出来显示,重复此操作,要求出来的顺序是:A,2,3,4,5..J,Q,K

要求的是给出定义规则后初始的扑克牌顺序!
1 楼 junlas 2009-11-04  
不明白这个游戏是什么意思?楼主能再解释的详细点吗。。

相关推荐

    21点扑克牌游戏(cpp)

    在现代社会中,随着社会的快速发展,人们对休闲娱乐越来越重视,又由于电脑的快速发展,“21点”纸牌游戏逐渐成为人们的娱乐的一种方式,编写程序实现游戏,该程序是模拟古老的21点扑克牌游戏,实现1对1的人机大战。...

    java实现扑克牌游戏

    java实现扑克牌游戏,思路及其清晰,十分适合初学者学习与应用。

    C语言实现扑克牌游戏

    一款C语言实现的扑克牌小游戏,用到了随机函数,初学者可以看一下,方便日后学习。游戏规则: 游戏开始时,向所有参与者(庄家和闲家)分发两张扑克牌。玩家可以看到他们的牌以及点数总和。然而,庄家有一张牌暂时不...

    21点扑克牌游戏(C#源码)

    21点扑克牌游戏(C#源码)

    java 扑克牌24点算法

    java 扑克牌24点算法 输入4个数(1-10),可以得到用+-*/运算,结果为24的方法

    java算法——玩家扑克牌

    * 玩家 * 扑克牌 * 创建一副扑克牌,不包含大小王 *定义扑克牌的属性(花色和点数)

    扑克牌游戏用C++实现

    C++扑克牌游戏源代码, 源代码的呈现,可以看出每一个执行的细节 可以在纯dos中运行中的游戏代码,精彩不容错过

    java 西游记扑克牌游戏.zip

    [java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip [java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip[java] 西游记扑克牌游戏.zip [java] 西游记扑克牌游戏.zip[java] ...

    扑克牌游戏编程

    扑克牌游戏编程的技巧、方法、源码等等,详细具体,程序清晰,运行良好,是很好的游戏开发教程

    C++程序设计扑克牌游戏

    内含C++程序的所有源代码,以及设计好以后的扑克牌运行程序,所设计的

    数据结构课程设计:手机通通讯录模拟,24点扑克牌游戏)

    本文档为数据结构课程设计代码,使用编程语言java,包含题目:手机通通讯录模拟,24点扑克牌游戏

    java扑克发牌算法实现

    扑克发牌算法实现 首先给扑克牌中每张牌设定一个编号,下面算法实现的编号规则如下: 红桃按照从小到大依次为:1-13 方块按照从小到大依次为:14-26 黑桃按照从小到大依次为:27-39 梅花按照从小到大依次为:40-52 ...

    java扑克牌游戏开发课设

    扑克牌游戏是一款受人喜欢的休闲游戏,大多数电脑上都装有这种游戏,很多人都玩过这种扑克牌游戏,都熟悉这种游戏的功能,我所做的这种扑克牌游戏开发理念是基于电脑自带的蜘蛛纸牌游戏,利用java语言实现了蜘蛛纸牌...

    21点扑克牌游戏(雷雷开发

    21点扑克牌游戏(雷雷开发 个人开发) 包你满意 亲情奉献 赶紧下载吧 欢迎下载我其它资源

    拱猪扑克牌游戏.rar

    拱猪扑克牌游戏使用.net c#开发,VS2017下编译通过,测试正常。

    Java实现简单的扑克牌游戏(无bug,能正常运行)

    Java实现简单的扑克牌游戏,思路及其清晰,十分适合初学者学习与应用。有洗牌,发牌等基本功能,还可以玩捉鬼游戏,附带详细讲解。

    扑克牌游戏素材开发包JPG

    适合开发扑克牌游戏

    扑克牌升级游戏

    扑克牌升级游戏,设计新颖,算法严谨,娱乐性强

    简单的扑克牌游戏

    一个简单的扑克牌游戏,洗牌,生成牌,用C++写成的。

Global site tag (gtag.js) - Google Analytics