Untitled

mail@pastecode.io avatar
unknown
c_cpp
2 years ago
2.7 kB
2
Indexable
Never
#include <stdio.h>
#include <string.h>

#define lvup_atk 200
#define lvup_dfn 100
#define lvup_maxHp 20
#define lvup_maxMp 15
#define T 2

typedef struct pokemon{
    int id;
    char name[10];
    int level;
    int attack;
    int defense;
    int Hp;
    int Mp;
    int maxHp;
    int maxMp;
    int costMp;
}Pokemon;

int max(int a, int b){
    if(a > b) return a;
    else return b;
}
// TODO: upgrade and recover the Pokémon
void level_up(Pokemon *P){
    if(P->level < 5){
        P->level++;
        P->attack += lvup_atk;
        P->defense += lvup_dfn;
        P->maxHp += lvup_maxHp;
        P->maxMp += lvup_maxMp;
        P->Hp = P->maxHp;
        P->Mp = P->maxMp;
    }
}

// TODO: simulate and print the process of the battle
void battle(Pokemon *A, Pokemon *B){
    int turn = 0;
    while(1){

        if(A->Hp == 0 && B->Hp != 0){
            printf("%s is the winner! %s died in vain...\n\n", B->name, A->name);
            return;
        }
        else if(B->Hp == 0 && A->Hp != 0){
            printf("%s is the winner! %s died in vain...\n\n", A->name, B->name);
            return;
        }
        else if(A->Hp == 0 && B->Hp == 0){
            printf("Draw.\n\n");
            return;
        }

        if(turn == 0){
            A->Mp += T;
            if(A->Mp >= A->maxMp) A->Mp = A->maxMp;//注意Mp不能大於最大Mp
            if(A->Mp < A->costMp){
                A->Mp += T;
                if(A->Mp >= A->maxMp) A->Mp = A->maxMp;
                printf("%s used Rest!\n", A->name);
                printf("%s now has %d MP.\n", A->name, A->Mp);
            }
            else{
                A->Mp -= A->costMp;
                B->Hp -= 2*(A->level)*max(A->attack-B->defense, 0)/100;
                if(B->Hp < 0) B->Hp = 0;
                printf("%s used Headbutt!\n", A->name);
                printf("%s now has %d HP.\n", B->name, B->Hp);
            }
            turn = 1;
        }
        else{
            B->Mp += T;
            if(B->Mp >= B->maxMp) B->Mp = B->maxMp;
            if(B->Mp < B->costMp){
                B->Mp += T;
                if(B->Mp > B->maxMp) B->Mp = B->maxMp;
                printf("%s used Rest!\n", B->name);
                printf("%s now has %d MP.\n", B->name, B->Mp);
            }
            else{
                B->Mp -= B->costMp;
                A->Hp -= 2*(B->level)*max(B->attack-A->defense, 0)/100;
                if(A->Hp < 0) A->Hp = 0;
                printf("%s used Headbutt!\n", B->name);
                printf("%s now has %d HP.\n", A->name, A->Hp);
            }
            turn = 0;
        }
    }
}