`
microjava
  • 浏览: 318730 次
  • 性别: 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  
不明白这个游戏是什么意思?楼主能再解释的详细点吗。。

相关推荐

    java实现扑克牌游戏

    在本文中,我们将深入探讨如何使用Java编程语言来实现一个扑克牌游戏。对于初学者来说,这是一个很好的项目,因为它涵盖了面向对象编程、数据结构、算法和游戏逻辑等多个核心概念。 首先,我们需要创建一个扑克牌的...

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

    《21点扑克牌游戏(C#源码)》是一款基于C#编程语言开发的桌面游戏,旨在模拟经典的21点玩法。21点,又称“黑杰克”,是一种流行的纸牌游戏,玩家与庄家进行对弈,目标是使手中的牌点数最接近21点,但不能超过21点。...

    21点扑克牌游戏(cpp)

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

    java算法——玩家扑克牌

    在Java编程中,设计一个扑克牌游戏涉及到许多关键概念,如对象封装、枚举类型、集合框架以及排序算法。以下是对这些知识点的详细说明: 首先,我们从标题和描述出发,"java算法——玩家扑克牌"表明我们需要创建一个...

    Python实现-《升级》扑克牌游戏,包括UI界面,AI玩家,裁判监督三大模块.rar

    在本项目中,我们主要探讨的是使用Python编程语言实现的一款名为《升级》的扑克牌游戏。这款游戏具有完整的用户界面(UI)、人工智能(AI)玩家以及裁判监督系统,为用户提供了一个全面的游戏体验。以下是对各模块的...

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

    21点扑克牌游戏,也称为“Blackjack”,是一种广受欢迎的纸牌游戏,源于18世纪的法国,现在已经成为全球各大赌场的经典游戏之一。它以其简单易懂的规则和策略性吸引了众多爱好者。 在这款游戏中,玩家将与庄家进行...

    扑克牌游戏代码

    这个游戏可能包括多种玩法,比如德州扑克、斗地主或者扑克牌接龙等。下面将详细探讨相关知识点。 1. **数据结构与算法**: - **牌堆(Deck)**:首先,我们需要创建一个数据结构来表示扑克牌堆,通常用数组或链表...

    Android扑克牌猜点小游戏

    总的来说,"Android扑克牌猜点小游戏"是一个集成了Android编程基础、数据结构、算法和用户交互设计的综合项目。对于初学者来说,这是一个很好的实践平台,可以帮助他们巩固基础知识,提升实际开发能力。而对于资深...

    拱猪扑克牌游戏.rar

    拱猪扑克牌游戏的玩法源自西方,是一种四人对局的策略型纸牌游戏。在游戏中,玩家的目标是尽可能收集分数,同时避免被其他对手"拱"出分数。每一轮中,玩家需要根据手中的牌来决定是否跟牌,并尝试获得特定的牌组以...

    java 扑克牌24点算法

    ### Java扑克牌24点算法解析 #### 一、算法背景与目标 24点游戏是一种数字游戏,玩家需要利用给定的四个数字通过加、减、乘、除(可加括号)来使得最终计算结果等于24。在本算法实现中,使用Java语言编写了一个简单...

    扑克牌游戏源码

    【标题】"扑克牌游戏源码"所涉及的知识点主要集中在以下几个方面: 1. **编程语言:DELPHI** DELPHI是一种基于Object Pascal的可视化编程环境,它以其高效性和强大的Windows应用程序开发能力而闻名。在这款扑克牌...

    翻扑克游戏_翻扑克牌游戏_

    翻扑克游戏,通常被称为“对对碰”或“记忆翻牌”,是一种常见的休闲益智游戏。在这个游戏中,玩家需要在二维的游戏板上翻转一对隐藏的扑克牌,如果它们是相同的图案,则会被消除,直到所有牌都被匹配并消除。这种...

    利用Matlab的APP设计模块制作的扑克牌游戏

    下面将详细讨论这款基于Matlab的扑克牌游戏的设计与实现。 首先,我们要理解APP设计模块的核心概念。Matlab的App Designer提供了一个直观的拖放式界面,用于构建GUI(图形用户界面)。通过这个界面,开发者可以添加...

    扑克牌游戏用C++实现

    根据给定的信息,我们可以提取并总结出以下与“扑克牌游戏用C++实现”相关的知识点: ### 一、项目背景及目的 此项目是利用C++语言开发的一个扑克牌游戏程序。通过源代码的公开分享,能够让学习者深入了解C++在...

    java 扑克牌游戏

    在Java编程领域,开发一款扑克牌游戏是一种常见的实践项目,旨在提升编程技能,尤其是面向对象设计和游戏逻辑处理。在这个名为"java 扑克牌游戏"的项目中,我们可以深入探讨以下几个关键知识点: 1. **面向对象编程...

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

    在本项目中,"Java实现简单的扑克牌游戏(无bug,能正常运行)"是一个针对初学者设计的教学实例,旨在帮助他们理解Java编程语言以及如何利用数据结构来模拟实际问题,比如游戏规则。这个项目包括了洗牌、发牌等基本...

    用java开发的扑克牌游戏程序源代码

    在本项目中,"用Java开发的扑克牌游戏程序源代码"是一个基于Java编程语言实现的扑克牌游戏软件。这个游戏程序展示了如何运用Java的核心概念和技术来构建一个完整的、交互式的娱乐应用。以下是对该项目涉及的一些关键...

    数据结构课程设计:扑克牌游戏

    在这个“数据结构课程设计:扑克牌游戏”项目中,我们主要关注的是如何使用数据结构来实现一个扑克牌游戏。这个项目涵盖了多个IT领域的关键知识点,包括数据结构的选择、算法设计以及软件工程的基本实践。 首先,从...

Global site tag (gtag.js) - Google Analytics