导入
要想制作一款游戏,首先要清楚它的流程,画出流程图,然后再添加一些灵魂细节。听起来是大道理但确实很重要,可以节省很多精力和返工 【你有资格说嘛
正题
我经过总结,列出了如下的游戏流程(箭头指向了下一个操作)(流程的框是瞎用的) :
下面这张图添加了一些细节
以上,每一个框至少需要一个函数来实现
由此,我们可以初步搭一个框架(由于交叉太多,为了方便我不得不用了 goto 语句):
注:
- 这里的 EAST 是一个 enum 值,以后会解释可以忽视
- 这里运用了 C++11 的大括号初始化方法,以后还会广泛运用
- last_ming 是一个 enum 类型,用来传递鸣牌的信息,以实现“抢杠”之类的操作,但现在可能还不完善,未来有可能会有修改
Maj_system* call{ new Maj_system{ EAST } };//运行构造函数并开局发牌
while (init_interface()); //初始化图形界面
goto mo; //第一次运行先摸牌
//------------------------------------------
rong_middle:
if (call->_ronghe(last_ming)) //如果荣和
goto jiesuan; //结算
//------------------------------------------//否则摸(岭上)牌
mo:
call->_mo(); //摸牌
//------------------------------------------
if (call->_zimo()) //如果自摸
goto jiesuan; //结算
//------------------------------------------//否则(下家)立直判断
if (call->_lizhi()) //如果立直
goto rong_end; //荣和判断
//------------------------------------------//否则判断加杠、暗杠
last_ming = call->_jiaangang();
if(last_ming) //如果加杠、暗杠
goto rong_middle; //荣和判断
//------------------------------------------//否则打牌
da:
call->_da(); //打牌
//------------------------------------------
rong_end:
if (call->_ronghe(last_ming)) //如果荣和
goto jiesuan; //结算
//------------------------------------------//否则碰杠判断
switch (call->_penggang())
{
case PENG: //如果碰
goto da; break; //打牌
case DAMING: //如果大明杠
goto mo; break; //摸牌
default:;
}
//------------------------------------------//否则吃判断
if (call->_chi()) //如果吃
goto da; //打牌
else goto mo; //否则(下家)摸牌
//------------------------------------------
jiesuan: //运行析构函数并最终结算
delete call;
附
此外,还需要明确数据间的决定关系(箭头指向决定对象)(流程的框也是瞎用的) :
至此,main 函数的内容基本成型,可以愉快地写里面的内容啦
规则参考
[1] 日麻百科
[2] 资深麻友
[3] 雀魂麻将
[4] 雀姬麻将
原创文章,转载请标明出处,如有谬误欢迎各位指正
欢迎交流麻将算法,QQ:2639914082