拖拉机小程序

来源:互联网 发布:mac安装mysql数据库 编辑:程序博客网 时间:2024/04/25 04:25


/**************************************************

文件名:   Porker.h

文件描述: 声明扑克类

创建人:   刘基伟 2007/3/24

版本号:   1.0

修改纪录: 暂无
**************************************************/


#include <List>
#include <ctime>
using namespace std;

class Viter;

#define FOUR        4
#define FIVE        5
#define THIRTEEN    13
#define TWENTY_SIX  26


/*====================================================

类 名 称: Porker

功能描述: 创建扑克类,对扑克进行处理

成员变量: List_porker    // 存储扑克的数值
           p_List_porker  // 指向List_porker
                    // 用于查找

成员函数: Porker_create  // 创建52张扑克
           Porker_delete  // 删除52张扑克
     Porker_wash()  // 由Viter对象来洗牌
     Porker_wash()  // 由Viter对象来将牌翻转
====================================================*/
class Porker
{
private:
 list<int>::iterator p_List_porker;
public:
 list<int> List_porker;
 Porker();
 bool Porker_create();
 bool Porker_delete();
 void Porker_wash();
 void Porker_reverse();
 void Porker_show();
};

 

/*****************************************************

文 件 名: Player.h

文件描述: 声明 Player 类

创 建 人: 刘基伟 2007/3/24

版 本 号: 1.0

修改纪录: 暂无

*****************************************************/

#include <List>

using namespace std;

/*=====================================================

结构体名: Player_node

功能描述: 实现一个扑克节点

成员变量: b_Turn                 // 判 断 是 否 轮
     i_Player_porker[5]     // 要 的 五 张 牌
     sti_Player_money       // 初 始 的 筹 码
     sti_Money_min          // 可 跟 最 小 值
     sti_Money_sum          // 下 注 的 总 和
     ePorker_type           // 扑 克 的 类 型
     p_Node_next            // 下 一 节 点 域

成员函数: Player_node            // 扑 克 的 构 造
=====================================================*/


struct Player_node
{
 bool b_Turn;
    int  i_Player_money;
 list<int> List_porker_type;
 list<int> List_porker_value;
 static int sti_Money_min;
 static int sti_Money_sum;
 Player_node* p_Node_next;
 Player_node();
 Player_node(bool, int, Player_node*);
};
class Player
{
private:
 int i_Count;
 Porker &p_Player_porker;
 Player_node *p_Player_head;
 list<int>::iterator p_List_porker;
 enum ePorker_type{Dan_zhang, Dui_zi, Tong_hua,
                Lian_zi, Gang_lian, Bao_zi};
public:
 Player(Porker &_ref_Player_porker);
    void Player_insert();
 void Player_delete();
 int  Player_size()const;
 int  Player_take_porker();
 void Player_follow(int _i_Count);
 void Player_porker_show();
 bool Player_compare(const Player &_Player);
 int  Player_porker_type();
 bool Player_porker_tonghua();
 bool Player_porker_connect();
};

/*****************************************************

文件名:    Tuolaji.cpp

文件描述: 定义控制台应用程序的入口点,实现一系列的
           操作

创建者:   刘基伟 2007/3/24

版本号:   1.0

修改纪录: 暂无
*****************************************************/


#include "stdafx.h"
#include "Porker.h"
#include "Player.h"

using namespace std;

static const int csti_Array[FOUR][THIRTEEN]={{40,28,16,4,44,32,20,8,48,36,24,12,52},
                                      {44,15,3,43,31,19,7,47,35,23,11,51,39},
                                      {14,2,42,30,18,6,46,34,22,10,50,38,26},
                                      {1,41,29,17,5,45,33,21,9,49,37,25,13}};

int Player_node::sti_Money_min = 1;
int Player_node::sti_Money_sum = 0;


Player_node::Player_node()
{
}
/*======================================================

函 数 名: Player_node

功能描述: 构造选手节点

参    数: bool b_Turn                
           int  i_Player_money
     int i_Player_porker[5]
     Player_node* p_Node_next

返 回 值: 无

抛出异常: 无

作    者: 刘基伟 2007/3/25

======================================================*/

Player_node::Player_node(bool b_Turn,
       int  i_Player_money,
       Player_node* p_Node_next)
{
 this->b_Turn = b_Turn;
 this->i_Player_money = i_Player_money;
 this->p_Node_next = p_Node_next;
}

/*======================================================

函 数 名: Player

功能描述: 构造选手

参    数: 无

返 回 值: 无

抛出异常: 无

作    者: 刘基伟 2007/3/25

======================================================*/

Player::Player(Porker &_ref_Player_porker): i_Count(0),
                                            p_Player_porker(_ref_Player_porker),
           p_Player_head(NULL)
{
}

/*======================================================

函 数 名: Player

功能描述: 插入选手

参    数: _i_Array[5]

返 回 值: void

抛出异常: 无

作    者: 刘基伟 2007/3/25

======================================================*/

void Player::Player_insert()
{
 Player_node *p_Privous, *p_New_player;
 p_New_player = new Player_node(true, 500, p_Player_head);
   if(p_New_player == NULL)
        return;
 if(i_Count == 0)
 {
  p_New_player->p_Node_next = p_New_player;
  p_Player_head = p_New_player;
    }
 else
 {
  p_Privous = p_Player_head;
  while(p_Privous->p_Node_next != p_Player_head)
  {
   p_Privous = p_Privous->p_Node_next;
  }
  p_Privous->p_Node_next = p_New_player;
        p_Player_head = p_New_player;
 }
    i_Count++;
}

/*====================================================

函 数 名: Player_delete

功能描述: 将选手全部删除

参    数: 无

返 回 值: void

抛出异常: 无

作    者: 刘基伟 2007/3/25

====================================================*/

void Player::Player_delete()
{
 Player_node *p_Privous = p_Player_head;
 while(i_Count > 0)
 {
  p_Privous = p_Privous->p_Node_next;
  p_Player_head->p_Node_next = p_Player_head->p_Node_next->p_Node_next;
  delete p_Privous;
  i_Count--;
 }
}

/*====================================================

函 数 名: Player_size

功能描述: 统计选手的数目

参    数: 无

返 回 值: int

抛出异常: 无

作    者: 刘基伟 2007/3/25

====================================================*/

int Player::Player_size()const
{
 return i_Count;
}

int Player::Player_take_porker()
{
 int i_Count_player = 4;
 Player_node *p_Via_node = p_Player_head;
 p_List_porker = p_Player_porker.List_porker.begin();
 for(int i_Out_circle = 0; i_Out_circle < 5; i_Out_circle++)
 {
  for(int i_In_circle = 0; i_In_circle < 4; i_In_circle++)
  {
   if(p_Via_node->b_Turn)
   {
    cout<<"请第 "<<i_In_circle<<" 位选择: 0不要 1要"<<endl;
    bool b_Player_take;
    cin>>b_Player_take;
    if(b_Player_take)
    {
     p_Player_head->List_porker_type.push_back(*p_List_porker++);
     p_Via_node->i_Player_money--;
     p_Via_node->sti_Money_sum++;
     p_List_porker++;
    }
    else
    {
     p_Via_node->b_Turn = false;
     i_Count_player--;
    }
   }
   p_Via_node = p_Via_node->p_Node_next;
  }
 }
 return i_Count_player;
}

void Player::Player_follow(int _i_Count)
{
 Player_node *p_Via_node = p_Player_head;
 if(_i_Count == 1)
 {
  for(int i_Via = 0; i_Via < 5; i_Via++)
  {
   if(p_Via_node->b_Turn)
    break;
   p_Via_node = p_Via_node->p_Node_next;
  }
  p_Via_node->i_Player_money += p_Via_node->sti_Money_sum;
  p_Via_node->sti_Money_sum = 0;
 }
 else
 {
  while( _i_Count > 1)
  {
   for(int i_Via = 0; i_Via < 4; i_Via++)
   {
    if(p_Via_node->b_Turn)
    {
     cout<<"请输入你要选择的方式: 0不跟 1比大 2跟 !"<<endl;
     int i_Player_select;
     cin>>i_Player_select;
     if(i_Player_select == 0)
     {
      p_Via_node->b_Turn = false;
     }
     else if(i_Player_select == 1)
     {

     }
     else
     {
      cout<<"请输入你要跟的筹码 ! "<<endl;
      cout<<"最少得跟 "<<p_Via_node->sti_Money_min<<endl;
      int i_Follow_money;
      cin>>i_Follow_money;
      p_Via_node->i_Player_money -= i_Follow_money;
      p_Via_node->sti_Money_sum += i_Follow_money;
      p_Via_node->sti_Money_min = i_Follow_money;
     }
    }
    else
    {}
   }
  }
 }
}

void Player::Player_porker_show()
{
 int i_Via;
 p_List_porker = p_Player_head->List_porker_type.begin();
 for(int i_Circle = 0; i_Circle < 3; i_Circle++)
 {
  switch(i_Via = *p_List_porker % 13, *p_List_porker % 4)// 按随机发牌顺序,分成四部分
           {
              case 0:
      printf("/x3%d ", i_Via ? i_Via:13);
      break;
              case 1:
      printf("/x4%d ", i_Via ? i_Via:13);
      break;
              case 2:
      printf("/x5%d ", i_Via ? i_Via:13);
      break;
              case 3:
      printf("/x6%d ", i_Via ? i_Via:13);
      break;
           }
 }
}

bool Player::Player_porker_connect()
{
 int i_Via = 0,a[3],i_Temp;
    i_Temp = p_Player_porker.List_porker.front();
 list<int> i_Porker_value;
 p_List_porker = p_Player_porker.List_porker.begin();
 for(int i_Circle = 0; i_Circle < 13; i_Circle++)
 {
  if(*p_List_porker == csti_Array[i_Temp][i_Circle])
  {
   i_Porker_value.push_back(i_Circle+1);
   p_List_porker++;
  }
 }
 i_Porker_value.sort();
    p_List_porker = i_Porker_value.begin();
 for(; p_List_porker != i_Porker_value.end(); p_List_porker++)
 {
  a[i_Via] = *p_List_porker;
  i_Via++;
 }
 if(a[0]+1 == a[1])
 {
  if(a[1]+1 == a[2])
  {
   return true;
  }
  else
  {
   return false;
  }
 }
 else
 {
  return false;
 }
}

bool Player::Player_porker_tonghua()
{
 int i_Via = 0,a[3];
 p_List_porker = p_Player_head->List_porker_type.begin();
    for(; p_List_porker != p_Player_head->List_porker_type.end(); p_List_porker++)
 {
  a[i_Via] = *p_List_porker;
  i_Via++;
 }
 if(a[0] == a[1])
 {
  if(a[0] == a[1])
  {
   return true;
  }
  else
  {
   return false;
  }
 }
 else
 {
  return false;
 }
}


int Player::Player_porker_type()
{
 p_List_porker = p_Player_head->List_porker_type.begin();
 int i =0,a[3];
 for(; p_List_porker != p_Player_head->List_porker_type.end(); p_List_porker++)
 {
  a[i] = *p_List_porker;
  i++;
 }
 if(a[0] == a[1])
 {
  if(a[0] == a[2])
  {
   return Bao_zi;
  }
  else
  {
   return Dui_zi;
  }
 }
 else
 {
  if(a[0] == a[2])
  {
   return Dui_zi;
  }
  else
  {
   if(a[1] == a[2])
   {
    return Dui_zi;
   }
   else
   {
    if(Player_porker_connect()&&Player_porker_tonghua())
     return Gang_lian;
    else if(Player_porker_tonghua())
     return Tong_hua;
    else if(Player_porker_connect())
     return Lian_zi;
    else
     return Dan_zhang;
   }
  }
 }
 
}

int _tmain(int argc, _TCHAR* argv[])
{
 int i_Count = 0;
 Porker porker;
 porker.Porker_create();
 porker.Porker_show();
 porker.Porker_wash();
 porker.Porker_show();
 porker.Porker_reverse();
 porker.Porker_show();

 Player *player = new Player(porker);
 player->Player_insert();
 player->Player_insert();
    player->Player_insert();
 player->Player_insert();
 i_Count = player->Player_take_porker();
 return 0;
}

 

/******************************************************

文件名:    Porker.cpp

文件描述: 用于扑克类的定义

创建人:   刘基伟 2007/3/24

版本号:   1.0

修改纪录: 暂无

******************************************************/


#include "stdafx.h"
#include "Porker.h"

/*====================================================

函 数 名: Porker

功能描述: 提供默认的构造函数

参 数:    无

返 回 值: 无

抛出异常: 无

作 者:    刘基伟 2007/3/24

====================================================*/

Porker::Porker()
{

}

/*====================================================

函 数 名: Porker_create

功能描述: 用于52张扑克的创建

参  数:   无

返 回 值:  bool,如果List_porker.size() == 52返回true,
           否则返回false.

抛出异常:  无

作  者:    刘基伟 2007/3/24

====================================================*/

bool Porker::Porker_create()
{
  int i_Count, i_Via;
     int i_Porker_value[52];
                                   //为辅助数组赋值
     for(i_Count = 0; i_Count < 52; ++i_Count)
        i_Porker_value[i_Count] = i_Count + 1;

     srand((unsigned int)time(NULL));           // 初始化随机数发生器
      
  i_Count = 0;
     while(i_Count < 52)
       {
          do{
     i_Via = rand() % 52;    //将有序的1--52变为无序
      }
    while(!i_Porker_value[i_Via]);
          List_porker.push_back(i_Porker_value[i_Via]);
          i_Porker_value[i_Via] = 0;
    i_Count++;
       }
     if(List_porker.size() == 52)
  {
   return true;
  }
  else
  {
   return false;
  }
}

/*======================================================

函 数 名: Porker_delete

功能描述: 将52张扑克全部删除

参 数:    无

返 回 值: bool,如果全部删除返回true,否则返回false

抛出异常: 无

作 者:    刘基伟 2007/3/24

======================================================*/

bool Porker::Porker_delete()
{
 List_porker.clear();
 if(List_porker.empty())
 {
  return true;
 }
 else
 {
  return false;
 }
}

/*=====================================================

函 数 名: Porker_wash

功能描述: 打乱List_porker中顺序

参 数:    无

返 回 值: 无

抛出异常: 无

作 者:    刘基伟 2007/3/24

=====================================================*/

void Porker::Porker_wash()
{
 int i_Count;
 int i_Half_one[TWENTY_SIX],i_Half_tow[TWENTY_SIX];
 p_List_porker = List_porker.begin();

 for(i_Count = 0; i_Count < TWENTY_SIX; i_Count++)
 {
  i_Half_one[i_Count] = *p_List_porker;    // 将奇数为存入数组i_Half_one
  p_List_porker++;
  i_Half_tow[i_Count] = *p_List_porker;    // 将偶数位存入数组i_Half_tow
  p_List_porker++;
 }

 p_List_porker = List_porker.begin();

 for(int i = 0; i < TWENTY_SIX; i++)
 {
  *p_List_porker = i_Half_tow[i];  
  p_List_porker++;
  *p_List_porker = i_Half_one[i];
  p_List_porker++;
 }
}

/******************************************************

函 数 名: Porker_reverse

功能描述: 将List_porker内的变量翻转

参 数:    无

返 回 值: void

抛出异常: 无

作 者:    刘基伟 2007/3/24
******************************************************/
void Porker::Porker_reverse()
{
 List_porker.reverse();
}

void Porker::Porker_show()
{
 int i_Via,i_Count = 0;
 p_List_porker = List_porker.begin();
 for(; p_List_porker != List_porker.end(); p_List_porker++)
 {
   if(i_Count%13 == 0)
      cout<<"第 "<<i_Count+1<<" 行 "<<endl;
  switch(i_Via = *p_List_porker % 13, *p_List_porker % 4)// 按随机发牌顺序,分成四部分
           {
              case 0:
      printf("/x3%d ", i_Via ? i_Via:13);
      break;
              case 1:
      printf("/x4%d ", i_Via ? i_Via:13);
      break;
              case 2:
      printf("/x5%d ", i_Via ? i_Via:13);
      break;
              case 3:
      printf("/x6%d ", i_Via ? i_Via:13);
      break;
           }
     i_Count++;
 }   

原创粉丝点击