纸牌游戏设计制作要点(C语言)
在本站看了一些C语言纸牌游戏设计的一些算法,此不置评。
下面列举设计要点和简洁算法供大家参考。
程序设计解决问题的方法就是算法,也就是功能函数 function ( )。
完整源码可参阅本人在本站的博文《纸牌游戏炸金花设计制作》以及其他纸牌游戏设计制作。
纸牌游戏设计的几个要点:
设计纸牌、画出纸牌、洗牌算法、界面设计文字打印,按游戏规则计算分数比大小定输赢。
transcards ( ){ //传入 num 0-51转换为 cardnum, cardstyle
//牌序 转为牌点和牌花色,画出牌张 }
cardback ( ){ //发牌时隐藏牌面显示牌背图案 }
shuffle_cards ( ){ //洗牌设计 }
print_t ( ){ //打印标题提示等美术文字
//传入参数 sx,sy, t$, tsize=text size }
cal_score ( ){ //计算分数,传入为c1,c2,c3,c4,c5 输出 gscore }
shuffle_cards (){ //洗牌设计
cs.SetColor (255,0,120,0); //backcolor
cs.DrawRect (2,2,718,900);
cs.Update ();
for (i=0;i pn=0; //发牌计数清0
//** 洗牌 **********************
for (i=0;i ResetPiece: //已生成牌有相同则重新生成
Rn=random()*52; //随机洗牌
num=(int )(Rn);
pnum[i]=num ;
for (k=0;k if (num==pnum[k]) goto ResetPiece ; }
}
for (k=0;k px=(k-k/13*13)*48+15;
py=k/13*170+100;
//cardback (); //洗牌后可显示牌背或不显示
}
cs.Update ();
// showcard(); //用于洗牌查验测试,游戏时注释掉
}//shuffle_cards ()
print_t (){ //打印标题提示等美术文字
//** 传入参数:位置 sx , sy,字串 t$,文字尺寸tsize
cs.SetFillMode (1);//0不填色,1填色
cs.SetTextStyle (0); //0正常,1粗体
ss0=t$ ;
cs.SetTextSize (tsize);
cs.SetColor (255,0,200,60);
cs.DrawText (ss0,sx+2,sy+3);
cs.SetColor (255,250,120,0);
cs.DrawText (ss0,sx,sy);
cs.SetFillMode (0);//0不填色,1填色
cs.SetColor (255,250,250,0);
cs.DrawText (ss0,sx,sy);
cs.SetFillMode (1);//0不填色,1填色
cs.Update ();
}//print _t ()
gamestart (){ //游戏 ”梭哈” >>> 开局发牌
shuffle_cards () ; //洗牌
clearOutput(); //清除测试输出
renewscreen (); //画界面
putbet () ; //设置筹码
//游戏开局时先发2张牌,一暗一明,然后轮流下注
for (i=0;i npn[i]=-1 ; wpn[i]=-1 ; spn[i]=-1 ; epn[i]=-1 ; }
// 发牌时各家底注为 10
zu1=10 ; zu2=10 ; zu3=10 ; zu4=10 ;
wnum=1 ; //开局预设东家
change_id () ; //切换玩家
//*******显示”庄家”…文字及分数和下注数
ss=intToString (bankers);
s=intToString (zu1);
t$=”庄家 “+” “+ss +” “+s;
sx=235; sy=60; tsize=40;
print_t ();
ss=intToString (users3);
s=intToString (zu4);
t$=”西家 “+” “+ss+” “+s ;
sx=20; sy=520; tsize=40;
print_t ();
ss=intToString (users2);
s=intToString (zu3);
t$=”南家 “+” “+ss+” “+s ;
sx=235; sy=850; tsize=40;
print_t ();
t$=”东家 ” ;
sx=620; sy=520; tsize=40;
print_t ();
ss=intToString (users1);
s=intToString (zu2);
t$=ss+” “+s ;
sx=440; sy=520; tsize=40;
print_t ();
//**** 发牌 >> ** 发牌顺序 北西南东
//transcards (int num) 传入num=0–51显示牌面
px=180; py=120; //北家
npn[0]=pnum[0];
num=npn[0]; nn=0 ;
px=nn*60+180 ;
cardback ();
sleep (500) ;
px=5; py=340; //西家
wpn[0]=pnum[1];
num=wpn[0]; wn=0 ;
px=wn*40+5 ;
cardback ();
sleep (500) ;
px=180; py=670; //南家
spn[0]=pnum[2];
num=spn[0]; sn=0 ;
px=sn*60+180 ;
cardback ();
sleep (500) ;
px=435; py=340; //东家
epn[0]=pnum[3];
num=epn[0]; en=0 ;
px=en*40+435 ;
cardback ();
sleep (500) ;
px=180; py=120; //北家
npn[1]=pnum[4];
num=npn[1]; nn=1 ;
px=nn*60+180 ;
transcards ();
sleep (500) ;
px=5; py=340; //西家
wpn[1]=pnum[5];
num=wpn[1]; wn=1 ;
px=wn*40+5 ;
transcards ();
sleep (500) ;
px=180; py=670; //南家
spn[1]=pnum[6];
num=spn[1]; sn=1 ;
px=sn*60+180 ;
transcards ();
sleep (500) ;
px=435; py=340; //东家
epn[1]=pnum[7];
num=epn[1]; en=1 ;
px=en*40+435 ;
transcards ();
pn=7 ; //已发8张牌
isdo=1 ; //开局后方可发牌 deal ()
}//gamestart ()
//游戏是安卓单机版设计,故
//游戏规则稍加改动,以北家为庄家,
//比分大小关键:相同对子时要比散牌点大小
//都是散牌时要逐张牌比大小,比较复杂
//如都是金花也要逐张牌比大小
//相同分数时逐张比大小,比花色大小,
//本游戏暂不设比花色大小,只要对四花色加权就可比出大小
//(bs&&user n //**** 计算赢家分数 ** 首三张加权 ****
//** bs 北家,us1 西家 , us2 南家 , us3 东家
//最大分值为赢家,输家赔分,赢家独得
//此安卓版手机游戏改为坐庄制,玩家与庄家比分
//**** 梭哈游戏计分规则:
// 皇家同花顺 AKQJT 500+400+ =900+
// 炸弹 AAAA ……> 2222 700+
// 葫芦 AAAKK 33222 600+
// 同花 A?Q?J?8?5? 500+
// 顺子 AKQJT ==> A5432 400+
// 三条 AAA23 222K8 300+
// 双对子 AAKK◇ ==> 3322? 200+
// 对子 AA○◇? ==> 22?◇○ 100+
// 散牌 按牌面计分 A +计 14分 =>> 2 +计 2分
//梭哈5 张牌比分计算稍微复杂些
cal_score (){ //梭哈游戏比分计算
//计算分数,输入为c1,c2,c3,c4,c5 输出 gscore
//为计分:c1->c5 换算为 1 ->> 13 (A ->> K )序
c1s=(c1-c1/13*13)+1; //牌点
c2s=(c2-c2/13*13)+1;
c3s=(c3-c3/13*13)+1;
c4s=(c4-c4/13*13)+1;
c5s=(c5-c5/13*13)+1;
csh1=c1/13 ; csh2=c2/13 ; csh3=c3/13 ;
csh4=c4/13 ; csh5=c5/13 ; //花色
if (c1s==1) c1s=14 ; //A 计点分为 14
if (c2s==1) c2s=14 ;
if (c3s==1) c3s=14 ;
if (c4s==1) c4s=14 ;
// if (c5s==1) c5s=14 ;
// 计算各家总分,
// 同花顺>四条>葫芦>同花>顺子>三条>对子加权
// 5张散牌或同花计分较复杂,要逐张牌比大小,
// 设置在翻牌result () 对比计算
gscore=c1s+c2s+c3s+c4s+c5s ;
//gscore = 5张牌合计分
//皇家同花顺:AKQJT 加权,最大
//若是同花加顺子:同花500+顺子400+ => 900+
//四条,99992 ,4连张炸弹
if (c1s==c2s&&c1s==c3s&&c1s==c4s){
gscore=c1s*4+700 ;
goto putout ; }
if (c2s==c3s&&c2s==c4s&&c2s==c5s){
gscore=c1s*4+700 ;
goto putout ; }
//葫芦AAAKK , 33222
if (c1s==c2s&&c1s==c3s&&c4s==c5s){
gscore=c1s*3+600 ;
goto putout ; }
if (c1s==c2s&&c3s==c4s&&c3s==c5s){
gscore=c3s*3+600 ;
goto putout ; }
if(csh1==csh2&&csh1==csh3&&csh1==csh4&&csh1==csh5){ //同花?????
gscore=gscore+500 ; }
if(c5s==(c4s-1)&&c4s==(c3s-1)&&c3s==(c2s-1)&&c2s==(c1s-1)){
//AKQJT 460分 ==>> 65432 顺子
gscore=gscore+400 ; }
if(c1s==14&&c2s==5&&c3s==4&&c4s==3&&c5s==2) { //A5432 =A 顺子 最小
gscore=gscore-13+400 ; }
//三条 AAA23 22234 比三条大小即可,不加权
if (c1s==c2s&&c1s==c3s){
gscore=c1s*3+300 ;
goto putout ; }
if (c2s==c3s&&c2s==c4s){
gscore=c2s*3+300 ;
goto putout ; }
if (c3s==c4s&&c3s==c5s){
gscore=c3s*3+300 ;
goto putout ; }
//双对子 AAKK6 33225
if (c1s==c2s&&c3s==c4s){
gscore=c1s*3+c3s*2+200 ;
goto putout ; }
if (c2s==c3s&&c4s==c5s){
gscore=c2s*3+c4s*2+200 ;
goto putout ; }
if (c1s==c2s&&c4s==c5s){
gscore=c1s*3+c4s*2+200 ;
goto putout ; }
//对子: 相同对子情况较少故散牌不加权
if (c1s==c2s) gscore=c1s*4+100 ;
if (c2s==c3s) gscore=c2s*4+100 ;
if (c3s==c4s) gscore=c3s*4+100 ;
if (c4s==c5s) gscore=c4s*4+100 ;
// **** 算法测试:print “…” 显示牌面 *******
putout :
//显示大牌点 AKQJ
ss1=intToString (c1s) ;
if (c1s==1||c1s==14) ss1=”A” ;
if (c1s==13) ss1=”K” ;
if (c1s==12) ss1=”Q” ;
if (c1s==11) ss1=”J” ;
ss2=intToString (c2s) ;
if (c2s==1||c2s==14) ss2=”A” ;
if (c2s==13) ss2=”K” ;
if (c2s==12) ss2=”Q” ;
if (c2s==11) ss2=”J” ;
ss3=intToString (c3s) ;
if (c3s==1||c3s==14) ss3=”A” ;
if (c3s==13) ss3=”K” ;
if (c3s==12) ss3=”Q” ;
if (c3s==11) ss3=”J” ;
ss4=intToString (c4s) ;
if (c4s==1||c4s==14) ss4=”A” ;
if (c4s==13) ss4=”K” ;
if (c4s==12) ss4=”Q” ;
if (c4s==11) ss4=”J” ;
ss5=intToString (c5s) ;
if (c5s==1||c5s==14) ss5=”A” ;
if (c5s==13) ss5=”K” ;
if (c5s==12) ss5=”Q” ;
if (c5s==11) ss5=”J” ;
//**** 测试 print test ** return gscore ****
//calculate & putout gscore, return gscore
print ” ” ; // 算法测试检验,可注释掉
print “取得牌面 = “,ss1 ,” 牌序 “, c1s ;
print “取得牌面 = “,ss2 ,” 牌序 “, c2s ;
print “取得牌面 = “,ss3 ,” 牌序 “, c3s ;
print “取得牌面 = “,ss4 ,” 牌序 “, c4s ;
print “取得牌面 = “,ss5 ,” 牌序 “, c5s ;
// print “return gscore = “,gscore ;
}//cal_score ()
cal_score (){ //三张牌的炸金花比分计算较为简单
//计算分数,输入为c1,c2,c3, 输出 gscore
//为计分:c1,c2,c3 换算为 1 ->> 13 (A ->> K )
c1s=(c1-c1/13*13)+1; //牌点
c2s=(c2-c2/13*13)+1;
c3s=(c3-c3/13*13)+1;
csh1=c1/13 ; csh2=c2/13 ; csh3=c3/13 ; //花色
if (c1s==1) c1s=14 ;
if (c2s==1) c2s=14 ;
if (c3s==1) c3s=14 ;
// 计算各家总分,豹子金花顺子对子加权
// 3张杂牌或同花计分较复杂,要逐张牌比大小,
// 翻牌result () 对比计算
gscore=c1s+c2s+c3s ; //3张牌合计分
if (c1s==c2s&&c1s==c3s){ //豹子
gscore=c1s*3+600 ;
goto putout ; }
//金花顺 = 300+ 200+
if (csh1==csh2&&csh1==csh3){ //金花
gscore=gscore+300 ; }
if (c3s==(c2s-1)&&c2s==(c1s-1)){ //顺子
gscore=gscore+200 ; }
if (c1s==14&&c2s==3&&c3s==2) {
//A32 = A23 顺子 算A顺子加30 大于K顺子
gscore=gscore+30+200 ; }
//对子 加权
if (c1s==c2s) gscore=c1s*4+100 ;
if (c2s==c3s) gscore=c2s*4+100 ;
// 若有豹子则 杂花 235 吃豹子
if (bs>600){ // 庄家有豹子
if (csh1>csh2||csh1
// **** 测试:显示牌面 *******
putout :
ss1=intToString (c1s) ;
if (c1s==1||c1s==14) ss1=”A” ;
if (c1s==13) ss1=”K” ;
if (c1s==12) ss1=”Q” ;
if (c1s==11) ss1=”J” ;
ss2=intToString (c2s) ;
if (c2s==1||c2s==14) ss2=”A” ;
if (c2s==13) ss2=”K” ;
if (c2s==12) ss2=”Q” ;
if (c2s==11) ss2=”J” ;
ss3=intToString (c3s) ;
if (c3s==1||c3s==14) ss3=”A” ;
if (c3s==13) ss3=”K” ;
if (c3s==12) ss3=”Q” ;
if (c3s==11) ss3=”J” ;
//**** 测试 print test ** return gscore ****
// putout:
//calculate & putout gscore, return gscore
print ” ” ; // 算法测试检验,可注释掉
print “取得牌面 = “,ss1 ,” 牌序 “, c1s ;
print “取得牌面 = “,ss2 ,” 牌序 “, c2s ;
print “取得牌面 = “,ss3 ,” 牌序 “, c3s ;
// print “return gscore = “,gscore ;
}//cal_score ()
//**** End ****
文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览114502 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!