利用C++编写简易宝可梦对战小游戏

 更新时间:2022年06月16日 15:33:12   作者:agmissle  
本文利用C++语言编写了一个小时候课间嘴上玩的那种宝可梦游戏,只有早期的三个宝可梦和基础招式,感兴趣的朋友快跟随小编一起学习学习吧

最近想到了用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++宝可梦对战游戏的资料请关注脚本之家其它相关文章!

相关文章

  • C++中继承的概念和定义

    C++中继承的概念和定义

    这篇文章主要介绍了详解C++ 中的概念和定义,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下,希望能给你带来帮助
    2021-08-08
  • C++动态规划中关于背包问题讲解

    C++动态规划中关于背包问题讲解

    可能有些读者有接触过动态规划,可能也有一些读者以前完全不知道动态规划这个东西,别担心,我这篇文章会为读者做一个入门,好让读者掌握这个重要的知识点
    2023-03-03
  • 人脸检测中AdaBoost算法详解

    人脸检测中AdaBoost算法详解

    这篇文章主要为大家详细介绍了人脸检测中AdaBoost算法的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Qt数据库应用之实现通用数据库分页

    Qt数据库应用之实现通用数据库分页

    数据库分页展示,在所有的涉及到数据库记录的项目中都是需要的。本文将利用Qt实现通用数据库的分页展示,感兴趣的小伙伴可以跟随小编学习一下
    2022-02-02
  • C++中const的实现机制深入分析

    C++中const的实现机制深入分析

    C语言以及C++语言中的const究竟表示什么?其具体的实现机制又是如何实现的呢?本文将对这两个问题进行一些分析,需要了解的朋友可以参考下
    2012-12-12
  • C语言算法的时间复杂度和空间复杂度

    C语言算法的时间复杂度和空间复杂度

    这篇文章主要介绍了C语言算法的时间复杂度和空间复杂度,算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源,更多相关需要的朋友可以参考一下
    2022-07-07
  • Cocos2d-x中使用CCScrollView来实现关卡选择实例

    Cocos2d-x中使用CCScrollView来实现关卡选择实例

    这篇文章主要介绍了Cocos2d-x中使用CCScrollView来实现关卡的选择实例,本文在代码中用大量注释讲解了CCScrollView的使用,需要的朋友可以参考下
    2014-09-09
  • linux下C/C++学生信息管理系统

    linux下C/C++学生信息管理系统

    这篇文章主要为大家详细介绍了linux下c/c++学生信息管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Linux下g++编译与使用静态库和动态库的方法

    Linux下g++编译与使用静态库和动态库的方法

    下面小编就为大家带来一篇Linux下g++编译与使用静态库和动态库的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • 如何解决C语言,函数名与宏冲突

    如何解决C语言,函数名与宏冲突

    本文介绍了“如何解决C语言,函数名与宏冲突”,需要的朋友可以参考一下
    2013-03-03

最新评论