首頁 > 軟體

利用C++編寫簡易寶可夢對戰小遊戲

2022-06-16 18:04:57

最近想到了用C++寫個小時候課間嘴上玩的那種寶可夢遊戲,先試寫了個demo,只有早期的三個寶可夢和基礎招式,感興趣的朋友可以再自己新增,也沒有各種物防特攻數值啥的,等以後會搞圖形化介面了再做個複雜的,功能完善的。

玩法就是選擇寶可夢和電腦對戰,除了攻擊還有三次防禦的機會,可以完全抵消對面這輪的攻擊,增加了一點博弈的感覺(其實和電腦也沒啥好博弈的)

上程式碼

#include<iostream>
#include<windows.h>
#include<ctime>
enum Type {normal,fire,grass,water};//定義招式與pokemon屬性
struct Atk//招式結構體
{
    char name[20];//招式名
    int damage;//傷害
    Type type;//屬性
    int speed;//招式速度
    int pp; //招式技能點數量
};
Atk def{"def",0,normal,10,3};//防禦
struct pokemon//pokemon結構體
{
    char name[30];//名
    int hp;//初始血量
    int speed;//pokemon本身速度
    Type type;//屬性
    Atk atk1;//招式1到4
    Atk atk2;
    Atk atk3;
    Atk atk4;
    int def;//防禦點數
};
void initial();
int choose(int);
int AIchoose(int);
int p_choose(int,pokemon);
int AI_choose(int,pokemon);
void duel(pokemon p_pokemon,pokemon AI_pokemmon);
double damage_coeff(Type type1,Type type2);
 
int main()
{
    using namespace std;
    int cont=1;//設定迴圈遊戲的flag
    while(cont==1)
    {
        system("cls");//新遊戲開始時清屏
        //初始化各個招式與pokemon
        Atk watergun{"water gun",40,water,2,2};//水槍
        Atk quickattack{"quick attack",40,normal,5,3};//電光石火
        Atk scratch{"scratch",40,normal,2,8};//抓
        Atk bubblebeam{"bubble beam",65,water,1,1};//泡沫光線
        Atk razorleaf{"razor leaf",55,grass,3,1};//飛葉快刀
        Atk vinewhip{"vine whip",35,grass,4,2};//藤鞭
        Atk tackle{"tackle",35,normal,2,10};//撞擊
        Atk ember{"ember",40,fire,2,1};//火苗
        Atk firespin{"fire spin",35,fire,4,2};//火焰旋渦
        pokemon bulbasaur{"bulbasaur",200,3,grass,tackle,quickattack,vinewhip,razorleaf,3};//妙蛙種子
        pokemon charmander{"charmander",200,2,fire,scratch,quickattack,ember,firespin,3};//小火龍
        pokemon squirtle{"squirtle",200,1,water,tackle,quickattack,watergun,bubblebeam,3};//傑尼龜
        initial();
        pokemon p_pokemon;
        pokemon AI_pokemon;
        int Num1,Num2;
        Num1=choose(Num1);
        Num2=AIchoose(Num2);
        //確定雙方選擇的pokemon
        switch(Num1)
        {
            case 1:
                p_pokemon=bulbasaur;
                break;
            case 2:
                p_pokemon=charmander;
                break;
            case 3:
                p_pokemon=squirtle;
                break;
        }
        switch(Num2)
        {
            case 0:
                AI_pokemon=bulbasaur;
                break;
            case 1:
                AI_pokemon=charmander;
                break;
            case 2:
                AI_pokemon=squirtle;
                break;
        }
        system("cls");
        Sleep(500);
        cout <<"You choose "<<p_pokemon.name<<" and your opponent choose "<<AI_pokemon.name<<endl;
        duel(p_pokemon,AI_pokemon);
        cout <<"If you want to play another round,enter number 1,or enter others number to quit:"<<endl;
        cin >>cont;
    }
    cin.get();
    return 0;
}
 
void initial()//初始化介面
{
    using namespace std;
    cout <<"Welcome to the pokemon duel!"<<endl;
    cout <<"Your pokemon has 3 chances to defend.Once you decide to defend,you will not get damage this turn."<<endl;
    cout <<"But also,you can not attack this turn."<<endl;
    cout <<"Now choose your pokemon by enter the number:";
    cout <<"1.bulbasaur 2.charmander 3.squirtle";
}
int choose(int Num)//玩家選擇pokemon,利用遞迴讓玩家正確輸入
{
    using namespace std;
    cin >>Num;
    if(Num!=1&&Num!=2&&Num!=3)
    {
        cout <<"You choose a wrong number, choose it again:";
        Num=choose(Num);
    }
    return Num;
}
int AIchoose(int Num)//電腦選擇pokemon,利用亂數讓電腦隨機選擇
{
    using namespace std;
    srand((unsigned)time(NULL));
    Num = rand() % 3;
    return Num;
}
int p_choose(int pchoose,pokemon p_pokemon)//玩家選擇招式,利用遞迴讓玩家正確輸入
{
    using namespace std;
    cin >>pchoose;
    //判斷玩家所選的招式PP是否足夠
    if(pchoose==1&&p_pokemon.atk1.pp<=0)
    {
        cout <<"You don't have enough pp"<<endl;
        pchoose=p_choose(pchoose,p_pokemon);
    }
    if(pchoose==2&&p_pokemon.atk2.pp<=0)
    {
        cout <<"You don't have enough pp"<<endl;
        pchoose=p_choose(pchoose,p_pokemon);
    }
    if(pchoose==3&&p_pokemon.atk3.pp<=0)
    {
        cout <<"You don't have enough pp"<<endl;
        pchoose=p_choose(pchoose,p_pokemon);
    }
    if(pchoose==4&&p_pokemon.atk4.pp<=0)
    {
        cout <<"You don't have enough pp"<<endl;
       pchoose=p_choose(pchoose,p_pokemon);
    }
    if(pchoose==5&&p_pokemon.def<=0)
    {
        cout <<"You don't have enough pp"<<endl;
        pchoose=p_choose(pchoose,p_pokemon);
    }
    if(pchoose>5||pchoose<=0)
    {
        cout <<"You choose a wrong number, choose it again:";
        pchoose=p_choose(pchoose,p_pokemon);
    }
    return pchoose;
}
int AI_choose(int AIchoose,pokemon AI_pokemon)//利用亂數讓電腦隨機選擇
{
    using namespace std;
    srand((unsigned)time(NULL));
    AIchoose = rand() % 5;
    //判斷電腦選擇招式的PP是否足夠
    if(AIchoose==0&&AI_pokemon.atk1.pp<=0)
    {
        Sleep(1000);
        AIchoose=AI_choose(AIchoose,AI_pokemon);
    }
    if(AIchoose==1&&AI_pokemon.atk2.pp<=0)
    {
        Sleep(1000);
        AIchoose=AI_choose(AIchoose,AI_pokemon);
    }
    if(AIchoose==2&&AI_pokemon.atk3.pp<=0)
    {
        Sleep(1000);
        AIchoose=AI_choose(AIchoose,AI_pokemon);
    }
    if(AIchoose==3&&AI_pokemon.atk4.pp<=0)
    {
        Sleep(1000);
        AIchoose=AI_choose(AIchoose,AI_pokemon);
    }
    if(AIchoose==4&&AI_pokemon.def<=0)
    {
        Sleep(1000);
        AIchoose=AI_choose(AIchoose,AI_pokemon);
    }
    return AIchoose;
}
double damage_coeff(Type type1,Type type2)//計算攻擊時傷害加成係數,type1為招式屬性,type2為pokemon屬性
{
    if(type1==normal)
    {
        return 1;
    }
    if(type1==grass)
    {
        switch(type2)
        {
            case grass:
                return 0.5;
                break;
            case fire:
                return 0.5;
                break;
            case water:
                return 2;
                break;
        }
    }
    if(type1==fire)
    {
        switch(type2)
        {
            case grass:
                return 2;
                break;
            case fire:
                return 0.5;
                break;
            case water:
                return 0.5;
                break;
        }
    }
    if(type1==water)
    {
        switch(type2)
        {
            case grass:
                return 0.5;
                break;
            case fire:
                return 2;
                break;
            case water:
                return 0.5;
                break;
        }
    }
}
void duel(pokemon p_pokemon,pokemon AI_pokemmon)//戰鬥流程函數
{
    using namespace std;
    while(p_pokemon.hp>0&&AI_pokemmon.hp>0)//雙方HP均大於0時繼續戰鬥
    {
        //顯示雙方相關資訊
        cout <<"Your HP:"<<p_pokemon.hp<<" Your opponent's HP:"<<AI_pokemmon.hp<<endl<<endl;
        cout <<"Choose your action this turn by ernter the number:"<<endl;
        cout <<"1."<<p_pokemon.atk1.name<<" PP:"<<p_pokemon.atk1.pp<<endl;
        cout <<"2."<<p_pokemon.atk2.name<<" PP:"<<p_pokemon.atk2.pp<<endl;
        cout <<"3."<<p_pokemon.atk3.name<<" PP:"<<p_pokemon.atk3.pp<<endl;
        cout <<"4."<<p_pokemon.atk4.name<<" PP:"<<p_pokemon.atk4.pp<<endl;
        cout <<"5.deffense PP:"<<p_pokemon.def;
        Atk this_turn_p_atk;//定義玩家本輪所選招式
        Atk this_turn_AI_atk;//定義電腦本輪所選招式
        int pchoose;
        pchoose=p_choose(pchoose,p_pokemon);
        int AIchoose;
        AIchoose=AI_choose(AIchoose,AI_pokemmon);
        switch(pchoose)
        {
            case 1:
                p_pokemon.atk1.pp=p_pokemon.atk1.pp-1;
                this_turn_p_atk=p_pokemon.atk1;
                break;
            case 2:
                p_pokemon.atk2.pp=p_pokemon.atk2.pp-1;
                this_turn_p_atk=p_pokemon.atk2;
                break;
            case 3:
                p_pokemon.atk3.pp=p_pokemon.atk3.pp-1;
                this_turn_p_atk=p_pokemon.atk3;
                break;
            case 4:
                p_pokemon.atk4.pp=p_pokemon.atk4.pp-1;
                this_turn_p_atk=p_pokemon.atk4;
                break;
            case 5:
                p_pokemon.def=p_pokemon.def-1;
                this_turn_p_atk=def;
                break;
        }
        switch(AIchoose)
        {
            case 0:
                AI_pokemmon.atk1.pp=AI_pokemmon.atk1.pp-1;
                this_turn_AI_atk=AI_pokemmon.atk1;
                break;
            case 1:
                AI_pokemmon.atk2.pp=AI_pokemmon.atk2.pp-1;
                this_turn_AI_atk=AI_pokemmon.atk2;
                break;
            case 2:
                AI_pokemmon.atk3.pp=AI_pokemmon.atk3.pp-1;
                this_turn_AI_atk=AI_pokemmon.atk3;
                break;
            case 3:
                AI_pokemmon.atk4.pp=AI_pokemmon.atk4.pp-1;
                this_turn_AI_atk=AI_pokemmon.atk4;
                break;
            case 4:
                AI_pokemmon.def=AI_pokemmon.def-1;
                this_turn_AI_atk=def;
                break;
        }
        system("cls");
        //判斷是否有玩家本輪採取防禦
        if(AIchoose==4&&pchoose!=5)
        {
            cout <<"You use "<<this_turn_p_atk.name<<".";
            Sleep(500);
            cout <<"But your attack was defended!"<<endl;
        }
        else if(pchoose==5&&AIchoose!=4)
        {
            cout <<"Your opponent use "<<this_turn_AI_atk.name<<".";
            Sleep(500);
            cout <<"But you defend the attack from the opponent!"<<endl;
        }
        else if(pchoose==5&&AIchoose==4)
        {
            cout <<"You both defend this turn."<<endl;
            Sleep(250);
        }
        else//雙方都沒有防禦的情況
        {
            int p_speed,AI_speed;
            double p_coeff,AI_coeff;
            //真正的速度為pokemon本身速度加招式速度
            p_speed=p_pokemon.speed+this_turn_p_atk.speed;//本輪玩家真正的速度
            AI_speed=AI_pokemmon.speed+this_turn_AI_atk.speed;//本輪電腦真正的速度
            //計算傷害係數
            p_coeff=damage_coeff(this_turn_p_atk.type,AI_pokemmon.type);
            AI_coeff=damage_coeff(this_turn_AI_atk.type,p_pokemon.type);
            //比較雙方誰本輪速度快,判斷先手
            if(AI_speed>p_speed)
            {
                cout <<"Your opponent use "<<this_turn_AI_atk.name<<" !"<<endl;
                Sleep(500);
                p_pokemon.hp=p_pokemon.hp-this_turn_AI_atk.damage*AI_coeff;//計算收到的傷害,傷害為招式傷害乘以傷害係數
                if(p_pokemon.hp<=0)
                {
                    cout <<"You have been defeated!"<<endl;
                }
                else if(p_pokemon.hp>0)
                {
                    cout <<"You use "<<this_turn_p_atk.name<<" !"<<endl;
                    Sleep(500);
                    AI_pokemmon.hp=AI_pokemmon.hp-this_turn_p_atk.damage*p_coeff;
                    if(AI_pokemmon.hp<=0)
                    {
                        cout <<"You win!"<<endl;
                    }    
                }
            }
            else if(AI_speed<p_speed)
            {
                cout <<"You use "<<this_turn_p_atk.name<<" !"<<endl;
                Sleep(500);
                AI_pokemmon.hp=AI_pokemmon.hp-this_turn_p_atk.damage*p_coeff;
                if(AI_pokemmon.hp<=0)
                {
                    cout <<"You win!"<<endl;
                }
                else
                {
                    cout <<"Your opponent use "<<this_turn_AI_atk.name<<" !"<<endl;
                    Sleep(500);
                    p_pokemon.hp=p_pokemon.hp-this_turn_AI_atk.damage*AI_coeff;
                    if(p_pokemon.hp<=0)
                    {
                        cout <<"You have been defeated!"<<endl;
                    }
                }
            }
            else if(AI_speed==p_speed)
            {
                cout <<"You both attack at the same time!"<<endl;
                Sleep(500);
                cout <<"You use "<<this_turn_p_atk.name<<" !"<<endl;
                Sleep(500);
                cout <<" Your opponent use "<<this_turn_AI_atk.name<<" !"<<endl;
                Sleep(500);
                p_pokemon.hp=p_pokemon.hp-this_turn_AI_atk.damage*AI_coeff;
                AI_pokemmon.hp=AI_pokemmon.hp-this_turn_p_atk.damage*p_coeff;
                if(AI_pokemmon.hp<=0&&p_pokemon.hp>0)
                {
                    cout <<"You win!"<<endl;
                }
                else if(AI_pokemmon.hp>0&&p_pokemon.hp<=0)
                {
                    cout <<"You have been defeated!"<<endl;
                }
                else if(AI_pokemmon.hp<=0&&p_pokemon.hp<=0)
                {
                    cout <<"Draw game!";
                }
            }
        }
    }
}

以上就是利用C++編寫簡易寶可夢對戰小遊戲的詳細內容,更多關於C++寶可夢對戰遊戲的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com