麻将
#include <windows.h>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define MJPAI_ZFB 0 //中,发,白
#define MJPAI_FENG 1 //东西南北风
#define MJPAI_WAN 2 //万
#define MJPAI_TIAO 3 //条
#define MJPAI_BING 4 //饼
#define MJPAI_HUA 5 //花
#define MJPAI_GETPAI true //起牌
#define MJPAI_PUTPAI false //打牌
//节点信息
struct stPAI
{
int m_Type; //牌类型
int m_Value; //牌字
}
;
//吃牌顺
struct stCHI
{
int m_Type; //牌类型
int m_Value1; //牌字
int m_Value2; //牌字
int m_Value3; //牌字
}
;
// m_Type m_Value
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
// 0 | 中 1 发2 白
// |
// 1 | 东 1 西2 南 北
// |
// 2 | 一万 二万 …… 九万
// |
// 3 | 一条 二条 …… 九条
// |
// 4 | 一饼 二饼 …… 九饼
// |
// 5 | 春 夏 秋 东 竹 兰 梅 菊
// |
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
//胡牌信息
struct stGoodInfo
{
char m_GoodName[100]; //胡牌术语
int m_GoodValue; //胡牌番数
}
;
//牌
class CMJ
{
vector< int > m_MyPAIVec[6]; //起的种牌型
vector< int > m_ChiPAIVec[6]; //吃的种牌型
vector< int > m_PengPAIVec[6]; //碰的种牌型
vector< int > m_GangPAIVec[6]; //杠的种牌型
stPAI m_LastPAI; //最后起的牌
stGoodInfo m_GoodInfo; //胡牌信息
bool m_9LBD; //是否听连宝灯牌型
bool m_13Y; //是否听十三幺
int m_MKNum; //明刻数
int m_AKNum; //暗刻数
bool m_4AK; //是否是听四暗刻
vector< stCHI > m_TempChiPAIVec; //吃的可选组合
vector< stPAI > m_TempPengPAIVec; //碰的可选组合
vector< stPAI > m_TempGangPAIVec; //杠的可选组合
public:
//构造
CMJ();
//析构
~CMJ();
//初始化
void Init();
//起牌
bool AddPai(int p_Type,int p_Value);
//取得对应的牌在牌墙的索引
int GetPaiIndex(int p_Type,int p_Value);
//打牌(参数为对应的牌在牌墙的索引)
bool DelPai(int PaiIndex);
//删除牌
bool DelPai(int p_Type,int p_Value);
//清空牌
void CleanUp();
//取得胡牌信息
stGoodInfo *GetInfo();
//检测是否胡牌
bool CheckAllPai(bool GetOrPut);
//对所有的牌进行输出
void PrintAllPai();
//对一张牌进行输出
void PrintPai(int p_Type,int p_Value);
//吃牌
bool CheckChiPai(int p_Type,int p_Value);
//吃牌
bool DoChiPai(int p_iIndex,int p_Type,int p_Value);
//碰牌
bool CheckPengPai(int p_Type,int p_Value);
//碰牌
bool DoPengPai(int p_Type,int p_Value);
//杠牌
bool CheckGangPai(int p_Type,int p_Value);
//杠牌
bool DoGangPai(int p_Type,int p_Value);
//对可吃的组合进行输出
void PrintChiChosePai();
//对可碰的组合进行输出
void PrintPengChosePai();
//对可杠的组合进行输出
void PrintGangChosePai();
//取得吃牌组合数
UINT GetChiChoseNum();
private:
//检测是否胡牌(张)
bool CheckAAPai(int iValue1,int iValue2);
//检测是否三连张
bool CheckABCPai(int iValue1,int iValue2,int iValu3);
//检测是否三重张
bool CheckAAAPai(int iValue1,int iValue2,int iValu3);
//检测是否四重张
bool CheckAAAAPai(int iValue1,int iValue2,int iValu3,int iValue4);
//检测是否三连对
bool CheckAABBCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6);
//检测是否三连高压
bool CheckAAABBBCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9);
//检测是否三连刻
bool CheckAAAABBBBCCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12);
//检测是否六连对
bool CheckAABBCCDDEEFFPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12);
//带将牌检测=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//检测是否胡牌(张)
bool Check5Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5);
//检测是否胡牌(张)
bool Check8Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8);
//检测是否胡牌(张)
bool Check11Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11);
//检测是否胡牌(张)
bool Check14Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12,int iValue13,int iValue14);
//不带将牌检测-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
//检测是否胡牌(张)
bool Check3Pai(int iValue1,int iValue2,int iValue3);
//检测是否胡牌(张)
bool Check6Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6);
//检测是否胡牌(张)
bool Check9Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9);
//检测是否胡牌(张)
bool Check12Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12);
private:
//胡牌判断
//检测是否胡大四喜
bool CheckD4X_HU();
//检则是否胡大三元
bool CheckD3Y_HU();
//检测是否胡绿一色
bool CheckL1S_HU();
//检测是否胡九莲宝灯
bool Check9LBD_HU();
//检测是否胡四杠
bool Check4Gang_HU();
//检测是否胡连七对
bool CheckL7D_HU();
//检测是否胡十三幺
bool Chekc13Y_HU();
//检测是否胡清幺九
bool CheckQY9_HU();
//检测是否胡小四喜
bool CheckX4X_HU();
//检测是否胡小三元
bool CheckX3Y_HU();
//检测是否胡字一色
bool CheckZ1S_HU();
//检测是否四暗刻
bool Check4AK_HU();
//检测是否一色双龙会
bool Check1S2LH_HU();
//检测是否一色四同顺
bool Check1S4TS_HU();
//检测是否一色四节高?
bool Check1S4JG_HU();
//检测是否一色四步高?
bool Check1S4BG_HU();
//检测是否三杠
bool Check3Gang_HU();
//检测是否混幺九
bool CheckHY9_HU();
//检测是否七对
bool Check7D_HU();
//检测是否七星不靠
bool Check7XBK_HU();
//检测是否全双刻?
bool CheckQSK_HU();
//清一色
bool CheckQ1S_HU();
//检测是否一色三同顺
bool Check1S3TS_HU();
//检测是否一色三节高
bool Check1S3JG_HU();
//检测是否全大
bool CheckQD_HU();
//检测是否全中
bool CheckQZ_HU();
//检测是否全小
bool CheckQX_HU();
//检测是否青龙
bool CheckQL_HU();
//检测是否三色双龙会
bool Check3S2LH_HU();
//检测是否一色三步高
bool Check1S3BG_HU();
//全带五
bool CheckQD5_HU();
//三同刻
bool Check3TK_HU();
//三暗刻
bool Check3AK_HU();
//单钓将
bool CheckDDJ_HU();
//检测胡
bool CheckHU();
private:
//听牌判断
//检测是否听九莲宝灯
bool Check9LBD_TING();
//检测是否听十三幺
bool Check13Y_TING();
//检测是否听四暗刻
bool Check4AK_TING();
//检测是否听牌
bool CheckTING();
}
;
//构造
CMJ::CMJ()
{
m_9LBD = false;
m_13Y = false;
m_4AK = false;
m_AKNum = 0;
m_MKNum = 0;
}
//析构
CMJ::~CMJ()
{
}
//初始化
void CMJ::Init()
{
m_9LBD = false;
m_13Y = false;
m_4AK = false;
m_AKNum = 0;
m_MKNum = 0;
}
//加入新牌,并排序
bool CMJ::AddPai(int p_Type,int p_Value)
{
int iSize = m_MyPAIVec[p_Type].size();
bool t_Find = false;
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[p_Type].begin();Iter !=m_MyPAIVec[p_Type].end(); Iter++)
{
if((*Iter)>p_Value)
{
m_MyPAIVec[p_Type].insert(Iter,p_Value);
t_Find = true;
break;
}
}
if(t_Find==false)
{
m_MyPAIVec[p_Type].push_back(p_Value);
}
m_LastPAI.m_Type = p_Type;
m_LastPAI.m_Value = p_Value;
return true;
}
//取得对应的牌在牌墙的索引
int CMJ::GetPaiIndex(int p_Type,int p_Value)
{
int count = 0;
for(UINT i = 0 ; i < 6 ; i++ )
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[i].begin();Iter !=m_MyPAIVec[i].end(); Iter++)
{
if(p_Type==i&&(*Iter)==p_Value)
{
return count;
}
count++;
}
}
return -1;
}
//打牌
bool CMJ::DelPai(int PaiIndex)
{
int count = 0;
for(UINT i = 0 ; i < 6 ; i++ )
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[i].begin();Iter !=m_MyPAIVec[i].end(); Iter++)
{
if(count==PaiIndex)
{
m_MyPAIVec[i].erase(Iter);
return true;
}
count++;
}
}
return false;
}
//删除牌
bool CMJ::DelPai(int p_Type,int p_Value)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[p_Type].begin();Iter !=m_MyPAIVec[p_Type].end(); Iter++)
{
if((*Iter)==p_Value)
{
m_MyPAIVec[p_Type].erase(Iter);
return true;
}
}
return false;
}
//清空牌
void CMJ::CleanUp()
{
for(UINT i = 0 ; i < 6 ; i++ )
{
m_MyPAIVec[i].clear();
m_ChiPAIVec[i].clear();
m_PengPAIVec[i].clear();
m_GangPAIVec[i].clear();
}
}
//取得胡牌信息
stGoodInfo *CMJ::GetInfo()
{
return &m_GoodInfo;
}
//对所有的牌进行函数调用
void CMJ::PrintAllPai()
{
cout<<" ";
for(UINT i = 0 ; i < 13 ; i++ )
{
cout<<i<<" - ";
}
cout<<endl;
int icount = 0;
//箭牌
if(m_MyPAIVec[0].empty()==false)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[0].begin();Iter !=m_MyPAIVec[0].end(); Iter++)
{
switch(*Iter)
{
case 1:
cout<<"[ 中]";
break;
case 2:
cout<<"[ 发]";
break;
case 3:
cout<<"[ 白]";
break;
}
icount++;
}
}
cout<<endl;
for(UINT i =0 ; i < icount; i++ )
{
cout<<" ";
}
//风牌
if(m_MyPAIVec[1].empty()==false)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[1].begin();Iter !=m_MyPAIVec[1].end(); Iter++)
{
switch(*Iter)
{
case 1:
cout<<"[ 东]";
break;
case 2:
cout<<"[ 南]";
break;
case 3:
cout<<"[ 西]";
break;
case 4:
cout<<"[ 北]";
break;
}
icount++;
}
}
cout<<endl;
for(UINT i =0 ; i < icount; i++ )
{
cout<<" ";
}
//万
if(m_MyPAIVec[2].empty()==false)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[2].begin();Iter !=m_MyPAIVec[2].end(); Iter++)
{
cout<<"["<<(*Iter)<<"万]";
icount++;
}
}
cout<<endl;
for(UINT i =0 ; i < icount; i++ )
{
cout<<" ";
}
//条
if(m_MyPAIVec[3].empty()==false)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[3].begin();Iter !=m_MyPAIVec[3].end(); Iter++)
{
cout<<"["<<(*Iter)<<"条]";
icount++;
}
}
cout<<endl;
for(UINT i =0 ; i < icount; i++ )
{
cout<<" ";
}
//饼
if(m_MyPAIVec[4].empty()==false)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[4].begin();Iter !=m_MyPAIVec[4].end(); Iter++)
{
cout<<"["<<(*Iter)<<"饼]";
icount++;
}
}
cout<<endl;
for(UINT i =0 ; i < icount; i++ )
{
cout<<" ";
}
}
//对一张牌进行输出
void CMJ::PrintPai(int p_Type,int p_Value)
{
//箭牌
if(p_Type==0)
{
switch(p_Value)
{
case 1:
cout<<"[中]";
break;
case 2:
cout<<"[发]";
break;
case 3:
cout<<"[白]";
break;
}
}
//风牌
if(p_Type==1)
{
switch(p_Value)
{
case 1:
cout<<"[东]";
break;
case 2:
cout<<"[南]";
break;
case 3:
cout<<"[西]";
break;
case 4:
cout<<"[北]";
break;
}
}
//万
if(p_Type==2)
{
cout<<"["<<p_Value<<"万]";
}
//条
if(p_Type==3)
{
cout<<"["<<p_Value<<"条]";
}
//饼
if(p_Type==4)
{
cout<<"["<<p_Value<<"饼]";
}
}
//吃牌
bool CMJ::CheckChiPai(int p_Type,int p_Value)
{
m_TempChiPAIVec.clear();
//饼
if(m_MyPAIVec[p_Type].empty()==false)
{
int iSize = m_MyPAIVec[p_Type].size();
if( iSize >= 2)
{
for(UINT i = 0 ; i < iSize-1 ; i++ )
{
if((m_MyPAIVec[p_Type][i]==(p_Value-2))&&(m_MyPAIVec[p_Type][i+1]==(p_Value-1)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value-2;
t_Chi.m_Value2 = p_Value-1;
t_Chi.m_Value3 = p_Value;
m_TempChiPAIVec.push_back(t_Chi);
}
if((m_MyPAIVec[p_Type][i]==(p_Value-1))&&(m_MyPAIVec[p_Type][i+1]==(p_Value+1)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value-1;
t_Chi.m_Value2 = p_Value;
t_Chi.m_Value3 = p_Value+1;
m_TempChiPAIVec.push_back(t_Chi);
}
if((m_MyPAIVec[p_Type][i]==(p_Value+1))&&(m_MyPAIVec[p_Type][i+1]==(p_Value+2)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value;
t_Chi.m_Value2 = p_Value+1;
t_Chi.m_Value3 = p_Value+2;
m_TempChiPAIVec.push_back(t_Chi);
}
}
}
//假设吃B,已有ABC
if( iSize >= 3)
{
for(UINT i = 1 ; i < iSize-1 ; i++ )
{
if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+1]==(p_Value+1)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value-1;
t_Chi.m_Value2 = p_Value;
t_Chi.m_Value3 = p_Value+1;
m_TempChiPAIVec.push_back(t_Chi);
}
}
}
//假设吃B,已有ABBC
if( iSize >= 4)
{
for(UINT i = 1 ; i < iSize-2 ; i++ )
{
if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+2]==(p_Value+1)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value-1;
t_Chi.m_Value2 = p_Value;
t_Chi.m_Value3 = p_Value+1;
m_TempChiPAIVec.push_back(t_Chi);
}
}
}
//假设吃B,已有ABBBC
if( iSize >= 5)
{
for(UINT i = 1 ; i < iSize-3 ; i++ )
{
if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+3]==(p_Value+1)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value-1;
t_Chi.m_Value2 = p_Value;
t_Chi.m_Value3 = p_Value+1;
m_TempChiPAIVec.push_back(t_Chi);
}
}
}
//假设吃B,已有ABBBBC
if( iSize >= 6)
{
for(UINT i = 1 ; i < iSize-4 ; i++ )
{
if((m_MyPAIVec[p_Type][i-1]==(p_Value-1))&&(m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+4]==(p_Value+1)))
{
stCHI t_Chi;
t_Chi.m_Type = p_Type;
t_Chi.m_Value1 = p_Value-1;
t_Chi.m_Value2 = p_Value;
t_Chi.m_Value3 = p_Value+1;
m_TempChiPAIVec.push_back(t_Chi);
}
}
}
if(m_TempChiPAIVec.size() > 0)
{
return true;
}
}
return false;
}
//吃牌
bool CMJ::DoChiPai(int p_iIndex,int p_Type,int p_Value)
{
AddPai(p_Type,p_Value);
vector<stCHI>::iterator Iter;
int icount = 0;
for(Iter = m_TempChiPAIVec.begin(); Iter != m_TempChiPAIVec.end(); Iter++ )
{
if(icount == p_iIndex)
{
DelPai((*Iter).m_Type,(*Iter).m_Value1);
DelPai((*Iter).m_Type,(*Iter).m_Value2);
DelPai((*Iter).m_Type,(*Iter).m_Value3);
m_ChiPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value1);
m_ChiPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value2);
m_ChiPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value3);
return true;
}
icount++;
}
return false;
}
//对可吃的组合进行输出
void CMJ::PrintChiChosePai()
{
cout<<"================吃牌组合======================="<<endl;
vector<stCHI>::iterator Iter;
for(Iter = m_TempChiPAIVec.begin(); Iter != m_TempChiPAIVec.end();Iter++)
{
//万
if((*Iter).m_Type==2)
{
cout<<"["<<(*Iter).m_Value1<<"万";
cout<<""<<(*Iter).m_Value2<<"万";
cout<<""<<(*Iter).m_Value3<<"万]";
}
//条
if((*Iter).m_Type==3)
{
cout<<"["<<(*Iter).m_Value1<<"条";
cout<<""<<(*Iter).m_Value2<<"条";
cout<<""<<(*Iter).m_Value3<<"条]";
}
//饼
if((*Iter).m_Type==4)
{
cout<<"["<<(*Iter).m_Value1<<"饼";
cout<<""<<(*Iter).m_Value2<<"饼";
cout<<""<<(*Iter).m_Value3<<"饼]";
}
}
cout<<endl<<"========================================="<<endl;
}
//对可碰的组合进行输出
void CMJ::PrintPengChosePai()
{
cout<<"=====================碰牌=================="<<endl;
vector<stPAI>::iterator Iter;
for(Iter = m_TempPengPAIVec.begin(); Iter != m_TempPengPAIVec.end();Iter++)
{
//万
if((*Iter).m_Type==2)
{
cout<<"["<<(*Iter).m_Value<<"万";
cout<<""<<(*Iter).m_Value<<"万";
cout<<""<<(*Iter).m_Value<<"万]";
}
//条
if((*Iter).m_Type==3)
{
cout<<"["<<(*Iter).m_Value<<"条";
cout<<""<<(*Iter).m_Value<<"条";
cout<<""<<(*Iter).m_Value<<"条]";
}
//饼
if((*Iter).m_Type==4)
{
cout<<"["<<(*Iter).m_Value<<"饼";
cout<<""<<(*Iter).m_Value<<"饼";
cout<<""<<(*Iter).m_Value<<"饼]";
}
}
cout<<endl<<"========================================="<<endl;
}
//对可杠的组合进行输出
void CMJ::PrintGangChosePai()
{
cout<<"====================杠牌==================="<<endl;
vector<stPAI>::iterator Iter;
for(Iter = m_TempGangPAIVec.begin(); Iter != m_TempGangPAIVec.end();Iter++)
{
//万
if((*Iter).m_Type==2)
{
cout<<"["<<(*Iter).m_Value<<"万";
cout<<""<<(*Iter).m_Value<<"万";
cout<<""<<(*Iter).m_Value<<"万";
cout<<""<<(*Iter).m_Value<<"万]";
}
//条
if((*Iter).m_Type==3)
{
cout<<"["<<(*Iter).m_Value<<"条";
cout<<""<<(*Iter).m_Value<<"条";
cout<<""<<(*Iter).m_Value<<"条";
cout<<""<<(*Iter).m_Value<<"条]";
}
//饼
if((*Iter).m_Type==4)
{
cout<<"["<<(*Iter).m_Value<<"饼";
cout<<""<<(*Iter).m_Value<<"饼";
cout<<""<<(*Iter).m_Value<<"饼";
cout<<""<<(*Iter).m_Value<<"饼]";
}
}
cout<<endl<<"========================================="<<endl;
}
//取得吃牌组合数
UINT CMJ::GetChiChoseNum()
{
return m_TempChiPAIVec.size();
}
//碰牌
bool CMJ::CheckPengPai(int p_Type,int p_Value)
{
m_TempPengPAIVec.clear();
//饼
if(m_MyPAIVec[p_Type].empty()==false)
{
int iSize = m_MyPAIVec[p_Type].size();
if( iSize >= 2)
{
for(UINT i = 0 ; i < iSize-1 ; i++ )
{
if((m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+1]==p_Value))
{
stPAI t_Peng;
t_Peng.m_Type = p_Type;
t_Peng.m_Value = p_Value;
m_TempPengPAIVec.push_back(t_Peng);
break;
}
}
}
if(m_TempPengPAIVec.size() > 0)
{
return true;
}
}
return false;
}
//碰牌
bool CMJ::DoPengPai(int p_Type,int p_Value)
{
AddPai(p_Type,p_Value);
vector<stPAI>::iterator Iter;
for(Iter = m_TempPengPAIVec.begin(); Iter != m_TempPengPAIVec.end(); Iter++ )
{
DelPai((*Iter).m_Type,(*Iter).m_Value);
DelPai((*Iter).m_Type,(*Iter).m_Value);
DelPai((*Iter).m_Type,(*Iter).m_Value);
m_PengPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
m_PengPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
m_PengPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
return true;
}
return false;
}
//杠牌
bool CMJ::CheckGangPai(int p_Type,int p_Value)
{
m_TempGangPAIVec.clear();
//饼
if(m_MyPAIVec[p_Type].empty()==false)
{
int iSize = m_MyPAIVec[p_Type].size();
if( iSize >= 3)
{
for(UINT i = 0 ; i < iSize-2 ; i++ )
{
if((m_MyPAIVec[p_Type][i]==p_Value)&&(m_MyPAIVec[p_Type][i+1]==p_Value)&&(m_MyPAIVec[p_Type][i+2]==p_Value))
{
stPAI t_Gang;
t_Gang.m_Type = p_Type;
t_Gang.m_Value = p_Value;
m_TempGangPAIVec.push_back(t_Gang);
break;
}
}
}
if(m_TempGangPAIVec.size() > 0)
{
return true;
}
}
return false;
}
//杠牌
bool CMJ::DoGangPai(int p_Type,int p_Value)
{
AddPai(p_Type,p_Value);
vector<stPAI>::iterator Iter;
for(Iter = m_TempGangPAIVec.begin(); Iter != m_TempGangPAIVec.end(); Iter++ )
{
DelPai((*Iter).m_Type,(*Iter).m_Value);
DelPai((*Iter).m_Type,(*Iter).m_Value);
DelPai((*Iter).m_Type,(*Iter).m_Value);
DelPai((*Iter).m_Type,(*Iter).m_Value);
//排序放入
if(m_GangPAIVec[(*Iter).m_Type].empty())
{
m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
m_GangPAIVec[(*Iter).m_Type].push_back((*Iter).m_Value);
}
else
{
vector<int>::iterator Iter2;
for(Iter2 = m_GangPAIVec[(*Iter).m_Type].begin(); Iter2 != m_GangPAIVec[(*Iter).m_Type].end(); Iter2++ )
{
if((*Iter2)>(*Iter).m_Value)
{
m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value);
m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value);
m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value);
m_GangPAIVec[(*Iter).m_Type].insert(Iter2,(*Iter).m_Value);
break;
}
}
}
return true;
}
return false;
}
//检测是否胡牌
bool CMJ::CheckAllPai(bool GetOrPut)
{
if(GetOrPut == MJPAI_GETPAI)
{
//检查大四喜
if(CheckD4X_HU())
{
strcpy(m_GoodInfo.m_GoodName,"大四喜");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查大三元
if(CheckD3Y_HU())
{
strcpy(m_GoodInfo.m_GoodName,"大三元");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查绿一色
if(CheckL1S_HU())
{
strcpy(m_GoodInfo.m_GoodName,"绿一色");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查九莲宝灯
if(Check9LBD_HU())
{
strcpy(m_GoodInfo.m_GoodName,"九莲宝灯");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查四杠
if(Check4Gang_HU())
{
strcpy(m_GoodInfo.m_GoodName,"四杠");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查连七对
if(CheckL7D_HU())
{
strcpy(m_GoodInfo.m_GoodName,"连七对");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查十三幺
if(Chekc13Y_HU())
{
strcpy(m_GoodInfo.m_GoodName,"十三幺");
m_GoodInfo.m_GoodValue = 88;
return true;
}
//检查清幺九
if(CheckQY9_HU())
{
strcpy(m_GoodInfo.m_GoodName,"清幺九");
m_GoodInfo.m_GoodValue = 64;
return true;
}
//检查小四喜
if(CheckX4X_HU())
{
strcpy(m_GoodInfo.m_GoodName,"小四喜");
m_GoodInfo.m_GoodValue = 64;
return true;
}
//检查小三元
if(CheckX3Y_HU())
{
strcpy(m_GoodInfo.m_GoodName,"小三元");
m_GoodInfo.m_GoodValue = 64;
return true;
}
//检测是否四暗刻
if(Check4AK_HU())
{
strcpy(m_GoodInfo.m_GoodName,"四暗刻");
m_GoodInfo.m_GoodValue = 64;
return true;
}
//检测是否一色双龙会
if(Check1S2LH_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色双龙会");
m_GoodInfo.m_GoodValue = 64;
return true;
}
//检测是否一色四同顺
if(Check1S4TS_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色四同顺");
m_GoodInfo.m_GoodValue = 48;
return true;
}
//检测是否一色四节高
if(Check1S4JG_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色四节高");
m_GoodInfo.m_GoodValue = 48;
return true;
}
//检测是否一色四步高
if(Check1S4BG_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色四步高");
m_GoodInfo.m_GoodValue = 32;
return true;
}
//检测是否三杠
if(Check3Gang_HU())
{
strcpy(m_GoodInfo.m_GoodName,"三杠");
m_GoodInfo.m_GoodValue = 32;
return true;
}
//检测是否七对
if(Check7D_HU())
{
strcpy(m_GoodInfo.m_GoodName,"七对");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否七星不靠
if(Check7XBK_HU())
{
strcpy(m_GoodInfo.m_GoodName,"七星不靠");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否全双刻
if(CheckQSK_HU())
{
strcpy(m_GoodInfo.m_GoodName,"全双刻");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否清一色
if(CheckQ1S_HU())
{
strcpy(m_GoodInfo.m_GoodName,"清一色");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否一色三同顺
if(Check1S3TS_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色三同顺");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否一色三节高
if(Check1S3JG_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色三节高");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否全大
if(CheckQD_HU())
{
strcpy(m_GoodInfo.m_GoodName,"全大");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否全中
if(CheckQZ_HU())
{
strcpy(m_GoodInfo.m_GoodName,"全中");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否全小
if(CheckQX_HU())
{
strcpy(m_GoodInfo.m_GoodName,"全小");
m_GoodInfo.m_GoodValue = 24;
return true;
}
//检测是否青龙
if(CheckQL_HU())
{
strcpy(m_GoodInfo.m_GoodName,"青龙");
m_GoodInfo.m_GoodValue = 16;
return true;
}
//检测是否三色双龙会
if(Check3S2LH_HU())
{
strcpy(m_GoodInfo.m_GoodName,"三色双龙会");
m_GoodInfo.m_GoodValue = 16;
return true;
}
//检测是否一色三步高
if(Check1S3BG_HU())
{
strcpy(m_GoodInfo.m_GoodName,"一色三步高");
m_GoodInfo.m_GoodValue = 16;
return true;
}
//检测是否单调将
if(CheckDDJ_HU())
{
strcpy(m_GoodInfo.m_GoodName,"单调将");
m_GoodInfo.m_GoodValue = 1;
return true;
}
//检测是否平胡
if(CheckHU())
{
strcpy(m_GoodInfo.m_GoodName,"平胡");
m_GoodInfo.m_GoodValue = 1;
return true;
}
}
else
{
//判断是否听连宝灯
m_9LBD = Check9LBD_TING();
if(m_9LBD)return true;
//判断是否听幺
m_13Y = Check13Y_TING();
if(m_13Y)return true;
//判断是否四暗刻
m_4AK = Check4AK_TING();
if(m_4AK)return true;
//检测是否听头
return CheckTING();
}
return false;
}
//检测是否胡牌(张)
inline bool CMJ::CheckAAPai(int iValue1,int iValue2)
{
if(iValue1 == iValue2)return true;
return false;
}
//检测是否三连张
inline bool CMJ::CheckABCPai(int iValue1,int iValue2,int iValue3)
{
if(iValue1 == (iValue2-1)&&iValue2 == (iValue3-1))return true;
return false;
}
//检测是否三重张
inline bool CMJ::CheckAAAPai(int iValue1,int iValue2,int iValue3)
{
if(iValue1 == iValue2&&iValue2 == iValue3)return true;
return false;
}
//检测是否四重张
inline bool CMJ::CheckAAAAPai(int iValue1,int iValue2,int iValue3,int iValue4)
{
if(iValue1 == iValue2&&iValue2 == iValue3&&iValue3 == iValue4)return true;
return false;
}
//检测是否三连对
inline bool CMJ::CheckAABBCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6)
{
if(iValue1 == iValue2&&iValue3 == iValue4&&iValue5 == iValue6)
{
if((iValue1 == iValue3-1)&&(iValue3 == iValue5-1))
{
return true;
}
}
return false;
}
//检测是否三连高压
inline bool CMJ::CheckAAABBBCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9)
{
if((iValue1 == iValue2&&iValue2 == iValue3)&&(iValue4 == iValue5&&iValue5 == iValue6)&&(iValue7 == iValue8&&iValue8 == iValue9))
{
if((iValue1 == iValue4-1)&&(iValue4 == iValue7-1))
{
return true;
}
}
return false;
}
//检测是否三连刻
inline bool CMJ::CheckAAAABBBBCCCCPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12)
{
if((iValue1 == iValue2&&iValue2 == iValue3&&iValue3 == iValue4)&&(iValue5 == iValue6&&iValue6 == iValue7&&iValue7 == iValue8)&&(iValue9 == iValue10&&iValue10 == iValue11&&iValue11 == iValue12))
{
if((iValue1 == iValue5-1)&&(iValue5 == iValue9-1))
{
return true;
}
}
return false;
}
//检测是否六连对
inline bool CMJ::CheckAABBCCDDEEFFPai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12)
{
if(iValue1 == iValue2&&iValue3 == iValue4&&iValue5 == iValue6&&iValue7 == iValue8&&iValue9 == iValue10&&iValue11 == iValue12)
{
if((iValue1 == iValue3-1)&&(iValue3 == iValue5-1)&&(iValue5 == iValue7-1)&&(iValue7 == iValue9-1)&&(iValue9 == iValue11-1))
{
return true;
}
}
return false;
}
//检测是否胡牌(张)
bool CMJ::Check5Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5)
{
//如果是左边两个为将,右边为三重张或三连张
if(CheckAAPai(iValue1,iValue2))
{
if(Check3Pai(iValue3,iValue4,iValue5))return true;
}
//如果中间两个为将
if(CheckAAAPai(iValue2,iValue3,iValue4))
{
if(CheckABCPai(iValue1,iValue4,iValue5))return true;
}
//如果是左边两个为将,右边为三重张或三连张
if(CheckAAPai(iValue4,iValue5))
{
if(Check3Pai(iValue1,iValue2,iValue3))return true;
}
return false;
}
//检测是否胡牌(张)
bool CMJ::Check8Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8)
{
//如果是左边两个为将,右边为三重张或三连张
if(CheckAAPai(iValue1,iValue2))
{
return Check6Pai(iValue3,iValue4,iValue5,iValue6,iValue7,iValue8);
}
//如果是中间两个为将,左右边为三重张或三连张
if(CheckAAPai(iValue4,iValue5))
{
if(Check3Pai(iValue1,iValue2,iValue3)&&Check3Pai(iValue6,iValue7,iValue8))return true;
}
//如果是右边两个为将,左边为三重张或三连张
if(CheckAAPai(iValue7,iValue8))
{
return Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6);
}
return false;
}
//检测是否胡牌(张)
bool CMJ::Check11Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11)
{
//如果是左边两个为将
if(CheckAAPai(iValue1,iValue2))
{
return Check9Pai(iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11);
}
//如果是中间两个为将
if(CheckAAPai(iValue4,iValue5))
{
//无AAA,全ABC
if(Check3Pai(iValue1,iValue2,iValue3)&&Check6Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true;
}
//如果是右边两个为将
if(CheckAAPai(iValue7,iValue8))
{
//无AAA,全ABC
if(Check3Pai(iValue9,iValue10,iValue11)&&Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true;
}
//如果是右边两个为将
if(CheckAAPai(iValue10,iValue11))
{
return Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9);
}
return false;
}
//检测是否胡牌(张)
bool CMJ::Check14Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12,int iValue13,int iValue14)
{
//如果是左边两个为将,右边为三重张或三连张
if(CheckAAPai(iValue1,iValue2))
{
//无AAA,全ABC
if(Check12Pai(iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12,iValue13,iValue14))return true;
return false;
}
//如果是中间两个为将,左右边为三重张或三连张
if(CheckAAPai(iValue4,iValue5))
{
//无AAA,全ABC
if(Check3Pai(iValue1,iValue2,iValue3)&&Check9Pai(iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12,iValue13,iValue14))return true;
return false;
}
//如果是中间两个为将,左右边为三重张或三连张
if(CheckAAPai(iValue7,iValue8))
{
//无AAA,全ABC
if(Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6)&&Check6Pai(iValue9,iValue10,iValue11,iValue12,iValue13,iValue14))return true;
return false;
}
//如果是中间两个为将,左右边为三重张或三连张
if(CheckAAPai(iValue10,iValue11))
{
//无AAA,全ABC
if(Check3Pai(iValue12,iValue13,iValue14)&&Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true;
return false;
}
//如果是右边两个为将,左右边为三重张或三连张
if(CheckAAPai(iValue13,iValue14))
{
//无AAA,全ABC
if(Check12Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true;
}
return false;
}
//检测是否胡牌(张)
bool CMJ::Check3Pai(int iValue1,int iValue2,int iValue3)
{
if(CheckABCPai(iValue1,iValue2,iValue3))return true;
if(CheckAAAPai(iValue1,iValue2,iValue3))return true;
return false;
}
//检测是否胡牌(张)
bool CMJ::Check6Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6)
{
if(Check3Pai(iValue1,iValue2,iValue3)&&Check3Pai(iValue4,iValue5,iValue6))return true;
if(Check3Pai(iValue1,iValue2,iValue3)&&Check3Pai(iValue4,iValue5,iValue6))return true;
//三连对
if(CheckAABBCCPai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true;
//第一张牌四连张
if(CheckAAAAPai(iValue2,iValue3,iValue4,iValue5))
{
if(CheckABCPai(iValue1,iValue2,iValue6))return true;
}
return false;
}
//检测是否胡牌(张)
bool CMJ::Check9Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9)
{
if(CheckABCPai(iValue1,iValue2,iValue3)&&Check6Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true;
if(CheckAAAPai(iValue1,iValue2,iValue3)&&Check6Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true;
if(CheckABCPai(iValue7,iValue8,iValue9)&&Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true;
if(CheckAAAPai(iValue7,iValue8,iValue9)&&Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6))return true;
return false;
}
//检测是否胡牌(张)
bool CMJ::Check12Pai(int iValue1,int iValue2,int iValue3,int iValue4,int iValue5,int iValue6,int iValue7,int iValue8,int iValue9,int iValue10,int iValue11,int iValue12)
{
if(CheckABCPai(iValue1,iValue2,iValue3)&&Check9Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true;
if(CheckAAAPai(iValue1,iValue2,iValue3)&&Check9Pai(iValue4,iValue5,iValue6,iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true;
if(CheckABCPai(iValue10,iValue11,iValue12)&&Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true;
if(CheckAAAPai(iValue10,iValue11,iValue12)&&Check9Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6,iValue7,iValue8,iValue9))return true;
if(Check6Pai(iValue1,iValue2,iValue3,iValue4,iValue5,iValue6)&&Check6Pai(iValue7,iValue8,iValue9,iValue10,iValue11,iValue12))return true;
return false;
}
//检测是否是大四喜
bool CMJ::CheckD4X_HU()
{
//东西南北四杠
if(m_GangPAIVec[1].size()==16)
{
//将牌
for(int i = 0 ; i < 6 ; i++ )
{
if(m_MyPAIVec[i].size()==2)
{
//如果是将
if(m_MyPAIVec[i][0] == m_MyPAIVec[i][1])
{
return true;
}
}
}
}
return false;
}
//检则是否是大三元
bool CMJ::CheckD3Y_HU()
{
//中发白三杠
if(m_GangPAIVec[0].size()==12)
{
//将牌
for(int i = 0 ; i < 6 ; i++ )
{
if(m_MyPAIVec[i].size()==2)
{
//如果是将
if(m_MyPAIVec[i][0] == m_MyPAIVec[i][1])
{
return true;
}
}
}
}
return false;
}
//检测是否绿一色
bool CMJ::CheckL1S_HU()
{
//只准有发财和条
if(m_MyPAIVec[1].size()>0)return false;
if(m_MyPAIVec[2].size()>0)return false;
if(m_MyPAIVec[4].size()>0)return false;
if(m_MyPAIVec[5].size()>0)return false;
if(m_ChiPAIVec[1].size()>0)return false;
if(m_ChiPAIVec[2].size()>0)return false;
if(m_ChiPAIVec[4].size()>0)return false;
if(m_ChiPAIVec[5].size()>0)return false;
if(m_PengPAIVec[1].size()>0)return false;
if(m_PengPAIVec[2].size()>0)return false;
if(m_PengPAIVec[4].size()>0)return false;
if(m_PengPAIVec[5].size()>0)return false;
if(m_GangPAIVec[1].size()>0)return false;
if(m_GangPAIVec[2].size()>0)return false;
if(m_GangPAIVec[4].size()>0)return false;
if(m_GangPAIVec[5].size()>0)return false;
//对发财
if(m_MyPAIVec[0].size() ==2)
{
if(m_MyPAIVec[0][0]==2&&m_MyPAIVec[0][1]==2)
{
for(int i = 1 ;i < 6 ; i++)
{
if(i==3)continue;
if(m_MyPAIVec[i].size()>0)return false;
if(m_ChiPAIVec[i].size()>0)return false;
if(m_PengPAIVec[i].size()>0)return false;
if(m_GangPAIVec[i].size()>0)return false;
}
//吃
int iSize = m_ChiPAIVec[3].size();
if(iSize>0)
{
vector< int >::iterator Iter;
for(Iter = m_ChiPAIVec[3].begin();Iter != m_ChiPAIVec[3].end();Iter++ )
{
if((*Iter)==1)return false;
if((*Iter)==5)return false;
if((*Iter)==7)return false;
if((*Iter)==9)return false;
}
}
//碰
iSize = m_PengPAIVec[3].size();
if(iSize>0)
{
vector< int >::iterator Iter;
for(Iter = m_PengPAIVec[3].begin();Iter != m_PengPAIVec[3].end();Iter++ )
{
if((*Iter)==1)return false;
if((*Iter)==5)return false;
if((*Iter)==7)return false;
if((*Iter)==9)return false;
}
}
//杠
iSize = m_GangPAIVec[3].size();
if(iSize>0)
{
vector< int >::iterator Iter;
for(Iter = m_GangPAIVec[3].begin();Iter != m_GangPAIVec[3].end();Iter++ )
{
if((*Iter)==1)return false;
if((*Iter)==5)return false;
if((*Iter)==7)return false;
if((*Iter)==9)return false;
}
}
//起
iSize = m_MyPAIVec[3].size();
if(iSize>0)
{
vector< int >::iterator Iter;
for(Iter = m_MyPAIVec[3].begin();Iter != m_MyPAIVec[3].end();Iter++ )
{
if((*Iter)==1)return false;
if((*Iter)==5)return false;
if((*Iter)==7)return false;
if((*Iter)==9)return false;
}
}
}
}
else
{
return false;
}
//如果有三张
if(m_MyPAIVec[3].size() == 3)
{
if(Check3Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2]))return true;
}
//如果有六张
if(m_MyPAIVec[3].size() == 6)
{
if(Check6Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5]))return true;
}
//九张
if(m_MyPAIVec[3].size() == 9)
{
if(Check9Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8]))return true;
}
//十二张
if(m_MyPAIVec[3].size() == 12)
{
if(Check12Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10],m_MyPAIVec[3][11]))return true;
}
return false;
}
//检测是否九莲宝灯(胡)
bool CMJ::Check9LBD_HU()
{
if(m_9LBD)//如果已经成九连宝灯牌型
{
if(m_MyPAIVec[2].size()==14)return true;
if(m_MyPAIVec[3].size()==14)return true;
if(m_MyPAIVec[4].size()==14)return true;
}
return false;
}
//检测是否九莲宝灯牌型(听)
bool CMJ::Check9LBD_TING()
{
for(UINT i = 2 ; i < 5 ; i++ )
{
if(m_MyPAIVec[i].size()==13)
{
if(m_MyPAIVec[i][0]==1&&m_MyPAIVec[i][1]==1&&m_MyPAIVec[i][2]==1)
{
if(m_MyPAIVec[i][3]==2&&m_MyPAIVec[i][4]==3&&m_MyPAIVec[i][5]==4&&m_MyPAIVec[i][6]==5&&m_MyPAIVec[i][7]==6&&m_MyPAIVec[i][8]==7&&m_MyPAIVec[i][9]==8)
{
if(m_MyPAIVec[i][10]==9&&m_MyPAIVec[i][11]==9&&m_MyPAIVec[i][12]==9)
{
return true;
}
}
}
}
}
return false;
}
//检测是否是四杠
bool CMJ::Check4Gang_HU()
{
int iSize = 0;
for(UINT i = 0 ; i < 6 ; i++ )
{
iSize = m_GangPAIVec[i].size();
}
if(iSize == 16)
{
//将牌
for(int i = 0 ; i < 6 ; i++ )
{
//如果是将
if(CheckAAPai(m_MyPAIVec[i][0],m_MyPAIVec[i][1]))
{
return true;
}
}
}
return false;
}
//检测是否连七对
bool CMJ::CheckL7D_HU()
{
for(UINT i = 2 ; i < 5 ; i++ )
{
if(m_MyPAIVec[i].size()==14)
{
if(m_MyPAIVec[i][0]==1&&m_MyPAIVec[i][1]==1&&m_MyPAIVec[i][2]==2&&m_MyPAIVec[i][3]==2&&m_MyPAIVec[i][4]==3&&m_MyPAIVec[i][5]==3&&m_MyPAIVec[i][6]==4&&m_MyPAIVec[i][7]==4&&m_MyPAIVec[i][8]==5&&m_MyPAIVec[i][9]==5&&m_MyPAIVec[i][10]==6&&m_MyPAIVec[i][11]==6&&m_MyPAIVec[i][12]==7&&m_MyPAIVec[i][13]==7)
{
return true;
}
if(m_MyPAIVec[i][0]==2&&m_MyPAIVec[i][1]==2&&m_MyPAIVec[i][2]==3&&m_MyPAIVec[i][3]==3&&m_MyPAIVec[i][4]==4&&m_MyPAIVec[i][5]==4&&m_MyPAIVec[i][6]==5&&m_MyPAIVec[i][7]==5&&m_MyPAIVec[i][8]==6&&m_MyPAIVec[i][9]==6&&m_MyPAIVec[i][10]==7&&m_MyPAIVec[i][11]==7&&m_MyPAIVec[i][12]==8&&m_MyPAIVec[i][13]==8)
{
return true;
}
if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==3&&m_MyPAIVec[i][2]==4&&m_MyPAIVec[i][3]==4&&m_MyPAIVec[i][4]==5&&m_MyPAIVec[i][5]==5&&m_MyPAIVec[i][6]==6&&m_MyPAIVec[i][7]==6&&m_MyPAIVec[i][8]==7&&m_MyPAIVec[i][9]==7&&m_MyPAIVec[i][10]==8&&m_MyPAIVec[i][11]==8&&m_MyPAIVec[i][12]==9&&m_MyPAIVec[i][13]==9)
{
return true;
}
}
}
return false;
}
//检测是否胡十三幺
bool CMJ::Chekc13Y_HU()
{
if(m_13Y)
{
bool i13YSize[13] ;
for(UINT i = 0 ; i < 13 ; i++ )
{
i13YSize[i]=false;
}
//中发白
vector<int>::iterator Iter;
for(Iter = m_MyPAIVec[0].begin();Iter != m_MyPAIVec[0].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[0]=true;
}
if((*Iter)==2)
{
i13YSize[1]=true;
}
if((*Iter)==3)
{
i13YSize[2]=true;
}
}
//东南西北风
for(Iter = m_MyPAIVec[1].begin();Iter != m_MyPAIVec[1].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[3]=true;
}
if((*Iter)==2)
{
i13YSize[4]=true;
}
if((*Iter)==3)
{
i13YSize[5]=true;
}
if((*Iter)==4)
{
i13YSize[6]=true;
}
}
//一九万
for(Iter = m_MyPAIVec[2].begin();Iter != m_MyPAIVec[2].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[7]=true;
}
if((*Iter)==9)
{
i13YSize[8]=true;
}
}
//一九条
for(Iter = m_MyPAIVec[3].begin();Iter != m_MyPAIVec[3].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[9]=true;
}
if((*Iter)==9)
{
i13YSize[10]=true;
}
}
//一九饼
for(Iter = m_MyPAIVec[4].begin();Iter != m_MyPAIVec[4].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[11]=true;
}
if((*Iter)==9)
{
i13YSize[12]=true;
}
}
int icount = 0;
for(UINT i = 0 ; i < 13 ; i++ )
{
if(i13YSize[i]==true)
{
icount++;
}
}
if(icount == 13)return true;
}
return false;
}
//检测是否清幺九
bool CMJ::CheckQY9_HU()
{
int iSize = 0;
int iCount = 0;
for(UINT i = 2 ; i < 5 ; i++ )
{
iSize = m_GangPAIVec[i].size();
iCount += iSize;
for(UINT j = 0 ; j < iSize ; j++ )
{
if(m_GangPAIVec[i][j]!=1||m_GangPAIVec[i][j]!=9)return false;
}
}
if(iCount == 12)
{
if(m_MyPAIVec[2].size()==2)
{
if(m_MyPAIVec[2][0]==1&&m_MyPAIVec[2][1]==1)return true;
if(m_MyPAIVec[2][0]==9&&m_MyPAIVec[2][1]==9)return true;
}
if(m_MyPAIVec[3].size()==3)
{
if(m_MyPAIVec[3][0]==1&&m_MyPAIVec[3][1]==1)return true;
if(m_MyPAIVec[3][0]==9&&m_MyPAIVec[3][1]==9)return true;
}
if(m_MyPAIVec[4].size()==4)
{
if(m_MyPAIVec[4][0]==1&&m_MyPAIVec[4][1]==1)return true;
if(m_MyPAIVec[4][0]==9&&m_MyPAIVec[4][1]==9)return true;
}
}
return false;
}
//检测是否胡小四喜
bool CMJ::CheckX4X_HU()
{
//东西南北四杠
if(m_GangPAIVec[1].size()==12)
{
//将牌的位置
int iJiangPos = -1;
//将牌
for(int i = 0 ; i < 6 ; i++ )
{
if(m_MyPAIVec[i].size()==5)
{
if(Check5Pai(m_MyPAIVec[i][0],m_MyPAIVec[i][1],m_MyPAIVec[i][2],m_MyPAIVec[i][3],m_MyPAIVec[i][4]))
{
return true;
}
}
if(m_MyPAIVec[i].size()==2)
{
//如果是将
if(CheckAAPai(m_MyPAIVec[i][0],m_MyPAIVec[i][1]))
{
iJiangPos = i;
break;
}
}
}
//
if(iJiangPos>0)
{
for(int i = 0 ; i < 6 ; i++ )
{
if(i!=iJiangPos)
{
if((m_MyPAIVec[i].size()==3))
{
if(Check3Pai(m_MyPAIVec[i][0],m_MyPAIVec[i][1],m_MyPAIVec[i][2]))return true;
}
}
}
}
}
return false;
}
//检测是否胡小三元
bool CMJ::CheckX3Y_HU()
{
//东西南北四杠
if(m_GangPAIVec[0].size()==8)
{
if(m_MyPAIVec[0].size()==5)
{
if(Check5Pai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4]))
{
return true;
}
else
{
return false;
}
}
else if(m_MyPAIVec[0].size()==2)
{
//如果是将
if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])==false)
{
return false;
}
}
else
{
return false;
}
return CheckHU();
}
return false;
}
//检测是否胡字一色
bool CMJ::CheckZ1S_HU()
{
//只准有字
if(m_MyPAIVec[2].size()>0)return false;
if(m_MyPAIVec[3].size()>0)return false;
if(m_MyPAIVec[4].size()>0)return false;
if(m_MyPAIVec[5].size()>0)return false;
if(m_ChiPAIVec[2].size()>0)return false;
if(m_ChiPAIVec[3].size()>0)return false;
if(m_ChiPAIVec[4].size()>0)return false;
if(m_ChiPAIVec[5].size()>0)return false;
if(m_PengPAIVec[2].size()>0)return false;
if(m_PengPAIVec[3].size()>0)return false;
if(m_PengPAIVec[4].size()>0)return false;
if(m_PengPAIVec[5].size()>0)return false;
if(m_GangPAIVec[2].size()>0)return false;
if(m_GangPAIVec[3].size()>0)return false;
if(m_GangPAIVec[4].size()>0)return false;
if(m_GangPAIVec[5].size()>0)return false;
int iSize = m_MyPAIVec[0].size();
if(iSize > 0)
{
if(iSize == 2)
{
if(m_MyPAIVec[0][0]==m_MyPAIVec[0][1])
{
iSize = m_MyPAIVec[1].size();
if(iSize == 0)return true;
if(iSize == 3)
{
if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2]))return true;
}
}
}
}
return false;
}
//检测是否四暗刻
bool CMJ::Check4AK_HU()
{
if(m_4AK)
{
//将牌
for(int i = 0 ; i < 6 ; i++ )
{
if(m_MyPAIVec[i].size()==2)
{
//如果是将
if(m_MyPAIVec[i][0] == m_MyPAIVec[i][1])
{
return true;
}
}
}
}
return false;
}
//检测是否一色双龙会
bool CMJ::Check1S2LH_HU()
{
//万,条,饼
for(UINT i = 0 ; i <= 4; i++ )
{
int iType = i;
if(m_MyPAIVec[iType].size()==14)
{
if(m_MyPAIVec[iType][0]==1&&m_MyPAIVec[iType][1]==1)
{
}
else
{
return false;
}
if(m_MyPAIVec[iType][2]==2&&m_MyPAIVec[iType][3]==2)
{
}
else
{
return false;
}
if(m_MyPAIVec[iType][4]==3&&m_MyPAIVec[iType][5]==3)
{
}
else
{
return false;
}
if(m_MyPAIVec[iType][6]==5&&m_MyPAIVec[iType][7]==5)
{
}
else
{
return false;
}
if(m_MyPAIVec[iType][8]==7&&m_MyPAIVec[iType][9]==7)
{
}
else
{
return false;
}
if(m_MyPAIVec[iType][10]==8&&m_MyPAIVec[iType][11]==8)
{
}
else
{
return false;
}
if(m_MyPAIVec[iType][12]==9&&m_MyPAIVec[iType][13]==9)
{
}
else
{
return false;
}
return true;
}
}
return false;
}
//检测是否一色四同顺
bool CMJ::Check1S4TS_HU()
{
//万,条,饼
for(UINT i = 0 ; i <= 4; i++ )
{
int iType = i;
//吃过的顺
int iSize1 = m_ChiPAIVec[iType].size();
//剩余牌墙中的顺
int iSize2 = m_MyPAIVec[iType].size();
//万
if(iSize1 + iSize2 >= 12)
{
//无吃的顺
if(iSize1==0)
{
if(iSize2==12)
{
//三连暗杠成顺
if(CheckAAAABBBBCCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11]))return CheckHU();
return false;
}
if(iSize2==14)
{
//三连暗杠成顺
if((m_MyPAIVec[iType][12]==(m_MyPAIVec[iType][13]))&&CheckAAAABBBBCCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11]))return true;
//三连暗杠成顺
if((m_MyPAIVec[iType][0]==(m_MyPAIVec[iType][1]))&&CheckAAAABBBBCCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13]))return true;
return false;
}
}
//吃到一个顺
if(iSize1==3)
{
if(iSize2==9)
{
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6])
{
return CheckHU();
}
}
return false;
}
if(iSize2==11)
{
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8]))
{
if(m_MyPAIVec[iType][9]==m_MyPAIVec[iType][10]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6])
{
return true;
}
}
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10]))
{
if(m_MyPAIVec[iType][0]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][8])
{
return true;
}
}
return false;
}
}
//吃到二个顺
if(iSize1==6)
{
if(iSize2==6)
{
//三连对
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4])
{
return CheckHU();
}
}
}
return false;
}
if(iSize2==8)
{
//三连对
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5]))
{
if(m_MyPAIVec[iType][6]==m_MyPAIVec[iType][7]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4])
{
return true;
}
}
}
//三连对
if(CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7]))
{
if(m_MyPAIVec[iType][0]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][6])
{
return true;
}
}
}
return false;
}
}
//吃到三个顺
if(iSize1==9)
{
if(iSize2==3)
{
//顺子
if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2])
{
if(m_ChiPAIVec[iType][6]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][7]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][8]==m_MyPAIVec[iType][2])
{
return CheckHU();
}
}
}
}
return false;
}
if(iSize2==5)
{
//顺子
if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2]))
{
if(m_MyPAIVec[iType][3]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2])
{
if(m_ChiPAIVec[iType][6]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][7]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][8]==m_MyPAIVec[iType][2])
{
return true;
}
}
}
}
//顺子
if(CheckABCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4]))
{
if(m_MyPAIVec[iType][0]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][6]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][7]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][8]==m_MyPAIVec[iType][4])
{
return true;
}
}
}
}
return false;
}
}
//吃到三连顺
if(iSize1==12)
{
if((m_ChiPAIVec[iType][0]==m_ChiPAIVec[iType][3])&&(m_ChiPAIVec[iType][3]==m_ChiPAIVec[iType][6])&&(m_ChiPAIVec[iType][6]==m_ChiPAIVec[iType][9]))
{
return CheckHU();
}
return false;
}
}
}
return false;
}
//检测是否一色四节高
bool CMJ::Check1S4JG_HU()
{
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++)
{
int iType = i;
if(m_GangPAIVec[iType].size()==16)
{
if((m_GangPAIVec[iType][0]==m_GangPAIVec[iType][4]-1)&&(m_GangPAIVec[iType][4]==m_GangPAIVec[iType][8]-1)&&(m_GangPAIVec[iType][8]==m_GangPAIVec[iType][12]-1))
{
return CheckHU();
}
}
}
return false;
}
//检测是否一色四步高
bool CMJ::Check1S4BG_HU()
{
/*//万
if(m_GangPAIVec[2].size()==16)
{
if((m_GangPAIVec[2][0]==m_GangPAIVec[2][4]-1)&&(m_GangPAIVec[2][4]==m_GangPAIVec[2][8]-1)&&(m_GangPAIVec[2][8]==m_GangPAIVec[2][12]-1))
{
return CheckHU();
}
}*/
return false;
}
//检测是否三杠
bool CMJ::Check3Gang_HU()
{
int iSize = 0;
for(UINT i = 0 ; i < 6 ; i++ )
{
iSize = m_GangPAIVec[i].size();
}
if(iSize == 12)
{
//将牌
return CheckHU();
}
return false;
}
//检测是否混幺九
bool CMJ::CheckHY9_HU()
{
return false;
}
//检测是否七对
bool CMJ::Check7D_HU()
{
int iDoubleNum = 0 ;
for(UINT i = 0 ; i < 6 ; i++ )
{
UINT iSize = m_MyPAIVec[i].size();
if(iSize%2 ==1||iSize==0)return false;//如果是奇数肯定不是对
for(UINT j = 0 ; j < iSize-1 ; j++)
{
if(m_MyPAIVec[i][j]==m_MyPAIVec[i][j+1])
{
iDoubleNum++;
j++;
}
}
}
if(iDoubleNum==7)return true;
return false;
}
//检测是否七星不靠
bool CMJ::Check7XBK_HU()
{
bool bIs7XBK[14] ;
for(UINT i = 0 ; i < 14 ; i++ )
{
bIs7XBK[i]=false;
}
//中发白
vector<int>::iterator Iter;
if(m_MyPAIVec[0].size()!=3)return false;
for(Iter = m_MyPAIVec[0].begin();Iter != m_MyPAIVec[0].end(); Iter++ )
{
if((*Iter)==1)
{
bIs7XBK[7]=true;
}
if((*Iter)==2)
{
bIs7XBK[8]=true;
}
if((*Iter)==3)
{
bIs7XBK[9]=true;
}
}
//东南西北风
if(m_MyPAIVec[1].size()!=4)return false;
for(Iter = m_MyPAIVec[1].begin();Iter != m_MyPAIVec[1].end(); Iter++ )
{
if((*Iter)==1)
{
bIs7XBK[10]=true;
}
if((*Iter)==2)
{
bIs7XBK[11]=true;
}
if((*Iter)==3)
{
bIs7XBK[12]=true;
}
if((*Iter)==4)
{
bIs7XBK[13]=true;
}
}
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++)
{
if(m_MyPAIVec[i].size()==3)
{
if(m_MyPAIVec[i][0]==1&&m_MyPAIVec[i][1]==4&&m_MyPAIVec[i][2]==7)
{
bIs7XBK[0]=true;
bIs7XBK[3]=true;
bIs7XBK[6]=true;
}
}
else if(m_MyPAIVec[2].size()==2)
{
if(m_MyPAIVec[i][0]==2&&m_MyPAIVec[i][1]==5)
{
bIs7XBK[1]=true;
bIs7XBK[4]=true;
}
else if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==6)
{
bIs7XBK[2]=true;
bIs7XBK[5]=true;
}
}
else
{
return false;
}
}
bool t_Result = true;
for(UINT i = 0 ; i < 14 ; i++ )
{
if(bIs7XBK[i]==false)t_Result=false;
}
if(t_Result)return true;
for(UINT i = 2 ; i <= 4 ; i++)
{
if(m_MyPAIVec[i].size()==3)
{
if(m_MyPAIVec[i][0]==2&&m_MyPAIVec[i][1]==5&&m_MyPAIVec[i][2]==8)
{
bIs7XBK[0]=true;
bIs7XBK[3]=true;
bIs7XBK[6]=true;
}
}
else if(m_MyPAIVec[2].size()==2)
{
if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==6)
{
bIs7XBK[1]=true;
bIs7XBK[4]=true;
}
else if(m_MyPAIVec[i][0]==4&&m_MyPAIVec[i][1]==7)
{
bIs7XBK[2]=true;
bIs7XBK[5]=true;
}
}
else
{
return false;
}
}
t_Result = true;
for(UINT i = 0 ; i < 14 ; i++ )
{
if(bIs7XBK[i]==false)t_Result=false;
}
if(t_Result)return true;
for(UINT i = 2 ; i <= 4 ; i++)
{
if(m_MyPAIVec[i].size()==3)
{
if(m_MyPAIVec[i][0]==3&&m_MyPAIVec[i][1]==6&&m_MyPAIVec[i][2]==9)
{
bIs7XBK[0]=true;
bIs7XBK[3]=true;
bIs7XBK[6]=true;
}
}
else if(m_MyPAIVec[2].size()==2)
{
if(m_MyPAIVec[i][0]==4&&m_MyPAIVec[i][1]==7)
{
bIs7XBK[1]=true;
bIs7XBK[4]=true;
}
else if(m_MyPAIVec[i][0]==5&&m_MyPAIVec[i][1]==8)
{
bIs7XBK[2]=true;
bIs7XBK[5]=true;
}
}
else
{
return false;
}
}
t_Result = true;
for(UINT i = 0 ; i < 14 ; i++ )
{
if(bIs7XBK[i]==false)t_Result=false;
}
if(t_Result)return true;
return false;
}
//检测是否全双刻
bool CMJ::CheckQSK_HU()
{
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++)
{
int iType = i;
if(m_GangPAIVec[iType].size()==16)
{
if(m_GangPAIVec[iType][0]==2&&m_GangPAIVec[iType][4]==4&&m_GangPAIVec[iType][8]==6&&m_GangPAIVec[iType][12]==8)
{
return CheckHU();
}
}
}
return false;
}
//清一色
bool CMJ::CheckQ1S_HU()
{
if(m_MyPAIVec[0].empty()==false)return false;
if(m_MyPAIVec[1].empty()==false)return false;
if(m_ChiPAIVec[0].empty()==false)return false;
if(m_ChiPAIVec[1].empty()==false)return false;
if(m_PengPAIVec[0].empty()==false)return false;
if(m_PengPAIVec[1].empty()==false)return false;
if(m_GangPAIVec[0].empty()==false)return false;
if(m_GangPAIVec[1].empty()==false)return false;
//清万
if(m_MyPAIVec[2].empty()==false)
{
if(m_MyPAIVec[3].empty()==false)return false;
if(m_MyPAIVec[4].empty()==false)return false;
if(m_ChiPAIVec[3].empty()==false)return false;
if(m_ChiPAIVec[4].empty()==false)return false;
if(m_PengPAIVec[3].empty()==false)return false;
if(m_PengPAIVec[4].empty()==false)return false;
if(m_GangPAIVec[3].empty()==false)return false;
if(m_GangPAIVec[4].empty()==false)return false;
return CheckHU();
}
//清条
if(m_MyPAIVec[3].empty()==false)
{
if(m_MyPAIVec[2].empty()==false)return false;
if(m_MyPAIVec[4].empty()==false)return false;
if(m_ChiPAIVec[2].empty()==false)return false;
if(m_ChiPAIVec[4].empty()==false)return false;
if(m_PengPAIVec[2].empty()==false)return false;
if(m_PengPAIVec[4].empty()==false)return false;
if(m_GangPAIVec[2].empty()==false)return false;
if(m_GangPAIVec[4].empty()==false)return false;
return CheckHU();
}
//清饼
if(m_MyPAIVec[4].empty()==false)
{
if(m_MyPAIVec[2].empty()==false)return false;
if(m_MyPAIVec[3].empty()==false)return false;
if(m_ChiPAIVec[2].empty()==false)return false;
if(m_ChiPAIVec[3].empty()==false)return false;
if(m_PengPAIVec[2].empty()==false)return false;
if(m_PengPAIVec[3].empty()==false)return false;
if(m_GangPAIVec[2].empty()==false)return false;
if(m_GangPAIVec[3].empty()==false)return false;
return CheckHU();
}
return false;
}
//检测是否一色三同顺
bool CMJ::Check1S3TS_HU()
{
//万条饼
for(UINT i = 2 ; i <= 4 ; i++ )
{
int iType = i;
//吃过的顺
int iSize1 = m_ChiPAIVec[iType].size();
//剩余牌墙中的顺
int iSize2 = m_MyPAIVec[iType].size();
if(iSize1 + iSize2 >= 9)
{
//无吃的顺
if(iSize1==0)
{
if(iSize2==9)
{
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8]))
{
return CheckHU();
}
return false;
}
if(iSize2==11)
{
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&CheckAAPai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10]))
{
return true;
}
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1]))
{
return true;
}
return false;
}
if(iSize2==12)
{
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&Check3Pai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11]))
{
return CheckHU();
}
//三连高压
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11])&&Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2]))
{
return CheckHU();
}
return false;
}
if(iSize2==14)
{
//三连顺(前)
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&Check5Pai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13]))
{
return true;
}
//三连顺(中)
if(CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])&&CheckAAABBBCCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])&&Check3Pai(m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13]))
{
return true;
}
//三连顺(中)
if(Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])&&CheckAAABBBCCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11])&&CheckAAPai(m_MyPAIVec[iType][12],m_MyPAIVec[iType][13]))
{
return true;
}
//三连顺(后)
if(CheckAAABBBCCCPai(m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10],m_MyPAIVec[iType][11],m_MyPAIVec[iType][12],m_MyPAIVec[iType][13])&&Check5Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4]))
{
return true;
}
return false;
}
}
//吃到一个顺
if(iSize1==3)
{
if(iSize2==6)
{
//三连对
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2])
{
return CheckHU();
}
}
}
if(iSize2==8)
{
//三连对(前)
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&CheckAAPai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
return true;
}
}
//三连对(后)
if(CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6])
{
return true;
}
}
}
if(iSize2==9)
{
//三连对(前)
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&Check3Pai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
return CheckHU();
}
}
//三连对(后)
if(CheckAABBCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][7])
{
return CheckHU();
}
}
}
if(iSize2==11)
{
//三连对(前)
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&Check5Pai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
return true;
}
}
//三连对(中)
if(CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1])&&CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])&&Check3Pai(m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6])
{
return true;
}
}
//三连对(中)
if(Check3Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])&&CheckAABBCCPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8])&&CheckAAPai(m_MyPAIVec[iType][9],m_MyPAIVec[iType][10]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][7])
{
return true;
}
}
//三连对(前)
if(CheckAABBCCPai(m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7],m_MyPAIVec[iType][8],m_MyPAIVec[iType][9],m_MyPAIVec[iType][10])&&Check5Pai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][7]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][9])
{
return true;
}
}
}
}
//吃到二个顺
if(iSize1==6)
{
if(iSize2==3)
{
//顺子
if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2])
{
return CheckHU();
}
}
}
}
if(iSize2==5)
{
//顺子(前)
if(CheckABCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2])&&CheckAAPai(m_MyPAIVec[iType][3],m_MyPAIVec[iType][4]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][2])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][2])
{
return true;
}
}
}
//顺子(后)
if(CheckABCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][4])
{
return true;
}
}
}
}
if(iSize2==6)
{
//三连对
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][5])
{
return CheckHU();
}
}
}
}
if(iSize2==8)
{
//三连对(前)
if(CheckAABBCCPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1],m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5])&&CheckAAPai(m_MyPAIVec[iType][6],m_MyPAIVec[iType][7]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][0]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][4])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][1]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][5])
{
return true;
}
}
}
//三连对(后)
if(CheckAABBCCPai(m_MyPAIVec[iType][2],m_MyPAIVec[iType][3],m_MyPAIVec[iType][4],m_MyPAIVec[iType][5],m_MyPAIVec[iType][6],m_MyPAIVec[iType][7])&&CheckAAPai(m_MyPAIVec[iType][0],m_MyPAIVec[iType][1]))
{
if(m_ChiPAIVec[iType][0]==m_MyPAIVec[iType][2]&&m_ChiPAIVec[iType][1]==m_MyPAIVec[iType][4]&&m_ChiPAIVec[iType][2]==m_MyPAIVec[iType][6])
{
if(m_ChiPAIVec[iType][3]==m_MyPAIVec[iType][3]&&m_ChiPAIVec[iType][4]==m_MyPAIVec[iType][5]&&m_ChiPAIVec[iType][5]==m_MyPAIVec[iType][7])
{
return true;
}
}
}
}
}
//吃到三个顺
if(iSize1==9)
{
if((m_ChiPAIVec[2][0]==m_ChiPAIVec[iType][3])&&(m_ChiPAIVec[iType][3]==m_ChiPAIVec[iType][6]))
{
return CheckHU();
}
}
}
}
return false;
}
//检测是否一色三节高
bool CMJ::Check1S3JG_HU()
{
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++)
{
int iType = i;
if(m_GangPAIVec[iType].size()==12)
{
if((m_GangPAIVec[iType][0]==m_GangPAIVec[iType][4]-1)&&(m_GangPAIVec[iType][4]==m_GangPAIVec[iType][8]-1))
{
return CheckHU();
}
}
}
return false;
}
//检测是否全大
bool CMJ::CheckQD_HU()
{
//剑牌,风牌
if(m_MyPAIVec[0].empty()==false)return false;
if(m_MyPAIVec[1].empty()==false)return false;
if(m_ChiPAIVec[0].empty()==false)return false;
if(m_ChiPAIVec[1].empty()==false)return false;
if(m_PengPAIVec[0].empty()==false)return false;
if(m_PengPAIVec[1].empty()==false)return false;
if(m_GangPAIVec[0].empty()==false)return false;
if(m_GangPAIVec[1].empty()==false)return false;
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++ )
{
if(m_MyPAIVec[i].empty()==false)
{
//剩余牌墙
int iSize = m_MyPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_MyPAIVec[i][j]<7)return false;
}
//吃
iSize = m_ChiPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_ChiPAIVec[i][j]<7)return false;
}
//碰
iSize = m_PengPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_PengPAIVec[i][j]<7)return false;
}
//杠
iSize = m_GangPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_GangPAIVec[i][j]<7)return false;
}
}
}
return CheckHU();
}
//检测是否全中
bool CMJ::CheckQZ_HU()
{
//剑牌,风牌
if(m_MyPAIVec[0].empty()==false)return false;
if(m_MyPAIVec[1].empty()==false)return false;
if(m_ChiPAIVec[0].empty()==false)return false;
if(m_ChiPAIVec[1].empty()==false)return false;
if(m_PengPAIVec[0].empty()==false)return false;
if(m_PengPAIVec[1].empty()==false)return false;
if(m_GangPAIVec[0].empty()==false)return false;
if(m_GangPAIVec[1].empty()==false)return false;
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++ )
{
if(m_MyPAIVec[i].empty()==false)
{
//剩余牌墙
int iSize = m_MyPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_MyPAIVec[i][j]<4)return false;
if(m_MyPAIVec[i][j]>6)return false;
}
//吃
iSize = m_ChiPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_ChiPAIVec[i][j]<4)return false;
if(m_ChiPAIVec[i][j]>6)return false;
}
//碰
iSize = m_PengPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_PengPAIVec[i][j]<4)return false;
if(m_PengPAIVec[i][j]>6)return false;
}
//杠
iSize = m_GangPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_GangPAIVec[i][j]<4)return false;
if(m_GangPAIVec[i][j]>6)return false;
}
}
}
return CheckHU();
}
//检测是否全小
bool CMJ::CheckQX_HU()
{
//剑牌,风牌
if(m_MyPAIVec[0].empty()==false)return false;
if(m_MyPAIVec[1].empty()==false)return false;
if(m_ChiPAIVec[0].empty()==false)return false;
if(m_ChiPAIVec[1].empty()==false)return false;
if(m_PengPAIVec[0].empty()==false)return false;
if(m_PengPAIVec[1].empty()==false)return false;
if(m_GangPAIVec[0].empty()==false)return false;
if(m_GangPAIVec[1].empty()==false)return false;
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++ )
{
if(m_MyPAIVec[i].empty()==false)
{
//剩余牌墙
int iSize = m_MyPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_MyPAIVec[i][j]>3)return false;
}
//吃
iSize = m_ChiPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_ChiPAIVec[i][j]>3)return false;
}
//碰
iSize = m_PengPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_PengPAIVec[i][j]>3)return false;
}
//杠
iSize = m_GangPAIVec[i].size();
for( UINT j = 0 ; j < iSize ; j++ )
{
if(m_GangPAIVec[i][j]>3)return false;
}
}
}
return CheckHU();
}
//检测是否青龙
bool CMJ::CheckQL_HU()
{
//花色
int iColorNum = 0;
//万,条,饼
for(UINT i = 2 ; i <= 4 ; i++ )
{
if(m_MyPAIVec[i].empty()==false)
{
iColorNum++;
if(m_MyPAIVec[i].size()==9)
{
for(UINT j = 0 ;j < 9 ;j++)
{
if(m_MyPAIVec[i][j] != j)return false;
}
}
}
}
if(iColorNum==1)return CheckHU();
return false;
}
//检测是否三色双龙会
bool CMJ::Check3S2LH_HU()
{
//五万为双龙
if(m_MyPAIVec[2].size()==2)
{
//双龙
if(m_MyPAIVec[2][0]==5&&m_MyPAIVec[2][1]==5)
{
//老少副
if(m_MyPAIVec[3].size()==6&&m_MyPAIVec[4].size()==6)
{
if(m_MyPAIVec[3][0]==1&&m_MyPAIVec[3][1]==2&&m_MyPAIVec[3][2]==3&&m_MyPAIVec[3][3]==7&&m_MyPAIVec[3][4]==8&&m_MyPAIVec[3][5]==9)
{
if(m_MyPAIVec[4][0]==1&&m_MyPAIVec[4][1]==2&&m_MyPAIVec[4][2]==3&&m_MyPAIVec[4][3]==7&&m_MyPAIVec[4][4]==8&&m_MyPAIVec[4][5]==9)
{
return true;
}
}
}
}
}
//五条为双龙
if(m_MyPAIVec[3].size()==2)
{
//双龙
if(m_MyPAIVec[3][0]==5&&m_MyPAIVec[3][1]==5)
{
//老少副
if(m_MyPAIVec[2].size()==6&&m_MyPAIVec[4].size()==6)
{
if(m_MyPAIVec[2][0]==1&&m_MyPAIVec[2][1]==2&&m_MyPAIVec[2][2]==3&&m_MyPAIVec[2][3]==7&&m_MyPAIVec[2][4]==8&&m_MyPAIVec[2][5]==9)
{
if(m_MyPAIVec[4][0]==1&&m_MyPAIVec[4][1]==2&&m_MyPAIVec[4][2]==3&&m_MyPAIVec[4][3]==7&&m_MyPAIVec[4][4]==8&&m_MyPAIVec[4][5]==9)
{
return true;
}
}
}
}
}
//五饼为双龙
if(m_MyPAIVec[4].size()==2)
{
//双龙
if(m_MyPAIVec[4][0]==5&&m_MyPAIVec[4][1]==5)
{
//老少副
if(m_MyPAIVec[2].size()==6&&m_MyPAIVec[3].size()==6)
{
if(m_MyPAIVec[2][0]==1&&m_MyPAIVec[2][1]==2&&m_MyPAIVec[2][2]==3&&m_MyPAIVec[2][3]==7&&m_MyPAIVec[2][4]==8&&m_MyPAIVec[2][5]==9)
{
if(m_MyPAIVec[3][0]==1&&m_MyPAIVec[3][1]==2&&m_MyPAIVec[3][2]==3&&m_MyPAIVec[3][3]==7&&m_MyPAIVec[3][4]==8&&m_MyPAIVec[3][5]==9)
{
return true;
}
}
}
}
}
return false;
}
//检测是否一色三步高
bool CMJ::Check1S3BG_HU()
{
return false;
}
//全带五
bool CMJ::CheckQD5_HU()
{
//剑牌,风牌
if(m_MyPAIVec[0].empty()==false)return false;
if(m_MyPAIVec[1].empty()==false)return false;
if(m_ChiPAIVec[0].empty()==false)return false;
if(m_ChiPAIVec[1].empty()==false)return false;
if(m_PengPAIVec[0].empty()==false)return false;
if(m_PengPAIVec[1].empty()==false)return false;
if(m_GangPAIVec[0].empty()==false)return false;
if(m_GangPAIVec[1].empty()==false)return false;
return false;
}
//三同刻
bool CMJ::Check3TK_HU()
{
/*if(m_GangPAIVec[2].size()==4)
{
//万,条,饼
for(UINT i = 3 ; i <= 4 ; i++ )
{
if(m_GangPAIVec[i].size()==4)
{
if(m_GangPAIVec[2][0]!=m_GangPAIVec[i][0])
{
return false;
}
}
}
}*/
return false;
}
//三暗刻
bool CMJ::Check3AK_HU()
{
return false;
}
//单钓将
bool CMJ::CheckDDJ_HU()
{
int count = 0;
for(UINT i = 0 ; i < 6 ; i++ )
{
count += m_MyPAIVec[i].size();
}
if(count==2)
{
if(m_MyPAIVec[m_LastPAI.m_Type].size()==2)
{
if(m_MyPAIVec[m_LastPAI.m_Type][0]==m_MyPAIVec[m_LastPAI.m_Type][1])return true;
}
}
return false;
}
//检测是否听十三幺
bool CMJ::Check13Y_TING()
{
bool i13YSize[13] ;
for(UINT i = 0 ; i < 13 ; i++ )
{
i13YSize[i]=false;
}
//中发白
vector<int>::iterator Iter;
for(Iter = m_MyPAIVec[0].begin();Iter != m_MyPAIVec[0].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[0]=true;
}
if((*Iter)==2)
{
i13YSize[1]=true;
}
if((*Iter)==3)
{
i13YSize[2]=true;
}
}
//东南西北风
for(Iter = m_MyPAIVec[1].begin();Iter != m_MyPAIVec[1].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[3]=true;
}
if((*Iter)==2)
{
i13YSize[4]=true;
}
if((*Iter)==3)
{
i13YSize[5]=true;
}
if((*Iter)==4)
{
i13YSize[6]=true;
}
}
//一九万
for(Iter = m_MyPAIVec[2].begin();Iter != m_MyPAIVec[2].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[7]=true;
}
if((*Iter)==9)
{
i13YSize[8]=true;
}
}
//一九条
for(Iter = m_MyPAIVec[3].begin();Iter != m_MyPAIVec[3].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[9]=true;
}
if((*Iter)==9)
{
i13YSize[10]=true;
}
}
//一九饼
for(Iter = m_MyPAIVec[4].begin();Iter != m_MyPAIVec[4].end(); Iter++ )
{
if((*Iter)==1)
{
i13YSize[11]=true;
}
if((*Iter)==9)
{
i13YSize[12]=true;
}
}
int icount = 0;
for(UINT i = 0 ; i < 13 ; i++ )
{
if(i13YSize[i]==true)
{
icount++;
}
}
if(icount >=12)return true;
return false;
}
//检测是否听四暗刻
bool CMJ::Check4AK_TING()
{
if(m_AKNum==4)return true;
return false;
}
//检测胡
bool CMJ::CheckHU()
{
bool t_Ok = false;
int iJiangNum = 0;
int iSize = m_MyPAIVec[0].size();
if(iSize>0)
{
//中发白
if(iSize==2)
{
if(!CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==3)
{
if(!CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2]))
{
return false;
}
}
else if(iSize==5)
{
if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])&&CheckAAAPai(m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4]))
{
iJiangNum++ ;
}
else
{
return false;
}
}
else if(iSize==8)
{
if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])&&CheckAAAPai(m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4],m_MyPAIVec[0][5])&&CheckAAPai(m_MyPAIVec[0][6],m_MyPAIVec[0][7]))
{
iJiangNum++ ;
}
else
{
return false;
}
}
else if(iSize==11)
{
if(CheckAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1])&&CheckAAAPai(m_MyPAIVec[0][2],m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7])&&CheckAAAPai(m_MyPAIVec[0][8],m_MyPAIVec[0][9],m_MyPAIVec[0][10]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4])&&CheckAAAPai(m_MyPAIVec[0][5],m_MyPAIVec[0][6],m_MyPAIVec[0][7])&&CheckAAAPai(m_MyPAIVec[0][8],m_MyPAIVec[0][9],m_MyPAIVec[0][10]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4],m_MyPAIVec[0][5])&&CheckAAPai(m_MyPAIVec[0][6],m_MyPAIVec[0][7])&&CheckAAAPai(m_MyPAIVec[0][8],m_MyPAIVec[0][9],m_MyPAIVec[0][10]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[0][0],m_MyPAIVec[0][1],m_MyPAIVec[0][2])&&CheckAAAPai(m_MyPAIVec[0][3],m_MyPAIVec[0][4],m_MyPAIVec[0][5])&&CheckAAAPai(m_MyPAIVec[0][6],m_MyPAIVec[0][7],m_MyPAIVec[0][8])&&CheckAAPai(m_MyPAIVec[0][9],m_MyPAIVec[0][10]))
{
iJiangNum++ ;
}
else
{
return false;
}
}
else
{
return false;
}
}
//东南西北
iSize = m_MyPAIVec[1].size();
if(iSize>0)
{
if(iSize==2)
{
if(!CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==3)
{
if(!CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2]))
{
return false;
}
}
else if(iSize==5)
{
if(CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])&&CheckAAAPai(m_MyPAIVec[1][2],m_MyPAIVec[1][3],m_MyPAIVec[1][4]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4]))
{
iJiangNum++ ;
}
else
{
return false;
}
}
else if(iSize==8)
{
if(CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])&&CheckAAAPai(m_MyPAIVec[1][2],m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4],m_MyPAIVec[1][5])&&CheckAAPai(m_MyPAIVec[1][6],m_MyPAIVec[1][7]))
{
iJiangNum++ ;
}
else
{
return false;
}
}
else if(iSize==11)
{
if(CheckAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1])&&CheckAAAPai(m_MyPAIVec[1][2],m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7])&&CheckAAAPai(m_MyPAIVec[1][8],m_MyPAIVec[1][9],m_MyPAIVec[1][10]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4])&&CheckAAAPai(m_MyPAIVec[1][5],m_MyPAIVec[1][6],m_MyPAIVec[1][7])&&CheckAAAPai(m_MyPAIVec[1][8],m_MyPAIVec[1][9],m_MyPAIVec[1][10]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4],m_MyPAIVec[1][5])&&CheckAAPai(m_MyPAIVec[1][6],m_MyPAIVec[1][7])&&CheckAAAPai(m_MyPAIVec[1][8],m_MyPAIVec[1][9],m_MyPAIVec[1][10]))
{
iJiangNum++ ;
}
else if(CheckAAAPai(m_MyPAIVec[1][0],m_MyPAIVec[1][1],m_MyPAIVec[1][2])&&CheckAAAPai(m_MyPAIVec[1][3],m_MyPAIVec[1][4],m_MyPAIVec[1][5])&&CheckAAAPai(m_MyPAIVec[1][6],m_MyPAIVec[1][7],m_MyPAIVec[1][8])&&CheckAAPai(m_MyPAIVec[1][9],m_MyPAIVec[1][10]))
{
iJiangNum++ ;
}
else
{
return false;
}
}
else
{
return false;
}
}
//万
iSize = m_MyPAIVec[2].size();
if(iSize>0)
{
if(iSize==2)
{
if(!CheckAAPai(m_MyPAIVec[2][0],m_MyPAIVec[2][1]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==3)
{
if(!CheckAAAPai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2]))
{
if(!CheckABCPai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2]))
{
return false;
}
}
}
else if(iSize==5)
{
if(!Check5Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==6)
{
if(!Check6Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5]))
{
return false;
}
}
else if(iSize==8)
{
if(!Check8Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==9)
{
if(!Check9Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8]))
{
return false;
}
}
else if(iSize==11)
{
if(!Check11Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8],m_MyPAIVec[2][9],m_MyPAIVec[2][10]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==12)
{
if(!Check12Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8],m_MyPAIVec[2][9],m_MyPAIVec[2][10],m_MyPAIVec[2][11]))
{
return false;
}
}
else if(iSize==14)
{
if(!Check14Pai(m_MyPAIVec[2][0],m_MyPAIVec[2][1],m_MyPAIVec[2][2],m_MyPAIVec[2][3],m_MyPAIVec[2][4],m_MyPAIVec[2][5],m_MyPAIVec[2][6],m_MyPAIVec[2][7],m_MyPAIVec[2][8],m_MyPAIVec[2][9],m_MyPAIVec[2][10],m_MyPAIVec[2][11],m_MyPAIVec[2][12],m_MyPAIVec[2][13]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else
{
return false;
}
}
//条
iSize = m_MyPAIVec[3].size();
if(iSize>0)
{
if(iSize==2)
{
if(!CheckAAPai(m_MyPAIVec[3][0],m_MyPAIVec[3][1]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==3)
{
if(!CheckAAAPai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2]))
{
if(!CheckABCPai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2]))
{
return false;
}
}
}
else if(iSize==5)
{
if(!Check5Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==6)
{
if(!Check6Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5]))
{
return false;
}
}
else if(iSize==8)
{
if(!Check8Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==9)
{
if(!Check9Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8]))
{
return false;
}
}
else if(iSize==11)
{
if(!Check11Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==12)
{
if(!Check12Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10],m_MyPAIVec[3][11]))
{
return false;
}
}
else if(iSize==14)
{
if(!Check14Pai(m_MyPAIVec[3][0],m_MyPAIVec[3][1],m_MyPAIVec[3][2],m_MyPAIVec[3][3],m_MyPAIVec[3][4],m_MyPAIVec[3][5],m_MyPAIVec[3][6],m_MyPAIVec[3][7],m_MyPAIVec[3][8],m_MyPAIVec[3][9],m_MyPAIVec[3][10],m_MyPAIVec[3][11],m_MyPAIVec[3][12],m_MyPAIVec[3][13]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else
{
return false;
}
}
//饼
iSize = m_MyPAIVec[4].size();
if(iSize>0)
{
if(iSize==2)
{
if(!CheckAAPai(m_MyPAIVec[4][0],m_MyPAIVec[4][1]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==3)
{
if(!CheckAAAPai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2]))
{
if(!CheckABCPai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2]))
{
return false;
}
}
}
else if(iSize==5)
{
if(!Check5Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==6)
{
if(!Check6Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5]))
{
return false;
}
}
else if(iSize==8)
{
if(!Check8Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==9)
{
if(!Check9Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8]))
{
return false;
}
}
else if(iSize==11)
{
if(!Check11Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8],m_MyPAIVec[4][9],m_MyPAIVec[4][10]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else if(iSize==12)
{
if(!Check12Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8],m_MyPAIVec[4][9],m_MyPAIVec[4][10],m_MyPAIVec[4][11]))
{
return false;
}
}
else if(iSize==14)
{
if(!Check14Pai(m_MyPAIVec[4][0],m_MyPAIVec[4][1],m_MyPAIVec[4][2],m_MyPAIVec[4][3],m_MyPAIVec[4][4],m_MyPAIVec[4][5],m_MyPAIVec[4][6],m_MyPAIVec[4][7],m_MyPAIVec[4][8],m_MyPAIVec[4][9],m_MyPAIVec[4][10],m_MyPAIVec[4][11],m_MyPAIVec[4][12],m_MyPAIVec[4][13]))
{
return false;
}
else
{
iJiangNum++ ;
}
}
else
{
return false;
}
}
if(iJiangNum==1)return true;
return false;
}
//检测听
bool CMJ::CheckTING()
{
//剑牌
for(UINT j = 0 ; j < 9 ;j++ )
{
//起牌
AddPai(0,j+1);
if(CheckAllPai(MJPAI_GETPAI))
{
int iPaiIndex = GetPaiIndex(0,j+1);
DelPai(iPaiIndex);
return true;
}
else
{
int iPaiIndex = GetPaiIndex(0,j+1);
DelPai(iPaiIndex);
}
}
//风牌
for(UINT j = 0 ; j < 9 ;j++ )
{
//起牌
AddPai(1,j+1);
if(CheckAllPai(MJPAI_GETPAI))
{
int iPaiIndex = GetPaiIndex(1,j+1);
DelPai(iPaiIndex);
return true;
}
else
{
int iPaiIndex = GetPaiIndex(1,j+1);
DelPai(iPaiIndex);
}
}
for(UINT i = 2 ; i < 5 ;i++ )
{
for(UINT j = 0 ; j < 9 ;j++ )
{
//起牌
AddPai(i,j+1);
if(CheckAllPai(MJPAI_GETPAI))
{
int iPaiIndex = GetPaiIndex(i,j+1);
DelPai(iPaiIndex);
return true;
}
else
{
int iPaiIndex = GetPaiIndex(i,j+1);
DelPai(iPaiIndex);
}
}
}
return false;
}
struct stPAIEx
{
stPAI m_NewPai; //起的新牌
int m_PaiNum; //剩余牌数
bool m_IsHZ; //是否黄庄
}
;
//麻将管理器
class CMJManage
{
vector<stPAI> m_MJVec; //麻将数据VEC
int m_HZPaiNum; //黄庄的牌数
public:
//构造函数
CMJManage();
//析构函数
~CMJManage();
//初始化牌
void InitPai(int p_HZPaiNum = 0);
//起牌
stPAIEx GetAPai();
private:
//洗牌
void XiPai();
}
;
CMJManage::CMJManage()
{
m_HZPaiNum = 0;
}
//析构函数
CMJManage::~CMJManage()
{
}
//初始化牌
void CMJManage::InitPai(int p_HZPaiNum)
{
m_HZPaiNum = p_HZPaiNum;
m_MJVec.clear();
//中发白
for(UINT i = 1 ; i <= 3 ; i++)
{
stPAI t_Pai;
t_Pai.m_Type = 0;
t_Pai.m_Value = i;
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
}
//东南西北
for(UINT i = 1 ; i <= 4 ; i++)
{
stPAI t_Pai;
t_Pai.m_Type = 1;
t_Pai.m_Value = i;
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
}
//万
for(UINT i = 1 ; i <= 9 ; i++)
{
stPAI t_Pai;
t_Pai.m_Type = 2;
t_Pai.m_Value = i;
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
}
//条
for(UINT i = 1 ; i <= 9 ; i++)
{
stPAI t_Pai;
t_Pai.m_Type = 3;
t_Pai.m_Value = i;
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
}
//饼
for(UINT i = 1 ; i <= 9 ; i++)
{
stPAI t_Pai;
t_Pai.m_Type = 4;
t_Pai.m_Value = i;
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
m_MJVec.push_back(t_Pai);
}
XiPai();
}
//洗牌
void CMJManage::XiPai()
{
srand( GetTickCount() );
random_shuffle(m_MJVec.begin(),m_MJVec.end());
}
//起牌
stPAIEx CMJManage::GetAPai()
{
//如果所有牌都起完了
stPAIEx t_Pai;
t_Pai.m_NewPai.m_Type = m_MJVec.back().m_Type;
t_Pai.m_NewPai.m_Value = m_MJVec.back().m_Value;
t_Pai.m_PaiNum = m_MJVec.size()-1;
if(t_Pai.m_PaiNum ==m_HZPaiNum)
{
t_Pai.m_IsHZ = true;
}
else
{
t_Pai.m_IsHZ = false;
}
//扔去一个
m_MJVec.pop_back();
return t_Pai;
}
#include <windows.h>
#include <iostream>
using namespace std;
int main()
{
//其它三个玩家
CMJ t_OtherPlayer[3];
//我
CMJ t_MyPlayer;
//洗牌器
CMJManage t_MJManage;
//分数
int t_Score = 0;
GameStart:
//初始化及洗牌
t_MJManage.InitPai();//初始化
t_MyPlayer.CleanUp();
for(UINT i = 0 ; i < 3; i++ )
{
t_OtherPlayer[i].CleanUp();
}
cout<<"洗牌完成"<<endl;
cout<<"起牌:========================================================"<<endl;
for(UINT i = 0 ; i < 13 ; i++)
{
stPAIEx t_Pai = t_MJManage.GetAPai();
t_MyPlayer.AddPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value);
for(UINT j = 0 ; j < 3; j++ )
{
stPAIEx t_Pai2 = t_MJManage.GetAPai();
t_OtherPlayer[j].AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
}
}
t_MyPlayer.Init();
for(UINT j = 0 ; j < 3; j++ )
{
t_OtherPlayer[j].Init();
}
//打牌循环
bool t_Finish = false;
bool t_Ting = false;
while(t_Finish == false)
{
t_MyPlayer.PrintAllPai();
cout<<endl;
cout<<"起牌:========================================================"<<endl;
stPAIEx t_Pai = t_MJManage.GetAPai();
//刷新我方牌墙
t_MyPlayer.PrintPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value);
cout<<endl;
//如果没有听头
if(t_Ting == false)
{
cout<<"要还是打?Y/N";
char t_Result;
cin>>t_Result;
if(t_Result =='Y'||t_Result=='y')
{
//起牌
t_MyPlayer.AddPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value);
//起牌后胡牌判断
t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI);
if(t_Finish)
{
printf("胡啦!!!:%s-%d",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue);
::_sleep(1000);
}
else
{
if(t_Pai.m_NewPai.m_Type == -1)//如果起牌数已达到上限
{
cout<<endl;
cout<<"黄庄了!!!!!!!!!!!!!"<<endl;
break;
}
t_MyPlayer.PrintAllPai();
cout<<endl;
OUTPai:
cout<<"请打牌(输入牌序号)";
int PaiIndex;
cin>>PaiIndex;
if(t_MyPlayer.DelPai(PaiIndex)==false)
{
cout<<"没有此牌"<<endl;
goto OUTPai;
}
//==============================牌面刷新================================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
//======================包听========================================================
if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI))
{
char t_BTing;
cout<<"要包听吗?:(Y/N)";
cin>>t_BTing;
if(t_BTing=='y'||t_BTing=='Y')
{
t_Ting = true;
}
}
//==============================================================================
}
}
else
{
//======================包听========================================================
if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI))
{
char t_BTing;
cout<<"要包听吗?:(Y/N)";
cin>>t_BTing;
if(t_BTing=='y'||t_BTing=='Y')
{
t_Ting = true;
}
}
//==============================================================================
}
}
else
{
t_MyPlayer.AddPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value);
//起牌
int iPaiIndex = t_MyPlayer.GetPaiIndex(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value);
if(iPaiIndex>=0)
{
//起牌后胡牌判断
t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI);
if(t_Finish)
{
cout<<endl;
printf("胡啦!!!:%s-合计%d番",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue);
t_Score += t_MyPlayer.GetInfo()->m_GoodValue;
::_sleep(1000);
break;
}
else
{
t_MyPlayer.DelPai(iPaiIndex);
cout<<"打牌";
t_MyPlayer.PrintPai(t_Pai.m_NewPai.m_Type,t_Pai.m_NewPai.m_Value);
cout<<endl;
::_sleep(1000);
}
}
else
{
cout<<"程序出错!"<<endl;
}
}
cout<<endl;
//其它玩家起牌出牌
for(UINT j = 0 ; j < 3; j++ )
{
stPAIEx t_Pai2 = t_MJManage.GetAPai();
if(j==0)
{
cout<<"南家起牌出牌:";
t_MyPlayer.PrintPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
cout<<endl;
::_sleep(1000);
}
if(j==1)
{
cout<<"西家起牌出牌:";
t_MyPlayer.PrintPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
cout<<endl;
::_sleep(1000);
}
if(j==2)
{
cout<<"北家起牌出牌:";
t_MyPlayer.PrintPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
cout<<endl;
::_sleep(1000);
}
char t_Result;
if(t_Ting == false)
{
if(t_Pai2.m_IsHZ)//如果起牌数已达到上限
{
cout<<endl;
cout<<"黄庄了!!!!!!!!!!!!!"<<endl;
t_Finish = true;
break;
}
bool t_Check = false;
//检查吃牌
if(t_MyPlayer.CheckChiPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value))
{
if(t_Check==false)
{
cout<<"请选择:";
}
cout<<"(吃)";
t_Check = true;
}
//检查碰牌
if(t_MyPlayer.CheckPengPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value))
{
if(t_Check==false)
{
cout<<"请选择:";
}
cout<<"(碰)";
t_Check = true;
}
//检查杠牌
if(t_MyPlayer.CheckGangPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value))
{
if(t_Check==false)
{
cout<<"请选择:";
}
cout<<"(杠)";
t_Check = true;
}
//起牌
t_MyPlayer.AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
//起牌后胡牌判断
if(t_MyPlayer.CheckAllPai(MJPAI_GETPAI))
{
if(t_Check==false)
{
cout<<"请选择:";
}
cout<<"(胡)";
t_Check = true;
}
int iPaiIndex = t_MyPlayer.GetPaiIndex(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
t_MyPlayer.DelPai(iPaiIndex);
//如果查到
if(t_Check)
{
cout<<endl;
cin>>t_Result;
}
else
{
//返回循环
continue;
}
}
else
{
t_Result = '4';
}
//吃牌
if(t_Result =='1')
{
t_MyPlayer.PrintChiChosePai();
int index = 0;
//如果吃牌组合大于
if(t_MyPlayer.GetChiChoseNum()>1)
{
cout<<"请输入组合号:"<<endl;
cin>>index;
}
t_MyPlayer.DoChiPai(index,t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
//==============================================================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
OUTPai2:
cout<<"请打牌(输入牌序号)";
int PaiIndex;
cin>>PaiIndex;
if(t_MyPlayer.DelPai(PaiIndex)==false)
{
cout<<"没有此牌"<<endl;
goto OUTPai2;
}
//=================================牌面刷新=============================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
//======================包听========================================================
if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI))
{
char t_BTing;
cout<<"要包听吗?:(Y/N)";
cin>>t_BTing;
if(t_BTing=='y'||t_BTing=='Y')
{
t_Ting = true;
}
}
//==============================================================================
//该我下家
j = -1;
}
else if(t_Result =='2')//碰牌
{
t_MyPlayer.PrintPengChosePai();
t_MyPlayer.DoPengPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
//==============================================================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
OUTPai3:
cout<<"请打牌(输入牌序号)";
int PaiIndex;
cin>>PaiIndex;
if(t_MyPlayer.DelPai(PaiIndex)==false)
{
cout<<"没有此牌"<<endl;
goto OUTPai3;
}
//==========================牌面刷新====================================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
//======================包听========================================================
if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI))
{
char t_BTing;
cout<<"要包听吗?:(Y/N)";
cin>>t_BTing;
if(t_BTing=='y'||t_BTing=='Y')
{
t_Ting = true;
}
}
//==============================================================================
j = -1;
}
else if(t_Result =='3')//杠牌
{
t_MyPlayer.PrintGangChosePai();
t_MyPlayer.DoGangPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
cout<<"起杠底牌"<<endl;
t_MyPlayer.AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
//==============================================================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
stPAIEx t_Pai2 = t_MJManage.GetAPai();
//起牌后胡牌判断
t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI);
if(t_Finish)
{
cout<<"杠底花吗?(Y/N)"<<endl;
char t_Result;
cin>>t_Result;
if(t_Result =='Y'||t_Result=='y')
{
cout<<endl;
printf("胡啦!!!:%s-%d",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue);
t_Score += t_MyPlayer.GetInfo()->m_GoodValue;
::_sleep(1000);
break;
}
}
if(t_Pai2.m_IsHZ)//如果起牌数已达到上限
{
cout<<"黄庄了!!!!!!!!!!!!!"<<endl;
t_Finish = true;
break;
}
OUTPai4:
cout<<"请打牌(输入牌序号)";
int PaiIndex;
cin>>PaiIndex;
if(t_MyPlayer.DelPai(PaiIndex)==false)
{
cout<<"没有此牌"<<endl;
goto OUTPai4;
}
//===========================牌面刷新===================================================
cout<<"牌面刷新============================"<<endl;
t_MyPlayer.PrintAllPai();
cout<<endl;
//==============================================================================
//======================包听========================================================
if(t_MyPlayer.CheckAllPai(MJPAI_PUTPAI))
{
char t_BTing;
cout<<"要包听吗?:(Y/N)";
cin>>t_BTing;
if(t_BTing=='y'||t_BTing=='Y')
{
t_Ting = true;
}
}
//==============================================================================
//该我下家
j = -1;
}
else if(t_Result =='4')//胡牌
{
//起牌
t_MyPlayer.AddPai(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
//起牌后胡牌判断
t_Finish = t_MyPlayer.CheckAllPai(MJPAI_GETPAI);
if(t_Finish)
{
printf("胡啦!!!:%s-合计%d番",t_MyPlayer.GetInfo()->m_GoodName,t_MyPlayer.GetInfo()->m_GoodValue);
t_Score += t_MyPlayer.GetInfo()->m_GoodValue;
::_sleep(1000);
break;
}
else
{
if(t_Pai2.m_IsHZ)//如果起牌数已达到上限
{
cout<<"黄庄了!!!!!!!!!!!!!"<<endl;
t_Finish = true;
break;
}
//起牌
int iPaiIndex = t_MyPlayer.GetPaiIndex(t_Pai2.m_NewPai.m_Type,t_Pai2.m_NewPai.m_Value);
cout<<endl;
t_MyPlayer.DelPai(iPaiIndex);
}
}
}
}
cout<<"我的分数:"<<t_Score<<endl;
::_sleep(3000);
goto GameStart;//重新开始一局
return 0;
}
斗地主
斗地主(人机智力堪忧)
#include <bits/stdc++.h>
#include <windows.h>
#define PLAYERCOUNT 3
#define CARDSCOUNT 54
#define CURRENTPLAYER 0
#define VALUECOUNT 17
#define ERROR -1
using namespace std;
int scnt=0;
const char toFigure[]="34567890JQKA 2YZ";
enum COLOR{ //花色显示ASCII: 3~6
eHEART=3,//红桃
eDIAMOND,//方片
eCLUB, //草花
eSPADE //黑桃
};
class Card;
class CardsType;
class CardGroup;
class Player;
class Landlords;
class LastCards;
bool makeChoice(string tip);
bool cmp(Card* a,Card* b);
class Card{
public:
char figure;
COLOR color;
int value;
Card(char _figure,COLOR _color){
figure=_figure;
color=_color;
value=calValue();
}
int calValue(){
for(int i=0;toFigure[i];i++){
if(toFigure[i]==figure){
return i;
}
}
return ERROR;
}
void print(){
assert(value!=ERROR);
if(figure=='Z'){
cout<<"Z";
}else if(figure=='Y'){
cout<<"Y";
}else{
cout<<figure<<(char)color;
}
cout<<' ';
}
};
class CardsType{
public:
//为了规范查找对应牌的方法
//统一为3个参数cnt1、isContinuous、cnt2
int typeId;
string typeStr;
int cnt1,cnt2;
bool isContinuous;
CardsType(){
typeId=ERROR;
}
bool operator ==(const CardsType& other)const{
return this->typeId==other.typeId;
}
void init(char* _typeStr,int _typeId,int _cnt1,bool _isContinuous,int _cnt2){
cnt1=_cnt1;
isContinuous=_isContinuous;
cnt2=_cnt2;
typeStr=_typeStr;
typeId=_typeId;
}
};
class CardGroup{
public:
vector<Card*> cards;
CardsType type;
void calType(){
int i,n=cards.size();
//init(typeStr,typeId,cnt1,isContinuous,cnt2)
if(n==0){
type.init("不出",14,0,0,0);
return;
}
if(n==2&&cards[0]->value==15&&cards[1]->value==14){
type.init("王炸",0,0,0,0);
return;
}
//统计同点数牌有多少张
int cntFlag[VALUECOUNT]={0};
for(i=0;i<n;i++){
cntFlag[cards[i]->value]++;
}
//统计点数最多和最少的牌
int maxCnt=0,minCnt=4;
for(i=0;i<VALUECOUNT;i++){
if(maxCnt<cntFlag[i]){
maxCnt=cntFlag[i];
}
if(cntFlag[i]&&minCnt>cntFlag[i]){
minCnt=cntFlag[i];
}
}
if(n==4&&maxCnt==4){
type.init("炸弹",1,4,0,0);
return;
}
if(n==1){
type.init("单牌",2,1,0,0);
return;
}
if(n==2&&maxCnt==2){
type.init("对子",3,2,0,0);
return;
}
if(n==3&&maxCnt==3){
type.init("三张 ",4,3,0,0);
return;
}
if(n==4&&maxCnt==3){
type.init("三带一",5,3,0,1);
return;
}
if(n==5&&maxCnt==3&&minCnt==2){
type.init("三带一对",6,3,0,2);
return;
}
if(n==6&&maxCnt==4){
type.init("四带二",7,4,0,1);
return;
}
if(n==8&&maxCnt==4&&minCnt==2){
type.init("四带二",8,4,0,2);
return;
}
if(n>=5&&maxCnt==1&&cards[0]->value==cards[n-1]->value+n-1){
type.init("顺子",9,1,1,0);
return;
}
if(n>=6&&maxCnt==2&&minCnt==2&&cards[0]->value==cards[n-1]->value+n/2-1){
type.init("连对",10,2,1,0);
return;
}
int fjCnt;//统计连续且大于3三张的牌
for(i=0;i<VALUECOUNT &&cntFlag[i]<3;i++);
for(fjCnt=0;i<VALUECOUNT &&cntFlag[i]>=3;i++,fjCnt++);
if(fjCnt>1){
if(n==fjCnt*3)
type.init("飞机",11,3,1,0);
else if(n==fjCnt*4)
type.init("飞机",12,3,1,1);
else if(n==fjCnt*5&&minCnt==2)
type.init("飞机",13,3,1,2);
}
}
void init(string inputStr, vector<Card*> &cardsHolded){
this->cards.clear();
//不出
if(inputStr=="N"){
this->calType();
return;
}
int i,j;
//输入合法性判断
for(i=0;i<inputStr.size();i++){
bool find=false;
for(j=0;toFigure[j];j++){
if(inputStr[i]==toFigure[j]){
find=true;
break;
}
}
if(find==false){
//输入字符不在toFigure中
return;
}
}
//查找手中有没有这些牌
int visitFlag[20]={0};
for(i=0;i<inputStr.size();i++){
Card *find=NULL;
for(j=0;j<cardsHolded.size();j++){
if(!visitFlag[j]&&cardsHolded[j]->figure==inputStr[i]){
visitFlag[j]=1;
find=cardsHolded[j];
break;
}
}
if(find){
this->cards.push_back(find);
}else{
cout<<inputStr[i];
cout<<"没有找到\t";
this->cards.clear();
return;
}
}//end for(i=0;i<inputStr.size();i++)
this->arrange();
}
void init(vector<Card*> newCards){
this->cards=newCards;
this->arrange();
}
bool isCanBeat(CardGroup &cardGroup){
if(cardGroup.type.typeStr=="王炸"){
return false;
}else if(this->type.typeStr=="王炸"){
return true;
}else if(cardGroup.type==this->type &&this->type.typeStr=="炸弹"){
return value()>cardGroup.value();
}else if(cardGroup.type.typeStr=="炸弹"){
return false;
}else if(this->type.typeStr=="炸弹"){
return true;
}else if(cardGroup.type==this->type &&this->cards.size()==cardGroup.cards.size()){
return this->value()>cardGroup.value();
}else{
return false;
}
}
int value(){
//计算牌组权值
int i;
if(type.typeStr=="三带一"||type.typeStr=="三带一对"||type.typeStr=="飞机"){
for(i=2;i<cards.size();i++){
if(cards[i]->value==cards[i-2]->value){
return cards[i]->value;
}
}
}
if(type.typeStr=="四带二"){
for(i=3;i<cards.size();i++){
if(cards[i]->value==cards[i-3]->value){
return cards[i]->value;
}
}
}
return cards[0]->value;
}
void arrange(){
//整理:排序、计算类型
sort(this->cards.begin(),this->cards.end(),cmp);
this->calType();
}
};
class LastCards{
static LastCards *lastCards;
public:
Player *player;
CardGroup cardGroup;
static LastCards* inst(){//单例模式
if(lastCards==NULL){
lastCards=new LastCards();
}
return lastCards;
}
vector<Card*> findCanBeatFrom(vector<Card*> &cardsHolded){
//查找能打得过的牌
int i,j,k,n=cardsHolded.size(),m=cardGroup.cards.size();
string typeStr=cardGroup.type.typeStr;
vector<Card*> ret;
if(typeStr=="王炸"||n<m){
//打不过,返回空数组
return ret;
}
int value=cardGroup.value();
//统计各点牌出现的次数
int cntFlag[VALUECOUNT]={0};
for(i=0;i<n;i++){
cntFlag[cardsHolded[i]->value]++;
}
int continuousCount=1;
if(cardGroup.type.isContinuous){
continuousCount=m/(cardGroup.type.cnt1+cardGroup.type.cnt2);
}
bool findFirstFigure;
//cout<<"continuousCount="<<continuousCount<<endl;
for(i=value+1;i<VALUECOUNT;i++){
findFirstFigure=true;
for(j=0;j<continuousCount;j++){
if(cntFlag[i-j]<cardGroup.type.cnt1){
findFirstFigure=false;
break;
}
}
if(findFirstFigure){
ret.clear();
int firstFigure=i;
//cout<<"查找"<<cardGroup.type.cnt1<<"个"<<firstFigure+3<<endl;
for(k=0,j=0;k<cardsHolded.size() &&j<continuousCount;k++){
if(cardsHolded[k]->value==firstFigure-j){
for(int kk=0;j>=0&&kk<cardGroup.type.cnt1;kk++){
ret.push_back(cardsHolded[k+kk]);
}
j++;
}
}
if(cardGroup.type.cnt2>0){
int SecondFigures[5];
int SecondCount=continuousCount;
if(cardGroup.type.typeStr=="四带二")
SecondCount=2;
bool findSecondFigure=true;
for(j=0,k=-1;j<SecondCount &&findSecondFigure;j++){
findSecondFigure=false;
for(k++;k<VALUECOUNT;k++){
SecondFigures[j]=k;
if(cntFlag[k]>=cardGroup.type.cnt2 &&cntFlag[k]<cardGroup.type.cnt1){
findSecondFigure=true;
break;
}
}
}
if(findSecondFigure){
//cout<<"查找SecondFigure "<<cardGroup.type.cnt2<<"个"<<SecondFigures[0]+3<<endl;
//cout<<"SecondCount= "<<SecondCount<<endl;
//for(i=0;i<SecondCount;i++)cout<<"SecondFigures["<<i<<"]="<<SecondFigures[i]<<endl;
for(i=0;i<SecondCount;i++){
for(j=0;j<cardsHolded.size();){
if(cardsHolded[j]->value==SecondFigures[i]){
for(k=0;k<cardGroup.type.cnt2;k++){
//cout<<"添加"<<cardsHolded[j]->value+3<<endl;
ret.push_back(cardsHolded[j+k]);
}
do{
j++;
}while(j<cardsHolded.size()&&cardsHolded[j]->value==SecondFigures[i]);
}else{
j++;
}
}
}
return ret;
}//if(findSecondFigure)
}//end if(cardGroup.type.cnt2>0)
else{
return ret;
}
}//end if(findFirstFigure)
}//end for(i=value+1;i<VALUECOUNT;i++)
ret.clear();
//没牌打得过时查找有没有炸弹
if(typeStr!="炸弹"){
for(i=cardsHolded.size()-1;i>=3;i--){
if(cardsHolded[i]->value==cardsHolded[i-3]->value){
for(j=0;j<4;j++){
ret.push_back(cardsHolded[i-j]);
}
break;
}
}
}
return ret;
}//end vector<Card*> findCanBeatFrom()
};
LastCards* LastCards::lastCards = NULL;
class Player{
public:
string name;
vector<Card*> cards;
void arrange(){
sort(cards.begin(),cards.end(),cmp);
}
void print(){
cout<<this->name<<":\t";
for(int i=0;i<cards.size();i++){
cards[i]->print();
}
cout<<"["<<cards.size()<<"]\n";
}
vector<Card*> tip(){
//提示功能,使自己最小一张连最长
CardGroup ret;
string temp;
int j,k,m=cards.size();
for(j=0;j<m;j++){
temp="";
for(k=j;k<m;k++){
temp+=cards[k]->figure;
}
ret.init(temp,cards);
if(ret.type.typeId!=ERROR){
return ret.cards;
}
}
ret.cards.clear();
return ret.cards;
}
void chupai(CardGroup &cardGroup){
//出牌
cout<<this->name<<":\t";
cout<<cardGroup.type.typeStr<<' ';
for(int i=0;i<cardGroup.cards.size();i++){
cardGroup.cards[i]->print();
this->cards.erase(find(this->cards.begin(),this->cards.end(),cardGroup.cards[i]));
}
cout<<"\t["<<this->cards.size()<<"]\n";
if(cardGroup.type.typeStr!="不出"){
//记录到 LastCards 中
LastCards::inst()->player=this;
LastCards::inst()->cardGroup.init(cardGroup.cards);
}
}
};
class Landlords{
Player *player[PLAYERCOUNT];
bool finished,youWin,landlordWin;
int landlordIndex;
Card *cards[CARDSCOUNT];
public:
Landlords(){
int i,j,k;
for(i=0;i<PLAYERCOUNT;i++){
this->player[i]=new Player();
}
//54张牌初始化
for(k=i=0;i<14;i++){
if(toFigure[i]==' '){
continue;
}
for(COLOR color=eHEART;color<=eSPADE;color=(COLOR)(color+1)){
this->cards[k++]=new Card(toFigure[i],color);
}
}
this->cards[k++]=new Card('Y',eSPADE);
this->cards[k]=new Card('Z',eHEART);
}
~Landlords(){
for(int i=0;i<PLAYERCOUNT;i++){
delete this->player[i];
}
for(int i=0;i<CARDSCOUNT;i++){
delete this->cards[i];
}
}
void init(){
player[CURRENTPLAYER]->name="Bice";
player[1]->name="玩家2";
player[2]->name="玩家3";
finished=false;
youWin=false;
landlordWin=false;
//抢地主
landlordIndex=ERROR;
while(landlordIndex==ERROR){
srand((int)time(0));
shuffle();
landlordIndex=chooseLandlord();
}
cout<<player[landlordIndex]->name<<"\t成为地主\n\n";
this->add3Cards();
LastCards::inst()->player=player[landlordIndex];
}
void startGame(){
string inputSrt;
CardGroup inputCards;
for(int iTurns=landlordIndex;!finished;iTurns++){
if(iTurns>=PLAYERCOUNT){
iTurns=0;
}
if(iTurns==CURRENTPLAYER){
cout<<endl;
player[iTurns]->print();
cout<<"输入提示:Z=大王 Y=小王 0=10 N=不要 输入可无序 例如:JKQ0A9\n请出牌:\t";
do{
cin>>inputSrt;
inputCards.init(inputSrt,player[iTurns]->cards);
}while(check(&inputCards)==false);
}else{
if(player[iTurns]==LastCards::inst()->player){
//若是上次出牌的是自己,启用提示功能
inputCards.init(player[iTurns]->tip());
}else{
//查找能打得过上家的牌
inputCards.init(LastCards::inst()->findCanBeatFrom(player[iTurns]->cards));
}
}
player[iTurns]->chupai(inputCards);//出牌
if(player[iTurns]->cards.size()==0){
//玩家手中没牌了,游戏结束
finished=true;
landlordWin=iTurns==landlordIndex;
if(landlordWin){
youWin=landlordIndex==CURRENTPLAYER;
}else{
youWin=landlordIndex!=CURRENTPLAYER;
}
}
}
cout<<"\n_________________________ "<<(youWin?"You Win!":"You Lose!")<<" _________________________\n\n";
}
void add3Cards(){
cout<<"地主3张牌:\t";
for(int i=PLAYERCOUNT*17;i<CARDSCOUNT;i++){
this->cards[i]->print();
player[landlordIndex]->cards.push_back(cards[i]);
}
cout<<endl;
player[landlordIndex]->arrange();
}
int chooseLandlord(){
cout<<"\n_________________________ 抢地主 _________________________\n\n";
int first=-1,last,cnt=0,i,j=rand()%PLAYERCOUNT;
bool decision;
for(i=0;i<PLAYERCOUNT;i++,j==2?j=0:j++){
if(j==CURRENTPLAYER){
decision=makeChoice("是否抢地主?(Y=抢/N=不抢):");
}else{
decision=rand()%2;
}
if(decision){
cnt++;
last=j;
if(first==-1){
first=j;
}
cout<<this->player[j]->name<<"\t抢地主\n";
}else{
cout<<this->player[j]->name<<"\t没有抢\n";
}
}
if(cnt==0){
cout<<"没人抢,重新发牌\n";
return ERROR;
}
if(cnt==1){
//第一轮只有一人抢地主
return first;
}
else{
//最后一次争抢
if(first==CURRENTPLAYER){
decision=makeChoice("是否抢地主?(Y=抢/N=不抢):");
}else{
decision=rand()%2;
}
if(decision){
cout<<this->player[first]->name<<"\t抢地主\n";
return first;
}else{
cout<<this->player[first]->name<<"\t没有抢\n";
return last;
}
}
}
void shuffle(){
int i,j,k;
//洗牌
for(i=0;i<CARDSCOUNT;i++){
swap(this->cards[i],this->cards[rand()%CARDSCOUNT]);
}
//分牌
for(k=i=0;i<PLAYERCOUNT;i++){
this->player[i]->cards.clear();
for(j=0;j<17;j++){
this->player[i]->cards.push_back(this->cards[k++]);
}
this->player[i]->arrange();//整理
this->player[i]->print();
}
}
bool check(CardGroup *cardGroup){
if(cardGroup->type.typeId==ERROR){
cout<<"出牌错误,重新输入\n";
return false;
}else if(cardGroup->type.typeStr=="不出"){
return true;
}else if(LastCards::inst()->player!=player[CURRENTPLAYER]&&!cardGroup->isCanBeat(LastCards::inst()->cardGroup)){
cout<<"打不过,重新输入\n";
return false;
}else{
return true;
}
}
};
int main(){
Landlords *landlords=new Landlords();
do{
landlords->init();//发牌、抢地主
landlords->startGame();//游戏开始
}while(makeChoice("\n是否继续游戏?(Y=继续/N=结束): "));
delete landlords;
return 0;
}
bool makeChoice(string tip){
cout<<tip;
string input;
cin>>input;
return input=="Y"||input=="y";
}
bool cmp(Card* a,Card* b){
if(a->value==b->value){
return a->color>b->color;
}else{
return a->value>b->value;
}
}
海战棋
#include <cstdio>
#include <ctime> //rand()%(x) 0~x-1 int
#include <windows.h> //停顿:Sleep();
#include <cstdlib> //清屏:system("cls");
#include <conio.h> //getch(); char
#include <iostream>
#include <cstring> //未知 :□; 打中 :◎; 未打中:○ 船:★;
using namespace std;
int rest[3][5],r1,r2; //rest[1]:玩家的海域; rest[2]:电脑的海域 r1:玩家还剩船数; r2:电脑还剩船数
int b1[12][12],b2[12][12]; //0:空海; 1:船只; 2:打中; 3:边界 4:未打中 5:沉船
int c1[12][12],c2[12][12]; //c1:玩家海域的颜色 c2:电脑海域颜色
int fx[8][2]={{0,1},{1,0},{0,-1},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
int now[2][2]; //now[左/右][x/y] 光标
string a1[12][12],a2[12][12];
int fd [500][2],head=0,tail=0;
void color(int a)//颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void gotoxy(int x,int y)//位置函数(整个界面)(行为x 列为y)
{
COORD pos;
pos.X=2*(y);
pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void gotoxy1(int x,int y)//位置函数(左边棋盘)(行为x 列为y)
{
COORD pos;
pos.X=2*(y+5);
pos.Y=x+1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void gotoxy2(int x,int y)//位置函数(右边棋盘)(行为x 列为y)
{
COORD pos;
pos.X=2*(y+18);
pos.Y=x+1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void check2(int x,int y){
int k=0,kx,ky,f=1;
for (int i=0; i<=3; i++){
if (b2[x+fx[i][0]][y+fx[i][1]]==2) k=i;
if (b2[x+fx[i][0]][y+fx[i][1]]==1) f=0;
}
for (kx=x,ky=y; b2[kx][ky]==2; kx+=fx[k][0],ky+=fx[k][1]);
if (b2[kx][ky]==1) f=0;
if (f){
int w=0;
color(12);
for (kx=x,ky=y; b2[kx][ky]==2; kx+=fx[k][0],ky+=fx[k][1]){
gotoxy2(kx,ky);
a2[kx][ky]="※";
c2[kx][ky]=12;
cout <<"※";
w++;
}
for (kx=x+fx[(k+2)%4][0],ky=y+fx[(k+2)%4][1]; b2[kx][ky]==2; kx+=fx[(k+2)%4][0],ky+=fx[(k+2)%4][1]){
gotoxy2(kx,ky);
a2[kx][ky]="※";
c2[kx][ky]=12;
cout <<"※";
w++;
}
if (w>0){
rest[2][w]--;
r2--;
if (rest[2][w]>0) color(14); else color(11);
gotoxy2(5-w,16); printf("*%d",rest[2][w]);
}
}
}
int move1(){
if (r1*r2==0) return(1);
color(5); gotoxy1(14,4); printf("电脑开炮");
color(13); gotoxy2(14,4); printf("玩家开炮");
int kx=now[1][0],ky=now[1][1],lastx,lasty,f=1;
char ch;
gotoxy2(kx,ky); color(11); if (a2[kx][ky]!=" ")cout <<a2[kx][ky]; else cout <<"▂"; gotoxy2(kx,ky);
while (f){
ch=getch();
if (ch=='1' || ch=='a'){kx=now[1][0]+fx[2][0]; ky=now[1][1]+fx[2][1];}
if (ch=='2' || ch=='s'){kx=now[1][0]+fx[1][0]; ky=now[1][1]+fx[1][1];}
if (ch=='3' || ch=='d'){kx=now[1][0]+fx[0][0]; ky=now[1][1]+fx[0][1];}
if (ch=='5' || ch=='w'){kx=now[1][0]+fx[3][0]; ky=now[1][1]+fx[3][1];}
if (kx>0 && kx<=10 && ky>0 && ky<=10){
gotoxy2(now[1][0],now[1][1]); color(c2[now[1][0]][now[1][1]]); cout <<a2[now[1][0]][now[1][1]];
gotoxy2(kx,ky); color(11); if (a2[kx][ky]!=" ")cout <<a2[kx][ky]; else cout <<"▂"; gotoxy2(kx,ky);
now[1][0]=kx; now[1][1]=ky;
}
if ((ch=='0' || ch==' ')&& b2[kx][ky]<=1){
if (b2[kx][ky]==1){b2[kx][ky]=2; a2[kx][ky]="◎"; c2[kx][ky]=4;}
if (b2[kx][ky]==0){b2[kx][ky]=4; a2[kx][ky]=" ";}
gotoxy2(kx,ky); color(c2[kx][ky]); cout <<a2[kx][ky];
f=0;
check2(kx,ky);
color (7); gotoxy2(12,4); cout <<"("; color(6); cout <<ky; color(7); cout <<","; color(2); cout <<kx;color(7); cout<<") ";
if (b2[kx][ky]==2) move1();
}
if (ch=='8' || ch=='g'){
for (int i=1; i<=10; i++) for (int j=1; j<=10; j++)
if (b2[i][j]==1){
gotoxy2(i,j);
color(10);
printf("Ω");
}
char ccc=getch();
for (; ccc!='8' && ccc!='g'; ccc=getch());
for (int i=1; i<=10; i++)for (int j=1; j<=10; j++){
gotoxy2(i,j);
color(c2[i][j]);
cout <<a2[i][j];
}
gotoxy2(kx,ky); color(11); if (a2[kx][ky]!=" ")cout <<a2[kx][ky]; else cout <<"▂"; gotoxy2(kx,ky);
}
if (ch=='4' || ch=='q') return(0);
}
return(1);
}
int ok(int x,int y){
int nnn=0;
if (b1[x][y]==2 || b1[x][y]==4 || b1[x][y]==5) return(0);
for (int i=0; i<=7; i++){
if (b1[x+fx[i][0]][y+fx[i][1]]==2) nnn++;
if (b1[x+fx[i][0]][y+fx[i][1]]==5) return(0);
}
if (nnn>1) return(0);
return(1);
}
void check1(int x,int y) {
int k=0,kx,ky,f=1;
for (int i=0; i<=3; i++){
if (b1[x+fx[i][0]][y+fx[i][1]]==2) k=i;
if (b1[x+fx[i][0]][y+fx[i][1]]==1) f=0;
}
for (kx=x,ky=y; b1[kx][ky]==2; kx+=fx[k][0],ky+=fx[k][1]);
if (b1[kx][ky]==1) f=0;
if (f){
int w=0;
color(12);
for (kx=x,ky=y; b1[kx][ky]==2; kx+=fx[k][0],ky+=fx[k][1]){
gotoxy1(kx,ky);
b1[kx][ky]=5;
a1[kx][ky]="※";
c1[kx][ky]=12;
cout <<"※";
w++;
}
for (kx=x+fx[(k+2)%4][0],ky=y+fx[(k+2)%4][1]; b1[kx][ky]==2; kx+=fx[(k+2)%4][0],ky+=fx[(k+2)%4][1]){
gotoxy1(kx,ky);
b1[kx][ky]=5;
a1[kx][ky]="※";
c1[kx][ky]=12;
cout <<"※";
w++;
}
if (w>0){
rest[1][w]--;
r1--;
if (rest[1][w]>0) color(14); else color(11);
gotoxy1(5-w,-5);
printf("%d*",rest[1][w]);
}
}
}
void move2(){
if (r1*r2==0) return;
color(13); gotoxy1(14,4); printf("电脑开炮");
color(5); gotoxy2(14,4); printf("玩家开炮");
Sleep(750);
int kx=0,ky=0,over=0;
while (tail>head){
head++;
kx=fd[head][0]; ky=fd[head][1];
if (ok(kx,ky)){over=1; break;}
}
while (!over){
kx=rand()%(10)+1;
ky=rand()%(10)+1;
if (ok(kx,ky)) over=1;
}
if (b1[kx][ky]==1){b1[kx][ky]=2; a1[kx][ky]="◎"; c1[kx][ky]=4;}
if (b1[kx][ky]==0){b1[kx][ky]=4; a1[kx][ky]=" ";}
gotoxy1(kx,ky); color(11); printf("⊕"); Sleep(600);
gotoxy1(kx,ky); color(c1[kx][ky]); cout <<a1[kx][ky];
color (7); gotoxy1(12,4); cout <<"("; color(6); cout <<ky; color(7); cout <<","; color(2); cout <<kx;color(7); cout<<") ";
check1(kx,ky);
if ((b1[kx][ky]==2 || b1[kx][ky]==5)&& r1*r2>0){
int i=rand()%(4);
for (int ii=0; ii<=3; ii++){
int px=kx+fx[i][0],py=ky+fx[i][1];
if (px>0 && px<=10 && py>0 && py<=10){
tail++;
fd[tail][0]=px;
fd[tail][1]=py;
}
i=(i+1)%4;
}
move2();
}
}
void put(){
int k=4;
while (k--){
for (int i=1; i<=4-k; i++){
int f1=0,f2=0;
int dir1,dir2;
dir1=rand()%(2);
dir2=rand()%(2);
while (!f1){
f1=1;
int lx=rand()%(10)+1;
int ly=rand()%(10)+1;
for(int nx=lx-1; nx<=lx+fx[dir1][0]*k+1; nx++)
for (int ny=ly-1; ny<=ly+fx[dir1][1]*k+1; ny++)
if(b1[nx][ny]==1){f1=0; break;}
for (int nx=lx; nx<=lx+fx[dir1][0]*k; nx++)
for (int ny=ly; ny<=ly+fx[dir1][1]*k; ny++)
if (b1[nx][ny]==3){f1=0; break;}
if (f1){
for (int jx=lx,jy=ly; jx<=lx+fx[dir1][0]*k && jy<=ly+fx[dir1][1]*k; jx+=fx[dir1][0],jy+=fx[dir1][1]){
b1[jx][jy]=1;
c1[jx][jy]=15;
color(15);
gotoxy1(jx,jy); printf("□");
}
}
}
while (!f2){
f2=1;
int lx=rand()%(10)+1;
int ly=rand()%(10)+1;
for(int nx=lx-1; nx<=lx+fx[dir2][0]*k+1; nx++)
for (int ny=ly-1; ny<=ly+fx[dir2][1]*k+1; ny++)
if(b2[nx][ny]==1){f2=0; break;}
for (int nx=lx; nx<=lx+fx[dir2][0]*k; nx++)
for (int ny=ly; ny<=ly+fx[dir2][1]*k; ny++)
if (b2[nx][ny]==3){f2=0; break;}
if (f2){
for (int jx=lx,jy=ly; jx<=lx+fx[dir2][0]*k && jy<=ly+fx[dir2][1]*k; jx+=fx[dir2][0],jy+=fx[dir2][1])
b2[jx][jy]=1;
}
}
int a=1;
}
}
}
void reset(){
system("cls");
color(15);gotoxy(18,10); printf("按 0 重排战船; 按任意键开始与电脑对战");
color(9);
gotoxy(0,9 ); printf("玩家海域");
gotoxy(0,22); printf("电脑海域");
for (int i=1; i<=4; i++) rest[1][i]=rest[2][i]=5-i;
for (int i=1; i<=10; i++){
b1[0][i]=b1[i][0]=b2[0][i]=b2[i][0]=3;
b1[11][i]=b1[i][11]=b2[11][i]=b2[i][11]=3;
}
color(8);
for (int i=1; i<=10; i++)for (int j=1; j<=10; j++) c1[i][j]=c2[i][j]=8;
for (int i=1; i<=10; i++)for (int j=1; j<=10; j++){
b1[i][j]=b2[i][j]=0;
a1[i][j]="□"; gotoxy1(i,j); cout <<a1[i][j];
a2[i][j]="□"; gotoxy2(i,j); cout <<a2[i][j];
}
color(14);
gotoxy1(1,-5); printf("%d*□□□□",rest[1][4]);
gotoxy1(2,-5); printf("%d*□□□ ",rest[1][3]);
gotoxy1(3,-5); printf("%d*□□ ",rest[1][2]);
gotoxy1(4,-5); printf("%d*□ ",rest[1][1]);
gotoxy2(4,12); printf(" □*%d",rest[2][1]);
gotoxy2(3,12); printf(" □□*%d",rest[2][2]);
gotoxy2(2,12); printf(" □□□*%d",rest[2][3]);
gotoxy2(1,12); printf("□□□□*%d",rest[2][4]);
color(2); for (int i=1; i<=10; i++){gotoxy1(i,11); cout <<i; gotoxy2(i,11); cout <<i;}
color(6); for (int i=1; i<=10; i++){gotoxy1(11,i); cout <<i; gotoxy2(11,i); cout <<i;}
color(7); gotoxy1(12,4); printf("( , )"); gotoxy2(12,4); printf("( , )");
put();
now[0][0]=now[0][1]=now[1][0]=now[1][1]=1;
r1=r2=10;
char res=getch(); if (res=='0') reset();
}
int main(){
int gameover=1;
while (gameover){
srand(time(NULL));
reset();
gotoxy(18,10); printf(" ");
int haha=0;
while (r1*r2){
if (!move1()){haha=1; break;} //玩家(haha==1说明中途退出)
move2(); //电脑
}
gotoxy(18,0);
if (haha) printf("怎么中途退出了...\n\n");
else if (r1==0) printf("很遗憾,你输了...\n\n");
else if (r2==0) printf("恭喜你,你赢了!!!\n\n");
printf("按1退出; 按其它键继续\n>>");
if (getch()=='1') gameover=0;
}
}
#字棋
include<cstdio>
#include<windows.h>
#include<ctime>
int a[4][4],i,j,xc,yc,mouse=0,ok=0,record[2][9],foot=9,winner,first=0,who=0;
void Place(const int x, const int y)
{ COORD PlaceCursorHere;PlaceCursorHere.X = y;PlaceCursorHere.Y = x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), PlaceCursorHere);
return;
}
void color(int x)
{SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);}
int search(int x0,int y0,int x,int y)
{
mouse=GetAsyncKeyState(VK_LBUTTON);
POINT pt; HWND h=GetForegroundWindow(); GetCursorPos(&pt); ScreenToClient(h,&pt);
if(pt.x>=x0&&pt.y>=y0&&pt.x<=x&&pt.y<=y)
{
if(mouse!=0) {Sleep(100); return 2;} else return 1;
}
else return 0;
}
bool check(int x)
{
int b=0,c=0,d=0,e=0;
for(i=1;i<=3;i++)
{
for(j=1;j<=3;j++) {b+=a[i][j]; c+=a[j][i];} d+=a[i][i]; e+=a[i][4-i];
if(b==x||c==x||d==x||e==x) return true; b=0; c=0;
}
return false;
}
void pcmove()
{
int x=10,b=0,c=0,d=0,e=0; xc=0; yc=0;
while(x>0)
{
for(i=1;i<=3;i++)
{
b=0; c=0; for(j=1;j<=3;j++) {b+=a[i][j]; c+=a[j][i];} d+=a[i][i]; e+=a[i][4-i];
if(b==x) {for(j=1;j<=3;j++) if(a[i][j]==0) {xc=i; yc=j; return;}} if(c==x) {for(j=1;j<=3;j++) if(a[j][i]==0) {xc=j; yc=i; return;}}
if(d==x) {for(j=1;j<=3;j++) if(a[j][j]==0) {xc=yc=j; return;}} if(e==x) {for(j=1;j<=3;j++) if(a[j][4-j]==0) {xc=j; yc=4-j; return;}}
} x-=8;
}
if(a[2][2]==0) {xc=yc=2; return;} x=2;
while(x>0) {for(i=1;i<=3;i+=x) for(j=1;j<=3;j+=x) if(a[i][j]==0) {xc=i; yc=j; return;} x--;}
}
void show()
{
int x=foot;
for(i=1;i<=3;i++) for(j=1;j<=3;j++) if(a[i][j]!=0) {if(a[i][j]==1) color(15); else color(11); Place(2*i-1,4*j-2); printf("●");}
color(15); Place(7,0);
if(who==0) {if(foot%2==1) printf("1号"); else printf("2号");} else printf("电脑");
if(who==0||first==1) x--;
printf("下子:(%d,%d)",record[0][8-x],record[1][8-x]);
}
void button(int x)
{
if(x<3)
{
Place(x*3,15); printf("┌┄┄┐");
Place(x*3+1,17); if(x==0){if(ok==0) printf("开始"); else printf("悔棋");} if(x==1) printf("重来"); if(x==2) printf("退出");
Place(x*3+2,15); printf("└┄┄┘");
}
if(x>2&&x<6)
{
Place(10,(x-4)*7); printf("┌┄┐");
Place(11,(x-4)*7+2); if(x==4) printf("是"); else printf("否");
Place(12,(x-4)*7); printf("└┄┘");
}
if(x>5&&x<8)
{
Place(10,(x-6)*12); printf("┌┄┄┄┄┐");
Place(11,(x-6)*12+2); if(x==6) printf("人机对战"); else printf("人人对战");
Place(12,(x-6)*12); printf("└┄┄┄┄┘");
}
if(x>7)
{
Place(10,(x-8)*12); printf("┌┄┄┄┄┐");
Place(11,(x-8)*12+2); if(x==8) printf(" 我先手 "); else printf("电脑先手");
Place(12,(x-8)*12); printf("└┄┄┄┄┘");
}
}
void menu(int x)
{
int k,l;
if(x==0)
{
if(ok==0) {ok=1; return;}
else if(9-foot>1)
{
foot+=2; for(i=9-foot;i<=11-foot;i++) {a[record[0][i]][record[1][i]]=0; record[0][i]=record[1][i]=0;}
for(i=1;i<=3;i++) for(j=1;j<=3;j++) {Place(2*i-1,4*j-2); printf(" ");} show();
}
}
if(x>0&&x<3)
{
for(l=10;l<=12;l++) for(j=1;j<=22;j++) {Place(l,j); printf(" ");}
Place(9,1); printf("你想"); if(x==1) printf("重来吗?"); if(x==2) printf("退出吗?");
button(4); button(5);
while(1)
{
mouse=GetAsyncKeyState(VK_LBUTTON);
for(i=0;i<=1;i++)
{
k=search(7+i*55,165,40+i*55,200);
if(k!=2) {if(k==1) color(15); else color(7); button(i+4);}
else
{for(l=9;l<=12;l++) for(j=1;j<=12;j++) {Place(l,j); printf(" ");}
if(i==0) {if(x==1) ok=2; else exit(0);} return;
}
}
Sleep(50);
}
}
if(x>2&&x<5) {if(x==3) {who=1; return;} else {who=0; return;}}
if(x>4) {if(x==5) {first=0; return;} else {first=1; return;}}
}
void click()
{
for(i=0;i<=2;i++)
{ mouse=GetAsyncKeyState(VK_LBUTTON);
int k=search(125,i*50+5,175,i*50+40);
if(k!=2) {if(k==1) color(15); else color(7); button(i); color(7);}
else{menu(i); return;}
}
Sleep(50);
}
void humove()
{
while(1)
{
for(i=1;i<=3;i++) for(j=1;j<=3;j++) if(search(7+(i-1)*32,7+(j-1)*32,7+i*32,7+j*32)==2&&a[j][i]==0)
{if(who==0&&foot%2!=1) a[j][i]=5; else a[j][i]=1; record[0][9-foot]=j; record[1][9-foot]=i; return;} click(); if(ok==2) return;
}
}
void replace()
{
int k,l,p,q;
Place(7,0); for(i=1;i<=15;i++) printf(" "); for(i=1;i<=3;i++) for(j=1;j<=3;j++) {Place(2*i-1,4*j-2); printf(" "); a[i][j]=0;}
for(i=0;i<2;i++) for(j=0;j<9;j++) record[i][j]=0; foot=9; winner=0; first=0; who=0; ok=1; button(6); button(7);
while(1)
{
for(i=0;i<=1;i++)
{
mouse=GetAsyncKeyState(VK_LBUTTON); k=search(i*80+7,165,i*80+103,200); q=search(125,105,175,140);
if(k!=2) {if(k==1) color(15); else color(7); button(i+6); color(7);}
else
{
menu(i+3); for(l=10;l<=12;l++) for(j=1;j<=22;j++) {Place(l,j); printf(" ");}
if(who==1)
{
button(7); button(8);
while(1)
{
for(j=0;j<=1;j++)
{
mouse=GetAsyncKeyState(VK_LBUTTON); k=search(j*80+7,165,j*80+103,200); q=search(125,105,175,140);
if(k!=2) {if(k==1) color(15); else color(7); button(j+8); color(7);}
else{menu(j+5); for(l=10;l<=12;l++) for(p=1;p<=22;p++) {Place(l,p); printf(" ");} return;}
if(q!=2) {if(q==1) color(15); else color(7); button(2); color(7);} else menu(2);
} Sleep(50);
}
}
return;
}
if(q!=2) {if(q==1) color(15); else color(7); button(2); color(7);} else menu(2);
}
Sleep(50);
}
}
int main()
{
printf("┌─┬─┬─┐\n\n├─┼─┼─┤\n\n├─┼─┼─┤\n\n└─┴─┴─┘\n\n");
for(i=0;i<3;i++) button(i);
while(ok==0) click();
while(1)
{
replace();
while(foot>0&&ok!=0)
{
if(first!=1) {humove(); show(); if(check(3)) {winner=1; ok=0; break;} foot--; if(foot<=0||ok==0||ok==2) break;}
if(who==0&&check(15)) {winner=2;ok=0;break;}
if(who!=0) {pcmove(); record[0][9-foot]=xc; record[1][9-foot]=yc; a[xc][yc]=5; show(); if(check(15)) {winner=2;ok=0;} foot--; first=0;}
}
if(ok==2) {ok=1; continue;} Place(7,0); for(i=1;i<=15;i++) printf(" ");
Place(7,4); color(15); if(winner==0) printf("平局!");
if(who!=0) {if(winner==1) printf("你赢了!"); if(winner==2) printf("你输了!"); Sleep(50);}
else {if(winner==1) printf("1号赢了!"); if(winner==2) printf("2号赢了!"); Sleep(50);}
ok=0; while(ok==0) click();
}
}
事件三子棋
//转自:https://www.luogu.com.cn/paste/c1fvaio2
//作者:https://www.luogu.com.cn/user/217233
/*
制作者:SqrtSecond
版本号:v1.1.9
v1.1.9更新内容:
压行
v1.1.8更新内容:
修复了一些bug
v1.1.7更新内容:
增加了设置页面和两个功能
v1.1.6更新内容:
1.增强了人机程序
2.修复了一些bug
3.更新了单人游戏的操作系统
v1.1.5更新内容:
1.修改了棋盘边框系统,使64位电脑与32位电脑兼容
2.修改了键盘的控制系统
3.增加新功能:按Enter或空格键可快速跳过剧情。
4.更新了5次神秘事件之后的buff特效
5.新增了人机系统和单人游戏
可以转载,但请务必注明出处!
*/
#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int Speed=3,pianhao=1;
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME)&0x8000)?1:0)
#define color(COLOR) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),COLOR);
void putss(string a)
{
while(KEY_DOWN('\r')||KEY_DOWN(' '));
bool flag=true;int len=a.length();
for(int i=0;i<len-1;++i)
{
if(KEY_DOWN('\r')||KEY_DOWN(' '))flag=false;
putchar(a[i]);
if(flag)Sleep(Speed*10);
}
putchar(a[len-1]);
while(KEY_DOWN('\r')||KEY_DOWN(' '));
}
int win1,win2,AIturn;bool flag,p;
int game(int turn);
void hint();
int Setting()
{
system("cls");
puts("速度调节——s\n");
puts("键盘偏好——k\n");
puts("退出——e\n");
while(true)
{
if(KEY_DOWN('E')){while(KEY_DOWN('E'));return 0;}
if(KEY_DOWN('S'))
{
while(true)
{
system("cls");
color(112);for(int i=1;i<=6-Speed;++i)puts(" ");
color(7);for(int i=6-Speed+1;i<=5;++i)puts("");
printf("当前速度:%d\n",6-Speed);
puts("按方向上下键进行设置,E键退出\n");
while(true)
{
if(KEY_DOWN(VK_UP))
{
while(KEY_DOWN(VK_UP));
Speed++;
if(Speed==6)Speed=5;
break;
}
if(KEY_DOWN(VK_DOWN))
{
while(KEY_DOWN(VK_DOWN));
Speed--;
if(Speed==0)Speed=1;
break;
}
if(KEY_DOWN('E')){while(KEY_DOWN('E'));return 1;}
}
}
}
if(KEY_DOWN('K'))
{
while(true)
{
system("cls");
puts("按左右键进行设置,E键退出\n");
puts(pianhao==0?"当前偏好:wsad控制方向,空格键放置棋子":"当前偏好:方向键控制方向,Enter键放置棋子");
puts("\n注:本设置仅在单人游戏时有效");
while(true)
{
if(KEY_DOWN(VK_LEFT)||KEY_DOWN(VK_RIGHT))
{
pianhao=1-pianhao;
while(KEY_DOWN(VK_LEFT)||KEY_DOWN(VK_RIGHT));
break;
}
if(KEY_DOWN('E')){while(KEY_DOWN('E'));return 1;}
}
}
}
}
}
int home()
{
system("cls");
puts("主菜单\n");
puts("开始游戏 —— s\n");
puts("游戏说明 —— h\n");
puts("设置 —— p\n");
puts("退出 —— e\n");
puts("制作人:SqrtSecond\n");
puts("(P.S.按Enter或空格键可快速跳过剧情)");
while(true)
{
if(KEY_DOWN('E'))
{
while(true)
{
system("cls");
puts("确定要离开吗?\n");
puts("是 —— y\n");
puts("否 —— n\n");
while(true)
{
if(KEY_DOWN('N'))return 1;
if(KEY_DOWN('Y'))
{
system("cls");
puts("qwq");
return 0;
}
}
}
}
if(KEY_DOWN('H'))
{
hint();
return 1;
}
if(KEY_DOWN('P'))
{
while(Setting());
return 1;
}
if(KEY_DOWN('S'))
{
system("cls");
putss("那么,开始游戏吧!\n");system("pause");
system("cls");
puts("你要玩什么模式?\n");
puts("单人,人机先走——a\n");
puts("单人,人机后走——b\n");
puts("双人——c\n");
win1=win2=0;p=0;
while(true)
{
if(KEY_DOWN('A'))AIturn=1,p=1;
if(KEY_DOWN('B'))AIturn=-1,p=1;
if(KEY_DOWN('C'))AIturn=0,p=1;
if(p)
{
putss("好的,开始吧!");system("pause");
int r=1;
while(true)
{r=-game(r);if(r==0)break;}
return 1;
}
}
}
}
}
void hint()
{
system("cls");
putss("首先,这是一个双人游戏。\n");system("pause");
putss("基本规则和标准的三子棋相同。\n");system("pause");
putss("双方需要每人轮流下一手。\n");system("pause");
putss("每人下完一手后,都会触发一个随机的事件。\n");system("pause");
putss("有可能会消除场上已有的棋子……\n");system("pause");
putss("但也有可能帮你多下一手棋!\n");system("pause");
putss("这正是这个游戏的好玩之处。\n");system("pause");
putss("也很靠运气。\n");system("pause");
putss("另外……\n");system("pause");
putss("别触发5次神秘事件,否则后果自负……\n");system("pause");
putss("准备好了就开始吧!\n");system("pause");
return;
}
int mp[5][5],X,Y;
void putchess()
{
system("cls");
printf("比分:%d:%d\n\n",win1,win2);
puts("◤ ◥");
for(int i=1;i<=3;++i)
{
printf(" ");
for(int j=1;j<=3;++j)
{
if(X==i&&Y==j)color(112);
printf(mp[i][j]==1?"×":mp[i][j]==-1?"○":" ");
if(X==i&&Y==j)color(7);
}
puts(" ");
}
puts("◣ ◢");
}
int l;
int win()
{
l=0;
for(int i=1;i<=3;++i)
{
if(mp[i][1]+mp[i][2]+mp[i][3]==3)l=1;
if(mp[i][1]+mp[i][2]+mp[i][3]==-3)l=-1;
if(mp[1][i]+mp[2][i]+mp[3][i]==3)l=1;
if(mp[1][i]+mp[2][i]+mp[3][i]==-3)l=-1;
}
if(mp[1][1]+mp[2][2]+mp[3][3]==3)l=1;
if(mp[1][1]+mp[2][2]+mp[3][3]==-3)l=-1;
if(mp[1][3]+mp[2][2]+mp[3][1]==3)l=1;
if(mp[1][3]+mp[2][2]+mp[3][1]==-3)l=-1;
if(l==0)
{
l=2;
for(int i=1;i<=3;++i)for(int j=1;j<=3;++j)if(mp[i][j]==0)l=0;
}
if(l==2)
{
putchess();
printf("恭喜双方打成平局!\n");system("pause");
return true;
}
if(l!=0)
{
putchess();
printf("%s获得了胜利!\n",l==1?(AIturn==1?"人机":AIturn==-1?"玩家":"玩家1"):(AIturn==-1?"人机":AIturn==1?"玩家":"玩家2"));system("pause");
l==1?win1++:win2++;
return true;
}
return false;
}
int xx,yy,h,boom,rx,ry,rz;
void effect(int playyer)
{
rx=rand()%12+1;putchess();
puts("事件发生!\n");system("pause");
if(rx<=4)
{
ry=rand()%3+1;rz=rand()%3+1;mp[ry][rz]=0;
putchess();printf("消除格子(%d,%d)!\n",ry,rz);
}
else if(rx==5)
{
ry=rand()%3+1;mp[ry][1]=mp[ry][2]=mp[ry][3]=0;
putchess();printf("消除第%d行!\n",ry);
}
else if(rx==6)
{
ry=rand()%3+1;mp[1][ry]=mp[2][ry]=mp[3][ry]=0;
putchess();printf("消除第%d列!\n",ry);
}
else if(rx==7)
{
mp[1][1]=mp[2][2]=mp[3][3]=0;
putchess();printf("消除左上到右下的对角线!\n");
}
else if(rx==8)
{
mp[1][3]=mp[2][2]=mp[3][1]=0;
putchess();printf("消除右上到左下的对角线!\n");
}
else if(rx==9)
{
do
{
ry=rand()%3+1;
rz=rand()%3+1;
}while(mp[ry][rz]);
mp[ry][rz]=h;
putchess();printf("帮你下一手(%d,%d)!\n",ry,rz);
}
else if(rx==10)
{
ry=rand()%2;
if(ry)
{
for(int i=1;i<=3;++i)for(int j=1;j<=3;++j)mp[i][j]=-mp[i][j];
putchess();printf("反转局势!!!");h=-h;
}
else puts("无事发生!(偷笑)");
}
else
{
boom++;
if(boom==5)
{
system("color 4F");printf("神秘事件×%d!!!\n",boom);
boom=0;system("pause");
putss("5次神秘事件凑齐了……\n");Sleep(Speed*1000);
putss("Windows的数据遭受了毁灭性的打击!!!\n");Sleep(Speed*1000);
for(int i=1;i<=50;++i){system("color 2C");system("color AE");system("color 7A");system("color E4");system("color 58");system("color B6");}
system("color 4F");
for(int i=1;i<=3;++i)for(int j=1;j<=3;++j)mp[i][j]=0;
putchess();
MessageBox(NULL,"您的Windows可能出现了点问题。","Windows系统自动提示",MB_OK+48);
MessageBox(NULL,"Windows正在尝试修复您的系统中……","Windows系统自动提示",MB_OK+64);
MessageBox(NULL,"系统内部存储器已被破坏!","Windows系统自动提示",MB_OK+48);
putss("数据已被破坏……请重新开始……\n");Sleep(Speed*1000);h=-1;
}
else printf("神秘事件×%d!!!\n",boom);
}
system("pause");
if(rx>=11)system("color 07");
}
/*
x=1,2,3,4(1/3):随机消除一个格子
x=5(1/12):随机消除一行
x=6(1/12):随机消除一列
x=7(1/12):消除左上到右下的对角线
x=8(1/12):消除左上到右下的对角线
x=9(1/12):帮自己下一手
x=10(1/12):反转局势或无事发生
x=11,12(1/6):神秘事件
*/
bool player1(){return (((h==1&&AIturn!=-1)||(h==-1&&AIturn==-1))&&pianhao==1)||(((h==1&&AIturn!=1)||(h==-1&&AIturn==1))&&pianhao==0);}
void puthint(){printf("现在轮到%s(执%s)了,你要下在哪一行,哪一列?%s\n",h==1?(AIturn==1?"人机":AIturn==-1?"玩家":"玩家1"):(AIturn==-1?"人机":AIturn==1?"玩家":"玩家2"),h==1?"×":"○",player1()?"(用wsad控制方向,空格键放置棋子)":"(用方向键控制方向,Enter键放置棋子)");}
int AI(int t)
{
for(int i=1;i<=3;++i)
{
if(mp[i][1]+mp[i][2]+mp[i][3]==2*t)return mp[i][1]==0?i*3+1:mp[i][2]==0?i*3+2:i*3+3;
if(mp[1][i]+mp[2][i]+mp[3][i]==2*t)return mp[1][i]==0?1*3+i:mp[2][i]==0?2*3+i:3*3+i;
}
if(mp[1][1]+mp[2][2]+mp[3][3]==2*t)return mp[1][1]==0?4:mp[2][2]==0?8:12;
if(mp[1][3]+mp[2][2]+mp[3][1]==2*t)return mp[1][3]==0?6:mp[2][2]==0?8:10;//判断己方二子连珠
for(int i=1;i<=3;++i)
{
if(mp[i][1]+mp[i][2]+mp[i][3]==-2*t)return mp[i][1]==0?i*3+1:mp[i][2]==0?i*3+2:i*3+3;
if(mp[1][i]+mp[2][i]+mp[3][i]==-2*t)return mp[1][i]==0?1*3+i:mp[2][i]==0?2*3+i:3*3+i;
}
if(mp[1][1]+mp[2][2]+mp[3][3]==-2*t)return mp[1][1]==0?4:mp[2][2]==0?8:12;
if(mp[1][3]+mp[2][2]+mp[3][1]==-2*t)return mp[1][3]==0?6:mp[2][2]==0?8:10;//判断对方二子连珠
if(mp[2][2]==0)return 8;//判中心
if(mp[1][1]+mp[2][2]+mp[3][3]==t&&(mp[1][1]==0||mp[2][2]==0))return mp[2][2]==0?8:mp[1][1]==0?4:12;
if(mp[1][3]+mp[2][2]+mp[3][1]==t&&(mp[1][3]==0||mp[2][2]==0))return mp[2][2]==0?8:mp[1][3]==0?6:10;
for(int i=1;i<=3;++i)
{
if(mp[i][1]+mp[i][2]+mp[i][3]==t&&(mp[i][1]==0||mp[i][2]==0))return mp[i][1]==0?i*3+1:mp[i][3]==0?i*3+3:i*3+2;
if(mp[1][i]+mp[2][i]+mp[3][i]==t&&(mp[1][i]==0||mp[2][i]==0))return mp[1][i]==0?1*3+i:mp[3][i]==0?3*3+i:2*3+i;//判断己方一子连珠
}//判己方一子连珠
return mp[1][1]==0?4:mp[1][3]==0?6:mp[3][1]==0?10:mp[3][3]==0?12:mp[1][2]==0?5:mp[2][1]==0?7:mp[2][3]==0?9:11;
}
int game(int turn)
{
boom=0;h=turn;memset(mp,0,sizeof(mp));
while(true)
{
X=Y=2;putchess();
if(h!=AIturn)
{
puthint();
while(((KEY_DOWN('W')||KEY_DOWN('S')||KEY_DOWN('A')||KEY_DOWN('D')||KEY_DOWN(' '))&&player1())||((KEY_DOWN(VK_UP)||KEY_DOWN(VK_DOWN)||KEY_DOWN(VK_LEFT)||KEY_DOWN(VK_RIGHT)||KEY_DOWN('\r'))&&!player1()));
while(true)
{
if((KEY_DOWN('W')&&player1())||(KEY_DOWN(VK_UP)&&!player1()))
{
X=(X+1)%3+1;
putchess();puthint();
while((KEY_DOWN('W')&&player1())||(KEY_DOWN(VK_UP)&&!player1()));
}
if((KEY_DOWN('A')&&player1())||(KEY_DOWN(VK_LEFT)&&!player1()))
{
Y=(Y+1)%3+1;
putchess();puthint();
while((KEY_DOWN('A')&&player1())||(KEY_DOWN(VK_LEFT)&&!player1()));
}
if((KEY_DOWN('S')&&player1())||(KEY_DOWN(VK_DOWN)&&!player1()))
{
X=(X%3)+1;
putchess();puthint();
while((KEY_DOWN('S')&&player1())||(KEY_DOWN(VK_DOWN)&&!player1()));
}
if((KEY_DOWN('D')&&player1())||(KEY_DOWN(VK_RIGHT)&&!player1()))
{
Y=(Y%3)+1;
putchess();puthint();
while((KEY_DOWN('D')&&player1())||(KEY_DOWN(VK_RIGHT)&&!player1()));
}
if((KEY_DOWN(' ')&&player1())||(KEY_DOWN('\r')&&!player1()))
{
while((KEY_DOWN(' ')&&player1())||(KEY_DOWN('\r')&&!player1()));
if(!mp[X][Y])break;
}
}
}
else
{
puts("人机计算中……");
int m=AI(AIturn),y=(m+2)%3+1,x=(m-y)/3;
if(x==y&&x==2)Sleep(Speed*100);
else if(x+y==3||x+y==5)
{
Sleep(Speed*50);
X=x;Y=y;putchess();puts("人机计算中……");Sleep(Speed*50);
}
else
{
Sleep(Speed*33.33);
X=x;putchess();puts("人机计算中……");Sleep(Speed*33.33);
Y=y;putchess();puts("人机计算中……");Sleep(Speed*33.33);
}
}
mp[X][Y]=h;X=Y=4;
if(win())break;
effect(h);
if(win())break;
h=-h;
}
while(true)
{
system("cls");
puts("要再玩一局吗?\n");
puts("是 —— y\n");
puts("否 —— n\n");
while(true)
{
if(KEY_DOWN('N'))
{
system("cls");
putss("正在计算最终得分……\n");
Sleep(Speed*666.66);
if(win1!=win2)
{
putss("最终的胜利者是:\n");Sleep(Speed*333.33);
printf("%s!\n",win1>win2?(AIturn==1?"人机":AIturn==-1?"玩家":"玩家1"):(AIturn==-1?"人机":AIturn==1?"玩家":"玩家2"));system("pause");
}
else
{
putss("最终结果是……\n");Sleep(Speed*333.33);
puts("平局!");system("pause");
}
printf("你们的比分为:%d:%d。\n",win1,win2);system("pause");
putss("欢迎下次再玩!\n");system("pause");
return 0;
}
if(KEY_DOWN('Y'))return h;
}
}
}
int main()
{
srand(time(NULL));
while(home());
return 0;
}
双人围棋
//转自:https://www.luogu.com.cn/paste/c1fvaio2
//作者:https://www.luogu.com.cn/user/217233
#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
#include<ctime>
using namespace std;
const int n=19,rangzi=7;//棋盘大小,让子子数
int x,y,turn,a[101][101],vis[101][101],vist[101][101],ans,p;char g;bool flag;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool dfs1(int x,int y,int u){
if(x==0||y==0||x==n+1||y==n+1||a[x][y]==3-u)return true;
if(a[x][y]==0)return false;
vis[x][y]=true;
for(int i=0;i<=3;++i)if(!vis[x+dx[i]][y+dy[i]]&&!dfs1(x+dx[i],y+dy[i],u))return false;
return true;
}
void dfs2(int x,int y,int u){
if(x==0||y==0||x==n+1||y==n+1||a[x][y]!=u)return;
a[x][y]=0;for(int i=0;i<=3;++i)dfs2(x+dx[i],y+dy[i],u);
}
bool dfs3(int x,int y){
if(x==0||y==0||x==n+1||y==n+1||a[x][y]==1)return true;
if(a[x][y]==2)return false;
vis[x][y]=true;
for(int i=0;i<=3;++i)if(!vis[x+dx[i]][y+dy[i]]&&!dfs3(x+dx[i],y+dy[i]))return false;
return true;
}
void dfs4(int x,int y){
if(x==0||y==0||x==n+1||y==n+1||vist[x][y]||a[x][y]==2)return;
ans++;vist[x][y]=1;
if(a[x][y]==0){a[x][y]=3;for(int i=0;i<=3;++i)dfs4(x+dx[i],y+dy[i]);}
}
void putchess(){
system("cls");
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
putchar(i==x&&j==y?'>':' ');
putchar(a[i][j]==3?',':a[i][j]==0?((i==4||i==n-3||2*i==n+1)&&(j==4||j==n-3||2*j==n+1))?'*':'.':a[i][j]==1?'@':'O');
}
putchar('\n');
}
}
bool control(char g){
x=(g=='w'?x+n-2:g=='s'?x:x-1)%n+1;
y=(g=='a'?y+n-2:g=='d'?y:y-1)%n+1;
return g==' ';
}
int main(){
x=y=(n+1)/2;turn=1;
while(true){
putchess();puts("按三下P结束游戏。");
g=_getch();
if(g=='p'){
p++;if(p==3)break;continue;
}else p=0;
if(control(g)){
if(a[x][y]!=0)continue;
a[x][y]=turn;flag=false;
for(int i=0;i<=3;++i){
memset(vis,0,sizeof(vis));
if(a[x+dx[i]][y+dy[i]]==3-turn&&dfs1(x+dx[i],y+dy[i],3-turn))flag=true,dfs2(x+dx[i],y+dy[i],3-turn);
}
if(!flag&&dfs1(x,y,turn)){a[x][y]=0;continue;}
turn=3-turn;
}
}
p=0;
while(true){
putchess();puts("请清除所有死子;按三下p结束清除。");
g=_getch();
if(g=='p'){
p++;if(p==3)break;continue;
}else p=0;
if(control(g)){a[x][y]=0;continue;}
}
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j){
memset(vis,0,sizeof(vis));
if(dfs3(i,j))dfs4(i,j);
}
putchess();printf("黑棋%d目,白棋%d目,%s赢了!",ans,n*n-ans,ans*2-rangzi>n*n?"黑棋":"白棋");
Sleep(3000);
}
中国象棋
#include <iostream>
#include <memory.h>
#include <cmath>
using namespace std;//存储结构:chess类是基类,派生类是各种棋子,在chessboard类中用chess的指针调用各个棋子
class chessboard;
class chess{
private:
int id;//等级
public:
chess(int i):id(i){}
int get(){return id;}
virtual bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy)=0;
virtual ~chess(){};//虚析构
};
class chessboard{
private:
chess *c[10][9];
char chessword[15][4]={"帅","相","炮","士","車","馬","兵","","卒","马","车","仕","砲","象","将"};//名字
public:
chessboard(){memset(c, NULL, sizeof(c));};//把指针初始化为零指针
void init();
chess* get(int x,int y){return c[x][y];}
int getid(int x,int y){ if(c[x][y]!=NULL) return c[x][y]->get();return 0;}
void show();
void play();
bool move(int startx,int starty,int aimx,int aimy);
~chessboard();//析构函数
static bool end;//判断结束
static int player;
};
bool chessboard::end=true;
int chessboard::player=-1;
bool chessboard::move(int startx,int starty,int aimx,int aimy){
if(startx>=0&&startx<10&&starty>=0&&starty<9//初步判断传入的点是否符合规则
&&aimx>=0&&aimx<10&&aimy>=0&&aimy<9
&&getid(startx,starty)&&getid(startx,starty)*player>0
&&c[startx][starty]->judge_move(*this,startx,starty,aimx,aimy)){
if(c[aimx][aimy]!=NULL) delete c[aimx][aimy];//吃子
c[aimx][aimy]=c[startx][starty];
c[startx][starty]=NULL;
player*=-1;
return true;
}
cout<<"走法错误,不符合规则"<<endl;
return false;
}
class horse : public chess{//马的实现
public:
horse(int i) : chess((i==0?-2:2)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&(tempx*tempx+tempy*tempy==5)&&!cb.get(startx+tempx/2,starty+tempy/2))
return true;
return false;
}
};
class soldier : public chess{//兵(卒)的实现
public:
soldier(int c) : chess((c==0?-1:1)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&sid*tempx<=0){
if(abs(tempx)==1&&tempy==0) return true;
if(abs(tempy)==1&&tempx==0)
if((startx/5==0&&sid>0)||(startx/5==1&&sid<0)) return true;
return false;
}
return false;
}
};
class general : public chess{//帅(将)的实现
public:
general(int c) : chess((c==0?-7:7)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&tempy*tempy+tempx*tempx==1&&aimx%7>=0&&aimx%7<=2&&aimy>=3&&aimy<=5)
return true;
return false;
}
~general(){chessboard::end=false;}
};
class elephant : public chess{//象(相)的实现
public:
elephant(int c) : chess((c==0?-6:6)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&tempy*tempy+tempx*tempx==8&&startx/5==aimx/5&&!cb.get(startx+tempx/2,starty+tempy/2))
return true;
return false;
}
};
class cannon : public chess{//炮的实现
public:
cannon(int c) : chess((c==0?-5:5)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&!(tempx&&tempy)&&(tempx+tempy)){
int tot=0;
if(tempx!=0){
int sign=tempx>0?1:-1;
for(int i=1;i<abs(tempx);i++)
if(cb.get(startx+sign*i,starty)) tot++;
}
else{
int sign=tempy>0?1:-1;
for(int i=1;i<abs(tempy);i++)
if(cb.get(startx,starty+sign*i)) tot++;
}
if(!aid)
{if(!tot) return true;}
else
{if(tot==1) return true;}
}
return false;
}
};
class guard: public chess{//士(仕)的实现
public:
guard(int c) : chess((c==0?-4:4)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&tempy*tempy+tempx*tempx==2&&aimx%7>=0&&aimx%7<=2&&aimy>=3&&aimy<=5)
return true;
return false;
}
};
class rook : public chess{//车的实现
public:
rook(int c) : chess((c==0?-3:3)){}
bool judge_move(chessboard &cb,int startx,int starty,int aimx,int aimy){
int tempx=aimx-startx,tempy=aimy-starty;
int sid=cb.getid(startx, starty),aid=cb.getid(aimx, aimy);
if(sid*aid<=0&&!(tempx&&tempy)&&(tempx+tempy)){
if(tempx!=0){
int sign=tempx>0?1:-1;
for(int i=1;i<abs(tempx);i++)
if(cb.get(startx+sign*i,starty)) return false;
}
else{
int sign=tempy>0?1:-1;
for(int i=1;i<abs(tempy);i++)
if(cb.get(startx,starty+sign*i)) return false;
}
return true;
}
return false;
}
};
chessboard :: ~chessboard(){
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
if(c[i][j]!=NULL){
delete c[i][j];
c[i][j]=NULL;
}
}
void chessboard :: init(){//初始化,棋子的生成
c[0][0]=new rook(0); c[0][8]=new rook(0);
c[0][1]=new horse(0); c[0][7]=new horse(0);
c[0][2]=new elephant(0); c[0][6]=new elephant(0);
c[0][3]=new guard(0); c[0][5]=new guard(0);
c[0][4]=new general(0); c[9][4]=new general(1);
c[2][1]=new cannon(0); c[2][7]=new cannon(0);
c[3][0]=new soldier(0); c[3][2]=new soldier(0);
c[3][4]=new soldier(0); c[3][6]=new soldier(0);
c[3][8]=new soldier(0); c[6][8]=new soldier(1);
c[6][0]=new soldier(1); c[6][2]=new soldier(1);
c[6][4]=new soldier(1); c[6][6]=new soldier(1);
c[7][1]=new cannon(1); c[7][7]=new cannon(1);
c[9][0]=new rook(1); c[9][8]=new rook(1);
c[9][1]=new horse(1); c[9][7]=new horse(1);
c[9][2]=new elephant(1); c[9][6]=new elephant(1);
c[9][3]=new guard(1); c[9][5]=new guard(1);
}
void chessboard :: show(){
cout<<"吴 零一二三四五六七八"<<endl<<endl;
char num[10][4]={"零","一","二","三","四","五","六","七","八","九"};
for(int i=0;i<10;i++){
if(i==5) cout<<" ——楚 河 汉 界———"<<endl;
cout<<num[i]<<" ";
for(int j=0;j<9;j++){
if(c[i][j]!=NULL)
cout<<chessword[c[i][j]->get()+7];
else if((i==1&&j==4)||(i==8&&j==4))
cout<<"米";
else
cout<<"十";
}
cout<<endl;
}
}
void chessboard::play(){
this->init();
this->show();
do{
int startx,starty,aimx,aimy;
int sid,aid;
do{
sid=aid=0;
cout<<"请输入起始棋子位置与目标位置的坐标:"<<endl;
cin>>startx>>starty>>aimx>>aimy;
}while(!this->move(startx,starty,aimx,aimy));
this->show();
}while(chessboard::end);
cout<<"结束,赢家是Player"<<(chessboard::player==1?1:2)<<endl;
}
int main(){
chessboard C;
C.play();
}
五子棋AI
#include <cstdio>
#include <windows.h>
#include <cstdlib>
#include <conio.h>
#include <iostream>
#include <cstring>
using namespace std;
#define Forij(x) for(int i=1;i<=x;i++)for(int j=1;j<=x;j++)
#define N 25
typedef long long LL;
LL fx[4][2]={{1,1},{1,0},{0,1},{1,-1}};
LL Q,GG;
string C[20]={"●","○","﹢","═","║","╔","╚","╗","╝","•"};//╋
void color(LL a){//颜色函数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
}
void gotoxy(LL x,LL y){
COORD pos;
pos.X=2*x;
pos.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
struct Gomoku{
LL m[50][50],nx,ny;
void reset(){
system("cls");
memset(m,-1,sizeof(m));
color(7);
for (LL i=1; i<=N; i++){
gotoxy(0,i);cout<<C[4]; gotoxy(N+1,i);cout<<C[4];
gotoxy(i,0);cout<<C[3]; gotoxy(i,N+1);cout<<C[3];
}
gotoxy(0,0);cout<<C[5]; gotoxy(0,N+1);cout<<C[6];
gotoxy(N+1,0);cout<<C[7]; gotoxy(N+1,N+1);cout<<C[8];
color(3);
Forij(N){
gotoxy(i,j); cout<<C[2];
}
nx=ny=N/2+1; gotoxy(nx,ny);
}
void _drop(LL x,LL i,LL j){
m[i][j]=x;
gotoxy(i,j);
color(15); cout<<C[x];
}
LL check(){
Forij(N){
for (LL Fx=0,tmp,lst,xx,yy; Fx<4; Fx++) if(m[i][j]!=-1){
xx=i,yy=j,tmp=0,lst=m[i][j];
for (LL k=1; k<=5; k++){
if (xx>N || yy>N) break;
if (m[xx][yy]==(lst^1)){break;}
if (m[xx][yy]==lst) tmp++;
xx+=fx[Fx][0],yy+=fx[Fx][1];
}
if (tmp==5){
return lst;
}
}
}
return -1;
}
LL arnd(LL x,LL y){
LL cnt=0;
for (LL i=x-1; i<=x+1; i++) if (i>0 && i<=N)
for (LL j=y-1; j<=y+1; j++) if (j>0 && j<=N)
if (m[i][j]>-1) cnt++;
return cnt;
}
void get_val(LL x,LL y,LL &val){
val=0;
Forij(N){
for (LL Fx=0,tmp,tk,xx,yy; Fx<4; Fx++){
xx=i,yy=j,tmp=tk=0;
for (LL k=1; k<=5; k++){
if (xx>N || yy>N){tmp=0; break;}
if (m[xx][yy]==(x^1)){tmp=0; break;}
if (m[xx][yy]==x) tmp++,tk+=(1<<(k-1));
xx+=fx[Fx][0],yy+=fx[Fx][1];
}
switch(tmp){
case 5:
val+=8000000000; break;
case 4:
val+=1000+350*y; break;
case 3:
val+=(tk==14)?(300+600*y):(300+200*y); break;
case 2:
val+=3+2*y; break;
case 1:
val+=1+y; break;
}
}
}
}
void AI(LL x){
LL best,brnd,bi,bj,v1,v2,kkk;
best=-2147483647;
brnd=-2147483647;
Forij(N) if (m[i][j]==-1){
m[i][j]=x;
get_val(x,10,v1); //gotoxy(N+5,N/2);printf("%d ",v1);
get_val(x^1,80,v2); //gotoxy(N+5,N/2+1);printf("%d ",v2);
if (v1-v2>best) bi=i,bj=j,best=v1-v2;
if (v1-v2==best)
if ((kkk=arnd(i,j))>brnd)
brnd=kkk,bi=i,bj=j;
m[i][j]=-1;
}
_drop(x,bi,bj);
}
void HM(LL x){
char ch=getch();
for (;;ch=getch()){
if (ch=='w') {if (ny>1) ny--;}
else if (ch=='s') {if (ny<N) ny++;}
else if (ch=='a') {if (nx>1) nx--;}
else if (ch=='d') {if (nx<N)nx++;}
else if (m[nx][ny]==-1){_drop(x,nx,ny); return;}
gotoxy(nx,ny);
}
}
} A;
int main(){
for (;;){
A.reset();
for (GG=-1;;){
gotoxy(A.nx,A.ny);
A.HM(0); GG=A.check(); if (GG>-1) break;
A.AI(1); GG=A.check(); if (GG>-1) break;
}
gotoxy(5,N+3);
if (GG==0) printf("AI_1 win!");
if (GG==1) printf("AI_2 wins!");
while (kbhit()) getch();
Sleep(500);
gotoxy(5,N+3);
printf("Press anything to continue.");
getch();
}
}
ABS五子棋(win7+win10)
作者:/user/297831
转自:/discuss/362406
//win7版本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<time.h>
#include<conio.h>
#include<windows.h>
#include<ctime>
using namespace std;
struct coordinate{
int X,Y;
}Coor1[626],Coor2[626];
char Getin=' ';
int Map[25][25],Sum1,Sum2;
int Map1[25][25];
void No(){
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}
void _Coordinate_(int x,int y){
HANDLE winHandle;//句柄
COORD pos = {x,y};
winHandle = GetStdHandle(STD_OUTPUT_HANDLE);
//设置光标位置
SetConsoleCursorPosition(winHandle,pos);
}
int Hrong(int x,int y,int n){
if(Map[x][y]==n) return 5;
}
void Nturn(){
int x1[10],y1[10];
for(int i=Sum1-1;i>=0;i--){
int x=Coor2[i].X,y=Coor2[i].Y,Emc=0;
for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
while(Map[x1[0]][y1[0]]==2){ x1[0]++;y1[0]++;Emc++;}
if(Emc==2&&Map[x-1][y-1]==0&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=5+3*Hrong(x1[0]+1,y1[0]+1,2);}
if(Emc==3&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=50+90*Hrong(x1[0]+1,y1[0]+1,2);}
if(Emc==4&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=500;}
Emc=0;
while(Map[x1[1]][y1[1]]==2){ x1[1]--;y1[1]++;Emc++;}
if(Emc==2&&Map[x+1][y-1]==0&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=5+3*Hrong(x1[1]-1,y1[1]+1,2);}
if(Emc==3&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=50+90*Hrong(x1[1]-1,y1[1]+1,2);}
if(Emc==4&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=500;}
Emc=0;
while(Map[x1[2]][y1[2]]==2){ x1[2]++;y1[2]--;Emc++;}
if(Emc==2&&Map[x-1][y+1]==0&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=5+3*Hrong(x1[2]+1,y1[2]-1,2);}
if(Emc==3&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=50+90*Hrong(x1[2]+1,y1[2]-1,2);}
if(Emc==4&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=500;}
Emc=0;
while(Map[x1[3]][y1[3]]==2){ x1[3]--;y1[3]--;Emc++;}
if(Emc==2&&Map[x+1][y+1]==0&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=5+3*Hrong(x1[3]-1,y1[3]-1,2);}
if(Emc==3&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=50+90*Hrong(x1[3]-1,y1[3]-1,2);}
if(Emc==4&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=500;}
Emc=0;
while(Map[x1[4]][y1[4]]==2){ x1[4]++;Emc++;}
if(Emc==2&&Map[x-1][y]==0&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=5+3*Hrong(x1[4]+1,y1[4],2);}
if(Emc==3&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=50+90*Hrong(x1[4]+1,y1[4],2);}
if(Emc==4&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=500;}
Emc=0;
while(Map[x1[5]][y1[5]]==2){ x1[5]--;Emc++;}
if(Emc==2&&Map[x+1][y]==0&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=5+3*Hrong(x1[5]-1,y1[5],2);}
if(Emc==3&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=50+90*Hrong(x1[5]-1,y1[5],2);}
if(Emc==4&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=500;}
Emc=0;
while(Map[x1[6]][y1[6]]==2){ y1[6]--;Emc++;}
if(Emc==2&&Map[x][y+1]==0&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=5+3*Hrong(x1[6],y1[6]-1,2);}
if(Emc==3&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=50+90*Hrong(x1[6],y1[6]-1,2);}
if(Emc==4&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=500;}
Emc=0;
while(Map[x1[7]][y1[7]]==2){ y1[7]++;Emc++;}
if(Emc==2&&Map[x][y-1]==0&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=5+3*Hrong(x1[7],y1[7]+1,2);}
if(Emc==3&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=50+90*Hrong(x1[7],y1[7]+1,2);}
if(Emc==4&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=500;}
}
}
void Uturn(){
int x1[10],y1[10];
for(int i=Sum1-1;i>=0;i--){
int x=Coor1[i].X,y=Coor1[i].Y,Emc=0;
for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
while(Map[x1[0]][y1[0]]==1){ x1[0]++;y1[0]++;Emc++;}
if(Emc==2&&Map[x-1][y-1]==0&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=5+4*Hrong(x1[0]+1,y1[0]+1,1);}
if(Emc==3&&Map[x-1][y-1]==0&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=45+2*Hrong(x1[0]+1,y1[0]+1,1);}
if(Emc==4&&Map[x-1][y-1]==2&&Map[x1[0]][y1[0]]==0){Map1[x1[0]][y1[0]]+=55;}
Emc=0;
while(Map[x1[1]][y1[1]]==1){ x1[1]--;y1[1]++;Emc++;}
if(Emc==2&&Map[x+1][y-1]==0&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=5+4*Hrong(x1[1]-1,y1[1]+1,1);}
if(Emc==3&&Map[x+1][y-1]==0&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=45+2*Hrong(x1[1]-1,y1[1]+1,1);}
if(Emc==4&&Map[x+1][y-1]==2&&Map[x1[1]][y1[1]]==0){Map1[x1[1]][y1[1]]+=55;}
Emc=0;
while(Map[x1[2]][y1[2]]==1){ x1[2]++;y1[2]--;Emc++;}
if(Emc==2&&Map[x-1][y+1]==0&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=5+4*Hrong(x1[2]+1,y1[2]-1,1);}
if(Emc==3&&Map[x-1][y+1]==0&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=45+2*Hrong(x1[2]+1,y1[2]-1,1);}
if(Emc==4&&Map[x-1][y+1]==2&&Map[x1[2]][y1[2]]==0){Map1[x1[2]][y1[2]]+=55;}
Emc=0;
while(Map[x1[3]][y1[3]]==1){ x1[3]--;y1[3]--;Emc++;}
if(Emc==2&&Map[x+1][y+1]==0&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=5+4*Hrong(x1[3]-1,y1[3]-1,1);}
if(Emc==3&&Map[x+1][y+1]==0&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=45+2*Hrong(x1[3]-1,y1[3]-1,1);}
if(Emc==4&&Map[x+1][y+1]==2&&Map[x1[3]][y1[3]]==0){Map1[x1[3]][y1[3]]+=55;}
Emc=0;
while(Map[x1[4]][y1[4]]==1){ x1[4]++;Emc++;}
if(Emc==2&&Map[x-1][y]==0&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=5+4*Hrong(x1[4]+1,y1[4],1);}
if(Emc==3&&Map[x-1][y]==0&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=45+2*Hrong(x1[4]+1,y1[4],1);}
if(Emc==4&&Map[x-1][y]==2&&Map[x1[4]][y1[4]]==0){Map1[x1[4]][y1[4]]+=55;}
Emc=0;
while(Map[x1[5]][y1[5]]==1){ x1[5]--;Emc++;}
if(Emc==2&&Map[x+1][y]==0&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=5+4*Hrong(x1[5]-1,y1[5],1);}
if(Emc==3&&Map[x+1][y]==0&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=45+2*Hrong(x1[5]-1,y1[5],1);}
if(Emc==4&&Map[x+1][y]==2&&Map[x1[5]][y1[5]]==0){Map1[x1[5]][y1[5]]+=55;}
Emc=0;
while(Map[x1[6]][y1[6]]==1){ y1[6]--;Emc++;}
if(Emc==2&&Map[x][y+1]==0&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=5+4*Hrong(x1[6],y1[6]-1,1);}
if(Emc==3&&Map[x][y+1]==0&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=45+2*Hrong(x1[6],y1[6]-1,1);}
if(Emc==4&&Map[x][y+1]==2&&Map[x1[6]][y1[6]]==0){Map1[x1[6]][y1[6]]+=55;}
Emc=0;
while(Map[x1[7]][y1[7]]==1){ y1[7]++;Emc++;}
if(Emc==2&&Map[x][y-1]==0&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=5+4*Hrong(x1[7],y1[7]+1,1);}
if(Emc==3&&Map[x][y-1]==0&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=45+2*Hrong(x1[7],y1[7]+1,1);}
if(Emc==4&&Map[x][y-1]==2&&Map[x1[7]][y1[7]]==0){Map1[x1[7]][y1[7]]+=55;}
}
}
void ESET(){
for(int i=2;i<23;i++)
for(int j=2;j<23;j++){
if(Map[i][j]==0&&Map[i+1][j]!=0&&Map[i-1][j]==Map[i+1][j]&&(Map[i+2][j]==0||Map[i+2][j]==Map[i+1][j])&&(Map[i-2][j]==0||Map[i-2][j]==Map[i-1][j]))
Map1[i][j]+=5;
if(Map[i][j]==0&&Map[i][j+1]!=0&&Map[i][j-1]==Map[i][j+1]&&(Map[i][j+2]==0||Map[i][j+2]==Map[i][j+1])&&(Map[i][j-2]==0||Map[i][j-2]==Map[i][j-1]))
Map1[i][j]+=5;
if(Map[i][j]==0&&Map[i+1][j+1]!=0&&Map[i-1][j-1]==Map[i+1][j+1]&&(Map[i+2][j+2]==0||Map[i+2][j+2]==Map[i+1][j+1])&&(Map[i-2][j-2]==0||Map[i-2][j-2]==Map[i-1][j-1]))
Map1[i][j]+=5;
if(Map[i][j]==0&&Map[i-1][j+1]!=0&&Map[i+1][j-1]==Map[i-1][j+1]&&(Map[i-2][j+2]==0||Map[i-2][j+2]==Map[i-1][j+1])&&(Map[i+2][j-2]==0||Map[i+2][j-2]==Map[i+1][j-1]))
Map1[i][j]+=5;
}
}
void AI(){
if(Sum1==0){
Map[12][12]=2;
Coor2[Sum2].X=12;
Coor2[Sum2++].Y=12;
return;
}
for(int i=0;i<25;i++)
for(int j=0;j<25;j++)
Map1[i][j]=0;
int x1[10],y1[10],Ax,Ay,Max=0;
ESET();
Uturn();
Nturn();
for(int i=Sum1-1;i>=0;i--){
int x=Coor1[i].X,y=Coor1[i].Y,Emc[10]={0};
for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
while(Map[x1[0]][y1[0]]==1){ x1[0]++;y1[0]++;Emc[0]++;}
while(Map[x1[1]][y1[1]]==1){ x1[1]--;y1[1]++;Emc[1]++;}
while(Map[x1[2]][y1[2]]==1){ x1[2]++;y1[2]--;Emc[2]++;}
while(Map[x1[3]][y1[3]]==1){ x1[3]--;y1[3]--;Emc[3]++;}
while(Map[x1[4]][y1[4]]==1){ x1[4]++;Emc[4]++;}
while(Map[x1[5]][y1[5]]==1){ x1[5]--;Emc[5]++;}
while(Map[x1[6]][y1[6]]==1){ y1[6]--;Emc[6]++;}
while(Map[x1[7]][y1[7]]==1){ y1[7]++;Emc[7]++;}
for(int j=0;j<8;j++)
if(Map[x1[j]][y1[j]]==0) Map1[x1[j]][y1[j]]+=Emc[j];
}
for(int i=Sum2-1;i>=0;i--){
int x=Coor2[i].X,y=Coor2[i].Y,Emc[10]={0};
for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
while(Map[x1[0]][y1[0]]==2){ x1[0]++;y1[0]++;Emc[0]++;}
while(Map[x1[1]][y1[1]]==2){ x1[1]--;y1[1]++;Emc[1]++;}
while(Map[x1[2]][y1[2]]==2){ x1[2]++;y1[2]--;Emc[2]++;}
while(Map[x1[3]][y1[3]]==2){ x1[3]--;y1[3]--;Emc[3]++;}
while(Map[x1[4]][y1[4]]==2){ x1[4]++;Emc[4]++;}
while(Map[x1[5]][y1[5]]==2){ x1[5]--;Emc[5]++;}
while(Map[x1[6]][y1[6]]==2){ y1[6]--;Emc[6]++;}
while(Map[x1[7]][y1[7]]==2){ y1[7]++;Emc[7]++;}
for(int j=0;j<8;j++)
if(Map[x1[j]][y1[j]]==0) Map1[x1[j]][y1[j]]+=Emc[j];
}
for(int i=0;i<25;i++)
for(int j=0;j<25;j++)
if(Map1[i][j]>Max){
Max=Map1[i][j];
Ax=i;
Ay=j;
}
Map[Ax][Ay]=2;
Coor2[Sum2].X=Ax;
Coor2[Sum2++].Y=Ay;
return;
}
void Win(){
int x1[10],y1[10],Max1=0,Max2=0;
for(int i=0,e=0;i<Sum1;i++){
int x=Coor1[i].X,y=Coor1[i].Y;
for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
while(Map[x1[0]][y1[0]]==1){ x1[0]++;y1[0]++;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[1]][y1[1]]==1){ x1[1]--;y1[1]++;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[2]][y1[2]]==1){ x1[2]++;y1[2]--;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[3]][y1[3]]==1){ x1[3]--;y1[3]--;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[4]][y1[4]]==1){ x1[4]++;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[5]][y1[5]]==1){ x1[5]--;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[6]][y1[6]]==1){ y1[6]--;e++;}
Max1=max(e,Max1);
e=0;
while(Map[x1[7]][y1[7]]==1){ y1[7]++;e++;}
Max1=max(e,Max1);
e=0;
if(Max1>=5){
cout<<"电脑就是给智障,你赢了!!!";
getchar();
exit(0);
}
}
for(int i=0,e=0;i<Sum2;i++){
int x=Coor2[i].X,y=Coor2[i].Y;
for(int j=0;j<10;j++){x1[j]=x;y1[j]=y;}
while(Map[x1[0]][y1[0]]==2){ x1[0]++;y1[0]++;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[1]][y1[1]]==2){ x1[1]--;y1[1]++;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[2]][y1[2]]==2){ x1[2]++;y1[2]--;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[3]][y1[3]]==2){ x1[3]--;y1[3]--;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[4]][y1[4]]==2){ x1[4]++;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[5]][y1[5]]==2){ x1[5]--;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[6]][y1[6]]==2){ y1[6]--;e++;}
Max2=max(e,Max2);
e=0;
while(Map[x1[7]][y1[7]]==2){ y1[7]++;e++;}
Max2=max(e,Max2);
e=0;
if(Max2>=5){
cout<<"你就是给智障,电脑赢了!!!";
getchar();
exit(0);
}
}
}
void start(bool a){
char in=0;
int X=12,Y=12;
bool Flag=1;
system("mode con cols=51 lines=27");
if(a){
while(in!='\n'){
_Coordinate_(0,0);
for(int i=0;i<25;i++){
for(int j=0;j<25;j++){
if(i==X&&j==Y){cout<<"╳";continue;}
if(Map[i][j]==0){cout<<"╋";continue;}
}
cout<<"\n";
}
in=getch();
if(in=='w') X--;
if(in=='s') X++;
if(in=='a') Y--;
if(in=='d') Y++;
if(in==' '){Map[X][Y]=1;Coor1[Sum1].X=X;Coor1[Sum1++].Y=Y;break;}
}
}while(1){
_Coordinate_(0,0);
if(Flag) AI();
for(int i=0;i<25;i++){
for(int j=0;j<25;j++){
if(i==X&&j==Y){cout<<"╳";continue;}
if(Map[i][j]==2){cout<<"○";continue;}
if(Map[i][j]==1){cout<<"●";continue;}
if(Map[i][j]==0){cout<<"╋";continue;}
}
cout<<"\n";
}if(Flag) Win();
in=getch();
Flag=0;
if(in=='w'){X--;Flag=0;}
if(in=='s'){X++;Flag=0;}
if(in=='a'){Y--;Flag=0;}
if(in=='d'){Y++;Flag=0;}
if(in==' '){
if(Map[X][Y]) Flag=0;
else{
Map[X][Y]=1;
Flag=1;
Coor1[Sum1].X=X;
Coor1[Sum1++].Y=Y;
}
}
}
}
void manu1(){
_Coordinate_(0,0);
cout<<"■■■■■■■■■■\n";
cout<<"■ 1.先手 ■\n";
cout<<"■ 2.后手 ■\n";
cout<<"■■■■■■■■■■";
while(1){
char in=getch();
if(in=='1') start(1);
if(in=='2') start(0);
}
}
void manu(){
system("cls");
cout<<"■■■■■■■■■■\n";
cout<<"■ abs五子棋 ■\n";
cout<<"■ 1.开局 ■\n";
cout<<"■■■■■■■■■■";
while(1){
char in=getch();
if(in=='1') manu1();
}
}
int main(){
system("mode con cols=21 lines=5");
No();
manu();
return 0;
}
扫雷
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<conio.h>
#include<windows.h>
#include<cstdlib>
#include<ctime>
using namespace std;
#define MAXN 35
#define MIDX 10
#define MIDY 40
#define CG 25
#define CK 80
int G,K,Lnum,Wnum;//G为地图高,K为地图,Lnum为地图中的雷数,Wnum为剩余的小旗数
int nx,ny;//现在光标所在的位置
bool QR=0,Lose=0,is_flag_true[MAXN][MAXN];//QR为确认模式是否打开,Lose为是否输,第三个是这个位置上的旗是否放对
char map[MAXN][MAXN],tmap[MAXN][MAXN];//第一个是只有雷和空地的地图,第二个是玩家能看到的地图
int map1[MAXN][MAXN],mapc[MAXN][MAXN];//map1为数字的地图,其中0代表空地,-1为雷,1-8为周围雷的个数
//mapc为当前格子的颜色
int col[10]={240,249,242,252,241,244,243,240,248};//col[i]表示windows扫雷中i的颜色,col[0]为空格的颜色
int d[10][4]={{0},{0,1},{1,0},{0,-1},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}};//8个方向
bool ZB;//作弊是否打开
/*各种函数*/
void color(int);//颜色
void gto(int,int);//光标位置
void make();//制作随机地图
void print();//打印地图等
bool check(int,int);//判断坐标是否合法
bool is_win();//判断是否赢
bool is_lose();//是否输
void dfs(int,int);//用深搜来打开方块
void st(int,int);//试探,即windows扫雷中的左右键同时按
void flag(int,int);//小旗
void bj(int,int);//标记
void swt();//确认模式
void again();//重新开始
void zb();//作弊模式
void mainmain();//主函数
void print_real_map();//打印最终的地图
void begin();//各种操作
int main()
{
mainmain();
}
void color(int a){SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);}
void gto(int x,int y)
{
COORD pos;pos.X=y;pos.Y=x;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
void make()
{
for(int i=1;i<=G;i++)
for(int j=1;j<=K;j++)
map[i][j]='#';//初始化
for(int i=1;i<=Lnum;i++)
{
int x=rand()%G+1,y=rand()%K+1;
while(map[x][y]=='O')
x=rand()%G+1,y=rand()%K+1;
map[x][y]='O';
}//随机放雷
for(int i=1;i<=G;i++)
for(int j=1;j<=K;j++)
{
if(map[i][j]=='O')map1[i][j]=-1,mapc[i][j]=240;//如果是雷
else
{
for(int k=1;k<=8;k++)
if(map[i+d[k][0]][j+d[k][1]]=='O')
map1[i][j]++;//计算周围雷的个数
mapc[i][j]=col[map1[i][j]];//根据格子上的数设置颜色
}
}
for(int i=1;i<=G;i++)
for(int j=1;j<=K;j++)
if(mapc[i][j]==0)//空地
mapc[i][j]=240;
}
void print()
{
system("cls");
gto(0,MIDY-4); color(233); printf("扫雷");
color(240);
gto(1,MIDY);
for(int i=2;i<=G+1;i++)
{
gto(i,0);
for(int j=1;j<=K;j++)
printf("#"),tmap[i-1][j]='#';//初始化玩家所看到的地图
}
gto(2,0);
nx=2,ny=0;
color(15);
printf("@");
color(15);
gto(2,2*K+5);printf("-----规则-----");
gto(3,2*K+5);printf("wasd:选择位置");
gto(4,2*K+5);printf("空格:打开");
gto(5,2*K+5);printf("1键:试探周围8个方块,如果其中有雷则不会打开,无");
gto(6,2*K+5);printf(" 雷或旗帜标对了则会将周围无雷的位置打开,");
gto(7,2*K+5);printf(" 如果试探时周围有标错的旗帜,则会游戏失败");
gto(8,2*K+5);printf(" 必须额外确认一次,以便查看周围被试探的区域");
gto(9,2*K+5);printf("2键:放置/取消小旗(F)");
gto(10,2*K+5);printf("3键:放置/取消标记(?)");
gto(11,2*K+5);printf("4键:打开/关闭确认模式,即每次操作需再按一次确认");
gto(12,2*K+5);printf("5键:打开/关闭作弊模式,即显示原本地图");
gto(13,2*K+5);printf("0键:重新开始");//打印规则
gto(G+4,0);printf("-----操作提示-----\n");
printf("请选择方块进行操作");
gto(1,2*K+10);color(12);printf("剩余小旗数:%d",Wnum=Lnum);
}
bool check(int x,int y){return y>=0&&y<K&&x>=2&&x<G+2;}
//因为地图是从2行0列开始打的,而地图是从1行1列开始存的,所以gto(x,y)走到的是map[x-1][y+1]
bool is_win()
{
int cnt=0;
for(int i=1;i<=G;i++)
for(int j=1;j<=K;j++)
if(map[i][j]=='#'&&map1[i][j]==-1)
cnt++;
if(cnt==Lnum) return 1;
//所有没被打开的方块都是雷=>胜利
for(int i=1;i<=G;i++)
for(int j=1;j<=K;j++)
if((tmap[i][j]!='F'&&map1[i][j]==-1)||(tmap[i][j]=='F'&&map1[i][j]!=-1))
return 0;
return 1;
//所有雷都标有旗
}
bool is_lose(){return Lose;}
void dfs(int x,int y)
{
if(map1[x-1][y+1]>0)//只要边界全部是数字就return
{
gto(x,y),color(mapc[x-1][y+1]),printf("%d",map1[x-1][y+1]);
tmap[x-1][y+1]=map1[x-1][y+1]+'0';
return;
}
gto(x,y);color(255);
tmap[x-1][y+1]=' ';
printf(" ");//因为下面判断了雷,上面判断了数字,这里就一定是空地
for(int i=1;i<=8;i++)
{
int xx=x+d[i][0]-1,yy=y+d[i][1]+1;//这里的xx和yy是在map中的,而不是gto中的
if(check(xx+1,yy-1)&&tmap[xx][yy]=='#'&&map1[xx][yy]!=-1)//所以check和dfs的参数要变化
dfs(xx+1,yy-1);
}
}
void st(int x,int y)
{
for(int i=1;i<=8;i++)
{
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy))
{
gto(xx,yy);
if(tmap[xx-1][yy+1]!='#')
color(mapc[xx-1][yy+1]-128);//减去128使周围的8个格子的背景颜色变为灰色
else
color(112);//这里特判一下'#',应该可以不用
printf("%c",tmap[xx-1][yy+1]);
}
}
gto(G+5,0),color(15),printf("请确认 ");
//试探必须额外确认一次,规则上有说
char c=getch();
if(c=='1')
{
for(int i=1;i<=8;i++)
{
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy))
if(tmap[xx-1][yy+1]=='F'&&map1[xx-1][yy+1]!=-1)//试探时有格子的小旗标错了=>失败
{
Lose=1;
return;
}
}
for(int i=1;i<=8;i++)
{
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy))
if(map1[xx-1][yy+1]==-1&&tmap[xx-1][yy+1]!='F')//试探是有格子为雷=>取消打开
return;
}
for(int i=1;i<=8;i++)
{
int xx=x+d[i][0],yy=y+d[i][1];
if(check(xx,yy)&&tmap[xx-1][yy+1]=='#')//打开周围8个格子
dfs(xx,yy);
}
}
}
void flag(int x,int y)
{
x-=1,y+=1;
if(tmap[x][y]=='F')//原本为小旗=>取消小旗
{
tmap[x][y]='#';mapc[x][y]=240;
gto(x+1,y-1),color(240),printf("#");
Wnum++;//更新小旗数
}
else//否则就放置小旗
{
is_flag_true[x][y]=map1[x][y]==-1;//判断小旗是否放对
tmap[x][y]='F';mapc[x][y]=253;
gto(x+1,y-1),color(253),printf("F");
Wnum--;//更新小旗数
}
gto(1,2*K+10);color(12);printf("剩余小旗数: ");
gto(1,2*K+22);printf("%d",Wnum);//更新小旗数
}
void bj(int x,int y)//和放小旗差不多,只是不用更新is_flag_true
{
x-=1,y+=1;
if(tmap[x][y]=='?')
{
gto(x+1,y-1),color(240),printf("#");
tmap[x][y]='#';mapc[x][y]=240;
}
else
{
if(tmap[x][y]=='F')//如果原本这个位置上是小旗,而你把它变为了标记,就要更新小旗数
{
Wnum++;
gto(1,2*K+10);color(12);printf("剩余小旗数: ");
gto(1,2*K+22);printf("%d",Wnum);
}
gto(x+1,y-1),color(240),printf("?");
tmap[x][y]='?';mapc[x][y]=240;
}
}
void swt(){QR=!QR;}
void zb()
{
if(ZB)//如果本来作弊打开了就把作弊地图清除
{
for(int i=1;i<=G;i++)
{
gto(i+1,K+2);
for(int j=1;j<=K;j++)
color(15),printf(" ");
}
ZB=0;
}
else//否则打印作弊地图
{
for(int i=1;i<=G;i++)
{
gto(i+1,K+2);
for(int j=1;j<=K;j++)
{
color(mapc[i][j]);
if(map1[i][j]==-1) printf("O");
else if(map1[i][j]>0) printf("%d",map1[i][j]);
else printf(" ");
}
}
ZB=1;
}
}
void again()
{
G=K=Lnum=nx=ny=Lose=ZB=0;
QR=0;
memset(is_flag_true,0,sizeof(is_flag_true));
memset(map,0,sizeof(map));
memset(tmap,0,sizeof(tmap));
memset(map1,0,sizeof(map1));
memset(mapc,0,sizeof(mapc));
color(15);
system("cls");//初始化
mainmain();
}
void begin()//各种操作
{
char c=getch();
gto(G+5,0),color(15),printf("请选择方块进行操作");
color(240);
if(c=='w'&&check(nx-1,ny))
{
gto(nx,ny);
if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')
color(mapc[nx-1][ny+1]);
printf("%c",tmap[nx-1][ny+1]);
gto(nx-=1,ny);color(15);printf("@");
}
else if(c=='s'&&check(nx+1,ny))
{
gto(nx,ny);if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')color(mapc[nx-1][ny+1]);printf("%c",tmap[nx-1][ny+1]);
gto(nx+=1,ny);color(15);printf("@");
}
else if(c=='a'&&check(nx,ny-1))
{
gto(nx,ny);if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')color(mapc[nx-1][ny+1]);printf("%c",tmap[nx-1][ny+1]);
gto(nx,ny-=1);color(15);printf("@");
}
else if(c=='d'&&check(nx,ny+1))
{
gto(nx,ny);if(tmap[nx-1][ny+1]!='#'||tmap[nx-1][ny+1]==' ')color(mapc[nx-1][ny+1]);printf("%c",tmap[nx-1][ny+1]);
gto(nx,ny+=1);color(15);printf("@");
}
//上下左右移动
else
{
if(c==' '&&(!(tmap[nx-1][ny+1]<='9'&&tmap[nx-1][ny+1]>='0'))&&tmap[nx-1][ny+1]!='F')
{
mapc[nx-1][ny+1]=col[map1[nx-1][ny+1]];//如果本来放了标记,mapc[nx-1][ny+1]的颜色为黑色,在打开时里面的颜色却不一定是黑色
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()==' ')
{
if(map1[nx-1][ny+1]==-1) {Lose=1;return;}
dfs(nx,ny);
}
}
else
{
if(map1[nx-1][ny+1]==-1) {Lose=1;return;}
dfs(nx,ny);
}
}
else if(c=='1')
{
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()=='1') st(nx,ny);
}
else st(nx,ny);
for(int i=1;i<=8;i++)
{
int xx=nx+d[i][0],yy=ny+d[i][1];
if(check(xx,yy))
{
gto(xx,yy);
if(tmap[xx-1][yy+1]!='#') color(mapc[xx-1][yy+1]);
else color(240);
printf("%c",tmap[xx-1][yy+1]);
}
}
}
else if(c=='2'&&(tmap[nx-1][ny+1]>'9'||tmap[nx-1][ny+1]<'1'))
{
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()=='2') flag(nx,ny);
}
else flag(nx,ny);
}
else if(c=='3'&&(tmap[nx-1][ny+1]>'9'||tmap[nx-1][ny+1]<'1'))
{
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()=='3') bj(nx,ny);
}
else bj(nx,ny);
}
else if(c=='4')
{
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()=='4') swt();
}
else swt();
}
else if(c=='5')
{
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()=='5') zb();
}
else zb();
}
else if(c=='0')
{
if(QR)
{
gto(G+5,0),color(15),printf("请确认 ");
if(getch()=='0') again();
}
else again();
}
}
}
void mainmain()
{
system("mode con cols=120 lines=35");//设置窗口大小
srand((unsigned)time(NULL));
int mode;
printf("1.初级\n2.中级\n3.高级\n4.自定义\n");
scanf("%d",&mode);if(mode>4) mode=4;
if(mode==1) G=9,K=9,Lnum=10;
else if(mode==2) G=16,K=16,Lnum=40;
else if(mode==3) G=16,K=30,Lnum=99;//三种等级的参数
else
{
printf("请输入雷区高度:");scanf("%d",&G);
printf("请输入雷区宽度:");scanf("%d",&K);
printf("请输入雷个数(建议不超过总大小的三分之一):");scanf("%d",&Lnum);
if(G>24) G=24;if(K>30) K=30;
if(G<9) G=9;if(K<9) K=9;
if(Lnum<10) Lnum=10;if(Lnum>G*K*9/10) Lnum=G*K*9/10;
//控制参数的范围,最后一个if是雷的数量不超过地图大小的9/10
}
make();
print();
while(1)
{
begin();
bool f1=is_win(),f2=is_lose();
if(f1||f2)
{
gto(0,0);
if(f1)
color(202),gto(0,0),printf("你 赢 了!!是否重来?(y/n)");
if(f2)
color(137),gto(0,0),printf("你 输 了!!是否重来?(y/n)");//输赢
print_real_map();
char c=getch();
if(c=='y'||c=='Y') again();
else
{
color(15);
system("cls");
gto(MIDX,MIDY-5);
printf("欢迎下次再来");
return;
}
}
}
}
void print_real_map()
{
color(240);
for(int i=1;i<=G;i++)
{
gto(i+1,0);
for(int j=1;j<=K;j++)
{
if(tmap[i][j]=='F'&&is_flag_true[i][j]==0)//如果旗标错了显示红色的X
color(252),printf("X");
else if(map1[i][j]==-1)//雷为黑色O
color(240),printf("O");
else if(map1[i][j]==0)//空
color(240),printf(" ");
else//数字
color(mapc[i][j]),printf("%d",map1[i][j]);
}
}}
三国杀
#include<iostream>
#include<time.h>
#include<stdio.h>
#include <stdlib.h>
using namespace std;
struct pai
{
int paifu;
int huase;
int yanse;
int dianshu;
int leixing;
int changdu;
void Kanpai()
{
if(paifu==0||paifu==1);
else
printf("牌副参数错误!\n");
switch(huase)
{
case 0:cout<<"黑桃";break;
case 1:cout<<"红桃";break;
case 2:cout<<"草花";break;
case 3:cout<<"方片";break;
case -1:cout<<"无色";break;
default:printf("花色错误!\n");break;
}
switch(dianshu)
{
case 0:cout<<"A ";break;
case 1:cout<<"2 ";break;
case 2:cout<<"3 ";break;
case 3:cout<<"4 ";break;
case 4:cout<<"5 ";break;
case 5:cout<<"6 ";break;
case 6:cout<<"7 ";break;
case 7:cout<<"8 ";break;
case 8:cout<<"9 ";break;
case 9:cout<<"10 ";break;
case 10:cout<<"J ";break;
case 11:cout<<"Q ";break;
case 12:cout<<"K ";break;
case -1:cout<<"无点数";break;
default:printf("点数错误!\n");break;
}
switch(leixing)
{
case 101:cout<<"【杀】"<<endl;break;
case 102:cout<<"【闪】"<<endl;break;
case 103:cout<<"【桃】"<<endl;break;
case 201:cout<<"【过河拆桥】"<<endl;break;
case 202:cout<<"【顺手牵羊】"<<endl;break;
case 203:cout<<"【无中生有】"<<endl;break;
case 204:cout<<"【决斗】"<<endl;break;
case 205:cout<<"【借刀杀人】"<<endl;break;
case 206:cout<<"【桃园结义】"<<endl;break;
case 207:cout<<"【五谷丰登】"<<endl;break;
case 208:cout<<"【南蛮入侵】"<<endl;break;
case 209:cout<<"【万箭齐发】"<<endl;break;
case 210:cout<<"【无懈可击】"<<endl;break;
case 251:cout<<"【乐不思蜀】"<<endl;break;
case 252:cout<<"【闪电】"<<endl;break;
case 301:cout<<"【诸葛连弩(1)】"<<endl;break;
case 302:cout<<"【雌雄双股剑(2)】"<<endl;break;
case 303:cout<<"【青釭剑(2)】"<<endl;break;
case 304:cout<<"【青龙偃月刀(3)】"<<endl;break;
case 305:cout<<"【丈八蛇矛(3)】"<<endl;break;
case 306:cout<<"【贯石斧(3)】"<<endl;break;
case 307:cout<<"【方天画戟(4)】"<<endl;break;
case 308:cout<<"【麒麟弓(5)】"<<endl;break;
case 331:cout<<"【八卦阵】"<<endl;break;
case 361:cout<<"【赤兔(-1)】"<<endl;break;
case 362:cout<<"【大宛(-1)】"<<endl;break;
case 363:cout<<"【紫辛(-1)】"<<endl;break;
case 381:cout<<"【爪黄飞电(+1)】"<<endl;break;
case 382:cout<<"【的卢(+1)】"<<endl;break;
case 383:cout<<"【绝影(+1)】"<<endl;break;
default:printf("类型参数错误!");break;
}
}
};
void Qishixipai(pai A[2][4][13],pai paidui[104])
{
int i,m,x,y,z,a[104]={0};
srand((unsigned)time(NULL));
for(i=1;i<=104;i++)
{
while(a[m=rand()%104]);
a[m]=i;
}
for(i=0;i<=103;i++)
{
x=(a[i]-1)/52;
y=((a[i]-1)-52*x)/13;
z=(a[i]-1)%13;
paidui[i]=A[x][y][z];
}
}
void Xipai(pai paidui[104],int*paiduishu,pai qipaidui[104],int*qipaishu)
{
int i,m,a[104]={0};
srand((unsigned)time(NULL));
for(i=1;i<=(*qipaishu);i++)
{
while(a[m=rand()%(*qipaishu)]);
a[m]=i;
}
for(i=0;i<=((*qipaishu)-1);i++)
{
paidui[i]=qipaidui[a[i]];
qipaidui[a[i]].leixing=-1;
(*paiduishu)++;
(*qipaishu)--;
}
for(i=(*paiduishu);i<=103;i++)paidui[i].leixing=-1;
}
pai Mo1pai(pai A[104],int *x,pai B[104],int*y,int *b)
{
pai p;
if((*x)==0)Xipai(A,x,B,y);
else if((*x)<0)printf("摸牌参数错误!");
else;
p=A[104-(*x)];
(*x)--;
(*b)++;
return(p);
}
struct wujiang
{
char name;
int tili;
int tilishangxian;
int shoupaishangxian;
int huihekaishi;
int panding;
int mopai;
int chupai;
int qipai;
int huihejieshu;
int juese;
pai shoupai[20];
int shoupaishu;
pai zhuangbei[4];
int zhuangbeishu;
pai pandingpai[3];
int pandingshu;
int juli[1];
void Kanshoupai()
{
printf("玩家当前手牌:\n");
if(shoupaishu)
{
int m;
for(m=0;m<=(shoupaishu-1);m++)
{
printf("%d ",m);
(shoupai[m]).Kanpai();
}
}
else printf("空城!\n");
printf("\n");
}
void Kanzhuangbei()
{
if(juese)printf("玩家");
else printf("电脑");
printf("当前装备:\n");
printf("0 武器: ");
if((zhuangbei[0]).leixing==-1)printf("空\n");
else (zhuangbei[0]).Kanpai();
printf("1 防具: ");
if((zhuangbei[1]).leixing==-1)printf("空\n");
else (zhuangbei[1]).Kanpai();
printf("2 进攻马: ");
if((zhuangbei[2]).leixing==-1)printf("空\n");
else (zhuangbei[2]).Kanpai();
printf("3 防御马: ");
if((zhuangbei[3]).leixing==-1)printf("空\n");
else (zhuangbei[3]).Kanpai();
printf("\n");
}
void Kanpandingpai()
{
if(juese)printf("玩家");
else printf("电脑");
printf("当前判定区:\n");
if((pandingpai[0]).leixing==-1)printf("空\n");
else
{
printf("0 ");
(pandingpai[0]).Kanpai();
if((pandingpai[1]).leixing==-1);
else
{
printf("1 ");
(pandingpai[1]).Kanpai();
if((pandingpai[2]).leixing==-1);
else
{
printf("2 ");
(pandingpai[2]).Kanpai();
}
}
}
}
};
void Mopai(int*shoupaishu,pai shoupai[20],pai A[104],int *x,pai B[104],int*y,int juese)
{
if(juese)printf("玩家从牌堆摸2张牌\n");
else printf("电脑从牌堆摸2张牌\n");
pai p;
p=Mo1pai(A,x,B,y,shoupaishu);
shoupai[*shoupaishu-1]=p;
pai q;
q=Mo1pai(A,x,B,y,shoupaishu);
shoupai[*shoupaishu-1]=q;
int m;
if(juese)
{
printf("玩家当前手牌:\n");
for(m=0;m<=(*shoupaishu-1);m++)
{
printf("%d ",m);
(shoupai[m]).Kanpai();
}
}
printf("牌堆还剩%d张牌!\n\n",*x);
}
void Qishishoupai(wujiang *w,pai A[104],int *x,pai B[104],int*y)
{
pai a;
a=Mo1pai(A,x,B,y,&((*w).shoupaishu));
(*w).shoupai[(*w).shoupaishu-1]=a;
pai b;
b=Mo1pai(A,x,B,y,&((*w).shoupaishu));
(*w).shoupai[(*w).shoupaishu-1]=b;
pai c;
c=Mo1pai(A,x,B,y,&((*w).shoupaishu));
(*w).shoupai[(*w).shoupaishu-1]=c;
pai d;
d=Mo1pai(A,x,B,y,&((*w).shoupaishu));
(*w).shoupai[(*w).shoupaishu-1]=d;
int m;
if((*w).juese)printf("玩家从牌堆摸4张牌\n");
else printf("电脑从牌堆摸4张牌\n");
if((*w).juese)
{
printf("玩家当前手牌:\n");
for(m=0;m<=((*w).shoupaishu-1);m++)
{
printf("%d ",m);
((*w).shoupai[m]).Kanpai();
}
}
printf("牌堆还剩%d张牌!\n\n",*x);
}
void Panding(pai paidui[104],int*paiduishu,pai qipaidui[104],int*qipaishu)
{
paidui[*paiduishu].Kanpai();
qipaidui[*qipaishu]=paidui[*paiduishu];
(*paiduishu)--;
(*qipaishu)++;
}
pai Zhangba(wujiang*w,pai qipaidui[104],int*qipaishu)
{
int x,y;
pai p;
for(;;)
{
int i,j;
printf("请输入任意两张手牌之前的编号,以空格隔开,以回车结束!\n");
scanf("%d",&x);
scanf("%d",&y);
if((x>=0)&&(x<(*w).shoupaishu)&&(y>=0)&&(y<(*w).shoupaishu-1))
{
switch((((*w).shoupai[x].huase)%2)+(((*w).shoupai[y].huase)%2))
{
case 0:p.yanse=0;break;
case 2:p.yanse=1;break;
case 1:p.yanse=2;break;
default:printf("【丈八蛇矛】函数参数错误!\n");
}
qipaidui[*qipaishu]=(*w).shoupai[x];
(*w).shoupai[x].leixing=-1;
((*w).shoupaishu)--;
(*qipaishu)++;
qipaidui[*qipaishu]=(*w).shoupai[y];
(*w).shoupai[y].leixing=-1;
((*w).shoupaishu)--;
(*qipaishu)++; printf("弃牌数:%d",*qipaishu);
for(i=0;i<=(((*w).shoupaishu)+1);i++)
{
if((*w).shoupai[i].leixing==-1)
{
for(j=i+1;j<=(((*w).shoupaishu)+2);j++)
(*w).shoupai[j-1]=(*w).shoupai[j];
i--;
}
}
printf("玩家把:\n");
qipaidui[(*qipaishu)-2].Kanpai();
qipaidui[(*qipaishu)-1].Kanpai();
printf("当作一张");
switch(p.yanse)
{
case 0:printf("黑色");break;
case 2:printf("红色");break;
case 1:printf("无色");break;
default:printf("绿色");break;
}
printf("无点数的【杀】");
p.dianshu=-1;
p.leixing=101;
return p;
break;
}
printf("你将两张空气当作一张空气属性的【杀】使用或打出!\n");
}
}
int Xuanpai(wujiang*w,int t)
{
int x;
if((*w).juese)
{
for(;;)
{
printf("出牌请输入手牌之前的编号,以回车结束!\n如果你想结束出牌阶段,请输入“-1”,以回车结束!\n");
scanf("%d",&x);
if((x>=-1&&x<((*w).shoupaishu))||((x==100)&&((*w).zhuangbei[0].leixing==305)))
{
return x;
break;
}
printf("你打出了一张空气!\n");
}
}
else return t;
}
pai Panpai(wujiang*w1,int*sha,int y,pai qipaidui[104],int*qipaishu)
{
pai p,q;
p.leixing=0;
q.leixing=-1;
if(y==-1)return q;
else
{
if(y==100)
{
if((*sha)>0)
{
q=Zhangba(w1,qipaidui,qipaishu);
printf("使用!\n");
return q;
}
else
{
printf("当前回合使用【杀】的次数已用尽,你也不能使用【丈八蛇矛】效果!\n");
return p;
}
}
switch((*w1).shoupai[y].leixing)
{
case 101:
if(((*sha)>0)||((*w1).zhuangbei[0].leixing==301))
{
if(((*w1).zhuangbei[0].leixing==301))printf("武器【诸葛连弩】效果被触发!\n");
return (*w1).shoupai[y];
break;
}
else
{
if((*w1).juese)printf("当前回合使用【杀】的次数已用尽,你不能使用【杀】!\n");
return p;break;
}
case 102:
if((*w1).juese)
printf("当前不需要响应任何操作,你不能主动打出【闪】!\n");
return p;break;
case 103:
if(((*w1).tili)<((*w1).tilishangxian))
{
return (*w1).shoupai[y];
break;
}
else
{
if((*w1).juese)
printf("你并未受伤,不能对自己使用【桃】!\n");
}
return p;break;
case 210:
if((*w1).juese)
printf("当前不需要响应任何锦囊,你不能主动打出【无懈可击】!\n");
return p;break;
case 201:
case 202:
case 203:
case 204:
case 205:
case 206:
case 207:
case 208:
case 209:
case 251:
case 252:
case 301:
case 302:
case 303:
case 304:
case 305:
case 306:
case 307:
case 308:
case 331:
case 361:
case 362:
case 363:
case 381:
case 382:
case 383:return (*w1).shoupai[y];break;
default:printf("手牌类型参数错误!\n");return p;break;
}
}
}
int Mubiao(pai p,wujiang *w1,wujiang *w2,int*sha)
{
int x;
switch(p.leixing)
{
case 101:
if((*w1).juese)
{
printf("请选择【杀】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
scanf("%d",&x);
if(x==0)
{
if((*w1).zhuangbei[0].changdu>=(*w1).juli[0])
{
(*sha)--;
return((*w2).juese);
}
else
{
printf("武器长度不够!\n");
return -2;
}
}
else
{
printf("目标错误!\n");
return -2;
}
}
else
{
if((*w1).zhuangbei[0].changdu>=(*w1).juli[0])
{
(*sha)--;
return((*w2).juese);
}
else return -2;
}
break;
case 103:return((*w1).juese);break;
case 201:
if((*w1).juese)
{
printf("请选择【过河拆桥】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
scanf("%d",&x);
if(x==0)
{
if((*w2).shoupaishu||(*w2).zhuangbeishu||(*w2).pandingshu)return((*w2).juese);
else
{
printf("目标没有牌!\n");
return -2;
}
}
else
{
printf("目标错误!\n");
return -2;
}
}
else return((*w2).juese);
break;
case 202:
if((*w1).juese)
{
printf("请选择【顺手牵羊】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
scanf("%d",&x);
if(x==0)
{
if(((*w2).shoupaishu||(*w2).zhuangbeishu||(*w2).pandingshu)&&((*w1).juli[0]<=1))return((*w2).juese);
else
{
printf("目标没有牌!\n");
return -2;
}
}
else
{
printf("目标错误!\n");
return -2;
}
}
else
{
if((*w1).juli[0]<=1)return((*w2).juese);
else return -2;
}
break;
case 203:
return((*w1).juese);break;
case 204:
if((*w1).juese)
{
printf("请选择【决斗】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
scanf("%d",&x);
if(x==0)return((*w2).juese);
else
{
printf("目标错误!\n");
return -2;
}
}
else return((*w2).juese);
break;
case 205:
int y;
if((*w1).juese)
{
printf("请选择【借刀杀人】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
scanf("%d",&x);
if(x!=0)
{
printf("目标错误!\n");
return -2;
}
else
{
if(((*w2).zhuangbei[0]).leixing<=300||((*w2).zhuangbei[0]).leixing>=331)
{
printf("目标装备区里没有武器!\n");
return -2;
}
else
{
printf("请选择【杀】的目标!\n提示:【杀】的目标必须在【借刀杀人】的目标的攻击范围之内!\n输入目标前的编号,以回车结束!\n0 玩家\n");
scanf("%d",&y);
if(y!=0)
{
printf("目标错误!\n");
return -2;
}
else
{
if(((*w2).zhuangbei[0].changdu)<(*w2).juli[0])
{
printf("武器距离不够!\n");
return -2;
}
else
return((*w2).juese);
}
}
}
}
else
{
if(((*w2).zhuangbei[0]).leixing<=300||((*w2).zhuangbei[0]).leixing>=331)return -2;
else
{
if(((*w2).zhuangbei[0].changdu)<(*w2).juli[0])return -2;
else return((*w2).juese);
}
}
break;
case 206:
case 207:return 99;break;
case 208:
case 209:return 100;break;
case 251:
if((*w1).juese)
{
printf("请选择【乐不思蜀】的目标!\n输入目标前的编号,以回车结束!\n0 电脑1\n");
scanf("%d",&x);
if(x==0)
{
int i;
for(i=0;i<=2;i++)
{
if((*w2).pandingpai[i].leixing==251)
i=-1;
break;
}
if(i==-1)
{
printf("目标判定区里不能同时存在两张相同的延时类锦囊!\n");
return -2;
}
else return((*w2).juese);
}
else
{
printf("目标错误!\n");
return -2;
}
}
else
{
int i;
for(i=0;i<=2;i++)
{
if((*w2).pandingpai[i].leixing==251)
i=-1;
break;
}
if(i==-1)return -2;
else return((*w2).juese);
}
break;
case 252:
int i;
for(i=0;i<=2;i++)
{
if((*w1).pandingpai[i].leixing==252)
i=-1;
break;
}
if(i==-1)
{
if((*w1).juese)printf("目标判定区里不能同时存在两张相同的延时类锦囊!\n");
return -2;
}
else return ((*w1).juese);
break;
case 301:
case 302:
case 303:
case 304:
case 305:
case 306:
case 307:
case 308:
case 331:
case 361:
case 362:
case 363:
case 381:
case 382:
case 383:return((*w1).juese);break;
default:return -2;break;
}
}
void Da1pai(wujiang *w1,wujiang*w2,pai qipaidui[104],int *qipaishu,int x)
{
int i;
if((x<0||x>=((*w1).shoupaishu))&&x!=100)
printf("你的牌呢?!\n");
else
{
switch(((*w1).shoupai)[x].leixing)
{
case 101:
case 102:
case 103:
case 201:
case 202:
case 203:
case 204:
case 205:
case 206:
case 207:
case 208:
case 209:
case 210:
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
break;
case 251:
for(i=1;i>=0;i--)(*w2).pandingpai[i+1]=(*w2).pandingpai[i];
(*w2).pandingpai[0]=(*w1).shoupai[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
((*w2).pandingshu)++;
break;
case 252:
for(i=1;i>=0;i--)(*w1).pandingpai[i+1]=(*w1).pandingpai[i];
(*w1).pandingpai[0]=(*w1).shoupai[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
((*w1).pandingshu)++;
break;
case 301:
case 302:
case 303:
case 304:
case 305:
case 306:
case 307:
case 308:
if((*w1).zhuangbei[0].leixing==-1)((*w1).zhuangbeishu)++;
else
{
qipaidui[*qipaishu]=((*w1).zhuangbei)[0];
(*qipaishu)++;
}
(*w1).zhuangbei[0]=(*w1).shoupai[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
break;
case 331:
if((*w1).zhuangbei[1].leixing==-1)((*w1).zhuangbeishu)++;
else
{
qipaidui[*qipaishu]=((*w1).zhuangbei)[1];
(*qipaishu)++;
}
(*w1).zhuangbei[1]=(*w1).shoupai[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
break;
case 361:
case 362:
case 363:
if((*w1).zhuangbei[2].leixing==-1)((*w1).zhuangbeishu)++;
else
{
qipaidui[*qipaishu]=((*w1).zhuangbei)[2];
(*qipaishu)++;
}
(*w1).zhuangbei[2]=(*w1).shoupai[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
break;
case 381:
case 382:
case 383:
if((*w1).zhuangbei[3].leixing==-1)((*w1).zhuangbeishu)++;
else
{
qipaidui[*qipaishu]=((*w1).zhuangbei)[3];
(*qipaishu)++;
}
(*w1).zhuangbei[3]=(*w1).shoupai[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
break;
default:break;
}
}
}
void Miaoshu(pai p,int juese,int duixiang)
{
if(juese==0)printf("电脑");
else if(juese==1)printf("玩家");
else printf("角色参数错误!\n");
if(p.leixing<=300&&p.leixing>100)
{
switch(duixiang)
{
case -1:printf("打出");break;
case 0:printf("对电脑使用");break;
case 1:printf("对玩家使用");break;
case 99:printf("使用");break;
case 100:printf("对所有人使用");break;
default:printf("对象参数错误\n");break;
}
}
else if(p.leixing>=301&&p.leixing<=400)
printf("装备");
else printf("你出的是什么东西?\n");
p.Kanpai();
if(!juese&&(p.leixing==101||p.leixing==204||p.leixing==205||p.leixing==207||p.leixing==208||p.leixing==209))printf("请响应!\n");
}
int Wuxie(pai *p,wujiang*w1,wujiang*w2,pai qipaidui[104],int*qipaishu,int a)
{
int x;
if((*w1).juese)
{
printf("是否使用【无懈可击】响应?\n\n");
for(;;)
{
(*w1).Kanshoupai();
printf("如果要使用【无懈可击】请输入手牌之前编号,不需要请输入“-1”,以回车结束!\n");
scanf("%d",&x);
if(x==-1)
{
for(x=0;x<((*w2).shoupaishu);x++)
{
if((*w2).shoupai[x].leixing==210)
{
printf("电脑使用");
((*w2).shoupai)[x].Kanpai();
printf("对象是");
(*p).Kanpai();
(*p)=((*w2).shoupai)[x];
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(int i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
a++;
break;
}
}
break;
}
else if((*w1).shoupai[x].leixing==210)
{
printf("玩家使用");
((*w1).shoupai)[x].Kanpai();
printf("对象是");
(*p).Kanpai();
(*p)=((*w1).shoupai)[x];
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(int i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
(*w1).Kanshoupai();
a++;
break;
}
else printf("你确定你使用的是【无懈可击】?\n");
}
}
else
{
printf("是否使用【无懈可击】响应?\n");
for(;;)
{
(*w2).Kanshoupai();
printf("如果要使用【无懈可击】请输入手牌之前编号,不需要请输入“-1”,以回车结束!\n");
scanf("%d",&x);
if(x==-1)break;
else if((*w2).shoupai[x].leixing==210)
{
printf("玩家使用");
((*w2).shoupai)[x].Kanpai();
printf("对象是");
(*p).Kanpai();
(*p)=((*w2).shoupai)[x];
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(int i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
(*w2).Kanshoupai();
a++;
break;
}
else printf("你确定你使用的是【无懈可击】?\n");
}
}
return a;
}
int Qiutao(wujiang*w,pai qipaidui[104],int*qipaishu)
{
int x;
if((*w).juese)
{
for(;;)
{
printf("如果要使用【桃】请输入手牌之前的编号,不需要请输入“-1”,以回车结束!\n");
scanf("%d",&x);
if(x==-1)
{
return -1;
break;
}
else if((*w).shoupai[x].leixing==103)
{
qipaidui[*qipaishu]=((*w).shoupai)[x];
for(int i=x+1;i<=((*w).shoupaishu);i++)((*w).shoupai)[i-1]=((*w).shoupai)[i];
((*w).shoupaishu)--;
(*qipaishu)++;
return 0;
break;
}
else printf("你确定你使用的是【桃】?\n");
}
}
else
{
for(x=0;x<((*w).shoupaishu);x++)
{
if((*w).shoupai[x].leixing==103)
{
qipaidui[*qipaishu]=((*w).shoupai)[x];
for(int i=x+1;i<=((*w).shoupaishu);i++)((*w).shoupai)[i-1]=((*w).shoupai)[i];
((*w).shoupaishu)--;
(*qipaishu)++;
return 0;
break;
}
}
return -1;
}
}
int Binsi(wujiang*w1,wujiang*w2,pai qipaidui[104],int*qipaishu)
{
if(((*w2).tili)>0)return 0;
else
{
int i;
if((*w1).juese)
{
for(;;)
{
printf("电脑濒死,是否使用【桃】?\n");
i=Qiutao(w1,qipaidui,qipaishu);
if(i==0)((*w2).tili)++;
if((i==-1)||((*w2).tili>0))break;
}
if((*w2).tili>0)return 0;
else
{
for(;;)
{
i=Qiutao(w2,qipaidui,qipaishu);
if(i==0)((*w2).tili)++;
if((i==-1)||((*w2).tili>0))break;
}
if((*w2).tili>0)return 0;
else return -1;
}
}
else
{
for(;;)
{
printf("玩家濒死,是否使用【桃】?\n");
i=Qiutao(w2,qipaidui,qipaishu);
if(i==0)((*w2).tili)++;
if((i==-1)||((*w2).tili>0))break;
}
if((*w2).tili>0)return 0;
else return -1;
}
}
}
int Shan(wujiang*w1,wujiang*w2,pai paidui[104],int*paiduishu,pai qipaidui[104],int*qipaishu)
{
int x;
if((*w2).juese)
{
if(((*w2).zhuangbei[1].leixing==331)&&((*w1).zhuangbei[0].leixing!=303))
{
for(;;)
{
int m;
printf("是否发动【八卦阵】防具效果?\n0 否\n1 是\n请输入选项之前的编号,以回车结束!\n");
scanf("%d",&m);
if(m==1)
{
Panding(paidui,paiduishu,qipaidui,qipaishu);
if(qipaidui[(*qipaishu)-1].huase%2)
{
printf("【八卦阵】判定成功!\n");
return 0;
}
}
else if(m==0)
{
printf("【八卦阵】判定失败!\n");
break;
}
else printf("你确定你输入的是“0”或“1”?\n");
}
}
else if(((*w2).zhuangbei[1].leixing==331)&&((*w1).zhuangbei[0].leixing==303))printf("【青釭剑】锁定技被触发!\n");
for(;;)
{
printf("请输入手牌之前的编号,或者输入“-1”放弃打出【闪】,以回车结束!\n");
scanf("%d",&x);
if(x==-1)
{
return -1;
break;
}
else if((*w2).shoupai[x].leixing==102)
{
printf("玩家打出");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(int i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
return 0;
break;
}
else printf("你确定你打出的是【闪】?\n");
}
}
else
{
if(((*w2).zhuangbei[1].leixing==331)&&((*w1).zhuangbei[0].leixing!=303))
{
Panding(paidui,paiduishu,qipaidui,qipaishu);
if(qipaidui[(*qipaishu)-1].huase%2)
{
printf("【八卦阵】判定成功!\n");
return 0;
}
else printf("【八卦阵】判定失败!\n");
}
else if(((*w2).zhuangbei[1].leixing==331)&&((*w1).zhuangbei[0].leixing==303))printf("【青釭剑】锁定技被触发!\n");
int i;
for(x=0;x<((*w2).shoupaishu);x++)
{
if((*w2).shoupai[x].leixing==102)
{
printf("电脑打出");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
return 0;
break;
}
}
return -1;
}
}
int Sha(wujiang *w1,wujiang*w2,pai paidui[104],int*paiduishu,pai qipaidui[104],int*qipaishu)
{
int x;
if((*w2).juese)
{
printf("请打出【闪】响应【杀】!否则你将受到1点伤害!\n");
x=Shan(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
if(x==-1)
{
int i;
((*w2).tili)--;
printf("电脑对玩家造成1点伤害!\n");
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
}
else if(x==0&&((*w1).zhuangbei[0].leixing==306))
{
int i;
if(((*w1).shoupaishu)>=2)
{
printf("电脑弃掉:\n");
((*w1).shoupai)[0].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[0];
for(i=1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
((*w1).shoupai)[0].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[0];
for(i=1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
printf("发动【贯石斧】武器效果使【杀】造成伤害!\n");
((*w2).tili)--;
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
}
else return 0;
}
else if(x==0&&((*w1).zhuangbei[0].leixing==304))
{
int i;
for(x=0;x<((*w1).shoupaishu);x++)
{
if((*w1).shoupai[x].leixing==101)
{
printf("电脑发动【青龙偃月刀】效果对玩家使用");
((*w1).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
i=Sha(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
return i;
break;
}
}
return 0;
}
}
else
{
x=Shan(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
if(x==-1)
{
if((*w1).zhuangbei[0].leixing==308)
{
for(;;)
{
printf("是否发动【麒麟弓】武器效果?\n0 否\n1 是\n");
scanf("%d",&x);
if(x==1)
{
if(((*w2).zhuangbei[2].leixing==-1)&&((*w2).zhuangbei[3].leixing==-1))
{
printf("电脑根本没有马,射你妹的马啊!\n");
break;
}
else
{
for(;;)
{
printf("0 ");
((*w2).zhuangbei[2]).Kanpai();
printf("1 ");
((*w2).zhuangbei[3]).Kanpai();
printf("请选择要弃掉的马,输入之前的编号,以回车结束!\n");
scanf("%d",&x);
if((x==0)&&((*w2).zhuangbei[2].leixing!=-1))
{
printf("你弃掉了电脑的");
((*w2).zhuangbei)[2].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[2];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[2].leixing=-1;
((*w2).juli[0])++;
break;
}
else if((x==1)&&((*w2).zhuangbei[3].leixing!=-1))
{
printf("你弃掉了电脑的");
((*w2).zhuangbei)[3].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[3];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[3].leixing=-1;
((*w1).juli[0])--;
break;
}
else printf("射你妹的马!");
}
break;
}
}
else if(x==0)break;
else printf("键盘上的“0”和“1”被你吃了吗?\n");
}
}
int i;
((*w2).tili)--;
printf("玩家对电脑造成1点伤害!\n");
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
}
else if(x==0&&((*w1).zhuangbei[0].leixing==306))
{
for(;;)
{
printf("是否发动【贯石斧】武器效果?\n0 否\n1 是\n");
scanf("%d",&x);
if(x==1)
{
int i;
if((*w1).shoupaishu+(*w1).zhuangbeishu<=2)
{
printf("你除了【贯石斧】以外连2张牌都没有,发动你妹的效果!\n");
break;
}
else
{
printf("请分别弃掉两张牌!\n");
for(i=0;i<=2;i++)
{
for(;;)
{
printf("请选择区域:\n0 手牌\n1 装备\n");
scanf("%d",&x);
if(x==0&&((*w1).shoupaishu==0))printf("你根本没有手牌,弃你妹啊!\n");
else if(x==1&&((*w1).zhuangbeishu==1))printf("你根本没有别的装备,弃你妹啊!\n");
else if(x>=0&&x<=1)break;
else printf("键盘上的“0”和“1”被你吃了吗?\n");
}
if(x==0)
{
for(;;)
{
(*w1).Kanshoupai();
printf("弃牌请输入手牌之前的编号,以回车结束!\n");
scanf("%d",&x);
if(x>=0&&x<((*w1).shoupaishu))break;
else printf("弃你妹的手牌!\n");
}
printf("你弃掉了");
((*w1).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
}
else
{
for(;;)
{
(*w1).Kanzhuangbei();
printf("请输入装备之前的编号,以回车键结束!\n");
scanf("%d",&x);
if((((*w1).zhuangbei[x]).leixing!=-1)&&(x>=0)&&(x<=3))
{
printf("你弃掉了");
((*w1).zhuangbei)[x].Kanpai();
qipaidui[*qipaishu]=((*w1).zhuangbei)[x];
((*w1).zhuangbeishu)--;
(*qipaishu)++;
((*w1).zhuangbei)[x].leixing=-1;
break;
}
else printf("弃你妹的装备!\n");
}
}
}
}
printf("玩家发动【贯石斧】武器效果使【杀】造成伤害!\n");
((*w2).tili)--;
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
break;
}
else if(x==0)break;
else printf("键盘上的“0”和“1”被你吃了吗?\n");
}
}
else if(x==0&&((*w1).zhuangbei[0].leixing==304))
{
for(;;)
{
printf("是否发动【青龙偃月刀】武器效果?\n0 否\n1 是\n");
scanf("%d",&x);
if(x==1)
{
for(;;)
{
printf("请对电脑使用一张【杀】!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");
(*w1).Kanshoupai();
scanf("%d",&x);
if(x==-1)
{
return 0;
break;
}
else if((*w1).shoupai[x].leixing==101)
{
int i;
printf("玩家对电脑使用");
((*w1).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
i=Sha(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
return i;
break;
}
else printf("你确定你打出的是【杀】?\n");
}
}
else if(x==0)
{
return 0;
break;
}
else printf("你确定你输入的是“0”或“1”?\n");
}
}
else return 0;
}
return 0;
}
void Tao(wujiang*w1)
{
((*w1).tili)++;
if((*w1).juese)printf("玩家");
else printf("电脑");
printf("恢复了1点体力!\n");
if(((*w1).tili)>((*w1).tilishangxian))printf("你被撑死了!\n");
}
void Chai(wujiang*w1,wujiang*w2,pai qipaidui[104],int*qipaishu)
{
int i,x,y;
if((*w1).juese)
{
for(;;)
{
if((*w2).shoupaishu+(*w2).zhuangbeishu+(*w2).pandingshu==0)
{
printf("对方空城,拆你妹啊!\n");
break;
}
else
{
printf("请选择想拆的区域,输入选项之前的编号,以回车结束!\n0 手牌\n1 装备区\n2 判定区\n");
scanf("%d",&x);
if(x==0&&((*w2).shoupaishu==0))printf("你拆掉了一张空气!\n");
else if(x==1&&((*w2).zhuangbeishu==0))printf("你拆掉了一张空气!\n");
else if(x==2&&((*w2).pandingshu==0))printf("你拆掉了一张空气!\n");
else if(x>=0&&x<=2)break;
else printf("你拆掉了太空区里的一张牌!\n");
}
}
switch(x)
{
case 0:
srand((unsigned)time(NULL));
y=rand()%((*w2).shoupaishu);
printf("你弃掉了电脑的");
((*w2).shoupai)[y].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[y];
for(i=y+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
break;
case 1:
for(;;)
{
(*w2).Kanzhuangbei();
printf("请输入装备之前的编号,以回车键结束!\n");
scanf("%d",&y);
if((((*w2).zhuangbei[y]).leixing!=-1)&&(y>=0)&&(y<=3))
{
printf("你弃掉了电脑的");
((*w2).zhuangbei)[y].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[y];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[y].leixing=-1;
if(!y)((*w2).zhuangbei)[y].changdu=1;
else if(y==2)((*w2).juli[0])++;
else if(y==3)((*w1).juli[0])--;
break;
}
else printf("你弃掉了一张空气!\n");
}
break;
case 2:
for(;;)
{
(*w2).Kanpandingpai();
printf("请输入判定牌之前的编号,以回车键结束!\n");
scanf("%d",&y);
if((*w2).pandingpai[y].leixing!=-1)
{
printf("你弃掉了电脑的");
((*w2).pandingpai)[y].Kanpai();
qipaidui[*qipaishu]=((*w2).pandingpai)[y];
((*w2).pandingshu)--;
(*qipaishu)++;
((*w2).pandingpai)[y].leixing=-1;
break;
}
else printf("你弃掉了一张空气!\n");
}
break;
default:break;
}
}
else
{
if((*w2).zhuangbeishu)
{
if((*w2).zhuangbei[1].leixing!=-1)
{
printf("电脑弃掉了玩家的");
((*w2).zhuangbei)[1].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[1];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[1].leixing=-1;
}
else if((*w2).zhuangbei[3].leixing!=-1)
{
printf("电脑弃掉了玩家的");
((*w2).zhuangbei)[3].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[3];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[3].leixing=-1;
((*w1).juli[0])--;
}
else if((*w2).zhuangbei[0].leixing!=-1)
{
printf("电脑弃掉了玩家的");
((*w2).zhuangbei)[0].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[0];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[0].leixing=-1;
((*w2).zhuangbei)[0].changdu=1;
}
else
{
printf("电脑弃掉了玩家的");
((*w2).zhuangbei)[2].Kanpai();
qipaidui[*qipaishu]=((*w2).zhuangbei)[2];
((*w2).zhuangbeishu)--;
(*qipaishu)++;
((*w2).zhuangbei)[2].leixing=-1;
((*w2).juli[0])++;
}
}
else
{
srand((unsigned)time(NULL));
y=rand()%((*w2).shoupaishu);
printf("电脑弃掉了玩家的手牌");
((*w2).shoupai)[y].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[y];
for(i=y+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
}
}
}
void Qian(wujiang *w1,wujiang *w2)
{
int i,x,y;
if((*w1).juese)
{
for(;;)
{
if((*w2).shoupaishu+(*w2).zhuangbeishu+(*w2).pandingshu==0)
{
printf("对方空城啦!你牵走了一张寂寞!\n");
break;
}
else
{
printf("请选择想牵的区域,输入选项之前的编号,以回车结束!\n0 手牌\n1 装备区\n2 判定区\n");
scanf("%d",&x);
if(x==0&&((*w2).shoupaishu==0))printf("你牵走了一张空气!\n");
else if(x==1&&((*w2).zhuangbeishu==0))printf("你牵走了一张空气!\n");
else if(x==2&&((*w2).pandingshu==0))printf("你牵走了一张空气!\n");
else if(x>=0&&x<=2)break;
else printf("你牵走了太空区里的一张牌!\n");
}
}
switch(x)
{
case 0:
srand((unsigned)time(NULL));
y=rand()%((*w2).shoupaishu);
printf("你牵走了电脑的");
((*w2).shoupai)[y].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).shoupai)[y];
for(i=y+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
((*w1).shoupaishu)++;
break;
case 1:
for(;;)
{
(*w2).Kanzhuangbei();
printf("请输入装备之前的编号,以回车键结束!\n");
scanf("%d",&y);
if((((*w2).zhuangbei[y]).leixing!=-1)&&(y>=0)&&(y<=3))
{
printf("你牵走了电脑的");
((*w2).zhuangbei)[y].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[y];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[y].leixing=-1;
if(!y)((*w2).zhuangbei[y]).changdu=1;
else if(y==2)((*w2).juli[0])++;
else if(y==3)((*w1).juli[0])--;
break;
}
else printf("你弃掉了一张空气!\n");
}
break;
case 2:
for(;;)
{
(*w2).Kanpandingpai();
printf("请输入判定牌之前的编号,以回车键结束!\n");
scanf("%d",&y);
if((*w2).pandingpai[y].leixing!=-1)
{
printf("你牵走了电脑的");
((*w2).pandingpai)[y].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).pandingpai)[y];
((*w2).pandingshu)--;
((*w1).shoupaishu)++;
((*w2).pandingpai)[y].leixing=-1;
break;
}
else printf("你牵走了一张空气!\n");
}
break;
default:break;
}
}
else
{
if((*w2).zhuangbeishu)
{
if((*w2).zhuangbei[1].leixing!=-1)
{
printf("电脑牵走了玩家的");
((*w2).zhuangbei)[1].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[1];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[1].leixing=-1;
}
else if((*w2).zhuangbei[3].leixing!=-1)
{
printf("电脑牵走了玩家的");
((*w2).zhuangbei)[3].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[3];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[3].leixing=-1;
((*w1).juli[0])--;
}
else if((*w2).zhuangbei[0].leixing!=-1)
{
printf("电脑牵走了玩家的");
((*w2).zhuangbei)[0].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[0];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[0].leixing=-1;
((*w2).zhuangbei)[0].changdu=1;
}
else
{
printf("电脑牵走了玩家的");
((*w2).zhuangbei)[2].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[2];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[2].leixing=-1;
((*w2).juli[0])--;
}
}
else
{
srand((unsigned)time(NULL));
y=rand()%((*w2).shoupaishu);
printf("电脑牵走了玩家的手牌");
((*w2).shoupai)[y].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).shoupai)[y];
for(i=y+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
((*w1).shoupaishu)++;
}
}
}
void Wuzhong(wujiang*w1,pai A[104],int *x,pai B[104],int*y)
{
Mopai(&((*w1).shoupaishu),(*w1).shoupai,A,x,B,y,(*w1).juese);
}
int Juedou(wujiang*w1,wujiang*w2,pai qipaidui[104],int*qipaishu)
{
int i,j,x;
if((*w1).juese)
{
for(;;)
{
j=0;
for(x=0;x<((*w2).shoupaishu);x++)
{
if((*w2).shoupai[x].leixing==101)
{
printf("电脑打出");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(int i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
j=1;
break;
}
}
if(!j)
{
printf("玩家对电脑造成1点伤害!\n");
((*w2).tili)--;
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
break;
}
j=0;
for(;;)
{
printf("请打出一张【杀】响应【决斗】,否则你将受到1点伤害!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");
if(((*w1).zhuangbei[0].leixing==305))printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");
(*w1).Kanshoupai();
scanf("%d",&x);
if(x==-1)
{
int i;
((*w1).tili)--;
printf("电脑对玩家造成1点伤害!\n");
i=Binsi(w2,w1,qipaidui,qipaishu);
return i;
break;
}
else if(((*w1).zhuangbei[0].leixing==305)&&x==100)
{
pai p=Zhangba(w1,qipaidui,qipaishu);
p.paifu=-1;
printf("打出!\n");
j=1;
break;
}
else if((*w1).shoupai[x].leixing==101)
{
printf("玩家打出");
((*w1).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
j=1;
break;
}
else printf("你确定你打出的是【杀】?\n");
}
}
}
else
{
for(;;)
{
j=0;
for(;;)
{
printf("请打出一张【杀】响应【决斗】,否则你将受到1点伤害!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");
if(((*w1).zhuangbei[0].leixing==305))printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");
(*w2).Kanshoupai();
scanf("%d",&x);
if(x==-1)
{
int i;
((*w2).tili)--;
printf("电脑对玩家造成1点伤害!\n");
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
break;
}
else if(((*w2).zhuangbei[0].leixing==305)&&x==100)
{
pai p=Zhangba(w2,qipaidui,qipaishu);
p.paifu=-1;
printf("打出!\n");
j=1;
break;
}
else if((*w2).shoupai[x].leixing==101)
{
printf("玩家打出");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
j=1;
break;
}
else printf("你确定你打出的是【杀】?\n");
}
j=0;
for(x=0;x<((*w1).shoupaishu);x++)
{
if((*w1).shoupai[x].leixing==101)
{
printf("电脑打出");
((*w1).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w1).shoupai)[x];
for(int i=x+1;i<=((*w1).shoupaishu);i++)((*w1).shoupai)[i-1]=((*w1).shoupai)[i];
((*w1).shoupaishu)--;
(*qipaishu)++;
j=1;
break;
}
}
if(!j)
{
printf("玩家对电脑造成1点伤害!\n");
((*w2).tili)--;
i=Binsi(w2,w1,qipaidui,qipaishu);
return i;
break;
}
}
}
}
int Jiedao(wujiang*w1,wujiang*w2,pai paidui[104],int*paiduishu,pai qipaidui[104],int*qipaishu)
{
int i,j=0,x;
if((*w1).juese)
{
for(x=0;x<((*w2).shoupaishu);x++)
{
if((*w2).shoupai[x].leixing==101)
{
printf("电脑对玩家使用");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(int i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
j=1;
break;
}
}
if(j)
{
i=Sha(w2,w1,paidui,paiduishu,qipaidui,qipaishu);
return i;
printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w1).tili,(*w1).tilishangxian,(*w2).tili,(*w2).tilishangxian);
}
else
{
printf("电脑放弃使用【杀】,玩家获得电脑的武器");
(*w2).zhuangbei[0].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[0];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[0].leixing=-1;
((*w2).zhuangbei)[0].changdu=1;
(*w1).Kanshoupai();
return 0;
}
}
else
{
for(;;)
{
printf("请对电脑使用一张【杀】,否则电脑将获得你的武器!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");
if(((*w2).zhuangbei[0].leixing==305))printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");
(*w2).Kanshoupai();
scanf("%d",&x);
if(x==-1)break;
else if(((*w2).zhuangbei[0].leixing==305)&&x==100)
{
pai p=Zhangba(w2,qipaidui,qipaishu);
p.paifu=-1;
printf("使用!\n");
j=1;
break;
}
else if((*w2).shoupai[x].leixing==101)
{
printf("玩家对电脑使用");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
j=1;
break;
}
else printf("你确定你使用的是【杀】?\n");
}
if(j)
{
i=Sha(w2,w1,paidui,paiduishu,qipaidui,qipaishu);
return i;
printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w2).tili,(*w2).tilishangxian,(*w1).tili,(*w1).tilishangxian);
}
else
{
printf("玩家放弃使用【杀】,电脑获得玩家的武器");
((*w2).zhuangbei)[0].Kanpai();
(*w1).shoupai[(*w1).shoupaishu]=((*w2).zhuangbei)[0];
((*w2).zhuangbeishu)--;
((*w1).shoupaishu)++;
((*w2).zhuangbei)[0].leixing=-1;
((*w2).zhuangbei)[0].changdu=1;
return 0;
}
}
}
void Taoyuan(wujiang*w)
{
if((*w).tili<(*w).tilishangxian)
{
((*w).tili)++;
if((*w).juese)printf("玩家");
else printf("电脑");
printf("恢复1点体力!\n");
}
}
void Kaipai(pai paidui[104],int* paiduishu,int renshu,pai wugu[10])
{
int i;
printf("五谷丰登开牌:\n");
for(i=1;i<=renshu;i++)
{
wugu[i-1]=paidui[104-(*paiduishu)];
(*paiduishu)--;
printf("%d ",i-1);
wugu[i-1].Kanpai();
}
}
void Qupai(pai wugu[10],wujiang*w)
{
int i,x;
printf("五谷丰登开牌:\n");
for(i=0;(wugu[i].leixing)!=-1;i++)
{
printf("%d ",i);
wugu[i].Kanpai();
}
if((*w).juese)
{
for(;;)
{
printf("请选择你想要的卡牌,输入卡牌之前的编号,以回车结束!\n");
scanf("%d",&x);
if(wugu[x].leixing!=-1)
{
printf("玩家选择");
wugu[x].Kanpai();
(*w).shoupai[(*w).shoupaishu]=wugu[x];
((*w).shoupaishu)++;
for(i=x+1;i<=9;i++)wugu[i-1]=wugu[i];
wugu[9].leixing=-1;
break;
}
printf("你选择了一张空气加入手牌!");
}
}
else
{
printf("电脑选择");
wugu[0].Kanpai();
(*w).shoupai[(*w).shoupaishu]=wugu[0];
((*w).shoupaishu)++;
for(i=1;i<=9;i++)wugu[i-1]=wugu[i];
wugu[9].leixing=-1;
}
}
void Rengpai(pai wugu[10],pai qipaidui[104],int*qipaishu)
{
int i;
for(i=0;wugu[i].leixing!=-1;i++)
{
qipaidui[*qipaishu]=wugu[i];
(*qipaishu)++;
wugu[i].leixing=-1;
}
}
int Nanman(wujiang*w1,wujiang*w2,pai qipaidui[104],int*qipaishu)
{
int i,x;
if((*w1).juese)
{
for(x=0;x<((*w2).shoupaishu);x++)
{
if((*w2).shoupai[x].leixing==101)
{
printf("电脑打出");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(int i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
return 0;
break;
}
}
printf("玩家对电脑造成1点伤害!\n");
((*w2).tili)--;
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
}
else
{
for(;;)
{
printf("请打出一张【杀】响应【南蛮入侵】,否则你将受到1点伤害!\n请输入手牌之前的编号,或者输入“-1”放弃出【杀】,以回车结束!\n");
if(((*w2).zhuangbei[0].leixing==305))printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");
(*w2).Kanshoupai();
scanf("%d",&x);
if(x==-1)
{
int i;
((*w2).tili)--;
printf("电脑对玩家造成1点伤害!\n");
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
break;
}
else if(((*w2).zhuangbei[0].leixing==305)&&x==100)
{
pai p=Zhangba(w2,qipaidui,qipaishu);
p.paifu=-1;
printf("使用!\n");
return 0;
break;
}
else if((*w2).shoupai[x].leixing==101)
{
printf("玩家打出");
((*w2).shoupai)[x].Kanpai();
qipaidui[*qipaishu]=((*w2).shoupai)[x];
for(i=x+1;i<=((*w2).shoupaishu);i++)((*w2).shoupai)[i-1]=((*w2).shoupai)[i];
((*w2).shoupaishu)--;
(*qipaishu)++;
return 0;
break;
}
else printf("你确定你打出的是【杀】?\n");
}
}
}
int Wanjian(wujiang*w1,wujiang*w2,pai paidui[104],int*paiduishu,pai qipaidui[104],int*qipaishu)
{
int i;
i=Shan(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
if(i==-1)
{
i=Binsi(w1,w2,qipaidui,qipaishu);
return i;
}
else return 0;
}
int Chupai(pai paidui[104],pai qipaidui[104],int *paiduishu,int*qipaishu,wujiang*w1,wujiang*w2,pai yuanshipaidui[2][4][13])
{
pai p1;
int sha=1;int y=-1,i,t=((*w1).shoupaishu)-1;
for(;;t--)
{
if((*w1).juese)
{
printf("\n电脑当前手牌数:%d\n",((*w2).shoupaishu));
(*w2).Kanzhuangbei();
(*w1).Kanshoupai();
(*w1).Kanzhuangbei();
}
int j=0;
if((*w1).juese&&((*w1).zhuangbei[0].leixing==305))printf("如果想发动【丈八蛇矛】效果,请输入“100”,以回车结束!\n");
y=Xuanpai(w1,t);
p1=Panpai(w1,&sha,y,qipaidui,qipaishu);
if((p1).leixing==-1)break;
else if((p1).leixing==0)continue;
else
{
int duixiang;
duixiang=Mubiao(p1,w1,w2,&sha);
if(duixiang==-2)continue;
else
{
Da1pai(w1,w2,qipaidui,qipaishu,y);
Miaoshu(p1,((*w1).juese),duixiang);
if(!((*w1).juese))
{
printf("\n电脑当前手牌数:%d\n",((*w1).shoupaishu));
(*w1).Kanzhuangbei();
(*w2).Kanshoupai();
(*w2).Kanzhuangbei();
}
switch(p1.leixing)
{
case 101:
i=Sha(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
if(i==-1){return -1;break;}
if((*w1).juese)printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w1).tili,(*w1).tilishangxian,(*w2).tili,(*w2).tilishangxian);
else printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w2).tili,(*w2).tilishangxian,(*w1).tili,(*w1).tilishangxian);
break;
case 103:
Tao(w1);
break;
case 201:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Chai(w1,w2,qipaidui,qipaishu);
else;
if((*w1).juese)(*w1).Kanshoupai();
break;
case 202:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Qian(w1,w2);
else;
if((*w1).juese)(*w1).Kanshoupai();
break;
case 203:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Wuzhong(w1,paidui,paiduishu,qipaidui,qipaishu);
else;
break;
case 204:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))
{
i=Juedou(w1,w2,qipaidui,qipaishu);
if(i==-1)return -1;
if((*w1).juese)printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w1).tili,(*w1).tilishangxian,(*w2).tili,(*w2).tilishangxian);
else printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w2).tili,(*w2).tilishangxian,(*w1).tili,(*w1).tilishangxian);
}
break;
case 205:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))
{
i=Jiedao(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
if(i==-1)return -1;
if((*w1).juese)printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w1).tili,(*w1).tilishangxian,(*w2).tili,(*w2).tilishangxian);
else printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w2).tili,(*w2).tilishangxian,(*w1).tili,(*w1).tilishangxian);
}
break;
case 206:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Taoyuan(w1);
j=0;
for(;;)
{
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Taoyuan(w2);
break;
case 207:
pai wugu[10];
for(i=1;i<=10;i++)wugu[i-1].leixing=-1;
Kaipai(paidui,paiduishu,2,wugu);
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Qupai(wugu,w1);
for(;;)
{
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))Qupai(wugu,w2);
Rengpai(wugu,qipaidui,qipaishu); printf("弃牌数:%d\n",*qipaishu);
break;
case 208:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))
{
i=Nanman(w1,w2,qipaidui,qipaishu);
if(i==-1)return -1;
if((*w1).juese)printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w1).tili,(*w1).tilishangxian,(*w2).tili,(*w2).tilishangxian);
else printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w2).tili,(*w2).tilishangxian,(*w1).tili,(*w1).tilishangxian);
}
break;
case 209:
for(;;)
{
i=Wuxie(&p1,w1,w2,qipaidui,qipaishu,0);
if(!i)break;
j++;
i=Wuxie(&p1,w2,w1,qipaidui,qipaishu,0);
if(!i)break;
j++;
}
if(!(j%2))
{
i=Wanjian(w1,w2,paidui,paiduishu,qipaidui,qipaishu);
if(i==-1)return -1;
if((*w1).juese)printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w1).tili,(*w1).tilishangxian,(*w2).tili,(*w2).tilishangxian);
else printf("玩家当前体力值:%d/%d\n电脑当前体力值:%d/%d\n",(*w2).tili,(*w2).tilishangxian,(*w1).tili,(*w1).tilishangxian);
}
break;
case 361:
case 362:
case 363:
((*w1).juli[0])--;break;
case 381:
case 382:
case 383:
((*w2).juli[0])++;break;
default:break;
}
printf("\n");
}
}
}
return 0;
}
void Qipai(pai shoupai[20],int *shoupaishu,pai qipaidui[104],int *qipaishu,int juese,int *shoupaishangxian)
{
int x;
if((*shoupaishu)>(*shoupaishangxian))
{
if(juese!=1&&juese!=0)printf("身份参数错误!");
int q=(*shoupaishu)-(*shoupaishangxian);
int i,j;
for(j=1;j<=q;j++)
{
for(;;)
{
if(juese)
{
printf("弃牌请输入手牌之前的编号,以回车结束!\n注:一次只能弃一张牌\n");
printf("手牌数:%d\n",*shoupaishu);
scanf("%d",&x);
if(x>=0&&x<(*shoupaishu))break;
else printf("你弃掉了一张空气!\n");
}
else
{
srand((unsigned)time(NULL));
x=rand()%(*shoupaishu);
break;
}
}
qipaidui[*qipaishu]=shoupai[x];
for(i=x+1;i<=(*shoupaishu);i++)shoupai[i-1]=shoupai[i];
(*shoupaishu)--;
if(juese)printf("弃牌阶段玩家弃置");
else printf("弃牌阶段电脑弃置");
qipaidui[*qipaishu].Kanpai();
(*qipaishu)++;
int m;
if(juese)
{
printf("玩家当前手牌:\n");
for(m=0;m<=(*shoupaishu-1);m++)
{
printf("%d ",m);
(shoupai[m]).Kanpai();
}
} printf("弃牌堆:%d\n",*qipaishu);
}
}
}
int Huihe(pai A[104],pai B[104],int *x,int *y,pai yuanshipaidui[2][4][13],wujiang *w1,wujiang *w2)
{
printf("\n回合开始阶段……\n");
switch((*w1).huihekaishi)
{
case 0:break;
default:printf("回合开始阶段参数错误!\n");break;
}
printf("判定阶段……\n");
int K=0;
if((*w1).pandingshu>0)
{
int i,j;
for(;(*w1).pandingshu;)
{
switch((*w1).pandingpai[0].leixing)
{
case 251:printf("【乐不思蜀】开始判定……\n"); break;
case 252:printf("【闪电】开始判定……\n");break;
default:printf("【??】开始判定……\n");break;
}
j=0;
pai p=((*w1).pandingpai[0]);
for(;;)//在判定之前询问【无懈】
{
i=Wuxie(&p,w2,w1,B,y,0);
if(!i)break;
j++;
i=Wuxie(&p,w1,w2,B,y,0);
if(!i)break;
j++;
}
switch((*w1).pandingpai[0].leixing)
{
case 251:
if(!(j%2))
{
printf("【乐不思蜀】的判定牌是:");
Panding(A,x,B,y);
if((B[(*y)-1].huase)!=1)
{
printf("【乐不思蜀】判定成功!\n");
if((*w1).juese)printf("玩家");
else printf("电脑");
printf("跳过出牌阶段!\n");
K=-1;
}
else printf("【乐不思蜀】判定失败!\n");
}
B[*y]=(*w1).pandingpai[0];
((*w1).pandingshu)--;
(*w1).pandingpai[0]=(*w1).pandingpai[1];
(*w1).pandingpai[1]=(*w1).pandingpai[2];
(*w1).pandingpai[2].leixing=-1;
(*y)++;
break;
case 252:
if(!(j%2))
{
printf("【闪电】的判定牌是:");
Panding(A,x,B,y);
if((B[(*y)-1].huase==0)&&(B[(*y)-1].dianshu>=1)&&(B[(*y)-1].dianshu<=8))
{
printf("【闪电】判定成功!\n");
if((*w1).juese)printf("玩家");
else printf("电脑");
printf("受到3点雷电伤害!");
((*w1).tili)=((*w1).tili)-3;
i=Binsi(w2,w1,B,y);
B[*y]=(*w1).pandingpai[0];
((*w1).pandingshu)--;
(*w1).pandingpai[0]=(*w1).pandingpai[1];
(*w1).pandingpai[1]=(*w1).pandingpai[2];
(*w1).pandingpai[2].leixing=-1;
(*y)++;
if(i==-1)return -1;
}
else
{
printf("【闪电】判定失败!\n");
(*w2).pandingpai[2]=(*w2).pandingpai[1];
(*w2).pandingpai[1]=(*w2).pandingpai[0];
(*w2).pandingpai[0]=(*w1).pandingpai[0];
(*w1).pandingpai[0]=(*w1).pandingpai[1];
(*w1).pandingpai[1]=(*w1).pandingpai[2];
(*w1).pandingpai[2].leixing=-1;
((*w1).pandingshu)--;
((*w2).pandingshu)++;
}
break;
}
default:printf("判定牌错误!");
} printf("弃牌数:%d\n",*y);
}
}
else if(!((*w1).pandingshu));
else printf("判定阶段参数错误!\n");
printf("摸牌阶段……\n");
switch((*w1).mopai)
{
case 0:Mopai(&((*w1).shoupaishu),(*w1).shoupai,A,x,B,y,(*w1).juese);break;
case -1:break;
default:printf("摸牌阶段参数错误!\n");break;
}
if(K==-1)goto M;
printf("出牌阶段……\n");
switch((*w1).chupai)
{
case 0:
{
int i;
i=Chupai(A,B,x,y,w1,w2,yuanshipaidui);
if(i==-1)
{
return -1;
break;
}
else break;
}
case -1:break;
default:printf("出牌阶段参数错误!\n");break;
}
M:
printf("弃牌阶段……\n");
switch((*w1).qipai)
{
case 0:
Qipai((*w1).shoupai,&((*w1).shoupaishu),B,y,(*w1).juese,&((*w1).tili));break;
default:printf("弃牌阶段参数错误!\n");break;
}
printf("回合结束阶段……\n");
switch((*w1).huihejieshu)
{
case 0:break;
default:printf("回合结束阶段参数错误!\n");break;
}
return 0;
}
int main()
{
void Kanshoupai(pai p);
pai yuanshipaidui[2][4][13],qipaidui[104],paidui[104];
wujiang wanjia,com;
com.tili=wanjia.tili=5;
com.tilishangxian=wanjia.tilishangxian=5;
com.huihekaishi=wanjia.huihekaishi=0;
com.panding=wanjia.panding=0;
com.mopai=wanjia.mopai=0;
com.chupai=wanjia.chupai=0;
com.qipai=wanjia.qipai=0;
com.huihejieshu=wanjia.huihejieshu=0;
com.shoupaishu=wanjia.shoupaishu=0;
com.pandingshu=wanjia.pandingshu=0;
com.zhuangbeishu=wanjia.zhuangbeishu=0;
com.juese=0;wanjia.juese=1;
pai p;
p.leixing=-1;
com.zhuangbei[0]=com.zhuangbei[1]=com.zhuangbei[2]=com.zhuangbei[3]=wanjia.zhuangbei[0]=wanjia.zhuangbei[1]=wanjia.zhuangbei[2]=wanjia.zhuangbei[3]=p;
com.zhuangbei[0].changdu=wanjia.zhuangbei[0].changdu=1;
com.pandingpai[0]=com.pandingpai[1]=com.pandingpai[2]=wanjia.pandingpai[0]=wanjia.pandingpai[1]=wanjia.pandingpai[2]=p;
com.juli[0]=wanjia.juli[0]=1;
int a,b,c;
for(a=0;a<=1;a++)
{
for(b=0;b<=3;b++)
{
for(c=0;c<=12;c++)
{
yuanshipaidui[a][b][c].paifu=a;
yuanshipaidui[a][b][c].huase=b;
yuanshipaidui[a][b][c].dianshu=c;
}
}
}
yuanshipaidui[0][0][0].leixing=204;
yuanshipaidui[0][0][1].leixing=331;
yuanshipaidui[0][0][2].leixing=201;
yuanshipaidui[0][0][3].leixing=201;
yuanshipaidui[0][0][4].leixing=304;yuanshipaidui[0][0][4].changdu=3;
yuanshipaidui[0][0][5].leixing=251;
yuanshipaidui[0][0][6].leixing=101;
yuanshipaidui[0][0][7].leixing=101;
yuanshipaidui[0][0][8].leixing=101;
yuanshipaidui[0][0][9].leixing=101;
yuanshipaidui[0][0][10].leixing=202;
yuanshipaidui[0][0][11].leixing=201;
yuanshipaidui[0][0][12].leixing=208;
yuanshipaidui[0][1][0].leixing=209;
yuanshipaidui[0][1][1].leixing=102;
yuanshipaidui[0][1][2].leixing=103;
yuanshipaidui[0][1][3].leixing=103;
yuanshipaidui[0][1][4].leixing=308;yuanshipaidui[0][1][4].changdu=5;
yuanshipaidui[0][1][5].leixing=103;
yuanshipaidui[0][1][6].leixing=103;
yuanshipaidui[0][1][7].leixing=103;
yuanshipaidui[0][1][8].leixing=103;
yuanshipaidui[0][1][9].leixing=101;
yuanshipaidui[0][1][10].leixing=101;
yuanshipaidui[0][1][11].leixing=103;
yuanshipaidui[0][1][12].leixing=102;
yuanshipaidui[0][2][0].leixing=204;
yuanshipaidui[0][2][1].leixing=101;
yuanshipaidui[0][2][2].leixing=101;
yuanshipaidui[0][2][3].leixing=101;
yuanshipaidui[0][2][4].leixing=101;
yuanshipaidui[0][2][5].leixing=101;
yuanshipaidui[0][2][6].leixing=101;
yuanshipaidui[0][2][7].leixing=101;
yuanshipaidui[0][2][8].leixing=101;
yuanshipaidui[0][2][9].leixing=101;
yuanshipaidui[0][2][10].leixing=101;
yuanshipaidui[0][2][11].leixing=205;
yuanshipaidui[0][2][12].leixing=205;
yuanshipaidui[0][3][0].leixing=204;
yuanshipaidui[0][3][1].leixing=102;
yuanshipaidui[0][3][2].leixing=102;
yuanshipaidui[0][3][3].leixing=102;
yuanshipaidui[0][3][4].leixing=102;
yuanshipaidui[0][3][5].leixing=101;
yuanshipaidui[0][3][6].leixing=101;
yuanshipaidui[0][3][7].leixing=101;
yuanshipaidui[0][3][8].leixing=101;
yuanshipaidui[0][3][9].leixing=101;
yuanshipaidui[0][3][10].leixing=102;
yuanshipaidui[0][3][11].leixing=103;
yuanshipaidui[0][3][12].leixing=101;
yuanshipaidui[1][0][0].leixing=252;
yuanshipaidui[1][0][1].leixing=302;yuanshipaidui[1][0][1].changdu=2;
yuanshipaidui[1][0][2].leixing=202;
yuanshipaidui[1][0][3].leixing=202;
yuanshipaidui[1][0][4].leixing=383;
yuanshipaidui[1][0][5].leixing=303;yuanshipaidui[1][0][5].changdu=2;
yuanshipaidui[1][0][6].leixing=208;
yuanshipaidui[1][0][7].leixing=101;
yuanshipaidui[1][0][8].leixing=101;
yuanshipaidui[1][0][9].leixing=101;
yuanshipaidui[1][0][10].leixing=210;
yuanshipaidui[1][0][11].leixing=305;yuanshipaidui[1][0][11].changdu=3;
yuanshipaidui[1][0][12].leixing=362;
yuanshipaidui[1][1][0].leixing=206;
yuanshipaidui[1][1][1].leixing=102;
yuanshipaidui[1][1][2].leixing=207;
yuanshipaidui[1][1][3].leixing=207;
yuanshipaidui[1][1][4].leixing=361;
yuanshipaidui[1][1][5].leixing=251;
yuanshipaidui[1][1][6].leixing=203;
yuanshipaidui[1][1][7].leixing=203;
yuanshipaidui[1][1][8].leixing=203;
yuanshipaidui[1][1][9].leixing=101;
yuanshipaidui[1][1][10].leixing=203;
yuanshipaidui[1][1][11].leixing=201;
yuanshipaidui[1][1][12].leixing=381;
yuanshipaidui[1][2][0].leixing=301;yuanshipaidui[1][2][0].changdu=1;
yuanshipaidui[1][2][1].leixing=331;
yuanshipaidui[1][2][2].leixing=201;
yuanshipaidui[1][2][3].leixing=201;
yuanshipaidui[1][2][4].leixing=382;
yuanshipaidui[1][2][5].leixing=251;
yuanshipaidui[1][2][6].leixing=208;
yuanshipaidui[1][2][7].leixing=101;
yuanshipaidui[1][2][8].leixing=101;
yuanshipaidui[1][2][9].leixing=101;
yuanshipaidui[1][2][10].leixing=101;
yuanshipaidui[1][2][11].leixing=210;
yuanshipaidui[1][2][12].leixing=210;
yuanshipaidui[1][3][0].leixing=301;yuanshipaidui[1][3][0].changdu=1;
yuanshipaidui[1][3][1].leixing=102;
yuanshipaidui[1][3][2].leixing=202;
yuanshipaidui[1][3][3].leixing=202;
yuanshipaidui[1][3][4].leixing=306;yuanshipaidui[1][3][4].changdu=3;
yuanshipaidui[1][3][5].leixing=102;
yuanshipaidui[1][3][6].leixing=102;
yuanshipaidui[1][3][7].leixing=102;
yuanshipaidui[1][3][8].leixing=102;
yuanshipaidui[1][3][9].leixing=102;
yuanshipaidui[1][3][10].leixing=102;
yuanshipaidui[1][3][11].leixing=307;yuanshipaidui[1][3][11].changdu=4;
yuanshipaidui[1][3][12].leixing=363;
int paiduishu=104;
int qipaishu=0;
printf("游戏开始!\n");
Qishixipai(yuanshipaidui,paidui);
Qishishoupai(&wanjia,paidui,&(paiduishu),qipaidui,&(qipaishu));
Qishishoupai(&com,paidui,&(paiduishu),qipaidui,&(qipaishu));
int i;
for(;;)
{
i=Huihe(paidui,qipaidui,&paiduishu,&qipaishu,yuanshipaidui,&wanjia,&com);
if(i==-1)break;
i=Huihe(paidui,qipaidui,&paiduishu,&qipaishu,yuanshipaidui,&com,&wanjia);
if(i==-1)break;
}}
推箱子4
//转自:https://www.luogu.com.cn/paste/2wljsz87
//作者:https://www.luogu.com.cn/user/454526
#include<iostream>
#include<stdio.h>
#include<conio.h>
#include <windows.h>
using namespace std;
void Game_Menu(HANDLE hout);
void Game_description(HANDLE hout);
void gotoxy(HANDLE hout, int x, int y);
int DrawMap(HANDLE hout);
void Move(HANDLE hout);
int finish();
void setmap(int n);
void color(int m);
bool flag = true;
int pass = 1;
#define R 10
#define C 10
#define framex 20
#define framey 14
int map[R][C] = {0};
//关卡1
int map1[R][C] = {
{ 0,0,1,1,1,0,0,0 },
{ 0,0,1,3,1,0,0,0 },
{ 0,0,1,0,1,1,1,1 },
{ 1,1,1,0,0,4,3,1 },
{ 1,3,4,4,0,1,1,1 },
{ 1,1,1,5,4,1,0,0 },
{ 0,0,0,1,3,1,0,0 },
{ 0,0,0,1,1,1,0,0 }
};
//地图 2(关卡2)
int map2[R][C]={
{1,1,1,1,1,0,0,0,0,0},
{1,5,0,0,1,0,0,0,0,0},
{1,0,4,4,1,0,1,1,1,0},
{1,0,4,0,1,0,1,3,1,0},
{1,1,1,0,1,1,1,3,1,0},
{0,1,1,0,0,0,0,3,1,0},
{0,1,0,0,0,1,0,0,1,0},
{0,1,0,0,0,1,1,1,1,0},
{0,1,1,1,1,1,0,0,0,0}
};
//地图 3(关卡3)
int map3[R][C]={
{ 0,0,0,1,1,1,1,1,1,1 },
{ 0,0,1,1,0,0,1,0,5,1 },
{ 0,0,1,0,0,0,1,0,0,1 },
{ 0,0,1,4,0,4,0,4,0,1 },
{ 0,0,1,0,4,1,1,0,0,1 },
{ 1,1,1,0,4,0,1,0,1,1 },
{ 1,3,3,3,3,3,0,0,1,0 },
{ 1,1,1,1,1,1,1,1,1,0 },
};
void Game_Menu(HANDLE hout){//游戏开始菜单
system("cls");
gotoxy(hout, framex, 1);
cout << "*******************";
gotoxy(hout, framex, 3);
cout << " 推箱子 ";
gotoxy(hout, framex, 5);
cout << " 按s或S开始 ";
gotoxy(hout, framex, 7);
cout << " 按q或Q退出 ";
gotoxy(hout, framex, 9);
cout << "游戏前关闭中文输入 ";
gotoxy(hout, framex, 11);
cout << "*******************";
_getch();
};
void Game_description(HANDLE hout){//操作提示
system("cls");
gotoxy(hout, framex, 1);
cout << "*****************************";
gotoxy(hout, framex, 3);
cout << " 按方向键上下左右移动 ";
gotoxy(hout, framex, 5);
cout << " 所有箱子到达目的地游戏胜利 ";
gotoxy(hout, framex, 7);
cout << " 按q或Q退出 ";
gotoxy(hout, framex, 9);
cout << "*****************************";
};
void gotoxy(HANDLE hout, int x, int y){
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(hout, pos);
};
void print(int i){//根据map值输出相应的图形
switch(i){
case 0:
color(0x7);
cout << " "; //空地■★□?◇◆??¤
break;
case 1:
color(8);
cout << "■";//墙体
break;
case 3:
color(0xE);
cout << "◇";//目的地
break;
case 4:
color(4);
cout << "□";//箱子
break;
case 5:
color(3);
cout << "♀"; //人
break;
case 7: //4+3 箱子到达目的地
color(6);
cout << "◆";
break;
case 8: //5+3 人与目的地重合
color(3);
cout << "♀";
break;
default:
break;
}
}
int DrawMap(HANDLE hout){//新的关卡开始时载入地图
//HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
gotoxy(hout, framex + C, framey - 3);
color(0xF);
cout << "第" << pass << "关";
//printf("第%d关", pass);
for(int i = 0; i < R; i++){
gotoxy(hout, framex, framey + i);
for(int j = 0; j < C; j++){
print(map[i][j]);
}
}
return 0;
};
void Move(HANDLE hout){//移动小人
int x = 0, y = 0;
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
if(map[i][j] == 5 || map [i] [j] == 8){
x = i;
y = j;
break;
}
}
}
gotoxy(hout, framex, framey + R);
color(0xF);
printf("当前位置:(%d, %d)", x, y);
int ch = _getch();
switch(ch){
case 'w':
case 'W':
case 72:
if(map[x - 1][y] == 0 || map[x - 1][y] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x - 1][y] += 5;
gotoxy(hout, framex + 2 * y, framey + x - 1);
print(map[x - 1][y]);
}
else if(map[x - 1][y] == 4 || map[x - 1][y] == 7){
if(map[x - 2][y] == 0 || map[x - 2][y] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x - 1][y] += 1;
gotoxy(hout, framex + 2 * y, framey + x - 1);
print(map[x - 1][y]);
map[x - 2][y] += 4;
gotoxy(hout, framex + 2 * y, framey + x - 2);
print(map[x - 2][y]);
}
}
break;
case 's':
case 'S':
case 80:
if(map[x + 1][y] == 0 || map[x + 1][y] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x + 1][y] += 5;
gotoxy(hout, framex + 2 * y, framey + x + 1);
print(map[x + 1][y]);
}
else if(map[x + 1][y] == 4 || map[x + 1][y] == 7){
if(map[x + 2][y] == 0 || map[x + 2][y] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x + 1][y] += 1;
gotoxy(hout, framex + 2 * y, framey + x + 1);
print(map[x + 1][y]);
map[x + 2][y] += 4;
gotoxy(hout, framex + 2 * y, framey + x + 2);
print(map[x + 2][y]);
}
}
break;
case 'a':
case 'A':
case 75:
if(map[x][y - 1] == 0 || map[x][y - 1] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x][y - 1] += 5;
gotoxy(hout, framex + 2 * y - 2, framey + x);
print(map[x][y - 1]);
}
else if(map[x][y - 1] == 4 || map[x][y - 1] == 7){
if(map[x][y - 2] == 0 || map[x][y - 2] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x][y - 1] += 1;
gotoxy(hout, framex + 2 * y - 2, framey + x);
print(map[x][y - 1]);
map[x][y - 2] += 4;
gotoxy(hout, framex + 2 * y - 4, framey + x);
print(map[x][y - 2]);
}
}
break;
case 'd':
case 'D':
case 77:
if(map[x][y + 1] == 0 || map[x][y + 1] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x][y + 1] += 5;
gotoxy(hout, framex + 2 * y + 2, framey + x);
print(map[x][y + 1]);
}
else if(map[x][y + 1] == 4 || map[x][y + 1] == 7){
if(map[x][y + 2] == 0 || map[x][y + 2] == 3){
map[x][y] -= 5;
gotoxy(hout, framex + 2 * y, framey + x);
print(map[x][y]);
map[x][y + 1] += 1;
gotoxy(hout, framex + 2 * y + 2, framey + x);
print(map[x][y + 1]);
map[x][y + 2] += 4;
gotoxy(hout, framex + 2 * y + 4, framey + x);
print(map[x][y + 2]);
}
}
break;
case 'q':
case 'Q':
flag = false;
default:
break;
}
};
int finish(){//判断游戏结束
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
if(map[i][j] == 4)return 0;
}
}
return 1;
};
void setmap(int n){
switch(n){
case 1:
memcpy(map, map1, sizeof(map1));
break;
case 2:
memcpy(map, map2, sizeof(map2));
break;
case 3:
memcpy(map, map3, sizeof(map3));
break;
}
};
void color(int m){//改变输出符号的颜色
HANDLE consolehend;
consolehend = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(consolehend, m);
};
int main(){
HANDLE hout = GetStdHandle(STD_OUTPUT_HANDLE);
Game_Menu(hout);
char ch = getch();
setmap(pass);
Game_description(hout);
DrawMap(hout);
if(ch == 'q' || ch == 'Q'){
return 0;
}
while(flag){
Move(hout);
if(finish()){
DrawMap(hout);
gotoxy(hout, framex, framey + R);
cout << " 恭喜,成功过关!";
gotoxy(hout, framex, framey + R + 2);
cout << "重玩(R)";
ch = getch();
system("cls");
pass++;
if(ch == 'r' || ch == 'R')pass--;
if(pass > 3) {
gotoxy(hout, framex, framey);
cout << " 您已通过全部关卡!";
getch();
flag = false;
}
else{
setmap(pass);
Game_description(hout);
DrawMap(hout);
}
}
}
return 0;
}
推箱子1
/*******************************************
用最简单的C语言语句写个推箱子的程序。
********************************************/
#include <stdio.h>
#include <conio.h>
#include<stdlib.h>
int map[9][11] = {
{0,1,1,1,1,1,1,1,1,1,0}, //0代表空地
{0,1,0,0,0,1,0,0,0,1,0}, //1代表墙
{0,1,0,4,4,4,4,4,0,1,0}, //3代表目的地
{0,1,0,4,0,4,0,4,0,1,1}, //4代表箱子
{0,1,0,0,0,0,0,0,4,0,1}, //5代表人
{1,1,0,1,1,1,1,0,4,0,1},
{1,0,8,3,3,3,3,1,0,0,1}, //2 3 4 5 6 7 8 9 1 0
{1,0,3,3,3,3,3,0,0,1,1},
{1,1,1,1,1,1,1,1,1,1,0} };
//绘制地图 //二维数组+switch()
void DrawMap()
{
//遍历二维数组 //0 打印空格 //1 墙 //3 目的地 //什么结构?
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 11; j++)
{
//if else switch
switch (map[i][j])
{
case 0:
printf(" ");
break;
case 1:
printf("■");
break;
case 3:
printf("☆");
break;
case 4:
printf("□");
break;
case 5:
printf("♀"); //5人
break;
case 7: //4 + 3 箱子在目的地中
printf("★");
break;
case 8: // 5 + 3 人在目的地当中 人?
printf("♀");
break;
}
}
printf("\n");
}
}
void PlayGame()
{
int r, c; //人的下标 //
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 11; j++)
{
if (map[i][j] == 5||map[i][j]==8) //i j 人的下标?
{
r = i;
c = j;
}
}
}
char ch; //字符变量
ch = getch(); //键盘的输入保存到字符中
// getch() getchar() 接收键盘字符
// getch()直接接收 不显示回文 getchar()显示回文可以修改 enter键结束
//根据不同的按键 改变不同的值. 分支.
switch (ch)
{
case 'W': //W A S D方向 72 80 75 77 虚拟键值 ascii windowVK_UP VK_TAB VK_RETUNE
case 'w':
case 72:
if (map[r - 1][c] == 0|| map[r - 1][c] == 3)
{
map[r - 1][c] += 5;
map[r][c] -= 5;
}
else if (map[r - 1][c] == 4 || map[r - 1][c] == 7)
{
if (map[r - 2][c] == 0 || map[r - 2][c] == 3)
{
map[r - 2][c] += 4;
map[r - 1][c] += 1;
map[r][c] -= 5;
}
}
break;
case 'S': //enter按键的作用 确认 返回
case 's':
case 80:
if (map[r + 1][c] == 0 || map[r + 1][c] == 3)
{
map[r + 1][c] += 5;
map[r][c] -= 5;
}
else if (map[r + 1][c] == 4 || map[r+ 1][c] == 7)
{
if (map[r + 2][c] == 0 || map[r + 2][c] == 3)
{
map[r + 2][c] += 4;
map[r + 1][c] += 1;
map[r][c] -= 5;
}
}
break;
case 'A':
case 'a':
case 75:
if (map[r ][c - 1] == 0 || map[r ][c - 1] == 3)
{
map[r ][c - 1] += 5;
map[r][c] -= 5;
}
else if (map[r][c - 1] == 4 || map[r][c - 1] == 7)
{
if (map[r ][c - 2] == 0 || map[r ][c - 2] == 3)
{
map[r ][c - 2] += 4;
map[r ][c - 1] += 1;
map[r][c] -= 5;
}
}
break;
case 'D':
case 'd':
case 77:
if (map[r][c + 1] == 0 || map[r][c + 1] == 3)
{
map[r][c + 1] += 5;
map[r][c] -= 5;
}
else if (map[r][c + 1] == 4 || map[r][c + 1] == 7)
{
if (map[r][c + 2] == 0 || map[r][c + 2] == 3)
{
map[r][c + 2] += 4;
map[r][c + 1] += 1;
map[r][c] -= 5;
}
}
break;
}
}
int main() //主函数
{
while (1)
{
system("cls");
DrawMap();
PlayGame();
}
return 0;
}
//通过按键来实现游戏 ---> 通过按键来改变二维数组的排列顺序.
//思考一个问题? 地图是二维数组来决定的. 人在哪里 二维数组来决定?
/************************************************
//人推箱子
可以动. 怎么办. 改变元素
1.人的前面是空地
2.人的前面是目的地
3.人的前面是箱子
3.1 箱子的前面是空地
3.2 箱子的前面是目的地
//盘断二维数组中有几个7
//没有目的地 不对.. 人站在目的地
//有没有4.
****************************************/
推箱子2
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int i,j;
void draw_map(int map[10][12]); //声明画图函数
int main()
{
system("title 李柏衡");
char input;
int count=0; //定义记分变量
int map[10][12] = {{2,2,2,2,2,1,1,1,1,1,2,2},
{1,1,1,1,2,1,0,0,0,1,1,2},
{1,0,0,1,1,1,0,1,0,0,1,2},
{1,0,4,3,3,3,3,3,1,0,1,1},
{1,0,0,1,1,3,3,3,4,0,0,1},
{1,0,0,0,0,4,1,1,4,1,0,1},
{1,0,4,1,4,0,0,0,4,0,0,1},
{1,1,0,6,0,1,1,1,4,1,0,1},
{2,1,1,1,1,1,2,1,0,0,0,1},
{2,2,2,2,2,2,2,1,1,1,1,1}
};
while (1) //死循环,等待用户命令
{
system("CLS");
for (i=0;i<12;i++)
{
printf("%d",i);
}
printf("\n");
/*for (i=1;i<10;i++)
{
printf("%d\n",i);
}*/
printf("\n");
draw_map(map);
printf("当前得分:%d\n",count);
//找初始位置
for (i=0;i<10;i++)
{
for (j=0;j<12;j++)
{
if (map[i][j]==6||map[i][j]==9)
break;
}
if (map[i][j]==6||map[i][j]==9)
break;
}
printf("您的当前坐标(%d,%d)",i,j);
input = getch(); //用getch()函数无需回车确认地获取用户输入,用于控制行走方向。
switch (input)
{
case 'w':
//如果人前面是空地。 //0代表空地 6代表人 //3代表目的地
if(map[i-1][j]==0)
{
map[i-1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
else
map[i][j]=0; //否则原地ID修改为空地ID 。
}
//如果人前面是目的地。
else if((map[i-1][j]==3)||(map[i-1][j]==9))
{
map[i-1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID为)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否则原地ID修改为为空地ID
}
//如果人前面是箱子。//4代表箱子 //7箱子进入目的地
else if(map[i-1][j]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i-2][j]==0)
{
map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
//下面是对箱子原地进行判断
if(map[i-1][j]==7) //如果箱子原地为目的地。
map[i-1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
else
map[i-1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否则就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i-2][j]==3)
{
map[i-2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
count++;
//下面是对箱子原先位置的判断,同上。
if(map[i-1][j]==7)
map[i-1][j]=9;
else
map[i-1][j]=6;
//下面是对人原先位置进行判断,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已经进入某目的地的箱子(ID=7)。
else if(map[i-1][j]==7)
{
//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
if(map[i-2][j]==0)
{
count--;
map[i-2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i-1][j]=9; //人自然而然的就站在了原先的目的地上了。
//下面是对人原先地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
if(map[i-2][j]==3)
{
map[i-2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。
map[i-1][j]=9; //人站在了目的地上。
//下面是对人原先站立地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case 's':
//如果人前面是空地。
if(map[i+1][j]==0)
{
map[i+1][j]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
else
map[i][j]=0; //否则原地ID修改为空地ID 。
}
//如果人前面是目的地。
else if(map[i+1][j]==3)
{
map[i+1][j]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID为)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否则原地ID修改为为空地ID
}
//如果人前面是箱子。
else if(map[i+1][j]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i+2][j]==0)
{
map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
//下面是对箱子原地进行判断
if(map[i+1][j]==7) //如果箱子原地为目的地。
map[i+1][j]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
else
map[i+1][j]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否则就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i+2][j]==3)
{
map[i-2][j]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
count++;
//下面是对箱子原先位置的判断,同上。
if(map[i+1][j]==7)
map[i+1][j]=9;
else
map[i+1][j]=6;
//下面是对人原先位置进行判断,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已经进入某目的地的箱子(ID=7)。
else if(map[i+1][j]==7)
{
//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
if(map[i+2][j]==0)
{
count--;
map[i+2][j]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i+1][j]=9; //人自然而然的就站在了原先的目的地上了。
//下面是对人原先地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
if(map[i+2][j]==3)
{
map[i+2][j]=7; //把箱子推入了另一目的地,自然,ID也应是。
map[i+1][j]=9; //人站在了目的地上。
//下面是对人原先站立地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case 'a':
//如果人前面是空地。
if(map[i][j-1]==0)
{
map[i][j-1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
else
map[i][j]=0; //否则原地ID修改为空地ID 。
}
//如果人前面是目的地。
else if(map[i][j-1]==3)
{
map[i][j-1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID为)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否则原地ID修改为为空地ID
}
//如果人前面是箱子。
else if(map[i][j-1]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i][j-2]==0)
{
map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
//下面是对箱子原地进行判断
if(map[i][j-1]==7) //如果箱子原地为目的地。
map[i][j-1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
else
map[i][j-1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否则就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i][j-2]==3)
{
count++;
map[i][j-2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
//下面是对箱子原先位置的判断,同上。
if(map[i][j-1]==7)
map[i][j-1]=9;
else
map[i][j-1]=6;
//下面是对人原先位置进行判断,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已经进入某目的地的箱子(ID=7)。
else if(map[i][j-1]==7)
{
//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
if(map[i][j-2]==0)
{
count--;
map[i][j-2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i][j-1]=9; //人自然而然的就站在了原先的目的地上了。
//下面是对人原先地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
if(map[i][j-2]==3)
{
map[i][j-2]=7; //把箱子推入了另一目的地,自然,ID也应是。
map[i][j-1]=9; //人站在了目的地上。
//下面是对人原先站立地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
case 'd':
//如果人前面是空地。
if(map[i][j+1]==0)
{
map[i][j+1]=6+0; //人往前走一步,ID为人的ID()加上空地的ID()。
if(map[i][j]==9) //如果当前人站的位置为目的地,则ID为(即人的ID()加上目的地ID())。
map[i][j]=3; //将人往前走一步后原地的ID修改为空地ID()。
else
map[i][j]=0; //否则原地ID修改为空地ID 。
}
//如果人前面是目的地。
else if(map[i][j+1]==3)
{
map[i][j+1]=6+3; //人往前走一步,ID为人ID+目的地ID=9。
if(map[i][j]==9) //如果原地也是目的地(ID为)。
map[i][j]=3; //人走后把原地ID修改回目的地ID。
else
map[i][j]=0; //否则原地ID修改为为空地ID
}
//如果人前面是箱子。
else if(map[i][j+1]==4)
{
//如果人前面是箱子,而箱子前面是空地。
if (map[i][j+2]==0)
{
map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID()
//下面是对箱子原地进行判断
if(map[i][j+1]==7) //如果箱子原地为目的地。
map[i][j+1]=9; //人站在箱子的原地(目的地)时该地ID应该为人的ID+目的地ID=9。
else
map[i][j+1]=6; //否则,人站在了原来的空地上,ID应该为+0=6。
//下面是对人原地进行判断
if(map[i][j]==9) //如果之前是目的地。
map[i][j]=3; //人走了之后修改回目的地ID。
else
map[i][j]=0; //否则就是空地。
}
//如果人的前面是箱子,而箱子前面是目的地。
else if (map[i][j+2]==3)
{
count++;
map[i][j+2]=7; //ID为(目的地ID()+箱子ID()=7),表示已经把箱子推入了目的地。
//下面是对箱子原先位置的判断,同上。
if(map[i][j+1]==7)
map[i][j+1]=9;
else
map[i][j+1]=6;
//下面是对人原先位置进行判断,同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
//如果人前面是已经进入某目的地的箱子(ID=7)。
else if(map[i][j+1]==7)
{
//如果人前面是已经进入某目的地的箱子,而箱子前面是空地。
if(map[i][j+2]==0)
{
count--;
map[i][j+2]=4; //把箱子重新推到空地上,ID=箱子ID+空地ID=4。
map[i][j+1]=9; //人自然而然的就站在了原先的目的地上了。
//下面是对人原先地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
//如果人前面是已经进入某目的地的箱子,而箱子前面是另一目的地。
if(map[i][j+2]==3)
{
map[i][j+2]=7; //把箱子推入了另一目的地,自然,ID也应是。
map[i][j+1]=9; //人站在了目的地上。
//下面是对人原先站立地进行判断,方法同上。
if(map[i][j]==9)
map[i][j]=3;
else
map[i][j]=0;
}
}
break;
}
if(count==8) //如果分数达到分
{
system("CLS"); //清屏
draw_map(map);
break; //退出死循环
}
}
printf("\n恭喜你,过关了!!\n"); //过关提示
return 0;
}
void draw_map(int map[10][12])
{
for(i=0;i<10;i++)
{
for(j=0;j<12;j++)
{
switch(map[i][j])
{
case 0:
printf(" "); //数字代表道路
break;
case 1:
printf("#"); //数字代表墙壁
break;
case 2:
printf(" "); //数字是游戏边框的空白部分
break;
case 3:
printf("!"); //数字代表目的地
break;
case 4:
printf("*"); //数字代表箱子
break;
case 7:
printf("$"); //数字代表箱子进入目的地
break;
case 6:
printf("@"); //数字代表人
break;
case 9:
printf("@"); //数字代表人进入目的地
break;
}
}
printf("\n"); //分行输出
}
}
UNO
#include<bits/stdc++.h>
#include<windows.h>
//making 制作中 waiting 等待中 end 完成
using namespace std;
struct card//卡片(end)
{
int color;//1=red 2=blue 3=green 4=yellow 5=black
int number;//0-9=0-9 10=禁 11=转 12=+2 13=调色 14=+4
};
struct player//van家(end)
{
card hand[103];
int score=0;
int have=0;
};
player a[13];
card now;
bool skip=false,turn=true,plus2=true;
int Plus=0;
card randcard()//随机卡(end)
{
card s;
s.number=rand()%15;
if(s.number>=13) s.color=5;
else s.color=rand()%4+1;
return s;
}
void getcard(int n)//获得一张卡(end)
{
a[n].have++;
a[n].hand[a[n].have]=randcard();
return ;
}
void setcolor()//调色(end)
{
cout<<"您希望变成什么颜色?\n1 红\n2 蓝\n3 绿\n4 黄\n";
int change;
cin>>change;
now.color=change;
now.number=-1;
return ;
}
void usecard(int i,int n)//使用一张卡(end)
{
now=a[n].hand[i];
if(a[n].hand[i].number==10) skip=true;
if(a[n].hand[i].number==11) turn=!turn;
if(a[n].hand[i].number==12) Plus+=2;
if(a[n].hand[i].number==13) setcolor();
if(a[n].hand[i].number==14)
{
Plus+=4;
plus2=false;
setcolor();
}
card temp;
temp=a[n].hand[a[n].have];
a[n].hand[a[n].have]=a[n].hand[i];
a[n].hand[i]=temp;
a[n].have--;
return ;
}
void init()//初始化(end)
{
for(int i=1; i<=10; i++) for(int j=1; j<=7; j++) getcard(i);
return ;
}
int end(int n)//游戏结束判定(end)
{
for(int i=1; i<=n; i++) if(a[i].have==0) return i;
return 0;
}
void show(int n,int i)//卡牌展示(end)
{
switch (a[n].hand[i].color)
{
case 1:
cout<<"红";
break;
case 2:
cout<<"蓝";
break;
case 3:
cout<<"绿";
break;
case 4:
cout<<"黄";
break;
}
if(a[n].hand[i].number<=9)cout<<a[n].hand[i].number<<' ';
if(a[n].hand[i].number==10)cout<<"禁 ";
if(a[n].hand[i].number==11)cout<<"转 ";
if(a[n].hand[i].number==12)cout<<"+2 ";
if(a[n].hand[i].number==13)cout<<"调色 ";
if(a[n].hand[i].number==14)cout<<"+4 ";
return ;
}
void shownow()
{
switch (now.color)
{
case 1:
cout<<"红";
break;
case 2:
cout<<"蓝";
break;
case 3:
cout<<"绿";
break;
case 4:
cout<<"黄";
break;
}
if(now.number<=9)cout<<now.number<<' ';
if(now.number==10)cout<<"禁 ";
if(now.number==11)cout<<"转 ";
if(now.number==12)cout<<"+2 ";
if(now.number==13)cout<<"调色 ";
if(now.number==14)cout<<"+4 ";
return ;
}
void round(int n)//回合进行(end)
{
system("cls");
cout<<n<<"号玩家的回合";
system("pause");
system("cls");
if(skip)
{
cout<<n<<"号玩家您被禁了!";
skip=false;
return ;
}
if(Plus!=0 && plus2)
{
cout<<"上家加给你了"<<Plus<<"张牌,您只能出+2 or +4!\n您的手牌有\n";
for(int i=1; i<=a[n].have; i++) show(n,i);
cout<<"\n您要出哪张牌?(从左往右的序号)输出0为不出牌,摸牌\n";
int use;
cin>>use;
if(use>a[n].have || (a[n].hand[use].number!=12 && a[n].hand[use].number!=14 && use!=0))
{
cout<<"无效的手牌!系统默认为0";
use=0;
}
if(use!=0) usecard(use,n);
else
{
for(int i=1; i<=Plus; i++) getcard(n);
plus2=true;
}
return ;
}
if(Plus!=0 && !plus2)
{
cout<<"上家加给你了"<<Plus<<"张牌,您只能出+4!\n您的手牌有\n";
for(int i=1; i<=a[n].have; i++) show(n,i);
cout<<"\n您要出哪张牌?(从左往右的序号)输出0为不出牌,摸牌\n";
int use;
cin>>use;
if(use>a[n].have || (a[n].hand[use].number!=14 && use!=0))
{
cout<<"无效的手牌!系统默认为0";
use=0;
}
if(use!=0) usecard(use,n);
else
{
for(int i=1; i<=Plus; i++) getcard(n);
plus2=true;
}
return ;
}
cout<<n<<"号玩家的回合\n您的手牌有\n";
for(int i=1; i<=a[n].have; i++) show(n,i);
cout<<"\n上一张牌为";
shownow();
cout<<"\n您要出哪张牌?(从左往右的序号)输出0为不出牌,摸牌\n";
int use;
cin>>use;
cout<<"\n";
if(use>a[n].have || (a[n].hand[use].color!=now.color && a[n].hand[use].color!=5 && use!=0))
{
cout<<"无效的手牌!系统默认为0\n";
use=0;
}
if(use!=0) usecard(use,n);
else
{
getcard(n);
cout<<"您摸了";
show(n,a[n].have);
cout<<"\n";
if(a[n].hand[a[n].have].color==now.color || a[n].hand[a[n].have].number==now.number)
{
cout<<"您摸的牌可以出! 按1出牌\n";
int ans;
cin>>ans;
if(ans==1) cout<<"您出了这张牌。\n";
}
usecard(use,n);
}
return ;
}
int play(int n)//游戏进程(end)
{
now=randcard();
while(now.number>=10)now=randcard();
int i=0;
while(true)
{
system("pause");
round(i+1);
if(turn) i=(i+1)%n;
else if(i==0) i=n-1;
else i--;
if(end(n)!=0) break;
}
return end(n);
}
int main()//主程序(end)
{
int n;
srand(time(0));
cout<<"UNO TIME by dead_X\nver1.3.0\n测试版\n由于WarmSnow催更过于勤劳,简化内容已经提前完成,具体请看更新公告\n";
system("pause");
cout<<"请输入游戏人数:\n";
cin>>n;
init();
system("cls");
for(int i=1; i<=100; i++)
{
cout<<"Loading......";
cout<<i<<"%";
Sleep(5);
system("cls");
}
int ans;
cout<<"加载完成!\n是否查看游戏规则介绍?是请按1,否请按0\n";
cin>>ans;
if(ans==1) cout<<"此功能正在开发中,预计将在2.0.0开发完毕\n";
cout<<"游戏开始!";
Sleep(100);
int res=play(n);
cout<<n<<"号玩家取得了胜利!";
return 0;
}
王权 V1.1.18
https://www.luogu.com/user/232323
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/hash_policy.hpp>
#include<windows.h>
#include<conio.h>
#define cls system("cls")
#define iv inline void
#define set1 SetConsoleTextAttribute
#define set2 GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY
#define sred FOREGROUND_RED
#define sgreen FOREGROUND_GREEN
#define sblue FOREGROUND_BLUE
#define set set1(set2 | sred | sgreen | sblue)
using namespace std;
using namespace __gnu_pbds;
//宗教,民众,军队,财富!
struct data{
string a;//事件过程
int a1,a2,a3,a4;//Y
int b1,b2,b3,b4;//N
string b,c;//b为Y得到技能名称,c为N得到技能名称
}x[1005];
struct data2{
int a,b;//起始年,驾崩年
string s;//名字
};
struct data3{
int a,b;//起始年,结束年
string s;//我方名字
int w;//是否胜利
};
struct data_email{
string a,b;//发送者、内容
};
#define SIZe 17
int ra[SIZe*2+1];
int year=1,year2=1,qaq=0,qaq2=0,textspeed=3,Flag=0;
int auto_read=0,auto_file=0;
string version="V1.1.18";
data2 gq[1005];
data3 gq2[1005];
vector<string> banben;//可读版本列表
vector<string> ach;//普通模式成就列表
vector<string> skills_2nd;//普通模式技能列表
vector<string> emails;//收到的邮件
gp_hash_table<string,string> skills;//普通模式技能效果
gp_hash_table<string,bool> ach_judge;//成就完成判断
gp_hash_table<string,string> ach_introduce;//成就介绍
gp_hash_table<string,vector<string> > achs;//成就分类
gp_hash_table<string,data_email> email_text;//根据标题为key储存发送者与内容
gp_hash_table<string,bool> email_judge;//根据标题为key储存是否已读
template <typename T>
inline string change(T a){stringstream ss;string s;ss.clear();ss.str("");ss<<a;ss>>s;return s;}
iv init()
{
//可读版本
banben.push_back("V1.1.18");
//普通&AI模式事件
x[1]=data{"大臣:国王,敌国的军队来攻打我们了。(Y:出军;N:没有动静)",0,-5,-10,-10,0,-15,0,0,"",""};
x[2]=data{"传信人:我们的内部出现了内奸,散布虚假消息。(Y:解决;N:没有动静)",10,0,-5,0,-20,-10,0,0,"",""};
x[3]=data{"大臣:在山下发现金矿。(Y:挖掘;N:没听见)",10,-10,-10,20,0,-10,0,0,"",""};
x[4]=data{"大臣:我们可以下发民众调查,加善百姓生活。(Y:接受;N:不接受)",5,10,0,-10,0,-10,-5,5,"",""};
x[5]=data{"军师:敌人可能要来进攻我们了,我们需要操练军队。(Y:接受;N:不接受)",5,-5,20,-10,0,0,0,0,"",""};
x[6]=data{"传信人:民间出现了很多盗贼。我们最好解决?(Y:解决;N:没有动静)",0,20,-5,-10,0,-5,0,-5,"",""};
x[7]=data{"大臣:建议造学校,普及知识。(Y:建造;N:没有动静)",10,10,0,-10,-5,0,-5,10,"",""};
x[8]=data{"马戏团老板:我们能到您的城市演出吗?(Y:能;N:拒绝)",0,10,0,-20,0,-10,5,10,"",""};
x[9]=data{"大臣:城市污染严重,可栽树否?(Y:栽树;N:没有动静)",-5,10,10,-10,0,-10,0,5,"",""};
x[10]=data{"巫师:大人,我这儿有灵丹妙药。(Y:售卖;N:拒绝)",-5,10,0,-10,0,-5,-10,0,"",""};
x[11]=data{"魔法师:国王,我能赐予您一种能力。(Y:接受;N:拒绝)",0,0,-15,0,0,0,0,0,"逃避",""};
x[12]=data{"魔法师:我希望人间平安。(Y:接受;N:拒绝)",0,0,0,-25,0,0,0,0,"平安",""};
x[13]=data{"魔法师:相反的魔法总是令人喜爱。(Y:认同;N:不认同)",-15,0,0,0,0,0,0,0,"倒置",""};
x[14]=data{"大臣:我认为我们可以加进人才。(Y:同意;N:拒绝)",0,20,0,-10,0,-10,0,0,"",""};
x[15]=data{"传信人:民间的传染病越加严重。(Y:解决;N:没有动静)",10,10,-10,-20,0,-20,-10,0,"",""};
x[16]=data{"天文学家:我预测这几日天气状况不佳。(Y:认同;N:不认同)",0,10,-10,0,0,0,0,0,"",""};
x[17]=data{"传信人:鼠疫导致民间人心惶惶。(Y:解决;N:没有动静)",0,20,0,-10,0,-15,-5,0,"",""};
//普通&AI模式技能列表
skills_2nd.push_back("逃避");
skills_2nd.push_back("平安");
skills_2nd.push_back("倒置");
//普通&AI模式技能介绍
skills["逃避"]="躲过这次选择,不接受也不拒绝";
skills["平安"]="使任一属性回到50 (可选择)";
skills["倒置"]="使做出选择后获得的增益倒置 (不包括获得、使用技能),直到下一次使用倒置为止";
//成就列表
ach.push_back("初登王位");
ach.push_back("多重加害");
ach.push_back("百寿");
ach.push_back("竞争者");
ach.push_back("两败俱伤");
ach.push_back("常年争执");
ach.push_back("殊途同归");
ach.push_back("保持同步");
ach.push_back("名字问题");
ach.push_back("隐藏地域");
//成就介绍
ach_introduce["初登王位"]="第一次开始普通模式";
ach_introduce["多重加害"]="同时因为多项属性而结束游戏";
ach_introduce["百寿"]="一个人物活到100岁";
ach_introduce["竞争者"]="第一次开始A.I.对战";
ach_introduce["两败俱伤"]="因为双方同时死亡而结束游戏";
ach_introduce["常年争执"]="一个人物与A.I.连续对战30年";
ach_introduce["殊途同归"]="在若干回合后双方的数据重回一样";
ach_introduce["保持同步"]="连续5回合与A.I.选择一样";
ach_introduce["名字问题"]="......你真的以为我会让你使用它?";
ach_introduce["隐藏地域"]="你是怎么发现这儿的?";
//......然而成就的展示是按获取方式分。
achs["普通模式"].push_back("初登王位");
achs["普通模式"].push_back("多重加害");
achs["普通模式"].push_back("百寿");
achs["A.I.对战"].push_back("竞争者");
achs["A.I.对战"].push_back("两败俱伤");
achs["A.I.对战"].push_back("常年争执");
achs["A.I.对战"].push_back("殊途同归");
achs["A.I.对战"].push_back("保持同步");
achs["隐藏成就"].push_back("名字问题");
achs["隐藏成就"].push_back("隐藏地域");
//邮件内容
email_text["游戏介绍-普通模式"]=data_email{"紫陰花",
"在这个游戏中,你需要控制一名君王来应对每一年所发生的事件,作出相应的对答。\n每一次相应的对答可以选择Y或N,你的国家拥有四种属性,不同的对答会造成每个属性的相应加减。\n四种属性分别是:宗教,民众,军队,财富。\n每个属性的初始状态都为50点。通过选择会加减属性,当一个属性<=0或>=100时,游戏结束,愤怒的臣民会杀掉你。\n你还拥有一项技能,这需要你在游戏中获得。技能是一次性的,得到新的技能会覆盖原技能。有技能时可以按S(Skill)触发效果。\n你的游戏目标是,活得尽量久。\n"};
email_text["游戏介绍-A.I.对战"]=data_email{"紫陰花",
"在普通模式的基础上,你需要与一个A.I.对战,你与其面对相同的问题而做出选择,最后活下的人胜利。"};
email_text["欢迎来到王权"]=data_email{"紫陰花",
"感谢您游玩王权!\n游戏制作者:紫陰花\n游戏团队:https://www.luogu.com.cn/team/23723"};
email_text["hide1"]=data_email{"???","你为什么会到这儿?"};
email_text["hide2"]=data_email{"???","你不应该来到这儿。离开。"};
email_text["Hide1"]=data_email{"","The author thinks that you are too YOUNG too SIMPLE."};
email_text["hacker1"]=data_email{"","(铃铃铃......)"};
email_text["hacker2"]=data_email{"","你在这了。"};
email_text["hacker3"]=data_email{"","如果有人玩到这个页面,请麻烦告知作者。"};
email_text["hacker4"]=data_email{"","但恐怕......你只是一个肮脏的黑客吧?"};
}
iv say(string say1,int say2);
iv rs(){for(int i=1;i<=SIZe;i++)ra[i]=i;for(int i=SIZe+1;i<=SIZe*2;i++)ra[i]=rand()%SIZe+1;random_shuffle(ra+1,ra+1+SIZe*2);}
iv di_box(string title,string s1,string s2);
iv diq(string s){di_box("","",s);}
iv hacker(){ifstream fin("WDGaster.txt");char c;int ci=0;fin>>ci;ci++;fin.close();
ofstream fout("WDGaster.txt");fout<<ci;fout.close();if(ci>1){if(ci<=6)cls,diq("你已经来了 "+change(ci)+" 次了。"),c=getch();cls;if(ci==2) diq("还不知足吗?");if(ci==3) diq("你知道,你在尝试修改代码。");
if(ci==4) diq("蠢蛋,代码都改不动。");if(ci==5) diq("如果你看到了这条消息,就代表你不是个 OIer。");if(ci==6) diq("你的耐心......可真让我吃惊啊。");if(ci>6) diq("你就没有更重要的事情去做吗?");c=getch();}
else for(int i=1;i<=4;i++) say("hacker"+change(i),2);exit(0);}
iv print(string a){for(int i=0;i<a.size();i++){putchar(a[i]);Sleep(textspeed);}}
iv print2(string a,int b){for(int i=0;i<a.size();i++){putchar(a[i]);Sleep(b);}}
iv start();
iv game();
iv ai_game();
iv red(string u){set1(set2 | sred);print(u);set;}
iv blue(string u){set1(set2 | sblue);print(u);set;}
iv red2(string u,int w){set1(set2 | sred);print2(u,w);set;}
iv green(string u){set1(set2 | sgreen);print(u);set;}
iv yellow(string u){set1(set2 | sred | sgreen);print(u);set;}
iv cyan(string u){set1(set2 | sgreen | sblue);print(u);set;}
iv pink(string u){set1(set2 | sred | sblue);print(u);set;}
iv rainbow(string u){for(int i=0;i<u.size();i++){int rainbo=rand()%7*rand()%7+1;switch(rainbo){case 1:print(change(u[i]));break;case 2:red(change(u[i]));break;case 3:green(change(u[i]));break;case 4:blue(change(u[i]));break;case 5:yellow(change(u[i]));break;case 6:cyan(change(u[i]));break;case 7:pink(change(u[i]));break;}} }
iv achieve(string u)
{
if(u=="初登王位")
{
pink("+------------------+\n");
pink("|获得成就:初登王位|\n");
pink("|第一次开始普通模式|\n");
pink("+------------------+\n");
}
if(u=="多重加害")
{
pink("+--------------------------+\n");
pink("|获得成就:多重加害 |\n");
pink("|同时因为多项属性而结束游戏|\n");
pink("+--------------------------+\n");
}
if(u=="百寿")
{
pink("+-----------------+\n");
pink("|获得成就:百寿 |\n");
pink("|一个人物活到100岁|\n");
pink("+-----------------+\n");
}
if(u=="竞争者")
{
pink("+------------------+\n");
pink("|获得成就:竞争者 |\n");
pink("|第一次开始A.I.对战|\n");
pink("+------------------+\n");
}
if(u=="两败俱伤")
{
pink("+--------------------------+\n");
pink("|获得成就:两败俱伤 |\n");
pink("|因为双方同时死亡而结束游戏|\n");
pink("+--------------------------+\n");
}
if(u=="常年争执")
{
pink("+--------------------------+\n");
pink("|获得成就:常年争执 |\n");
pink("|一个人物与A.I.连续对战30年|\n");
pink("+--------------------------+\n");
}
if(u=="殊途同归")
{
pink("+------------------------------+\n");
pink("|获得成就:殊途同归 |\n");
pink("|在若干回合后双方的数据重回一样|\n");
pink("+------------------------------+\n");
}
if(u=="保持同步")
{
pink("+-----------------------+\n");
pink("|获得成就:保持同步 |\n");
pink("|连续5回合与A.I.选择一样|\n");
pink("+-----------------------+\n");
}
ach_judge[u]=1;
}
int long_di_box=50;
iv di_box(string title,string s1,string s2) //dialog box
{
int kkk=20;
int c=0,maxnkkk=-1;
for(int i=0;i<s2.size();i++)
{
if(s2[i]=='\n') c=0;
else c++;
maxnkkk=max(maxnkkk,c);
}
kkk=max(kkk,maxnkkk);
print("+"+string(kkk,'-')+"+\n");
if(title.size()!=0)
print("|"+title+string(kkk-title.size(),' ')+"|\n");
if(s1.size()!=0)
{
print("|");
cyan(s1);
print(":"+string(kkk-1-s1.size(),' ')+"|\n");
}
int s2u=0,summ=0;
for(int i=0;i<s2.size();i++)
{
if(summ==kkk)
print("|\n"),summ=0,s2u=0;
if(s2u==0)
print("|"),s2u=1;
if(s2[i]!='\n')
putchar(s2[i]),summ++;
else
print(string(kkk-summ,' ')),summ=kkk;
}
print(string(kkk-summ,' '));
print("|\n+"+string(kkk,'-')+"+\n");
}
iv say(string say1,int say2)
{
char c;
cls;
if(say2==1)
di_box("",email_text[say1].a,email_text[say1].b);
else
diq(email_text[say1].b);
c=getch();
}
iv num(int a)
{
if(a>=25 and a<=75) set1(set2 | sgreen);
if((a<25 and a>0) or (a>75 and a<100)) set1(set2 | sred | sgreen);
if(a<=0 or a>=100) set1(set2 | sred);
print(change(a));set;
}
inline int div_int(int a,int b){return b==0?0:a/b;}
iv cho(int a){if(a>0) green("增加");if(a<0) red("减少");if(a==0) print("无");}
iv email() //邮件
{
cls;
for(int i=emails.size()-1;i>=0;i--)
{
int &kkk=long_di_box;
print("+"+string(kkk,'-')+"+\n");
print("|信件"+change(i+1)+string(kkk-4-change(i+1).size(),' ')+"|\n");
if(email_judge[emails[i]]==0)
{
print("|");
red("未读");
print(string(kkk-4,' ')+"|\n");
}
print("|发送者:");
cyan(email_text[emails[i]].a);
print(string(kkk-7-email_text[emails[i]].a.size(),' ')+"|\n");
print("|标题:");
yellow(emails[i]);
print(string(kkk-5-emails[i].size(),' ')+"|\n");
print("+"+string(kkk,'-')+"+\n");
}
cyan("输入信件编号阅读信件;输入0退出(需按回车)\n");
int c;
cin>>c;
while(c<0 or c>emails.size()) cin>>c;
if(c==0)
{
cls;
start();
}
else
{
cls;
di_box(emails[c-1],email_text[emails[c-1]].a,email_text[emails[c-1]].b);
email_judge[emails[c-1]]=1;
cyan("按1退出\n");
char c=getch();
while(c!='1') c=getch();
cls;
email();
}
}
iv file(int hi) //存档
{
/*
version
year year2 qaq qaq2 textspeed auto_read auto_file
gq[1].a gq[1].b gq[1].s
...
gq[qaq].a gq[qaq].b gq[qaq].s
gq2[1].a gq2[1].b gq2[1].s gq2[1].w
...
gq2[qaq2].a gq2[qaq2].b gq2[qaq2].s gq2[qaq2].w
emails.size()
emails[0]
...
emails[emails.size()-1]
email_judge[0]
...
email_judge[emails.size()-1]
*/
char c='N';
if(hi==0)
{
red("你确定要存档?将会覆盖原有存档(Y确定,N退出)\n");
c=getch();
while(c!='Y' and c!='N') c=getch();
}
if(c=='Y' or hi==1)
{
ofstream fout("reignsfile.txt");
fout<<version<<endl;
fout<<year<<' '<<year2<<' '<<qaq<<' '<<qaq2<<' '<<textspeed<<' '<<auto_read<<' '<<auto_file<<'\n';
for(int i=1;i<=qaq;i++)
fout<<gq[i].a<<' '<<gq[i].b<<' '<<gq[i].s<<'\n';
for(int i=1;i<=qaq2;i++)
fout<<gq2[i].a<<' '<<gq2[i].b<<' '<<gq2[i].s<<' '<<gq2[i].w<<'\n';
fout<<endl<<emails.size()<<endl;
for(int i=0;i<emails.size();i++)
fout<<emails[i]<<' ';
fout<<endl;
for(int i=0;i<emails.size();i++)
fout<<email_judge[emails[i]]<<' ';
fout<<endl;
fout.close();
ofstream fout2("reignsach.txt");
for(int i=0;i<ach.size();i++)
fout2<<ach_judge[ach[i]]<<' ';
fout2.close();
if(hi==0)
{
green("存档成功!");
Sleep(2000);
}
}
if(hi==0)
{
cls;
start();
}
}
iv readfile(int hi) //读档
{
char c='N';
if(hi==0)
{
red("你确定要读档?将会覆盖原有存档(Y确定,N退出)\n");
c=getch();
while(c!='Y' and c!='N') c=getch();
}
if(c=='Y' or hi==1)
{
string guyutxdy;
ifstream fin("reignsfile.txt");
fin>>guyutxdy;//版本占位符
fin>>year>>year2>>qaq>>qaq2>>textspeed>>auto_read>>auto_file;
for(int i=1;i<=qaq;i++)
fin>>gq[i].a>>gq[i].b>>gq[i].s;
for(int i=1;i<=qaq2;i++)
fin>>gq2[i].a>>gq2[i].b>>gq2[i].s>>gq2[i].w;
int kkkk;
fin>>kkkk;
emails.clear();
for(int i=0;i<kkkk;i++)
{
string sr1;
fin>>sr1;
emails.push_back(sr1);
}
for(int i=0;i<kkkk;i++)
{
bool sr1;
fin>>sr1;
email_judge[emails[i]]=sr1;
}
fin.close();
ifstream fin2("reignsach.txt");
for(int i=0;i<ach.size();i++)
fin2>>ach_judge[ach[i]];
fin2.close();
if(hi==0)
{
green("读档成功!");
Sleep(2000);
}
}
if(hi==1) Flag=1;
else
{
cls;
start();
}
}
iv statistics() //统计
{
yellow("普通模式:\n");
if(qaq==0) cyan("尚未有人坐上王座\n\n");
else
{
cyan("到目前为止,有 ");
print(change(qaq));
cyan(" 个君王\n");
int maxn=-1,maxnn;
for(int i=1;i<=qaq;i++)
{
print(change(gq[i].a));
cyan(" 年至 ");
print(change(gq[i].b));
cyan(" 年,为君王 ");
yellow(gq[i].s);
putchar('\n');
if(maxn<gq[i].b-gq[i].a+1)
maxn=gq[i].b-gq[i].a+1,maxnn=i;
}
cyan("最长统治者为 ");
yellow(gq[maxnn].s);
cyan(" ,统治了 ");
print(change(maxn));
cyan(" 年\n\n");
}
yellow("A.I.对战:\n");
if(qaq2==0) cyan("尚未有人开始争夺\n\n");
else
{
cyan("到目前为止,有 ");
print(change(qaq2));
cyan(" 场争夺\n");
int maxn=-1,maxnn;
for(int i=1;i<=qaq2;i++)
{
print(change(gq2[i].a));
cyan(" 年至 ");
print(change(gq2[i].b));
cyan(" 年,为君王 ");
yellow(gq2[i].s);
cyan(" 与对方争夺,结果为");
if(gq2[i].w==0)
red("失败\n");
if(gq2[i].w==1)
green("成功\n");
if(gq2[i].w==2)
yellow("平局\n");
if(maxn<gq2[i].b-gq2[i].a+1)
maxn=gq2[i].b-gq2[i].a+1,maxnn=i;
}
cyan("最长时间争夺者为 ");
yellow(gq2[maxnn].s);
cyan(" ,争夺了 ");
print(change(maxn));
cyan(" 年\n\n");
}
cyan("按1退出\n");
char c=getch();
while(c!='1') c=getch();
cls;
start();
}
iv journal() //更新日志
{
yellow("V1.0.0:");pink("基础游戏设施 (2019.11.29)\n");
yellow("V1.0.1:");pink("增加更新日志 设置 存档 读档 (2019.11.30)\n");
yellow("V1.0.2:");pink("增加2条新的事件 (2019.12.2)\n");
yellow("V1.0.3:");pink("增加自动读档 游戏公告 (2019.12.4)\n");
yellow("V1.0.4:");pink("增加自动存档 修正部分文本 (2019.12.5)\n");
yellow("V1.0.5:");pink("增加彩色字体 修复自动存档 (2019.12.7)\n");
yellow("V1.0.6:");pink("修改统计 (2019.12.7)\n");
yellow("V1.0.7:");pink("增加1条新的事件 (2019.12.9)\n");
yellow("V1.1.0:");pink("增加技能 成就(未完工) (2019.12.11)\n");
yellow("V1.1.1:");pink("修改技能 平安 增加技能 倒置 修复成就 (2019.12.14)\n");
yellow("V1.1.2:");pink("增加2条成就 (2019.12.14)\n");
yellow("V1.1.3:");pink("增加模式沦陷战役 开启沦陷战役-童话门 (2020.1.1)\n");
yellow("V1.1.4:");pink("开启沦陷战役-世界门 (2020.1.4)\n");
yellow("V1.1.5:");pink("邮件系统(未完工) (2020.1.15)\n");
yellow("V1.1.6:");pink("邮件系统(将近完工) (2020.1.17)\n");
yellow("V1.1.7:");pink("开启沦陷战役-人心门 (2020.1.24)\n");
yellow("V1.1.8:");pink("修改沦陷战役-人心门 (2020.1.25)\n");
yellow("V1.1.9:");pink("削弱沦陷战役-人心门强度 增加彩蛋 (2020.1.26)\n");
yellow("V1.1.10:");pink("削弱沦陷战役-人心门 沦陷战役-世界门强度 (2020.1.28)\n");
yellow("V1.1.11:");pink("制作沦陷战役-我们门(未完工) WARNING!!!!!!!!!!!!!!! (2020.2.5)\n");
yellow("V1.1.12:");pink("更新成就(是的,这个人一直在拖更) (2020.2.28)\n");
yellow("V1.1.13:");pink("暂时关闭了沦陷战役的模式,而且这个模式可能会删除 (2020.4.24)\n");
yellow("V1.1.14:");pink("再见,沦陷战役(开始制作A.I.对战) (2020.4.28)\n");
yellow("V1.1.15:");pink("开启 A.I.对战 (2020.5.9)\n");
yellow("V1.1.16:");pink("优化 A.I. 的判断(关于 倒置 考虑得更具体,当选择Y可获得技能时特别判断) (2020.5.19)\n");
yellow("V1.1.17:");pink("增加2条成就,修复 A.I.对战 双方同时死亡的BUG(转化成了一个成就) (2020.5.22)\n");
yellow("V1.1.18:");pink("增加2条成就 (2020.6.2)\n");
cyan("\n按1退出\n");
char c=getch();
while(c!='1') c=getch();
cls;
start();
}
iv setting() //设置
{
cyan("1.文本速度\n");
cyan("2.自动读档(打开exe文件时)\n");
cyan("3.自动存档(游戏结束后)\n");
cyan("4.退出\n");
char c=getch();
while(c<'1' or c>'4') c=getch();
if(c=='1')
{
cyan("输入文本速度 (目前一个汉字为 ");
cyan(change(textspeed));
cyan(" ms)\n");
scanf("%d",&textspeed);
cls;
setting();
}
if(c=='2')
{
cyan("是否自动读档? (打开exe文件时,1为是,0为否,目前为 ");
cyan(change(auto_read));
cyan(" )\n");
scanf("%d",&auto_read);
if(auto_read!=0 and auto_read!=1) auto_read=0;
cls;
setting();
}
if(c=='3')
{
cyan("是否自动存档? (一场游戏后,1为是,0为否,目前为 ");
cyan(change(auto_file));
cyan(" )\n");
scanf("%d",&auto_file);
if(auto_file!=0 and auto_file!=1) auto_file=0;
cls;
setting();
}
if(c=='4'){cls;start();}
}
iv achievement_name_judge(string &qwq)
{
if(ach_judge[qwq]==0) red(string(qwq.size(),'?'));
else green(qwq);
}
iv achievement() //成就
{
cyan("成就名是全为?的,表示未完成;绿色表示已完成\n\n");
int usize=achs["普通模式"].size();
yellow("普通模式:\n");
for(int i=0;i<usize;i++)
green("> "),achievement_name_judge(achs["普通模式"][i]),print(":"),yellow(ach_introduce[achs["普通模式"][i]]),putchar('\n');
putchar('\n');
usize=achs["A.I.对战"].size();
yellow("A.I.对战:\n");
for(int i=0;i<usize;i++)
green("> "),achievement_name_judge(achs["A.I.对战"][i]),print(":"),yellow(ach_introduce[achs["A.I.对战"][i]]),putchar('\n');
putchar('\n');
usize=achs["隐藏成就"].size();
yellow("隐藏成就:\n");
for(int i=0;i<usize;i++)
green("> "),achievement_name_judge(achs["隐藏成就"][i]),print(":"),yellow(ach_introduce[achs["隐藏成就"][i]]),putchar('\n');
cyan("\n按1退出\n");
char c=getch();
while(c!='1') c=getch();
cls;
start();
}
iv reigns_data() //游戏机制资料
{
cyan("技能:\n\n");
for(int i=0;i<skills_2nd.size();i++)
pink(skills_2nd[i]+":"+skills[skills_2nd[i]]+"\n");
cyan("\n按1退出\n");
char c=getch();
while(c!='1') c=getch();
cls;
start();
}
iv choose_game() //选择游戏
{
green("1.普通模式\n");
green("2.A.I.对战\n");
green("3.返回\n");
cyan("\n请选择游戏模式:\n");
char c=getch();
while(!(c=='1' or c=='2' or c=='3' or c=='\\')) c=getch();
cls;
if(c=='1') game();
if(c=='2') ai_game();
if(c=='\\')
{
ach_judge["隐藏地域"]=1;
say("hide1",1);
say("hide2",1);
cls;
start();
}
if(c=='3')
{
cls;
start();
}
}
iv save_or_read() //选择存读档:
{
green("1.存档\n");
green("2.读档\n");
green("3.返回\n");
cyan("\n请选择:\n");
char c=getch();
while(!(c=='1' or c=='2' or c=='3')) c=getch();
cls;
if(c=='1') file(0);
if(c=='2') readfile(0);
if(c=='3')
{
cls;
start();
}
}
iv start() //主界面
{
pink("The Game:");yellow("Reigns");pink(" (王权)\n");
pink("Version:");yellow(version);pink("\n");
pink("The Author:");yellow("紫陰花");pink(" (洛谷用户名)\n\n");
if(Flag==0)
{
pink("正在检查您是否自动读档...\n");
ifstream fin("reignsfile.txt");
string op;
fin>>op>>auto_read>>auto_read>>auto_read>>auto_read>>auto_read>>auto_read;
fin.close();
if(auto_read==0)
{
red("您没有自动读档或没有本地保存文件\n\n");
emails.push_back("欢迎来到王权");
emails.push_back("游戏介绍-普通模式");
emails.push_back("游戏介绍-A.I.对战");
}
else
{
ifstream fin("reignsfile.txt");
fin>>op;
fin.close();
int fLag=0;
for(int i=0;i<banben.size();i++)
if(op==banben[i])
{
fLag=1;
break;
}
if(fLag==1)
{
readfile(1);
red("已为您读档\n\n");
}
else
{
red("您的保存文件版本不兼容\n\n");
emails.push_back("欢迎来到王权");
emails.push_back("游戏介绍-普通模式");
}
}
Flag=1;
}
int unreadnum=0;
for(int i=0;i<emails.size();i++)
if(email_judge[emails[i]]==0)
unreadnum++;
pink("1.开始游戏\n");
pink("2.邮件");
if(unreadnum>0)
red("("+change(unreadnum)+")");
pink("\n");
pink("3.统计\n");
pink("4.更新日志\n");
pink("5.游戏设置\n");
pink("6.存读档\n");
pink("7.成就\n");
pink("8.游戏机制资料\n");
pink("X.退出游戏\n");
char c=getch();
while((c<'1' or c>'8') and c!='X') c=getch();
cls;
if(c=='1') choose_game();
if(c=='2') email();
if(c=='3') statistics();
if(c=='4') journal();
if(c=='5') setting();
if(c=='6') save_or_read();
if(c=='7') achievement();
if(c=='8') reigns_data();
if(c=='X') exit(0);
}
inline int inversion(int judge,int number)
{
if(judge==0) return number;
else return 0-number;
}
iv game() //普通模式
{
string name;
string skill="无";
int q=50,w=50,e=50,r=50;
cyan("输入你的姓名(不含空格):");
cin>>name;
if(name=="紫陰花")
{
ach_judge["名字问题"]=1;
say("Hide1",2);cls;start();
return;
}
cls;
int k=year,j=1,inver=0;
char c;
rs();
if(k==1)
achieve("初登王位");
while(1)
{
if(year-k+1==100 and ach_judge["百寿"]==0)
achieve("百寿");
print("君王:");yellow(name);putchar('\n');
print("统治期 第 ");red(change(year));print(" 年\n");
print("宗教:");num(q);putchar(' ');
print("民众:");num(w);putchar(' ');
print("军队:");num(e);putchar(' ');
print("财富:");num(r);putchar('\n');
print("技能:");cyan(skill);putchar('\n');
if(inver==1) red("处于倒置状态\n");
putchar('\n');
if(q<=0 or q>=100 or w<=0 or w>=100 or e<=0 or e>=100 or r<=0 or r>=100) //死亡
{
red("对你感到不满的臣民们一拥而上,杀死了你\n");
gq[qaq+1]={k,year,name};
qaq++;
int guyu=0;
if(q<=0 or q>=100) guyu++;
if(w<=0 or w>=100) guyu++;
if(e<=0 or e>=100) guyu++;
if(r<=0 or r>=100) guyu++;
if(guyu>=2 and ach_judge["多重加害"]==0)
achieve("多重加害");
Sleep(3000);
if(auto_file==1) file(1);
cls;
start();
return;
}
print("事件:\n");
int v=ra[j];
print(x[v].a);putchar('\n');
print("Y:\n宗教:");cho(inversion(inver,x[v].a1));
print("\n民众:");cho(inversion(inver,x[v].a2));
print("\n军队:");cho(inversion(inver,x[v].a3));
print("\n财富:");cho(inversion(inver,x[v].a4));
putchar('\n');
if(x[v].b!="") print("可得技能:"),cyan(x[v].b),putchar('\n');
print("N:\n宗教:");cho(inversion(inver,x[v].b1));
print("\n民众:");cho(inversion(inver,x[v].b2));
print("\n军队:");cho(inversion(inver,x[v].b3));
print("\n财富:");cho(inversion(inver,x[v].b4));
putchar('\n');
if(x[v].c!="") print("可得技能:"),cyan(x[v].c),putchar('\n');
if(skill!="无") print("S:\n技能效果:\n"),cyan(skills[skill]);
putchar('\n');
c=getch();
while(c!='Y' and c!='N' and ((c=='S' and skill=="无") or c!='S')) c=getch();
if(c=='Y'){q+=inversion(inver,x[v].a1);w+=inversion(inver,x[v].a2);e+=inversion(inver,x[v].a3);r+=inversion(inver,x[v].a4);if(x[v].b!="") skill=x[v].b;}
if(c=='N'){q+=inversion(inver,x[v].b1);w+=inversion(inver,x[v].b2);e+=inversion(inver,x[v].b3);r+=inversion(inver,x[v].b4);if(x[v].c!="") skill=x[v].c;}
if(c=='S')
{
if(skill=="平安")
{
cyan("选择宗教按1、民众按2、军队按3、财富按4\n");
c=getch();
while(c<'1' or c>'4') c=getch();
if(c=='1') q=50;
if(c=='2') w=50;
if(c=='3') e=50;
if(c=='4') r=50;
year--,j--;
}
if(skill=="倒置") inver=1-inver,year--,j--;
skill="无";
}
cls;
year++;j++;
if(j==SIZe*2+1)
rs(),j=1;
}
}
iv ai_game() //A.I.对战
{
string name;
string skill="无",skill2="无";
int q=50,w=50,e=50,r=50;
int q2=50,w2=50,e2=50,r2=50;
cyan("输入你的姓名(不含空格):");
cin>>name;
if(name=="紫陰花")
{
ach_judge["名字问题"]=1;
say("Hide1",2);cls;start();
return;
}
cls;
int k=year2,j=1,inver1=0,inver2=0;
bool sttg=0;//殊途同归 成就判断
int bctb=0;//保持同步 成就判断
char c;
rs();
if(k==1)
achieve("竞争者");
while(1)
{
int tb_i_choose=0;
if(sttg==0 and not(q==q2 and w==w2 and e==e2 and r==r2)) sttg=1;
else if(sttg==1 and q==q2 and w==w2 and e==e2 and r==r2)
if(ach_judge["殊途同归"]==0)
achieve("殊途同归");
if(bctb==5 and ach_judge["保持同步"]==0)
achieve("保持同步");
if(year2-k+1==30 and ach_judge["常年争执"]==0)
achieve("常年争执");
int ai_back=0;
print("我方君王:");yellow(name);putchar('\n');
print("敌方君王:");red("A.I.\n");
print("争夺期 第 ");red(change(year2));print(" 年\n");
yellow("我方:");print("宗教:");num(q);print(" 民众:");num(w);print(" 军队:");num(e);print(" 财富:");num(r);putchar('\n');
red("敌方:");print("宗教:");num(q2);print(" 民众:");num(w2);print(" 军队:");num(e2);print(" 财富:");num(r2);putchar('\n');
yellow("我方技能:");cyan(skill);putchar('\n');
red("敌方技能:");cyan(skill2);putchar('\n');
if(inver1==1) red("我方处于倒置状态\n");
if(inver2==1) red("敌方处于倒置状态\n");
putchar('\n');
bool die_1=(q<=0 or q>=100 or w<=0 or w>=100 or e<=0 or e>=100 or r<=0 or r>=100);
bool die_2=(q2<=0 or q2>=100 or w2<=0 or w2>=100 or e2<=0 or e2>=100 or r2<=0 or r2>=100);
if(die_1 and die_2)
{
red("双方君王同时被杀\n");
red("同时死亡,游戏平局\n");
achieve("两败俱伤");
gq2[qaq2+1]={k,year2,name,2};
qaq2++;
Sleep(3000);
if(auto_file==1) file(1);
cls;
start();
return;
}
if(die_1) //我方死亡
{
red("对你感到不满的臣民们一拥而上,杀死了你\n");
red("您先死亡,游戏失败\n");
gq2[qaq2+1]={k,year2,name,0};
qaq2++;
Sleep(3000);
if(auto_file==1) file(1);
cls;
start();
return;
}
if(die_2) //敌方死亡
{
red("敌方的统治失败,君王被杀\n");
red("敌方死亡,游戏胜利\n");
gq2[qaq2+1]={k,year2,name,1};
qaq2++;
Sleep(3000);
if(auto_file==1) file(1);
cls;
start();
return;
}
print("事件:\n");
int v=ra[j];
print(x[v].a);putchar('\n');
print("Y:\n宗教:");cho(inversion(inver1,x[v].a1));
print("\n民众:");cho(inversion(inver1,x[v].a2));
print("\n军队:");cho(inversion(inver1,x[v].a3));
print("\n财富:");cho(inversion(inver1,x[v].a4));
putchar('\n');
if(x[v].b!="") print("可得技能:"),cyan(x[v].b),putchar('\n');
print("N:\n宗教:");cho(inversion(inver1,x[v].b1));
print("\n民众:");cho(inversion(inver1,x[v].b2));
print("\n军队:");cho(inversion(inver1,x[v].b3));
print("\n财富:");cho(inversion(inver1,x[v].b4));
putchar('\n');
if(x[v].c!="") print("可得技能:"),cyan(x[v].c),putchar('\n');
if(skill!="无") print("S:\n技能效果:\n"),cyan(skills[skill]);
putchar('\n');
c=getch();
while(c!='Y' and c!='N' and ((c=='S' and skill=="无") or c!='S')) c=getch();
if(c=='Y'){tb_i_choose=1,q+=inversion(inver1,x[v].a1);w+=inversion(inver1,x[v].a2);e+=inversion(inver1,x[v].a3);r+=inversion(inver1,x[v].a4);if(x[v].b!="") skill=x[v].b;}
if(c=='N'){tb_i_choose=2,q+=inversion(inver1,x[v].b1);w+=inversion(inver1,x[v].b2);e+=inversion(inver1,x[v].b3);r+=inversion(inver1,x[v].b4);if(x[v].c!="") skill=x[v].c;}
if(c=='S')
{
if(skill=="平安")
{
cyan("选择宗教按1、民众按2、军队按3、财富按4\n");
c=getch();
while(c<'1' or c>'4') c=getch();
if(c=='1') q=50;
if(c=='2') w=50;
if(c=='3') e=50;
if(c=='4') r=50;
year2--,j--,ai_back=1;
}
if(skill=="倒置") inver1=1-inver1,year2--,j--,ai_back=1;
skill="无";
}
if(ai_back==0)
{
//A.I.判断部分
int ai_a1=q2+inversion(inver2,x[v].a1),ai_b1=w2+inversion(inver2,x[v].a2),ai_c1=e2+inversion(inver2,x[v].a3),ai_d1=r2+inversion(inver2,x[v].a4);
int ai_a2=q2+inversion(inver2,x[v].b1),ai_b2=w2+inversion(inver2,x[v].b2),ai_c2=e2+inversion(inver2,x[v].b3),ai_d2=r2+inversion(inver2,x[v].b4);
int ai_max1=max(max(max(abs(ai_a1-50),abs(ai_b1-50)),abs(ai_c1-50)),abs(ai_d1-50));
int ai_max2=max(max(max(abs(ai_a2-50),abs(ai_b2-50)),abs(ai_c2-50)),abs(ai_d2-50));
int ai_o1=ai_a1+ai_b1+ai_c1+ai_d1,ai_o2=ai_a2+ai_b2+ai_c2+ai_d2;
bool ai_s1=not(ai_a1<=0 or ai_a1>=100 or ai_b1<=0 or ai_b1>=100 or ai_c1<=0 or ai_c1>=100 or ai_d1<=0 or ai_d1>=100);
bool ai_s2=not(ai_a2<=0 or ai_a2>=100 or ai_b2<=0 or ai_b2>=100 or ai_c2<=0 or ai_c2>=100 or ai_d2<=0 or ai_d2>=100);
int choose;
if(ai_s1 and ai_s2)
{
if(x[v].b!="")
{
if(skill2!="") choose=2;
else
{
if(x[v].b=="逃避")
if(abs(abs(ai_c1-50)-abs(e2-50))<10) choose=1;
else choose=2;
if(x[v].b=="平安")
if(abs(abs(ai_d1-50)-abs(r2-50))<15) choose=1;
else choose=2;
if(x[v].b=="倒置")
if(abs(abs(ai_a1-50)-abs(q2-50))<10) choose=1;
else choose=2;
}
}
else
{
if(ai_max1>ai_max2) choose=2;
if(ai_max1<ai_max2) choose=1;
if(ai_max1==ai_max2)
{
if(abs(ai_o1-200)>abs(ai_o2-200)) choose=2;
if(abs(ai_o1-200)<abs(ai_o2-200)) choose=1;
if(abs(ai_o1-200)==abs(ai_o2-200)) choose=rand()%2+1;
}
}
}
if(ai_s1 and not(ai_s2)) choose=1;
if(not(ai_s1) and ai_s2) choose=2;
if(not(ai_s1) and not(ai_s2))
{
if(skill2=="逃避") skill2="无",choose=0;
if(skill2=="倒置")
{
inver2=1-inver2;
ai_a1=q2+inversion(inver2,x[v].a1),ai_b1=w2+inversion(inver2,x[v].a2),ai_c1=e2+inversion(inver2,x[v].a3),ai_d1=r2+inversion(inver2,x[v].a4);
ai_a2=q2+inversion(inver2,x[v].b1),ai_b2=w2+inversion(inver2,x[v].b2),ai_c2=e2+inversion(inver2,x[v].b3),ai_d2=r2+inversion(inver2,x[v].b4);
ai_max1=max(max(max(abs(ai_a1-50),abs(ai_b1-50)),abs(ai_c1-50)),abs(ai_d1-50));
ai_max2=max(max(max(abs(ai_a2-50),abs(ai_b2-50)),abs(ai_c2-50)),abs(ai_d2-50));
ai_o1=ai_a1+ai_b1+ai_c1+ai_d1,ai_o2=ai_a2+ai_b2+ai_c2+ai_d2;
ai_s1=not(ai_a1<=0 or ai_a1>=100 or ai_b1<=0 or ai_b1>=100 or ai_c1<=0 or ai_c1>=100 or ai_d1<=0 or ai_d1>=100);
ai_s2=not(ai_a2<=0 or ai_a2>=100 or ai_b2<=0 or ai_b2>=100 or ai_c2<=0 or ai_c2>=100 or ai_d2<=0 or ai_d2>=100);
if(ai_s1 and ai_s2)
{
if(ai_max1>ai_max2) choose=2;
if(ai_max1<ai_max2) choose=1;
if(ai_max1==ai_max2)
{
if(abs(ai_o1-200)>abs(ai_o2-200)) choose=2;
if(abs(ai_o1-200)<abs(ai_o2-200)) choose=1;
if(abs(ai_o1-200)==abs(ai_o2-200)) choose=rand()%2+1;
}
}
if(ai_s1 and not(ai_s2)) choose=1;
if(not(ai_s1) and ai_s2) choose=2;
else choose=rand()%2+1;
}
else if(skill2=="平安")
{
int ai_flag=0,ai_now1=1,ai_now2=1,ai_ch1,ai_ch2;
if(ai_a1<=0 or ai_a1>=100) ai_flag++,ai_ch1=1;
if(ai_b1<=0 or ai_b1>=100) ai_flag++,ai_ch1=2;
if(ai_c1<=0 or ai_c1>=100) ai_flag++,ai_ch1=3;
if(ai_d1<=0 or ai_d1>=100) ai_flag++,ai_ch1=4;
if(ai_flag>1) ai_now1=0;
ai_flag=0;
if(ai_a2<=0 or ai_a2>=100) ai_flag++,ai_ch2=1;
if(ai_b2<=0 or ai_b2>=100) ai_flag++,ai_ch2=2;
if(ai_c2<=0 or ai_c2>=100) ai_flag++,ai_ch2=3;
if(ai_d2<=0 or ai_d2>=100) ai_flag++,ai_ch2=4;
if(ai_flag>1) ai_now2=0;
if(ai_now1 and ai_now2)
{
if(ai_max1>ai_max2) choose=2;
if(ai_max1<ai_max2) choose=1;
if(ai_max1==ai_max2)
{
if(abs(ai_o1-200)>abs(ai_o2-200)) choose=2;
if(abs(ai_o1-200)<abs(ai_o2-200)) choose=1;
if(abs(ai_o1-200)==abs(ai_o2-200)) choose=rand()%2+1;
}
}
if(ai_now1 and not(ai_now2))
{
choose=1;
if(ai_ch1==1) q2=50;
if(ai_ch1==2) w2=50;
if(ai_ch1==3) e2=50;
if(ai_ch1==4) r2=50;
}
if(not(ai_now1) and ai_now2)
{
choose=2;
if(ai_ch2==1) q2=50;
if(ai_ch2==2) w2=50;
if(ai_ch2==3) e2=50;
if(ai_ch2==4) r2=50;
}
else choose=rand()%2+1;
}
else choose=rand()%2+1;
}
//A.I.选择生效部分
if(choose==1){q2+=inversion(inver2,x[v].a1);w2+=inversion(inver2,x[v].a2);e2+=inversion(inver2,x[v].a3);r2+=inversion(inver2,x[v].a4);if(x[v].b!="") skill2=x[v].b;}
if(choose==2){q2+=inversion(inver2,x[v].b1);w2+=inversion(inver2,x[v].b2);e2+=inversion(inver2,x[v].b3);r2+=inversion(inver2,x[v].b4);if(x[v].c!="") skill2=x[v].c;}
if(choose==tb_i_choose) bctb++;
else bctb=0;
}
cls;
year2++;j++;
if(j==SIZe*2+1)
rs(),j=1;
}
}
int main()
{
srand(time(NULL));
init();
start();
}
股票游戏
//转自:https://www.luogu.com.cn/paste/y5a46yjm
#include<bits/stdc++.h>
#include"windows.h"
using namespace std;
int r[11],cx[11],d,i,j,p,x,xx,xxx,rt,ret,stn,s,sd,sdn,k,tn,h,z,zx,wt,kkk,wek;
double money,c[11],n,b,bx,re,use,mb,dm,df,dx,cn,cun,nnn,tou;
bool bk,cj[11],hhh=1,ct=1;
void printn();
int main()
{
printf("炒股票:(BY:Wkykw)\n");
printf("你将进行一些操作来买卖股票\n");
printf("你有一定的财富用于自由购买\n");
printf("但当你的负债大于1000元时,你将破产\n");
printf("请注意:即使不进行任何操作,每天仍会有不少于当前现金的千分之一的消耗\n");
printf("注:-1为自选模式,0为无限模式\n");
printf("\n请按回车键继续...");
getchar();
system("cls") ;
printf("请输入你想要的难度(-1~6)");
scanf("%d",&k);
if(k<=6&&k>=-1)
{
switch(k)
{
case -1:
printf("\n你期望的现金?") ;
scanf("%lf",&money);
printf("\n你期望的目标?") ;
scanf("%lf",&mb);
printf("\n你期望的日期?") ;
scanf("%d",&tn);
k=4;
break;
case 0:
money=1000000;
mb=9999999.99;
tn=9999999;
break;
case 1:
money=10000;
mb=1000;
tn=1000;
break;
case 2:
money=20000;
mb=5000;
tn=100;
break;
case 3:
money=30000;
mb=15000;
tn=90;
break;
case 4:
money=50000;
mb=30000;
tn=80;
break;
case 5:
money=100000;
mb=100000;
tn=70;
break;
case 6:
money=300000;
mb=700000;
tn=60;
break;
}
if(k==0)
{
k=7;
}
}
else
{
return 0;
}
kkk=k;
nnn=money;
for(i=1;i<=k+2;i++)c[i]=i*100.00;
printf("\n你需要在%d天内赚%.2lf元\n",tn,mb);
printf("你的初始资金为%.2lf元\n",money);
printf("祝君游戏愉快。\n");
printf("\n请按回车键继续...");
getchar();
getchar();
mb+=money;
system("cls") ;
system("color 7E");
/* START */
do
{
if(hhh)
d++;
system("cls");
printf("指令:0=过,1=买,2=卖,3=借,4=还,5=存,6=取");
if(!hhh)printf(",666=正常模式");
if(k==7)printf(",7=GAME OVER");
printf("\nDay %d:\n",d);
srand(clock());
wt=rand()%600;
if(wt==0)
{
printf("系统缺钱,向你借了%.2lf元\n",money/3);
money/=1.5;
}
if(wt>590)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 你遭受了偷窃!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|FOREGROUND_GREEN|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
tou=money*(k+2)/10;
money-=tou;
}
if(tou&&wt<400&&wt>380)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 你的财富得以追回!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|FOREGROUND_GREEN|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
money+=tou;
}
if(d>=3)
if(stn)
{
srand((int)time(0)),s=rand()%(k/2+1);
if(s&&hhh)
{
sd++;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 金融危机第%d天\n",sd);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|FOREGROUND_GREEN|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
sdn=rand()%30+10;
}
else
sd=0,sdn=0,stn=0;
}
else
{
srand((int)time(0));
s=rand()%10;
if(!s&&hhh)
{
sd=1;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 金融危机!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
sdn=20;
stn=1;
}
}
if(d>1&&hhh)
{
srand((int)time(0));
use=rand()%50+sdn+money/1000;
money-=use;
df+=use;
}
printf("当前资产:%.2lf\n",money);
if(k!=7)
{
printf("我的目标:%.2lf\n",mb);
printf("还剩%d天\n",tn-d+1);
}
dx=dm-df;
if(dx>0)
{
printf("昨日净赚:%.2lf\n",dx);
}
else
printf("昨日净亏:%.2lf\n",-dx);
re=re*1.7;
cun*=1.005;
printf("今日还款额度:%.2lf\n",re);
printf("当前借款:%.2lf\n",bx);
printf("当前存款:%.2lf\n",cun);
if(d==ret-1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf("明天你必须还钱!\n");
}
if(d==ret&&hhh)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf("现在你必须还钱!\n");
money-=b*re;
ret=0;
bk=0;
re=0;
df+=n;
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
if(money<-1000&&hhh) break;
printf(" 股市情况: 股价(元/股) 当前持有量 增/降百分点\n");
for(i=1;i<=k+2;i++)
{
printf(" ");
x=rand()% (120-k*10);
if(c[i]<10.00)
{
h+=2;
x+=5;
if(c[i]<1.00)
{
h+=2;
x+=10;
if(c[i]<0.1)
{
h+=2;
x+=25;
}
}
}
r[i]=x-25-min((sdn/2),50)+h;
z+=r[i];
zx+=r[i];
c[i]*=r[i]*0.01+1;
if(z<-240||zx<-80)
{
h+=1;
}
else
{
if((z>320||zx>100)&&hhh)
{
h-=1;
}
}
srand(clock());
_sleep(x+15);
if(i%2==0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY|
BACKGROUND_BLUE);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY|
BACKGROUND_INTENSITY|BACKGROUND_BLUE);
}
printf(" 公司%d",i);
printf("%18.6f%12d ",c[i],cx[i]);
if(r[i]>=0)
{
if(i%2==0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_INTENSITY|BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
}
else
{
if(i%2==0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_INTENSITY|BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
}
zx=0;
printf("********************************************************************************");
while(1)
{
printf("\n接下来你要做什么?\n");
scanf("%d",&x);
if(x==0)
{
system("color F0");
_sleep(100);
system("color 7E");
break;
}
if((x>0&&x<7)||x==666||(x==8&&k==7))
switch(x)
{
case 1:
printf("买那个?\n");
scanf("%d",&xx);
printf("买多少?\n");
scanf("%d",&xxx);
n=c[xx]*xxx;
if(xx>0&&xx<k+3&&xxx>0)
if(money>=n)
{
printf("交易成功!\n");
money-=n;
cx[xx]+=xxx;
df+=n;
}
else
{
printf("你买不起!\n");
}
else
{
printf("无效操作\n");
}
break;
case 2:
printf("卖那个?\n");
scanf("%d",&xx);
printf("卖多少?\n");
scanf("%d",&xxx);
n=c[xx]*xxx;
if(xx>0&&xx<k+3)
{
if(cx[xx]>=xxx)
{
printf("交易成功!\n");
money+=n;
if(hhh)
cx[xx]-=xxx;
dm+=n;
}
else
{
printf("股票不足!\n");
break;
}
}
else
{
printf("无效操作\n");
}
break;
case 3:
if(!bk)
{
printf("借多少?\n");
scanf("%lf",&bx);
if(bx<=money)
{
if(bx<=0)
{
printf("无效操作\n");
break;
}
money+=bx;
b=bx;
ret=d+14;
if(hhh)
bk=1,re=0.01;
if(hhh)
printf("交易成功!两周内你必须还钱!\n");
}
else
printf("你还不能借这么多钱!\n");
}
else
printf("你现在不能借钱!\n");
break;
case 4:
if(b*re>money+1000)
{
printf("你无力还钱!\n");
break;
}
if(b==0)
{
printf("你无需还钱!\n");
break;
}
money-=b*re;
ret=0;
re=0;
bk=0;
df+=n;
printf("还钱成功!\n");
break;
case 5:
printf("存多少?\n");
scanf("%lf",&cn);
if(cn<=0)
{
printf("无效操作\n");
break;
}
if(money>=cn)
{
cun+=cn;
money-=cn;
printf("存款成功!\n");
break;
}
else
{
printf("你没有这么多钱!\n");
break;
}
case 6:
if(cun==0||hhh==0)
{
printf("你没有存款!\n");
break;
}
else
{
money+=cun;
cun=0;
printf("取款成功!\n");
break;
}
case 7:
ct=0;
break;
case 666:
if(hhh)
{
printf("你是否进入无敌模式?\n是=1\n");
scanf("%d",&xx);
if(xx==1){
system("color 02");
_sleep(300);
printn();
_sleep(300);
system("color 02");
_sleep(300);
printn();
_sleep(300);
printf("Nice\n");
k=7;
money+=1000000;
for(i=1;i<=k+2;i++)
{
cx[i]=99999;
h=1000;
hhh=0;
}
}
}
else
{
printf("你是否退出无敌模式?\n是=1\n");
scanf("%d",&xx);
if(xx==1){
system("color 02");
_sleep(300);
printn();
_sleep(300);
system("color 02");
_sleep(300);
printn();
_sleep(300);
printf("Well\n");
k=kkk;
money+=1000000;
h=-10;
hhh=1;
}
}
break;
}
else
printf("无效操作\n");
getchar();
getchar();
printn();
}
df=0,dm=0;
/*
if(d%7==0)
{
system("cls");
wek=d/7;
printf("这是第%d周\n",wek);
printf("是否资助?(是1否0)\n",wek);
scanf("%d",&x) ;
if(x==1)
{
printf("资助哪个?\n");
scanf("%d",&x) ;
while(x<0&&x>k+3)
{
printf("无效操作");
scanf("%d",&x) ;
}
}
}*/
}
while(money>-1000&&((money-bx<mb&&d<tn)||(k==7)&&ct));
/* GAME OVER */
system("color F0");
if(money>=mb)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE|BACKGROUND_INTENSITY);
printf("************************************YOU WIN!************************************\n");
printf("你在%d天内用%.2f元赚取了%.2f元",d,nnn,money-nnn);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE|BACKGROUND_INTENSITY);
printf("***********************************YOU LOSE!************************************\n");
if(money<-1000)
{
printf("你破产了!\n");
}
printf("你的最终资金:%.2f",money);
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE|BACKGROUND_INTENSITY);
getchar() ;
}
void printn()
{
system("cls") ;
system("color 7E");
printf("指令:0=过,1=买,2=卖,3=借,4=还,5=存,6=取");
if(!hhh)printf(",666=正常模式");
if(k==7)printf(",7=GAME OVER");
printf("\nDay %d:\n",d);
if(d>=3)
if(stn)
{
if(s&&hhh)
{
sd++;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 金融危机第%d天\n",sd);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|FOREGROUND_GREEN|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
}
}
else
{
if(!s&&hhh)
{
sd=1;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 金融危机!\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
}
}
printf("当前资产:%.2lf\n",money);
if(k!=7)
{
printf("我的目标:%.2lf\n",mb);
printf("还剩%d天\n",tn-d+1);
}
if(dx>0)
printf("昨日净赚:%.2lf\n",dx);
else
printf("昨日净亏:%.2lf\n",-dx);
printf("今日还款额度:%.2lf\n",re);
printf("当前借款:%.2lf\n",bx);
printf("当前存款:%.2lf\n",cun);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
printf(" 股市情况: 股价(元/股) 当前持有量 增/降百分点\n");
for(i=1;i<=k+2;i++)
{
printf(" ");
if(i%2==0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY|
BACKGROUND_BLUE);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_INTENSITY|
BACKGROUND_INTENSITY|BACKGROUND_BLUE);
}
printf(" 公司%d",i);
printf("%18.6f%12d ",c[i],cx[i]);
if(r[i]>=0)
{
if(i%2==0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_INTENSITY|BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
}
else
{
if(i%2==0)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
else
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_INTENSITY|
BACKGROUND_INTENSITY|BACKGROUND_BLUE);
printf("%7d% \n",r[i]);
}
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_INTENSITY|
BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
}
zx=0;
printf("********************************************************************************");
}