您的位置:首页 > 编程语言

分享人生第一个游戏源代码

2011-03-03 22:19 447 查看
第一次自己写博客,与大家分享一下自己第一个写的算正经的游戏。这是我家乡江西一个本土游戏,名字叫“斗牛”,是一种赌博游戏。

赌博有害家庭健康,因此将其改编成简单的游戏,希望所有的家庭和睦。

这是我写的第一个游戏,虽然写的繁琐而且效率低下,但对于学了半年的我来说,这是莫大的安慰。在缺乏生气的大学生活里,有一种

兴趣坚持自己的兴趣是难能宝贵的,我想这能让生活更充实些吧!

人有兴趣爱好就好,就不至于迷茫。爱好兴趣有庸俗、高压之分,但他们给人的充实与愉悦感的价值是等效的。万事开头难,学C语言

开始比较艰难,如果能挺过来,并且发现其中的兴趣就会发现,它能带给人们满足感!

/*建立二人斗牛游戏的程序*/

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#include <time.h>

/*牌的数据结构*/

typedef struct

{

char face[4];

int num;

}FACE;

/*建立返回牌结果的数据结构*/

typedef struct

{

int result; //点数

int max; //最大的那张牌

int number; //如果多张牌时返回

int numberzhi;

}PAIRESULT;

/*建立总共纸牌初始函数*/

void inition(FACE zong[])

{

int i;

for(i=1;i<=4;i++)

{

strcpy(zong[i].face,"3");

zong[i].num=0;

}

for(i=5;i<=8;i++)

{

strcpy(zong[i].face,"4");

zong[i].num=1;

}

for(i=9;i<=12;i++)

{

strcpy(zong[i].face,"5");

zong[i].num=2;

}

for(i=13;i<=16;i++)

{

strcpy(zong[i].face,"6");

zong[i].num=3;

}

for(i=17;i<=20;i++)

{

strcpy(zong[i].face,"7");

zong[i].num=4;

}

for(i=21;i<=24;i++)

{

strcpy(zong[i].face,"8");

zong[i].num=5;

}

for(i=25;i<=28;i++)

{

strcpy(zong[i].face,"9");

zong[i].num=6;

}

for(i=29;i<=32;i++)

{

strcpy(zong[i].face,"10");

zong[i].num=7;

}

for(i=33;i<=36;i++)

{

strcpy(zong[i].face,"J");

zong[i].num=8;

}

for(i=37;i<=40;i++)

{

strcpy(zong[i].face,"Q");

zong[i].num=9;

}

for(i=41;i<=44;i++)

{

strcpy(zong[i].face,"K");

zong[i].num=10;

}

for(i=45;i<=48;i++)

{

strcpy(zong[i].face,"A");

zong[i].num=11;

}

for(i=49;i<=52;i++)

{

strcpy(zong[i].face,"2");

zong[i].num=12;

}

}

/*建立输出函数*/

void output(int n,FACE zong[],int k)

{

int i;

printf("/n");

if(k==2)

printf("这是玩家的牌/n");

else

printf("这是庄家的牌/n");

for(i=1;i<=n;i++)

printf("%s ",zong[i].face);

printf("/n");

}

/*建立洗牌函数*/

void xipai(FACE zong[])

{

int i,j;

long k;

FACE temp;

srand(time(NULL));

for(k=1;k<1000;k++)

{

i=1+rand()%52;

j=1+rand()%52;

temp=zong[i];

zong[i]=zong[j];

zong[j]=temp;

}

}

/*建立发牌函数*/

void fapai(FACE zong[],FACE player1[],FACE player2[])

{

int i=1,c1=1,c2=1;

for(i=1;i<=10;)

{

player1[c1++]=zong[i++];

player2[c2++]=zong[i++];

}

}

/*建立牌的排序函数*/

void paisort(FACE player[])

{

FACE temp;

int i,j;

for(i=0;i<4;i++)

for(j=1;j<=4-i;j++)

if(player[j].num>player[j+1].num)

{

temp=player[j];

player[j]=player[j+1];

player[j+1]=temp;

}

}

/*建立只有三张非纸牌的函数*/

int san(int a2[])

{

if((a2[0]+a2[1]+a2[2])%10==0)//三张牌和为十的倍数时

return 10;

else //没有牛时

{

/*以下是有两张牌和为10时*/

if(a2[0]+a2[1]==10) return a2[2];

if(a2[0]+a2[2]==10) return a2[1];

if(a2[1]+a2[2]==10) return a2[0];

else

return 0;

}

}

/*建立有四张非花牌时的函数*/

int si(int a[])

{

if((a[0]+a[1]+a[2])%10==0) //其中有三张牌和为10的倍数时

return a[3];

if((a[0]+a[1]+a[3])%10==0)

return a[2];

if((a[0]+a[2]+a[3])%10==0)

return a[1];

if((a[3]+a[1]+a[2])%10==0)

return a[0];

/*以下是有两张牌和为1*/

else

{

if(a[0]+a[1]==10&&a[2]+a[3]==10)

return 10;

if(a[0]+a[1]==10&&a[2]+a[3]!=10)

return (a[2]+a[3])%10;

if(a[0]+a[2]==10&&a[1]+a[3]==10)

return 10;

if(a[0]+a[2]==10&&a[1]+a[3]!=10)

return (a[1]+a[3])%10;

if(a[0]+a[3]==10&&a[2]+a[1]==10)

return 10;

if(a[0]+a[3]==10&&a[2]+a[1]!=10)

return (a[2]+a[1])%10;

if(a[1]+a[2]==10&&a[0]+a[3]==10)

return 10;

if(a[1]+a[2]==10&&a[0]+a[3]!=10)

return (a[0]+a[3])%10;

if(a[1]+a[3]==10&&a[0]+a[2]==10)

return 10;

if(a[1]+a[3]==10&&a[0]+a[2]!=10)

return (a[2]+a[0])%10;

if(a[2]+a[3]==10&&a[0]+a[1]==10)

return 10;

if(a[2]+a[3]==10&&a[0]+a[1]!=10)

return (a[0]+a[1])%10;

/*若无法凑出十时,点为零*/

else

return 0;

}

}

/*若无张牌都为非花牌,即五张非花牌时,若要有点数,必须用三张牌来凑点数*/

int wu(int a[])

{

if((a[0]+a[1]+a[2])%10==0&&a[3]+a[4]==10)

return 10;

if((a[0]+a[1]+a[2])%10==0&&a[3]+a[4]!=10)

return (a[3]+a[4])%10;

if((a[0]+a[1]+a[3])%10==0&&a[2]+a[4]==10)

return 10;

if((a[0]+a[1]+a[3])%10==0&&a[2]+a[4]!=10)

return (a[2]+a[4])%10;

if((a[0]+a[1]+a[4])%10==0&&a[2]+a[3]==10)

return 10;

if((a[0]+a[1]+a[4])%10==0&&a[2]+a[3]!=10)

return (a[2]+a[3])%10;

if((a[0]+a[2]+a[3])%10==0&&a[1]+a[4]==10)

return 10;

if((a[0]+a[2]+a[3])%10==0&&a[1]+a[4]!=10)

return (a[1]+a[4])%10;

if((a[0]+a[2]+a[4])%10==0&&a[1]+a[3]==10)

return 10;

if((a[0]+a[2]+a[4])%10==0&&a[1]+a[3]!=10)

return (a[1]+a[3])%10;

if((a[0]+a[4]+a[3])%10==0&&a[2]+a[1]==10)

return 10;

if((a[0]+a[4]+a[3])%10==0&&a[2]+a[1]!=10)

return (a[2]+a[1])%10;

if((a[2]+a[1]+a[3])%10==0&&a[4]+a[0]==10)

return 10;

if((a[2]+a[1]+a[3])%10==0&&a[0]+a[4]!=10)

return (a[0]+a[4])%10;

if((a[2]+a[1]+a[4])%10==0&&a[0]+a[3]==10)

return 10;

if((a[2]+a[1]+a[4])%10==0&&a[0]+a[3]!=10)

return (a[0]+a[3])%10;

if((a[4]+a[1]+a[3])%10==0&&a[2]+a[0]==10)

return 10;

if((a[4]+a[1]+a[3])%10==0&&a[2]+a[0]!=10)

return (a[2]+a[0])%10;

if((a[2]+a[4]+a[3])%10==0&&a[0]+a[1]==10)

return 10;

if((a[2]+a[4]+a[3])%10==0&&a[0]+a[1]!=10)

return (a[0]+a[1])%10;

else

return 0;

}

/*建立求最大值的函数*/

int searchmaxpai(FACE player[])

{

int a[7]={0},i,max;

for(i=1;i<=5;i++)

{

if(player[i].num>=11)

a[i]=player[i].num-13;

else

a[i]=player[i].num;

}

for(max=a[1],i=1;i<=5;i++)

if(max<a[i])

max=a[i];

return max;

}

/*建立计算有几张重复牌的函数*/

void countrepeat(int a[],int n,int b[])

{

int k[5]={0},i=0,j=0,temp=0;

for(i=0;i<n;i++)

{

temp=a[i];

for(j=0;j<n;j++)

if(temp==a[j])

k[i]++;

}

for(i=0;i<n;i++)

{

if(k[i]>=3)

{

b[0]=k[i]; //b[0]存储重复数目

b[1]=a[i];

break;//b[1]存储对应的值

}

}

}

/*建立计算牌的点数的函数,这是游戏的核心算法*/

PAIRESULT jisuan(FACE player[],PAIRESULT finalresult)

{

int a1[5]={0},c1=0;//用于存储10,J,Q,K的花牌表示的值

int a[2]={-1,-1};

int a2[5]={0},c2=0; //用于存储非花牌表示的值

int i;

for(i=1;i<=5;i++) //总共5次

{

if(player[i].num>=7&&player[i].num<=10) //如果是花牌时

a1[c1++]=player[i].num+3;

else

if(player[i].num>=0&&player[i].num<=6)//如果是3-9时

a2[c2++]=player[i].num+3;

else

a2[c2++]=player[i].num-10; //如果是A或2时

} //完成对牌的分类存储

/*以下对非花牌进行计算点数*/

switch(c2)

{

case 0 : finalresult.result=10;break; //都是花牌时

case 1 : finalresult.result=a2[0];break; //只有一张非花牌时

/*只有二张非零牌时*/

case 2 : {if(a2[0]+a2[1]==10)

finalresult.result=10;

else

finalresult.result=(a2[0]+a2[1])%10;

}break;

/*以下是由三张非花牌时*/

case 3 : finalresult.result=san(a2);break;

/*以下是四张非花牌时*/

case 4 : finalresult.result=si(a2);break;

/*以下是五张非花牌时*/

case 5 : finalresult.result=wu(a2);break;

}

finalresult.max=searchmaxpai(player); //最大牌的值,便于点数相同时比较大小

/*以下对有可能有的多张牌进行处理,存储最多的牌*/

if(c1>=3)

{

countrepeat(a1,c1,a);

if(a[0]>=3)

{

finalresult.number=a[0]+1; //如果是花牌有多张时倍数更大

finalresult.numberzhi=a[1];

}

}

else

if(c2>=3)

{

countrepeat(a2,c2,a);

if(a[0]>=3)

{

finalresult.number=a[0];

finalresult.numberzhi=a[1];

}

}

else

finalresult.number=finalresult.numberzhi=-1;

return finalresult;

}

PAIRESULT build()

{

PAIRESULT final;

final.max=-1,

final.number=-1;

final.result=final.numberzhi=-1;

return final;

}

/*建立牌的比较函数,a[0]总金钱,a[1]表示押金*/

int compare(PAIRESULT final1,PAIRESULT final2,int a[])

{

int t=a[0];

/*做如下规定,四张相同牌,20,三张相同牌15倍,五张即四张花牌时25被*/

/*相同牌时庄家牌大*/

switch(final1.number)

{

case 5 : {if(final2.number==5&&final1.numberzhi>=final2.numberzhi)

{

a[0]=a[0]-a[1]*25;

break;

}

if(final2.number==5&&final1.numberzhi<final2.numberzhi)

{

a[0]=a[0]+a[1]*25;

break;

}

else

{

a[0]=a[0]-a[1]*25;

break;

}

};

case 4 : { if(final2.number==5)

{

a[0]=a[0]+a[1]*25;

break;

}

if(final2.number==4&&final1.numberzhi>=final2.numberzhi)

{

a[0]=a[0]-a[1]*20;

break;

}

if(final2.number==4&&final1.numberzhi<final2.numberzhi)

{

a[0]=a[0]+a[1]*20;

break;

}

else

{

a[0]=a[0]-a[1]*20;

break;

}

}

case 3 : { if(final2.number==5)

{

a[0]=a[0]+a[1]*25;

break;

}

if(final2.number==4)

{

a[0]=a[0]+a[1]*20;

break;

}

if(final2.number==3&&final1.numberzhi<final2.numberzhi)

{

a[0]=a[0]+a[1]*15;

break;

}

else

{

a[0]=a[0]-a[1]*15;

break;

}

};

case -1 : {

if(final2.number==5)

{

a[0]=a[0]+a[1]*25;

break;

}

if(final2.number==4)

{

a[0]=a[0]+a[1]*20;

break;

}

if(final2.number==3)

{

a[0]=a[0]+a[1]*15;

break;

}

if(final1.result>final2.result)//庄家牌大时

{

if(final1.result==10)

{

a[0]=a[0]-a[1]*3;

break;

}

if(final1.result>=7&&final1.result<=9)

{

a[0]=a[0]-a[1]*2;

break;

}

if(final1.result<7)

{

a[0]=a[0]-a[1];

break;

}

}

else

if(final1.result<final2.result)//玩家牌大时

{

if(final2.result==10)

{

a[0]=a[0]+a[1]*3;

break;

}

if(final2.result>=7&&final2.result<=9)

{

a[0]=a[0]+a[1]*2;

break;

}

if(final2.result<7)

{

a[0]=a[0]+a[1];

break;

}

}

else

{ if(final1.result==10&&final1.max>=final2.max)

{

a[0]=a[0]-a[1]*3;

break;

}

if(final1.result==10&&final1.max<final2.max)

{

a[0]=a[0]+a[1]*3;

break;

}

if(final1.result>=7&&final1.result<=9&&final1.max>=final2.max)

{

a[0]=a[0]-a[1]*2;

break;

}

if(final1.result>=7&&final1.result<=9&&final1.max<final2.max)

{

a[0]=a[0]+a[1]*2;

break;

}

if(final1.result<7&&final1.max>=final2.max)

{

a[0]=a[0]-a[1];

break;

}

if(final1.result<7&&final1.max<final2.max)

{

a[0]=a[0]+a[1];

break;

}

}

}

}

return a[0]-t;

}

void menu()

{

printf("/t/t/t欢迎来到“欢乐斗牛”游戏/n");

printf("请按数字键选择/n");

printf("/t1:开始游戏/n");

printf("/t2:游戏规则/n");

printf("/t3:离开游戏/n");

}

/*建立游戏规则函数*/

void instruction()

{

printf("/t斗牛也属于纸牌游戏,该游戏中游戏为庄家,你为玩家./n");

printf("/t游戏开始时系统送你100游戏币,输完时游戏结束.");

printf("/t规则简要如下:/n");

printf( "/t每人有五张牌,比较点数,点数大者胜。计算点数时10、J、Q、/n");

printf("/tK为花牌,用非花牌计算点数,若五张牌中没有一张花牌,任意用/n");

printf("/t其中三张凑成10的倍数,如果不能,则点数为零,如果能凑成,用/n");

printf("/t另外两张之和除以十,余数为点数。若有花牌时,可以用其中两张/n");

printf("/t或三张牌凑成10的倍数,如果能,结果为其余牌之和除以10的余数/n");

printf("/t(余数为零点数为10)。不能时,点数为零。当点数相同时,以牌/n");

printf("/t面值大者胜./n");

printf("/t0-6点倍率为1,7-9点倍率为2,10点倍率为3/n");

printf("/t三张相同面值的非花牌,倍率15,四张20/n");

printf("/t三张相同面值的花牌,倍率20,四张25/n");

printf("/t赌博有害家庭健康,该游戏仅供娱乐/n");

}

int main()

{

FACE zong[52];//总共的48张纸牌

PAIRESULT final1=build(),final2=build();//牌的结果

FACE player1[5],player2[5]; //用于存储两个玩家的牌,player1是庄家,player2是玩家

inition(zong);

int flag,a[2]={100,0},count=1,defen;

char ch;

/*以下是游戏菜单*/

menu();

scanf("%d",&flag);

while(flag<1||flag>3)

{

printf("数字输入错误,请重新输入/n");

scanf("%d",flag);

}

while(flag!=1)

{

if(flag==3)

exit(0);

else

if(flag==2)

{

instruction();

menu();

scanf("%d",&flag);

}

}

if(flag==1)

{

printf("/t/t现在开始游戏/n");

printf("/t/t系统先送你100游戏币,当游戏币不大于零时游戏结束/n");

while(1)

{

printf("/t/t/t/t第%d局/n",count);

printf("请下注(1-10游戏币),目前你的游戏币为%d/n",a[0]);

while(1)

{

scanf(" %d",&a[1]);

if(a[1]>0&&a[1]<=10)

break;

else

printf("输入数据范围不对,请重新选择/n");

}

xipai(zong); //洗牌

fapai(zong,player1,player2); //发牌

paisort(player1); output(5,player1,1); //庄家的牌,先排序在现实牌

paisort(player2); output(5,player2,2); //玩家的牌,先排序在显现牌

final1=jisuan(player1,final1); //计算点数

final2=jisuan(player2,final2); //计算点数

defen=compare(final1,final2,a);

if(final1.number>=3&&final1.numberzhi>=11)

printf("/t庄家有%d张牌相同/n",(final1.number-1));

else

if(final1.number>=3&&final1.numberzhi<11)

printf("/t庄家有%d张牌相同/n",final1.number);

else

printf("/t庄家牌的点数: %d/n",final1.result);

if(final2.number>=3&&final2.numberzhi>=11)

printf("恭喜你,你有%d张牌相同/n",(final2.number-1));

else

if(final2.number>=3&&final2.numberzhi<11)

printf("恭喜你,你有%d张牌相同/n",final2.number);

else

if(final2.result==10)

printf("/t/t你牛了,牛气冲天/n");

else

if(final2.result>=7&&final2.result<=9)

printf("/t/t你进套了,点数:%d/n",final2.result);

else

printf("/t/t你的点数:%d/n",final2.result);

if(defen>0)

printf("/t本局你胜,得分:%d/n",defen);

else

if(defen==0)

printf("/t本局平局/n");

else

printf("/t本局你输了,再接再厉,得分:%d/n",defen);

printf("/t/t/t/t总游戏币:%d/n",a[0]);

if(a[0]<=0)

break;

else

{

printf("/t/t继续C(continue)/t/t退出游戏E(end)/n");

scanf(" %c",&ch);

if(ch=='e')

break;

else

{

count++;

final1=final2=build();

}

}

}

}

if(a[0]==100)

printf("/t游戏结果平局/n");

else

if(a[0]>100)

printf("/t恭喜你,你赢的游戏币%d/n",a[0]-100);

else

printf("/t再接再厉,你输了游戏币%d/n",100-a[0]);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: