利用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++宝可梦对战游戏的资料请关注我们其它相关文章!

(0)

相关推荐

  • c++实现扫雷小游戏代码分享

    分成两个源文件和一个头文件 注意:这串代码并不完整,不能够实现当所查坐标周围雷的数量为0时,直接展开周围坐标: 头文件:game.h #include <stdio.h> #define count 10 //雷的数量 //定义 行-ROW,列-COL #define ROW 9 #define COL 9 #define ROWS ROW+2 //多加一些,方便代码 #define COLS COL+2 //初始化棋盘,声明的函数均在game.c中实现 void InitBoard(char

  • C++实现简易贪吃蛇游戏

    C++实现建议贪吃蛇(不会闪屏幕) 使用vs2013完成.记录踏上游戏开发的道路. 效果图 代码 // 2021.7.24.1贪吃蛇.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #include <list> #include <numeric> #include <algorithm> #include <Windows.h> #includ

  • C/C++实现经典象棋游戏的示例代码

    目录 大体思路 效果展示 核心代码 大体思路 采用面相过程的设计方式实现,类似于我们平时做的课程设计,实现这样的小游戏无非就是多了图形处理库.这里使用的是acllib图形库. 设计这种小游戏,首先要从宏观上去认识:象棋,要有棋盘,要有棋子,棋子要移动. 对于棋盘,十行九列画出即可. 对于棋子,分黑红两方,按照指定位置画出. 如何移动棋子,我们有mouseEvent函数. 初始化棋盘棋子:initmap,initpaint 利用鼠标实现棋子移动分两步(mouseEvent): 第一次点击,记录点击

  • C++实现简易的弹球小游戏

    本文实例为大家分享了C++实现弹球小游戏的具体代码,供大家参考,具体内容如下 操作说明:键盘A和D键控制左右移动,让球不要落下. #include <graphics.h> #include <conio.h> #include <time.h> int i; int xx=0; int yy = 0; class Ball { public: int x, y; clock_t b; void draw() { setfillcolor(RGB(200, 399, 1

  • c++实现俄罗斯方块游戏代码

    俄罗斯方块c++ 1.创建项目2.总共需要创建两个文件,一个main.cpp,一个是elsfk2.h.本人使用的编译器是vs2019. 3.在项目的源文件夹下创建一个文件夹image 4.把下面两张图片重命名好放进刚创建的文件夹 elsfk.jpg elsfk_block.jpg 5.把下列代码分别复制到对应文件中 ----------------------------------------------------------------------------------- 以下是main

  • 基于C++实现五子棋小游戏

    本文实例为大家分享了C++实现五子棋小游戏的具体代码,供大家参考,具体内容如下 (这是一个颜色会变化的呦) #include <iostream> using namespace std; int b[20][20]; int n; int m; void qipan() {     system("cls");     int k = 1;     for (int k = 0;k < n;++k)     {         for (int j = 0;j &l

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

    最近想到了用C++写个小时候课间嘴上玩的那种宝可梦游戏,先试写了个demo,只有早期的三个宝可梦和基础招式,感兴趣的朋友可以再自己添加,也没有各种物防特攻数值啥的,等以后会搞图形化界面了再做个复杂的,功能完善的. 玩法就是选择宝可梦和电脑对战,除了攻击还有三次防御的机会,可以完全抵消对面这轮的攻击,增加了一点博弈的感觉(其实和电脑也没啥好博弈的) 上代码 #include<iostream> #include<windows.h> #include<ctime> enu

  • Java实现简易版联网坦克对战小游戏(附源码)

    介绍 通过本项目能够更直观地理解应用层和运输层网络协议, 以及继承封装多态的运用. 网络部分是本文叙述的重点, 你将看到如何使用Java建立TCP和UDP连接并交换报文, 你还将看到如何自己定义一个简单的应用层协议来让自己应用进行网络通信. 获取源码 (本地下载) 基础版本 游戏的原理, 图形界面(非重点) 多张图片快速连续地播放, 图片中的东西就能动起来形成视频, 对视频中动起来的东西进行操作就变成游戏了. 在一个坦克对战游戏中, 改变一辆坦克每一帧的位置, 当多帧连续播放的时候, 视觉上就有

  • 利用c++编写简易版2048小游戏

    目录 1.程序初始化 2.画图操作 3.字符控制 4.判断游戏结束和游戏胜利 别的不多说,先上效果图 我们都知道2048是个4 4的方格,为了方便数组下表我们生成5 5的数组,只用到1~4的下标. 初始化时候先随便生成两个目标 1.程序初始化 // 程序初始化 void init() { score = 0; memset(a, 0, sizeof(a)); int x1 = rand() % 4 + 1, y1 = rand() % 4 + 1, x2 = rand() % 4 + 1, y2

  • 利用Matlab编写简易版连连看小游戏

    这是一款MATLAB连连看小游戏,基本实现了连连看的功能,不过目前没有写出死局判定的模块,日后可能会对其进行改进. 游戏截图 游戏组装说明 我们的变量path输入的是图像包的相对路径或绝对路径 这里我们由于文件夹名称就叫“图片”所以直接path='图片’是没啥问题的. 文件夹里就是图片素材啦,其名称没有任何要求,形状最好是方的,不过不是的话问题也不大,程序会自动将其拉伸成方的........ 我们这里要求的是读入jpg格式,想要png,jpg都读的话,.....最简单的就是直接读两次 完整代码

  • 利用Python编写简易版德州扑克小游戏

    目录 德州扑克简要介绍 什么是德州扑克 游戏规则简要介绍 德州扑克游戏的python实现过程 游戏初始化 评选赢家 游戏主题函数 游戏体验与展示 模块不足与后续改进 德州扑克简要介绍 什么是德州扑克 德州扑克不知道大家是否玩过,它是起源于美国的得克萨斯州的一种博弈类卡牌游戏,英文名叫做Texas Hold’em Poker.玩法上又分为常规桌(Cash, 现金局),单桌赛(SNG)和多桌锦标赛(MTT).虽然扑克种类繁多,但基本的扑克规则通常保持一致.它是一种考验心态与谋略的游戏. 游戏规则简要

  • 利用Python编写简易的录制屏幕小工具

    目录 1.准备 2.代码 由于最近测试需要录制系统界面的操作过程,因为都是全屏的操作,所以用python做一个简单的录屏小工具. 实现过程也是比较简单,就是通过对屏幕操作进行不断的截图,最后将截图合成一个操作视频的过程.由于我们只是做简单的截屏功能,并没有加入音频效果. 1.准备 开始之前我们还是按照以往的方式介绍一下使用到的第三方的python模块. from PIL import ImageGrab import numpy as np import cv2 import datetime

  • 利用C语言实现三子棋(井字棋)小游戏

    本文实例为大家分享了C语言实现三子棋(井字棋)小游戏的具体代码,供大家参考,具体内容如下 推荐阅读顺序(不建议跳过) 先看实现之后的界面 -- 然后看分析程序要实现的步骤 -- 之后在看翻到test.c部分 -- 在test.c中找到main()函数 -- 从main函数的第一步开始看 -- 遇到自定义函数请到game.h源文件中找到相应函数的详情 辅助阅读: game.h文件中放的是函数的声明(引用头文件) game.c文件中放的是函数的详情(怎么用代码实现相应步骤的) test.c文件中放的

  • 利用C#编写扫雷游戏(附源码)

    前言 翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来.当然现在看来,里面有很多的不足之处,但因博主现在已经工作,没有时间再去优化.这个项目就是利用C#编写一个Windows系统下的扫雷小游戏. 首先讲下扫雷小游戏的玩法: (1)扫雷就是要把所有非地雷的格子揭开即胜利:踩到地雷格子就算失败. (2)当点开的格子不是地雷区域的时候,该格子会显示一个数字,该数字表示的含义就是该格子周边有多少个地雷. (3)同时点开的如果非地雷的格子,周边连贯的非地雷区域都会自动被

  • 如何利用Promises编写更优雅的JavaScript代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它们写出更优雅的 JavaScript 代码. Promises 易于阅读 比如说我们想从 HipsterJesus 的API中抓取一些数据并将这些数据添加到我们的页面中.这些 API 的响应数据形式如下: { "text": "<p>Lorem ipsum...<

  • java简易小游戏制作代码

    java简易小游戏制作 游戏思路:设置人物移动,游戏规则,积分系统,随机移动的怪物,游戏胜负判定,定时器. 游戏内容部分 package 代码部分; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyList

随机推荐