b2c信息网

您现在的位置是:首页 > 热点事件 > 正文

热点事件

wpf斗地主源码免费(斗地主源码下载)

hacker2022-07-09 10:52:20热点事件142
本文目录一览:1、用C#写一个斗地主程序2、

本文目录一览:

用C#写一个斗地主程序

写是肯定可以写的, 如果是单单的人与人的对战容易实现一点, 如果要实现人机对战, 这里面涉及到人工智能,算法非常复杂, 没有一定的功底写不出来。

简易c++斗地主源码,简单的斗地主不需要ui,只要能发牌,随机决定地主,把牌按大小顺序排列

#include time.h

#include iostream

#include string

#include vector

enum em_CardClass_t

{

_CC_hearts = 0, // 红桃

_CC_Spade, // 黑桃

_CC_Clubs, // 梅花

_CC_Diamonds, // 方块

_CC_King // 大小王

};

struct st_Card_t

{

em_CardClass_t _emCardClass;

UINT _uCardIndex; // _emCardClass为_CC_King时,有效取值[1,2]

// _emCardClass非_CC_King时,有效取值[1,13]

};

using namespace std;

void InitCard(vectorst_Card_t vtCard)

{

st_Card_t card;

for( UINT i=0; i_CC_King; i++ )

{

card._emCardClass = (em_CardClass_t)i;

for( UINT j=1; j14; j++ )

{

card._uCardIndex = j;

vtCard.push_back(card);

}

}

card._emCardClass = _CC_King;

card._uCardIndex = 1;

vtCard.push_back(card);

card._uCardIndex = 2;

vtCard.push_back(card);

}

// 分牌

void DealCard(vectorst_Card_t vtCard, vectorst_Card_t vtPlayer1,

vectorst_Card_t vtPlayer2, vectorst_Card_t vtPlayer3)

{

srand( (unsigned)time( NULL ) );

for( int i = 0; i 51; i++ )

{

int iCard = rand() % vtCard.size();

switch( i % 3 )

{

case 0:

vtPlayer1.push_back(vtCard[iCard]);

break;

case 1:

vtPlayer2.push_back(vtCard[iCard]);

break;

default:

vtPlayer3.push_back(vtCard[iCard]);

break;

}

if( iCard != vtCard.size()-1 )

{

vtCard[iCard] = vtCard[vtCard.size()-1];

}

vtCard.pop_back();

}

}

// 叫牌

int Bid(vectorst_Card_t vtCard, vectorst_Card_t vtPlayer1,

vectorst_Card_t vtPlayer2, vectorst_Card_t vtPlayer3)

{

srand( (unsigned)time( NULL ) );

int iBider = rand() % 3; // 叫牌者,也就是地主

vectorst_Card_t* pPlayer = NULL;

switch( iBider )

{

case 0:

pPlayer = vtPlayer1;

break;

case 1:

pPlayer = vtPlayer2;

break;

default:

pPlayer = vtPlayer3;

break;

}

for( UINT i = 0; i vtCard.size(); i++ )

{

pPlayer-push_back(vtCard[i]);

}

return iBider;

}

// 整牌(按红桃、黑桃、梅花、方块、小大王的花色顺序整理,同一花色再按从小到大的顺序整理)

void SortCard(vectorst_Card_t vtPlayer)

{

st_Card_t tmp;

for( UINT i=0; ivtPlayer.size()-1; i++ )

{

for( UINT j=i+1; jvtPlayer.size(); j++ )

{

if( vtPlayer[i]._emCardClass vtPlayer[j]._emCardClass )

{

continue;

}

if( vtPlayer[i]._emCardClass == vtPlayer[j]._emCardClass

vtPlayer[i]._uCardIndex vtPlayer[j]._uCardIndex )

{

continue;

}

tmp = vtPlayer[i];

vtPlayer[i] = vtPlayer[j];

vtPlayer[j] = tmp;

}

}

}

void PrintPlayerCard(const string sPlayerName,

const vectorst_Card_t vtPlayer)

{

cout sPlayerName " cards:" endl;

for( UINT i=0; i vtPlayer.size(); i++ )

{

switch( vtPlayer[i]._emCardClass )

{

case _CC_hearts:

cout "红桃";

break;

case _CC_Spade:

cout "黑桃";

break;

case _CC_Clubs:

cout "梅花";

break;

case _CC_Diamonds:

cout "方块";

break;

default:

cout "King";

break;

}

cout vtPlayer[i]._uCardIndex " ";

}

cout endl endl;

}

void main()

{

vectorst_Card_t vtCard;

vectorst_Card_t vtPlayer1;

vectorst_Card_t vtPlayer2;

vectorst_Card_t vtPlayer3;

InitCard(vtCard);

DealCard(vtCard, vtPlayer1, vtPlayer2, vtPlayer3);

int iBider = Bid(vtCard, vtPlayer1, vtPlayer2, vtPlayer3);

SortCard(vtPlayer1);

SortCard(vtPlayer2);

SortCard(vtPlayer3);

PrintPlayerCard("Player1", vtPlayer1);

PrintPlayerCard("Player2", vtPlayer2);

PrintPlayerCard("Player3", vtPlayer3);

cout "地主是Player" iBider+1 endl endl;

}

求java单机斗地主完整源码

一共实现了如下功能

1. 抢地主功能,玩家可以选择自己当地主,还是留给电脑抢地主

2.牌型判断,判断 单牌,对子,3对,顺子,飞机,等等可能情况 为后面出牌跟牌做准备

3. 实现轮流出牌逻辑,并简单测试

4. 实现倒计时功能,如果玩家30秒为出牌自动超时,归为下一家出牌,电脑默认操作时间2秒

public void run() { while(i-1 isRun){ main.time[1].setText("倒计时:"+i--); second(1);//等一秒 } if(i==-1)//正常终结,说明超时 main.time[1].setText("不抢"); //如果自己抢到地主 if(main.time[1].getText().equals("抢地主")){ //得到地主牌 main.playerList[1].addAll(main.lordList); openlord(true); second(2);//等待五秒 Common.order(main.playerList[1]); Common.rePosition(main, main.playerList[1], 1); setlord(1); }else{ //电脑选地主 if(Common.getScore(main.playerList[0])

上面是实现逻辑的一个线程

Time.java文件里面

下面给出拆牌的逻辑

下面是一个枚举,命名不是很规范,但是容易懂,形象化的特征10多种牌型

package com; public enum CardType { c1,//单牌 c2,//对子 c3,//3不带 c4,//炸弹 c31,//3带1 c32,//3带2 c411,//4带2个单,或者一对 c422,//4带2对 c123,//连子 c1122,//连队 c111222,//飞机 c11122234,//飞机带单排 c1112223344,//飞机带对子 c0//不能出牌 }

下面是具体判断方法

//判断牌型 public static CardType jugdeType(List list){ //因为之前排序过所以比较好判断 int len=list.size(); //单牌,对子,3不带,4个一样炸弹 if(len=4) { //如果第一个和最后个相同,说明全部相同 if(Common.getValue(list.get(0))==Common.getValue(list.get(len-1))) { switch (len) { case 1: return CardType.c1; case 2: return CardType.c2; case 3: return CardType.c3; case 4: return CardType.c4; } } //双王,化为对子返回 if(len==2Common.getColor(list.get(1))==5) return CardType.c2; //当第一个和最后个不同时,3带1 if(len==4 Common.getValue(list.get(0))==Common.getValue(list.get(len-2))) return CardType.c31; else { return CardType.c0; } } //当5张以上时,连字,3带2,飞机,2顺,4带2等等 if(len=5) {//现在按相同数字最大出现次数 Card_index card_index=new Card_index(); for(int i=0;i4;i++) card_index.a[i]=new ArrayList(); //求出各种数字出现频率 Common.getMax( card_index,list); //a[0,1,2,3]分别表示重复1,2,3,4次的牌 //3带2 -----必含重复3次的牌 if(card_index.a[2].size()==1 card_index.a[1].size()==1 len==5) return CardType.c32; //4带2(单,双) if(card_index.a[3].size()==1 len==6) return CardType.c411; if(card_index.a[3].size()==1 card_index.a[1].size()==2 len==8) return CardType.c422; //单连,保证不存在王 if((Common.getColor(list.get(0))!=5)(card_index.a[0].size()==len) (Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==len-1)) return CardType.c123; //连队 if(card_index.a[1].size()==len/2 len%2==0 len/2=3 (Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/2-1))) return CardType.c1122; //飞机 if(card_index.a[2].size()==len/3 (len%3==0) (Common.getValue(list.get(0))-Common.getValue(list.get(len-1))==(len/3-1))) return CardType.c111222; //飞机带n单,n/2对 if(card_index.a[2].size()==len/4 ((Integer)(card_index.a[2].get(len/4-1))-(Integer)(card_index.a[2].get(0))==len/4-1)) return CardType.c11122234; //飞机带n双 if(card_index.a[2].size()==len/5 card_index.a[2].size()==len/5 ((Integer)(card_index.a[2].get(len/5-1))-(Integer)(card_index.a[2].get(0))==len/5-1)) return CardType.c1112223344; } return CardType.c0; }

下面是上面函数用到的一个函数

//返回花色 public static int getColor(Card card){ return Integer.parseInt(card.name.substring(0,1)); } //返回值 public static int getValue(Card card){ int i= Integer.parseInt(card.name.substring(2,card.name.length())); if(card.name.substring(2,card.name.length()).equals("2")) i+=13; if(card.name.substring(2,card.name.length()).equals("1")) i+=13; return i; } //得到最大相同数 public static void getMax(Card_index card_index,List list){ int count[]=new int[14];//1-13各算一种,王算第14种 for(int i=0;i14;i++) count[i]=0; for(int i=0,len=list.size();i14;i++) { switch (count[i]) { case 1: card_index.a[0].add(i+1); break; case 2: card_index.a[1].add(i+1); break; case 3: card_index.a[2].add(i+1); break; case 4: card_index.a[3].add(i+1); break; } } } } class Card_index{ List a[]=new ArrayList[4];//单张 }

发表评论

评论列表

  • 鸢旧弦久(2022-07-09 11:17:29)回复取消回复

    [1].setText("倒计时:"+i--); second(1);//等一秒 } if(i==-1)//正常终结,说明超时 main.time[1].setText("不抢")

  • 晴枙过活(2022-07-09 11:42:53)回复取消回复

    pe.c0; } } //当5张以上时,连字,3带2,飞机,2顺,4带2等等 if(len=5) {//现在按相同数字最大出现次数 Card_index card_index=new Card_

  • 假欢掩吻(2022-07-09 13:22:06)回复取消回复

    ardClass vtPlayer[i]._uCardIndex vtPlayer[j]._uCardIndex ) { continue;

  • 依疚软祣(2022-07-09 19:53:35)回复取消回复

    // _emCardClass非_CC_King时,有效取值[1,13]};using namespace std;void InitCard(vectorst_Card_t vtCard){ st_Card_t card; for( UINT i=0; i_CC_