共有回帖数 0 个
-
模仿梭哈游戏规则写的,vc6.0编译过的,昨天写了一下午调试了1个system("pause");
}while(1); //无限循环
}
/* 创建28张扑克 */
void creat(int card[])
{
int i,j;
for(i=0;iN;i++)
{
card=rand()%N;
for(j=0;ji;j++)
{
if(card[j]==card) //生成数字重复则重新生成
{
i--;
break;
}
}
}
}
/* 模拟洗牌,随机交换 */
void shuffle(int card[])
{
int i,j,temp;
for(i=0;iN;i++)
{
j=rand()%(N-i)+i; //生成i~N-1的随机数字中的一个
temp=card; //与第i张牌交换
card=card[j];
card[j]=temp;
}
}
/* 发给两位玩家扑克牌 */
void deal(int card[],int playerCard[][M])
{
int i,j,k=0;
for(j=0;jM;j++)
{
for(i=0;i2;i++)
{
playerCard[j]=card[k]; //依次顺序发牌
k++;
}
}
}
/* 冒泡排序 */
void sort(int card[])
{
int i,j,temp;
for(i=0;iM-1;i++)
{
for(j=0;jM-1-i;j++)
{
if(card[j]card[j+1])
{
temp=card[j];
card[j]=card[j+1];
card[j+1]=temp;
}
}
}
}
/* 将数字转化为扑克牌 */
char *conversion(int num,char pictureCard[])
{
char *numberCard[]={"8","9","10","J","Q","K","A"}; //牌的大小
char *kind[]={"4","5","3","6"}; //牌的花色
strcpy(pictureCard,kind[num%4]);
strcat(pictureCard,numberCard[num/4]);
return pictureCard; //将牌的大小和花色形成一个字符串并返回
}
/* 以下算法均为已排好序的(牌面花色都从小到大) */
/* 判断5张扑克是否连续 */
int checkShun(int card[])
{
int i,flag=1; //flag==1连续
for(i=0;iM-1;i++)
{
if((card[i+1])/4-card/4!=1)
{
flag=0; //flag=0不连续
}
}
return flag; //返回flag
}
/* 判断是否花色相同 */
int checkTong(int card[])
{
int i,j,flag=1; //flag==1花色相同
for(i=0;iM-1;i++)
{
for(j=i+1;jM;j++)
{
if(card%4!=card[j]%4)
{
flag=0; //flag=0花色不同
}
}
}
return flag; //返回flag
}
/* 判断是否同花顺牌型 */
int checkTongHuaShun(int card[])
{
if(checkShun(card)&&checkTong(card)) //连续并且花色相同
{
return 1;
}
else
{
return 0;
}
}
/* 判断是否顺子牌型 */
int checkShunzi(int card[])
{
if(checkShun(card)&&!checkTong(card)) //连续并且花色不同
{
return 1;
}
else
{
return 0;
}
}
/* 判断是否同花牌型 */
int checkTongHua(int card[])
{
if(!checkShun(card)&&checkTong(card)) //不连续并且花色相同
{
return 1;
}
else
{
return 0;
}
}
/* 判断是否为四条牌型 */
int checkSiTiao(int card[])
{
if(card[0]/4==card[3]/4||card[1]/4==card[4]/4) //第1张和第4张扑克牌大小一样
{ //或者第2张和第5张扑克牌大小一样
return 1;
}
else
{
return 0;
}
}
/* 判断是否为三条一对牌型 */
int checkSanTiaoYiDui(int card[])
{
if(card[0]/4==card[2]/4&&card[3]/4==card[4]/4) //第1张和第3张扑克牌相等&&
{ //第4张和第5张扑克牌相等
return 1;
}
else if(card[0]/4==card[1]/4&&card[2]/4==card[4]/4) //第1张和第2张扑克牌相等&&
{ //第3张和第5张扑克牌相等
return 1;
}
else
{
return 0;
}
}
/* 判断是否为两对牌型 */
int checkLiangDui(int card[])
{
if(!checkSiTiao(card)&&!checkSanTiaoYiDui(card)) //不是四条并且不是三条一对
{
if(card[0]/4==card[1]/4&&card[2]/4==card[3]/4) //第1张和第2张扑克牌相等&&
{ //第3张和第4张扑克牌相等
return 1;
}
else if(card[0]/4==card[1]/4&&card[3]/4==card[4]/4) //第1张和第2张扑克牌相等&&
{ //第4张和第5张扑克牌相等
return 1;
}
else if(card[1]/4==card[2]/4&&card[3]/4==card[4]/4) //第2张和第3张扑克牌相等&&
{ //第4张和第5张扑克牌相等
return 1;
}
else
{
return 0;
}
}
else
{
return 0;
}
}
/* 判断是否为三条牌型 */
int checkSanTiao(int card[])
{
if(!checkSiTiao(card)&&!checkSanTiaoYiDui(card)) //不是四条并且不是三条一对
{
if(card[0]/4==card[2]/4||card[1]/4==card[3]/4||card[2]/4==card[4]/4)//第1张和第3张扑克牌||
{ //第2张和第4张扑克牌||
return 1; //第3张和第5张扑克牌相等
}
else
{
return 0;
}
}
else
{
return 0;
}
}
/* 判断是否为对子牌型 */
int checkDuiZi(int card[])
{
int i,flag=0; //flag==0代表不是对子
if(!checkSiTiao(card)&&!checkSanTiaoYiDui(card)&&!checkLiangDui(card)&&!checkSanTiao(card))
{ //!四条&&!三条一对&&!两对&&!三条
for(i=0;iM-1;i++)
{
if(card/4==card[i+1]/4) //如果有两张连续的牌相等则为对子
{
flag=1;
}
}
return flag;
}
else
{
return 0;
}
}
晚上,只会写控制台的,原创,有游戏才有学习的动力么,^_^
/* 将5张扑克牌转化为9种牌型 */
int change(int card[])
{
if(checkTongHuaShun(card)) //同花顺牌型8
{
return 8;
}
else if(checkSiTiao(card)) //四条牌型7
{
return 7;
}
else if(checkSanTiaoYiDui(card)) //三条一对牌型6
{
return 6;
}
else if(checkTongHua(card)) //同花牌型5
{
return 5;
}
else if(checkShunzi(card)) //顺子牌型4
{
return 4;
}
else if(checkSanTiao(card)) //三条牌型3
{
return 3;
}
else if(checkLiangDui(card)) //两对牌型2
{
return 2;
}
else if(checkDuiZi(card)) //对子牌型1
{
return 1;
}
else //散牌牌型0
{
return 0;
}
}
/* 比较两数大小返回1,返回-1,相等返回0 */
int cmp(int a,int b)
{
if(ab)
{
return 1;
}
else if(ab)
{
return -1;
}
else
{
return 0;
}
}
/* 比较两幅同花顺,同花,顺子,散牌的大小 */
int cmpShunOrSanPai(int card1[],int card2[])
{
if(card1[M-1]/4!=card2[M-1]/4) //第5张牌不相等
{
return cmp(card1[M-1]/4,card2[M-1]/4); //返回第5张牌的大小比较
}
else
{
return cmp(card1[M-1]%4,card2[M-1]%4); //返回第5张牌的花色比较
}
}
/* 返回四条对应的扑克数字的编号 */
int maxSiTiao(int card[])
{
int i;
for(i=0;iM-1;i++)
{
if(card/4==card[i+1]/4) //返回两张连续相等的牌对应的数字的编号
{
return card[i+1];
}
}
return 0;
}
/* 比较两幅四条的大小 */
int cmpSiTiao(int card1[],int card2[])
{
return cmp(maxSiTiao(card1)/4,maxSiTiao(card2)/4);
}
/* 返回三条对应的扑克的数字编号 */
int maxSanTiao(int card[])
{
int i;
for(i=0;iM-1;i++)
{
if(card/4==card[i+1]/4&&card/4==card[i+2]/4) //返回3张连续相等牌最大数字的编号
{
return card[i+2];
}
}
return 0;
}
/* 比较两幅三条的大小 */
int cmpSanTiao(int card1[],int card2[])
{
return cmp(maxSanTiao(card1)/4,maxSanTiao(card2)/4);
}
/* 返回两对中较大的一对的扑克牌对应的数字 */
int maxLiangDui(int card[])
{
int a,i;
for(i=0;iM-1;i++)
{
if(card/4==card[i+1]/4) //最后的相等的数字为最大的数字
{
a=card[i+1];
}
}
return a;
}
/* 返回两对中较小的一对对应的牌的大小 */
int minLiangDui(int card[])
{
return maxSiTiao(card); //最前面的第2个数字
}
/* 比较两幅两对的大小 */
int cmpLiangDui(int card1[],int card2[])
{
if(maxLiangDui(card1)/4!=maxLiangDui(card2)/4) //最大对牌的大小不相等
{
return cmp(maxLiangDui(card1)/4,maxLiangDui(card2)/4);
}
else if(minLiangDui(card1)/4!=minLiangDui(card2)/4) //最小对牌的大小不相等
{
return cmp(minLiangDui(card1)/4,minLiangDui(card2)/4);
}
else //都相等返回最大对对应的最大花色
{
return cmp(maxLiangDui(card1)%4,maxLiangDui(card2)%4);
}
}
/* 比较两副对子的大小 */
int cmpDuiZi(int card1[],int card2[])
{
if(maxLiangDui(card1)/4!=maxLiangDui(card2)/4) //直接调用两对中最大对的返回函数即可
{
return cmp(maxLiangDui(card1)/4,maxLiangDui(card2)/4);
}
else
{
return cmp(maxLiangDui(card1)%4,maxLiangDui(card2)%4); //相等返回最大花色
}
}
/* 比较两幅扑克牌的大小 */
int compare(int card1[],int card2[])
{
if(change(card1)!=change(card2)) //牌型不同则牌型大的扑克牌大
{
return cmp(change(card1),change(card2));
}
else if(change(card1)==8||change(card1)==5||change(card1)==4||change(card1)==0)
{
return cmpShunOrSanPai(card1,card2); //同花顺||同花||顺子||或散牌
}
else if(change(card1)==7) //四条
{
return cmpSiTiao(card1,card2);
}
else if(change(card1)==6||change(card1)==3) //三条一对或者三条
{
return cmpSanTiao(card1,card2);
}
else if(change(card1)==2) //两对
{
return cmpLiangDui(card1,card2);
}
else //对子
{
return cmpDuiZi(card1,card2);
}
}
/* 显示两位玩家全部扑克牌 */
void displayTotal(int playerCard[][M],char pictureCard[])
{
int i;
printf("computer: ");
for(i=0;iM;i++) //电脑的全部牌
{
printf("%6s",conversion(playerCard[0],pictureCard));
}
printf("nplayer:t ");
for(i=0;iM;i++) //玩家的全部牌
{
printf("%6s",conversion(playerCard[1],pictureCard));
}
printf("n");
}
/* 显示两位玩家部分扑克牌 */
void displayPart(int playerCard[][M],char pictureCard[])
{
int i;
printf("computer: ");
printf("t**");
for(i=1;iM;i++) //电脑的部分牌
{
printf("%6s",conversion(playerCard[0],pictureCard));
}
printf("nplayer: ");
printf("t**");
for(i=1;iM;i++)
{
printf("%6s",conversion(playerCard[1],pictureCard)); //玩家的部分牌
}
printf("n");
}
/* 简单的游戏算分系统 */
void compute(int playerCard[][M],int playerCopy[][M],char pictureCard[])
{
char select;
static playerTotal=1000; //电脑 玩家初始分数
static computerTotal=1000;
int flag=1,total; //flag=1代表投注
printTotal(computerTotal,playerTotal);
printf("please select:ta.20tb.50tc.80td.100te.drop(-10) "); //5种选择
fflush(stdin);
select=getchar();
switch(select)
{
case 'a': //下注20
playerTotal-=20;
computerTotal-=20;
total=40;
break;
case 'b': //下注50
playerTotal-=50;
computerTotal-=50;
total=100;
break;
case 'c': //下注80
playerTotal-=80;
computerTotal-=80;
total=160;
break;
case 'd': //下注100
playerTotal-=100;
computerTotal-=100;
total=200;
break;
default:
flag=0; //flag=0代表放弃-10
}
if(compare(playerCard[1],playerCard[0])==1&&flag==1) //玩家胜
{
printf("you winn");
playerTotal+=total;
}
else if(compare(playerCard[1],playerCard[0])==-1&&flag==1) //电脑胜
{
printf("you losen");
computerTotal+=total;
}
else if(flag==0) //弃权电脑胜
{
playerTotal-=10;
computerTotal+=10;
printf("you losen");
}
displayTotal(playerCopy,pictureCard); //显示电脑 玩家全部牌
if(checkTotal(playerTotal)&&checkTotal(computerTotal)) //电脑玩家分数为正
{
printTotal(computerTotal,playerTotal); //显示分数
}
else if(!checkTotal(playerTotal)) //玩家分数=0
{
printf("you lose the game. n");
exit(0);
}
else if(!checkTotal(computerTotal)) //电脑分数=0
{
printf("you win the game. n");
exit(0);
}
}
/* 显示两家分数 */
void printTotal(int computerTotal,int playerTotal)
{
printf("computer:t%dn",computerTotal);
printf("player:tt%dn",playerTotal);
}
/* 判断分数是否0 */
int checkTotal(int total)
{
if(total=0)
{
return 0;
}
else
return 1;
}
/* 将两位玩家的扑克牌拷贝一个副本 */
void copy(int playerCard[][M],int playerCopy[][M])
{
int i,j;
for(i=0;i2;i++)
{
for(j=0;jM;j++)
{
playerCopy[j]=playerCard[j];
}
}
}
楼主 2016-01-23 11:44 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知