| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 7269 人关注过本帖
标题:用C语言(控制台)写个斗地主程序(不需要人机对战)
只看楼主 加入收藏
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-11 11:14
cacker
该用户已被删除
收藏
得分:0 
回复 10楼 Windy0Winll
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-11 12:57
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用御坂美琴在2010-9-10 21:00:58的发言:

你要是会C++的话,那要的是对象指针,不是函数指针,直接用C++实现多态什么的就好了



闲的蛋疼,要不一起写个吧?
2010-09-11 14:39
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
回复 12楼 cacker
我也说说我的看法:

对于初始化游戏,就是洗牌,我想的方案是:首先给54张牌用随机函数打乱顺序,第一个人就是那第1,4,7...49z张牌;第2个人拿2,5,8,...,50张牌;第3个人拿3,6,...,51张牌(或者3个人分别拿1~17,18~34,35~51张);剩下的三张是地主的。在使用随机函数时,随机种子一定每次要改变,比如说我们在玩这一局的过程中时,就确定下一次用于洗牌的53个随机种子。

对于排序,不知道就按照从大到小的顺序进行排序。

我觉得对于数据的储存用链表也不错,好像要求用先有的知识来实现的话,那用数组好了。
int PlayerNowCard[3][16]。当然3是分别表示3个玩家了,那个16是一共有16种牌(不要分花色,3~10,J,Q,K,A,2,w(小王),W,其中小标为0时表示当前玩家手中还剩的牌的数目)中每种牌的数目。如玩家1手中有3张k,那么有 PlayerNowCard[0][k对应的编号] 应该等于 3。


对于出牌时的检查和比较大小 ,类似于上面的。由于一次最多可以出12种牌,因此我觉得只要定义一个2维数(刚出完的牌和将要出的牌)组就好了。只有后面的人的牌比刚出完的牌大(要同一类型,炸弹除外),才可以出牌。这个数组可以是这样 int ThrowCard[2][13],其中第2维下表为0的表示这次要出牌的种数,其他合上面那个数组功能有点差别 。如有一个人出的牌是 三个5 三个6 带一对3 一张10,则有ThrowCard[0][0]=4,ThrowCard[0][1]=3(牌为3) *32 + 1(5的张数),ThrowCard[0][2]=5(牌为5) *32 + 3(5的张数),ThrowCard[0][3]=6(牌为6) *32 + 3(5的张数),ThrowCard[0][4]=10(牌为10) *32 + 1(10的张数)。这样的话,在比较牌的大小可能要简单些。

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-11 15:42
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-11 17:29
Windy0Winll
Rank: 2
来 自:走了
等 级:等待验证会员
帖 子:71
专家分:90
注 册:2010-8-26
收藏
得分:0 
----用户输入的数据,你得转换成你想要的样子----
我到觉得那样也不复杂。一般人出牌一般是把主体部分放前面,这样比较大小更容易。我想没有谁 出 三个7 三个8 带一个3 一对10 会这样出3 7 8  
7 10 8 7 8 10 ,一般会这样:7 7 7 8 8 8 3 10 10,我想前者还有肯能出现歧义。比如 4 4 4 3 3 3 4 ,这种牌是解释为 四个4带 三个3呢 还是  
三个3 三个4 带一个4呢?这样我到觉得根本没必要记录附带的牌(如果不要实现悔牌的话),只要记录牌的类型编号,和最小主体部分的那个单张就好
了。出牌的数据只要用这样就好了:int ThrowCard[2][2]。对于顺子等要考虑长度的牌我们把长度也考虑进类型里面去。如 定义顺子的基本类型为 5,则顺子3 ~ 7(长度为5),那么它的类型可以设计为 5*32 + 7.
将要出的牌必须得严格的和刚出的牌类型匹配(除了炸弹),否则不能出牌。

在斗地主过程中我们要规定:出牌必须是 先主体部分(从小到大) ,再附带部分。否则是非法出牌。这样即符合常理,又不会产生歧义。这样一来,代码简单了不少。

还有对于出牌的数据记录我们可以用一个环形队列,只要把上面的数组改为这样int ThrowCard[3][2]就好了。或者这样来实现刚出的牌动态的变化int flag=0; 刚出的牌:ThrowCard[flag],将要出的牌ThrowCard[!flag],然后改变这个状态flag = !flag.


还有5张牌还有一种情况:4张带1

按长度来比,长度一长就复杂了。如有10张牌,是5连对,顺子,两个 连续3张 带两对 ,三个 连续3张 带一张 ,四张 带两张等,这样情况还是挺复杂的。更何况,不同地区的斗地主带牌规则不一样,如有的可以 三个8 可以 大 三个5 带6 ,有的地方则不可以。因此能够匹配的牌不一定张数一样(不考虑炸弹)。

[ 本帖最后由 Windy0Winll 于 2010-9-11 19:57 编辑 ]

悄悄地来。。。 然后悄悄地走。。。。。。
2010-09-11 19:44
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用Devil_W在2010-9-11 14:39:35的发言:

闲的蛋疼,要不一起写个吧?

你蛋疼不关我事啊

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-11 19:52
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:0 
以下是引用御坂美琴在2010-9-11 19:52:31的发言:


你蛋疼不关我事啊



不,我是估计你写不出来。只有嘴上功夫而已.
收到的鲜花
  • 遮天云2010-09-11 20:11 送鲜花  -2朵   附言:悲哀!我看你头也够疼的
2010-09-11 20:06
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:0 
以下是引用Devil_W在2010-9-11 20:06:09的发言:

不,我是估计你写不出来。只有嘴上功夫而已.

不要用激将法,这对我没用,不过只有嘴上功夫这本领,我还比不上呢

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2010-09-11 20:11
cacker
该用户已被删除
收藏
得分:0 
提示: 作者被禁止或删除 内容自动屏蔽
2010-09-11 20:52
快速回复:用C语言(控制台)写个斗地主程序(不需要人机对战)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018155 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved