[C]名字大战(控制台小游戏)

去年刚进专业时做的东东...
当时RPG玩多了,然后又想到以前玩过一个flash版本的名字大战
于是便有此物

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>

void game();
void lvlup(int);
int go();
void fight(int,int);
int damage(int,int);
int crit(int);
void miss(int,int);
int heal(int);
void lucky(int,int);
int length(char[20]);
int oratk(char[20]);
int ordef(char[20]);
int ordex(char[20]);
int orluk(char[20]);
void status();
void sleep(int);


//Global Val
int atk[2],def[2],dex[2],luk[2];
int hp[2];
char name[2][20];
int maxhp[2]={100,100};
int win[2];
int lvexp[2];
int lvl[2];
int god[2]={1,1};

int main(){
    do{
        system("cls");
        printf("\n\t\t\t\tName Battle  2\n");//                                   Name Battle  2
        printf("\n\t\t\t\t-----Auto-----\n");//                                   -----Auto-----
        printf("\n\t\t    -  Press any key to continue.  -");//            -  Press any key to continue.  -
        getch();
        
        system("cls");
        printf("\n\n\n\t\t\tPress any key to play");
        getch();
        game();
    }while(1);
}

void game(){
    char conti='y';//continue?
    win[0]=0;win[1]=0;
    lvexp[0]=0;lvexp[1]=0;
    lvl[0]=1;lvl[1]=1;
    int winner;
    
    system("cls");
    printf("\n\tPlease enter name of player1->");
    scanf("%s",name[0]);
    atk[0]=oratk(name[0]);
    def[0]=ordef(name[0]);
    dex[0]=ordex(name[0]);
    luk[0]=orluk(name[0]);
    printf("\n\tPlease enter name of player2->");
    scanf("%s",name[1]);
    atk[1]=oratk(name[1]);
    def[1]=ordef(name[1]);
    dex[1]=ordex(name[1]);
    luk[1]=orluk(name[1]);
    
    if(atk[0]==17&&def[0]==10&&dex[0]==13&&luk[0]==12)
        {atk[0]=def[0]=dex[0]=luk[0]=25;
        god[0]=2;}
    if(atk[1]==17&&def[1]==10&&dex[1]==13&&luk[1]==12)
        {atk[1]=def[1]=dex[1]=luk[1]=25;
        god[1]=2;}
    if(atk[0]==11&&def[0]==10&&dex[0]==15&&luk[0]==15)
        {atk[0]=def[0]=dex[0]=luk[0]=50;maxhp[0]=1000;
        god[0]=5;}
    if(atk[1]==11&&def[1]==10&&dex[1]==15&&luk[1]==15)
        {atk[1]=def[1]=dex[1]=luk[1]=50;maxhp[1]=1000;
        god[1]=5;}
    if(atk[0]==20&&def[0]==10&&dex[0]==16&&luk[0]==13)
        {atk[0]=def[0]=dex[0]=luk[0]=50;maxhp[0]=1000;
        god[0]=5;}
    if(atk[1]==20&&def[1]==10&&dex[1]==16&&luk[1]==13)
        {atk[1]=def[1]=dex[1]=luk[1]=50;maxhp[1]=1000;
        god[1]=5;}
        
    printf("\n\n\tPress any key to continue.");
    getch();
    getch();

    do{
        hp[0]=maxhp[0];
        hp[1]=maxhp[1];
        winner=go();//A round.
        win[winner]++;
        status();
        printf("\t%s wins.\n",name[winner]);
        lvexp[winner]+=25*god[winner];
        sleep(2);
        lvlup(0);
        lvlup(1);
    }while(conti=='y');
    if(win[0]>win[1])
        winner=0;
    else if(win[0]<win[1])
        winner=1;
    else
        winner=2;
    system("cls");
    printf("*****Result***********************************************************\n");
    printf("\tP1:%19s\t\tP2:%19s\n\n",name[0],name[1]);
    printf("\t\tWIN:%2d\t\t\t\tWIN:%2d\n\n",win[0],win[1]);
    if(winner==2)
        printf("\t\t\t\tDraw\n");
    else
    printf("\t\t\tWinner:%s\n",name[winner]);
    printf("**********************************************************************\n");
    
  //Effect//*****Status***********************************************************
          //        P1:xxxxxxxxxxxxxxxxxxx          P2:xxxxxxxxxxxxxxxxxxx
          //                WIN:00                          WIN:00               
          //
          //                        Winner:xxxxxxxxxxx
          //*****fighting*********************************************************
    printf("\n\tPress any key to return to Menu.");
    getch();
    getch();
}

void lvlup(int a){
    for(;lvexp[a]>100*lvl[a];){
        lvexp[a]-=100*lvl[a];
        maxhp[a]+=10*((lvl[a]>10)?1:2)*god[a];
        lvl[a]++;
        atk[a]+=((lvl[a]>10)?2:3)*god[a];
        def[a]+=((lvl[a]>10)?1:2)*god[a];
        dex[a]+=((lvl[a]>10)?1:2)*god[a];
        luk[a]+=((lvl[a]>10)?1:2)*god[a];
        if(atk[a]>99)
            atk[a]=99;
        if(def[a]>99)
            def[a]=99;
        if(dex[a]>99)
            dex[a]=99;
        if(luk[a]>99)
            luk[a]=99;
        status();
        printf("\t%s reaches level %d.",name[a],lvl[a]);
        printf("\n\n\tprintf Enter to continue.");
        sleep(2);
    }
}

int go(){
    double op1,ed1,op2,ed2;
    long delay[2];
    delay[0]=(100-dex[0])/10.0;
    delay[1]=(100-dex[1])/10.0;
    op1=0;
    ed1=0;
    op2=0;
    ed2=0;
    srand(time(NULL));
    status();
    do{
        ed1+=0.1;
        ed2+=0.1;
        if(ed1-op1>delay[0]){
            status();//Show the status.
            fight(0,1);//P1 Fight
            ed1=0;
            sleep(2);
        }
        if(!(hp[0]&&hp[1]))
            break;
        if(ed2-op2>delay[1]){
            status();//Show the status.
            fight(1,0);//P2 Fight
            ed2=0;
            sleep(2);
        }

    }while(hp[0]&&hp[1]);
    if(hp[0])
        return 0;
    if(hp[1])
        return 1;
}

void fight(int a,int b){
    int action,delta;
    action = rand()%100;
    if(action<90){//attack;
        delta=damage(a,b);
        delta*=crit(a);
        miss(b,delta);
    }
    else{//heal;
        delta=heal(a);
        lucky(a,delta);
    }
}

//*************************************About attack
int damage(int a,int b){
    int damg;
    damg=(10+rand()%11)*god[a];
    if((atk[a]-def[b])>0)
    damg=damg+((atk[a]-def[b]>50)?50:(atk[a]-def[b]));
    printf("\t%s attacks.",name[a]);
    return damg;
}

int crit(int a){
    int rate,rt;
    rt=(dex[a]+2*luk[a])/3+1;
    if(rt>50)
        rt=50;
    if(god[a]>1)
        rt=75;
    rate=rand()%100;
    if(rate<rt){
        printf("Critical! x2");
        return 2;
    }
    else
        return 1;
}

void miss(int b,int damg){
    int rate,rt;
    int a;
    a=(b+1)%2;
    rt=2*dex[b]+luk[b]-dex[a]-luk[a];
    if(rt>50)
        rt=50;
    if(god[a]>1)
        rt=50;
    rate=rand()%100;
    if(rate<rt)
        printf(" But missed.");
    else{
        hp[b]-=damg;
        if(hp[0]<0)
            hp[0]=0;
        if(hp[1]<0)
            hp[1]=0;
        lvexp[a]+=damg/2;
        printf(" %s's HP-%d",name[b],damg);
    }
}

//*************************************About heal
int heal(int a){
    int treat;
    treat=20+rand()%11;
    treat+=luk[a];
    printf("\t%s heals himself.",name[a]);
    return treat;
}

void lucky(int a, int treat){
    int rate,rt;
    rt=2*luk[a];
    if(rt>50)
        rt=50;
    if(god[a]>1)
        rt=100;
    rate=rand()%100;
    if(rate<rt){
        treat*=2;
        printf("Good luck! x2 HP+%d",treat);
    }
    else
        printf(" HP+%d",treat);
    hp[a]+=treat;
    lvexp[a]+=treat/2;
    if(hp[a]>maxhp[a])
        hp[a]=maxhp[a];
}

//*************************************About creating data
inline int length(char a[20]){
    int l;
    int i;
    for(i=0;i<20;i++)
        if(a[i]==0){
            l=i;
            break;
        }
    return l;
}//Check the length of name.

inline int oratk(char a[20]){
    int atk;
    int i;
    for(i=0;i<length(a);i++)
        atk+=(i*(int)a[i]);
    atk%=11;
    atk+=10;
    return atk;
}//ATK 10~20

inline int ordef(char a[20]){
    int def;
    int i;
    for(i=0;i<length(a);i++)
        def+=(int)a[i];
    def%=11;
    def+=10;
    return def;
}//DEF 10~20

inline int ordex(char a[20]){
    int dex;
    int i;
    for(i=0;i<length(a);i++)
        dex+=(10000/(int)a[i]);
    dex%=11;
    dex+=10;
    return dex;
}//DEX 10~20      Time=(30-DEX)/10  1~2(s)

inline int orluk(char a[20]){
    int luk;
    int i;
    for(i=0;i<length(a);i++)
        luk+=((int)a[i]*(int)a[i]/100);
    luk%=11;
    luk+=10;
    return luk;
}//LUK 10~20       Miss=LUK%

inline void status(){
    system("cls");
    printf("*****Status***********************************************************\n");
    printf("\tP1:%19s\t\tP2:%19s\n",name[0],name[1]);
    printf("\tHP:%3d\t\tWIN:%2d\t\tHP:%3d\t\tWIN:%2d\n",hp[0],win[0],hp[1],win[1]);
    printf("\tATK:%2d\t\tDEF:%2d\t\tATK:%2d\t\tDEF:%2d\n",atk[0],def[0],atk[1],def[1]);
    printf("\tDEX:%2d\t\tLUK:%2d\t\tDEX:%2d\t\tLUK:%2d\n",dex[0],luk[0],dex[1],luk[1]);
    printf("\tLV:%3d\t\tEXP:%4d\tLV:%3d\t\tEXP:%4d\n",lvl[0],lvexp[0],lvl[1],lvexp[1]);
if(god[0]==1&&god[1]==1)
    printf("*****fighting*********************************************************\n");
else if(god[0]==5&&god[1]==5)
    printf("*****fighting*********************************************Hero vs Boss\n");
else if(god[0]==5||god[1]==5)
    printf("*****fighting**********************************************Legend Mode\n");
else
    printf("*****fighting*********************************************Creator Mode\n");
  //Effect//*****Status***********************************************************
          //        P1:xxxxxxxxxxxxxxxxxxx          P2:xxxxxxxxxxxxxxxxxxx
          //        HP:000          WIN:00          HP:000          WIN:00               
          //        ATK:00          DEF:00          ATK:00          DEF:00
          //        DEX:00          LUK:00          DEX:00          LUK:00
          //*****fighting*********************************************************
}
        
void sleep(int n){ 
	time_t start,end; 
	volatile long unsigned t;

	start = time(NULL); 
	end = time(NULL); 
	while(difftime(end,start)<n){ 
	end = time(NULL); 
	} 
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值