项目右键点击–>属性–> C/C++ –> 常规 –> 附加包含目录
C:\local\boost_1_64_0
项目右键点击–>属性–> VC++ 目录 –> 库目录
C:\local\boost_1_64_0\lib32-msvc-14.0
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
void print(const boost::system::error_code & e)
{
std::cout << "Hello, world!" << std::endl;
}
int main()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.async_wait(&print);
io.run();
return 0;
}
The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling io_service::run(). Therefore unless the io_service::run() function is called the callback for the asynchronous wait completion will never be invoked.
http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial/tuttimer2.html
项目右键点击–>属性–> C/C++ –> 常规 –> 附加包含目录
C:\local\boost_1_64_0
项目右键点击–>属性–> VC++ 目录 –> 库目录
C:\local\boost_1_64_0\lib32-msvc-14.0
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
int main()
{
boost::asio::io_service io;
boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));
t.wait(); //会在这里停5秒
std::cout << "Hello, world!" << std::endl;
return 0;
}
http://www.boost.org/doc/libs/1_64_0/doc/html/boost_asio/tutorial/tuttimer1.html
牌
万,条,筒,各36张,一共108张牌。
自摸:在玩家摸牌时,摸到的牌满足胡牌条件,并选择“胡牌”,为自摸。自摸时胡牌者赢所有未胡牌玩家的分。若为引杠后自摸(即引杠后杠上开花)胡牌,只赢被引杠者的分。
点炮(放冲):打出一张牌后,有玩家使用这张牌胡牌,也称点炮。胡牌者赢点炮玩家的分。
一炮双响(三响):打牌后,有两家胡这张牌便被称为一炮双响。如果其余三家都胡牌,便称为一炮三响。
海底捞: 玩家在牌墙最后一张摸牌后胡牌,则胡牌番数在原有的基础上加1。
海底炮: 玩家摸上牌墙最后一张后点炮,则胡牌玩家番数在原有的基础上加1。
胡牌
胡牌时的牌型种类如下:
11 、 123 、 123 、 123 、 123
11 、 123 、 123 、 123 、 111(1111 ,下同 )
11 、 123 、 123 、 111 、 111
11 、 123 、 111 、 111 、 111
11 、 111 、 111 、 111 、 111
11、11、11、11、11、11、11
牌局结束情况:
所有的牌都摸完了。
有3个玩家胡牌了。
同时每个胡过牌的玩家不可以再摸牌,出牌。
大对子: 胡牌时,1对将 + 4副刻子。
清一色: 胡牌时,牌面为单一花色。
暗七对: 胡牌时,是7副对子。
全幺九: 胡牌时,对子、顺子、刻子 全都带有幺和九。
将对: 胡牌时,由2、5、8牌组成的大对子,也就是对子+4副刻子,全部都是由2、5、8构成。
清大对: 清一色 + 大对子。
清七对: 清一色 + 暗七对。
清带幺: 清一色 + 全幺九。
定缺
牌局一开始的时候,每个玩家都要进入定缺的场景,也就是每个玩家要在万、条、筒这3种牌中选个一个种类。
然后在接下来的牌局中,只要手牌中还有这个种类的牌,那就不可以打其他的牌。
比如说:我在定缺的时候选择了万,那么我的手牌中只要还有万牌,那条、筒这两类牌就不可以打。
如果手牌中已经没有万了,但是摸牌的时候刚好摸到了一张万,那就只能打这张万。
叫牌:若玩家手中的牌型只差一张便可以胡牌,其状态称为叫牌。
当牌全部摸完后,若玩家有叫则显示“自家有叫”。
若无叫则显示“自家无叫”。
查叫: 牌摸完后,还有2家及以上的玩家没胡牌,则进入查叫阶段。
无叫的玩家要输分给有叫的玩家。
按照查大叫的方式算番,即按照有叫玩家牌面的最大番数来计算输赢分。
已胡牌的玩家不参与查叫。如果未胡牌者都未听或都有听,则不互相查叫。
查叫分为查大叫、查小叫,这个版本固定为查大叫;
查大叫:以手牌较大番数为准进行查叫;
查小叫:以手牌较小番数为准进行查叫。
根(归): 胡牌中有四张一样的牌,称为“根”。 有几个根加几番。
四张同样的牌都在一个人手里,包含杠或手牌。
比如碰了3条,手里还有345条,这种也算一根。
暗杠: 手中有4张一样的牌,杠牌之后只有自己看得见。[播放下雨动画]
明杠:就是杠牌之后,杠的牌其他玩家可以看得到。引杠、巴杠、绕杠都属于明杠。
引杠(放杠)(点杠): 其他人打出一张牌,自己手中有三张相同的牌,即可杠牌,称为引杠。[播放刮风动画]
巴杠(续杠)(自杠): 如果自己已经有碰过的牌,同时又摸到了一张相同的牌,即可杠牌,称为续杠。[播放刮风动画]
绕杠:是指手中三张,有人打出第四张,自己先碰后杠;或者碰牌后摸到第四张,却没有立即补杠,而是下回再杠。不收水钱,只算一根。
杠上花: 杠牌之后,摸了一张新的手牌,然后胡牌了。杠上花的番数要加一。
暗杠杠上花: 暗杠之后,摸了一张新的手牌,然后胡牌了。自摸胡牌。
引杠杠上花: 引杠之后,摸了一张新的手牌,然后胡牌了。重庆麻将在这里将引杠者当作为点炮者。
巴杠杠上花: 巴杠之后,摸了一张新的手牌,然后胡牌了。自摸胡牌。
绕杠杠上花: 绕杠之后,摸了一张新的手牌,然后胡牌了。自摸胡牌。
杠上炮: 胡他人杠牌后打出的第一张牌,杠上炮的番数要加一。
暗杠上炮: 暗杠之后,摸了一张新的手牌,再打出一张手牌,然后被其他人胡了。
杠引上炮: 引杠之后,摸了一张新的手牌,再打出一张手牌,然后被其他人胡了。
暗杠上炮: 巴杠之后,摸了一张新的手牌,再打出一张手牌,然后被其他人胡了。
暗杠上炮: 暗杠之后,摸了一张新的手牌,再打出一张手牌,然后被其他人胡了。
抢杠: 胡他人碰后要补杠的牌,抢杠的玩家结算番数加一,被抢杠者的此根不算,并作为点炮者。
过水不胡:
转水:
退水:
引杠时,除了向引杠者收取底分x2的水钱,还需要向另外两位玩家收取底分x1的水钱。
决定牌局中是否算天地胡,不选择该规则,出现天地胡也算普通胡牌。
天和(天胡):是麻将中的一种和牌形式,指的是庄家利用最初摸到的14张牌和牌的情况。只有庄家能够达成。
地和(地胡):是麻将中的一种和牌形式,指的是闲家在第一圈摸牌胡牌,称之为地和。
决定牌局中是否有门清和中张加番的规则。
门清指的是不碰不杠,全靠自己摸牌
中张指的是所胡的这张牌是两张牌中间的那张,例如3筒5筒,胡中间的4筒。
决定牌局中是否有卡心五加番的规则。
卡心五指的是所胡的牌是4和6中间的5,例如手中有4条和6条,胡5条。
大单钓:玩家手中只剩下一张牌之后胡牌。
选择该规则时,出现大单钓加1番。
决定牌局中是否有全幺九加番和将对加番的规则。
若设置选择了该项,游戏开局发牌后:
1、每个玩家从自己手牌中点起3张同花色牌;
2、确定后,玩家不能更改换牌;
3、确定后,3张牌(盖着)移动到桌子中间,中间就有4堆(每堆3张牌)牌。
4、四家都确定换牌后,系统随机一套分配规则(规则要确保来自自己的那堆不能分配给自己),把四堆牌分发给玩家(有牌的飞行动画,飞向收牌方)。
决定大对子是加2番还是加1番。
决定自摸时是额外获得底分还是额外加番。
杠上炮
杠上花
1局: 消耗房卡1张
4局: 消耗房卡2张
8局: 消耗房卡3张
16局: 消耗房卡4张
3番,4番,5番,6番
https://github.com/DynamoRIO/drmemory.git
drmemory -brief – foo.exe arg1 arg2
运行此命令,请用可执行文件名和命令行参数替换 “foo.exe arg1 arg2”。
工具–>Dr memory
策略模式:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
#include <stdio.h>
#include <iostream>
using namespace std;
class QuackBehavior
{
public:
virtual void Quack() = 0;
};
class FlyBehavior
{
public:
virtual void Fly() = 0;
};
class Duck
{
public:
void Swim()
{
cout << "All duck can swim.\n";
}
virtual void Display() = 0;
void PerformQuack()
{
m_pQuackBehavior->Quack();
}
void PerformFly()
{
m_pFlyBehavior->Fly();
}
void SetQuackBehavior(QuackBehavior * pQuackBehavior)
{
m_pQuackBehavior = pQuackBehavior;
}
void SetFlyBehavior(FlyBehavior * pFlyBehavior)
{
m_pFlyBehavior = pFlyBehavior;
}
private:
QuackBehavior * m_pQuackBehavior;
FlyBehavior * m_pFlyBehavior;
};
class SqueakDuck : public Duck
{
void Display()
{
cout << "This is a squeak duck.\n";
}
};
class SqueakQuackBehavior : public QuackBehavior
{
public:
void Quack()
{
cout << "zi zi zi ...\n";
}
};
class SqueakFlyBehavior : public FlyBehavior
{
public:
void Fly()
{
cout << "Can't fly.\n";
}
};
int main()
{
Duck * d = new SqueakDuck;
d->SetFlyBehavior(new SqueakFlyBehavior);
d->SetQuackBehavior(new SqueakQuackBehavior);
d->PerformFly();
d->PerformQuack();
return 0;
}
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Observer
{
public:
virtual void Update(double temperature, double humidity, double pressure) = 0;
};
class DisplayElement
{
public:
virtual void Display() = 0;
};
class Subject
{
public:
virtual void RegisterObserver(Observer * pObserver) = 0;
virtual void RemoveObserver(Observer * pObserver) = 0;
virtual void NotifyObservers() = 0;
};
class WeatherData : public Subject
{
public:
void RegisterObserver(Observer * pObserver)
{
m_vecObservers.push_back(pObserver);
}
void RemoveObserver(Observer * pObserver)
{
m_vecObservers.erase(remove(m_vecObservers.begin(), m_vecObservers.end(), pObserver), m_vecObservers.end());
}
void NotifyObservers()
{
vector<Observer*>::iterator iter = m_vecObservers.begin();
while (iter != m_vecObservers.end())
{
(*iter)->Update(m_temperature, m_humidity, m_pressure);
++iter;
}
}
void MeasurementsChanged()
{
NotifyObservers();
}
void SetMeasurements(double temperature, double humidity, double pressure)
{
m_temperature = temperature;
m_humidity = humidity;
m_pressure = pressure;
MeasurementsChanged();
}
private:
vector<Observer*> m_vecObservers;
double m_temperature;
double m_humidity;
double m_pressure;
};
class CurrentConditionsDisplay : public Observer, DisplayElement
{
public:
CurrentConditionsDisplay(WeatherData * pWeatherData)
{
pWeatherData->RegisterObserver(this);
}
void Update(double temperature, double humidity, double pressure)
{
m_temperature = temperature;
m_humidity = humidity;
m_pressure = pressure;
Display();
}
void Display()
{
cout << "CurrentConditionsDisplay m_temperature = " << m_temperature <<
", m_humidity = " << m_humidity <<
", m_pressure = " << m_pressure << endl;
}
private:
double m_temperature;
double m_humidity;
double m_pressure;
};
class StatisticsDisplay : public Observer, DisplayElement
{
public:
StatisticsDisplay(WeatherData * pWeatherData)
{
pWeatherData->RegisterObserver(this);
}
void Update(double temperature, double humidity, double pressure)
{
m_temperature = temperature;
m_humidity = humidity;
m_pressure = pressure;
Display();
}
void Display()
{
cout << "StatisticsDisplay m_temperature = " << m_temperature <<
", m_humidity = " << m_humidity <<
", m_pressure = " << m_pressure << endl;
}
private:
double m_temperature;
double m_humidity;
double m_pressure;
};
int main()
{
WeatherData * pWeatherData = new WeatherData;
CurrentConditionsDisplay * pCu = new CurrentConditionsDisplay(pWeatherData);
StatisticsDisplay * pSta = new StatisticsDisplay(pWeatherData);
pWeatherData->SetMeasurements(80, 60, 30);
return 0;
}