基于curses库C++设计一款能进行海贼对战RPG文字游戏

游戏运行界面截图:

利用C++设计一款能进行海贼对战RPG文字游戏演示视频

全部操作都是使用键盘来控制游戏的 

 

 

项目名称

C++海贼王文字游戏

设计目标:

利用C++设计一款能进行海贼对战,营救船员,等级提升 装备购买使用等其他操作的RPG 游戏

功能描述

1.初始化界面有新建角色 继续游戏 退出游戏等功能

2.游戏内有商店,装备背包,冒险地图,治疗,我的任务 存档退出功能

2.装备背包可以存放已购买的装备和药水 同时可以管理丢弃使用

3.可以接收营救伙伴任务,成功打败怪物即可完成任务 并把伙伴加入一起战斗

4.冒险地图有三个怪物,击败它们能获得相应的金币经验

设计方案

基于curses终端库进行设计游戏界面设计,利用c++多态实现不同类之间的信息交互 。

设计过程:(编写过程写下的思路和一些代码)

选择curses 终端库设计

首先安装库:

 sudo apt-get install libncurses5-dev

初始化:

    //设置中文环境
    setlocale(LC_ALL,"");
   //WINDOW *my_win;
​
    //初始化界面 
    initscr();                   //进入curses 模式
    cbreak();                    //把终端的CBREAK模式打开
    noecho();                    //关闭回显
   //curs_set(0);                //把光标置为不可见
    keypad(stdscr, true);        //使用用户终端的键盘上的小键盘
​
    start_color();               //开启颜色功能 
    init_pair(1, COLOR_WHITE, COLOR_RED);  //定义1种颜色
    init_pair(2, COLOR_BLACK, COLOR_GREEN);  //定义1种颜色
   //保存当前界面的X Y 
    win_x = COLS; 
    win_y = LINES; 

编译命令:

g++ *.cpp -lncursesw

图片转化字符:

https://www.fontke.com/tool/image2ascii/

打印信息: mvprintw

 mvprintw(10, 0, "小型回复药剂 : 能帮助角色恢复10点生命值\n需花费的金币:10");   
        refresh(); //刷新界面   

项目设计思路:

战斗开始后玩家角色可在区域内一边移动一边作战,操作角色移动至最佳站位(对敌人处于优势的位置)后发动攻击;
    

海贼王

1.设计角色抽象类 -> 角色类可以派生出不同的职业

class role
{
public:
    role(){}
    void show()
    {
        char buf[512] ={0};
        sprintf(buf,"海贼名称:%s 攻击力: %d 防御: %d \n血量: %d 装备:%s 悬赏金额:%d",this->name.c_str(),this->attk,this->defense,this->HP,this->get_equimnet().c_str(),this->get_reward());
        mvprintw(display_row, 0, buf);   
        refresh(); //刷新界面   
        role_disMenu.push_back(this->name.c_str());        
    }
    void potion_treatment(int h)//药水治疗
    {
        if (this->CUR_HP + h > this->HP)
        {
            this->recovery_CurHp();
            return;
        }
        this->CUR_HP += h;

    }
    
    void recovery_CurHp()//治疗恢复
    {
        this->CUR_HP = this->HP;
    }
    //输出人物信息
    void output_role_msg(WINDOW *local_win)
    {
        mvwprintw(local_win,3,0,"            "); //y=30 
        mvwprintw(local_win,3,50,"          "); //y=30 
        //输出各自信息:
        mvwprintw(local_win,1,0,"海贼名称:%s",this->get_name().c_str()); //y=30 
        mvwprintw(local_win,2,0,"等级:%d",this->get_grade()); //y=30 
        mvwprintw(local_win,3,0,"生命值:%d ",this->get_CUR_HP()); //y=30 
        mvwprintw(local_win,4,0,"攻击力:%d",this->get_attk()); //y=30 
        mvwprintw(local_win,5,0,"装备:%s",this->get_equimnet().c_str()); //y=30 
        mvwprintw(local_win,6,0,"经验值:%d/100",this->get_experience()); //y=30 
        mvwprintw(local_win,7,0,"悬赏金额:%d",this->get_reward()); //y=30 

        wrefresh(local_win);          
    }    

    void add_Exp(int Exp)//增加经验
    {
        this->experience += Exp;
        if (this->experience >= 100 && this->grade < 5)
        {
            //cout << "升级成功" << endl;升一级所有属性涨70% 
            this->HP *= 1.7;
            this->CUR_HP = this->HP;
            this->attk *= 1.7 ;
            this->defense *= 1.7;
            this->grade += 1;
            this->experience -= 100;
            this->reward *=3;
        }        
    } 

    void promote(int hp, int def,int attk,const char *_equipment)//穿戴装备提升能力
    {
        this->HP+=hp;
        this->CUR_HP+=hp;
        this->defense+=def;
        this->attk+=attk;
        this->equipment = _equipment;
    }
    void add_coin(int coin )//增加金币 
    {
        this->gold_coins += coin;
    } 
    bool reduce_coin(int sum)//减少金币 用于商店购买
    {
         this->gold_coins -= sum;
        if(this->gold_coins <0)
        {
            //购买失败
            this->gold_coins += sum;
            return false;
        }else{
            return true;
        }
    }


    int get_attk()
    {
        return this->attk;
    }
    string get_name()
    {
        return this->name;
    }
    int get_grade(){return this->grade;}
    int get_defense(){return this->defense;}
    int get_coins(){return this->gold_coins;}
    int get_CUR_HP(){return this->CUR_HP;} 
    int get_HP(){return this->HP;}     
    int get_reward(){return this->reward;}
    string get_equimnet(){return this->equipment;}
    int get_experience(){return this->experience;}

    void be_hurt(int hurt){this->CUR_HP -= hurt; }
    string get_skill(int i){return skill[i];}
    //读取文件设置人物属性
    void read_file_setmsg(const char *name,int grade,int Hp,
        int CUR_HP ,int attk,int defense,const char *equipment ,int experience , int reward ,int gold_coins )
    {
        this->name = string(name);
        this->grade = grade;
        this->HP = Hp;
        this->CUR_HP =CUR_HP;
        this->attk = attk;
        this->defense = defense;
        this->equipment = string(equipment);
        this->experience = experience;
        this->reward = reward;
        this->gold_coins = gold_coins;

    }
    //每个人物都有三个技能 设置纯虚函数 预留接口 实现传入不同的对象就会使用不同的对应的技能 多态
    virtual int skill1(role &r) = 0;
    virtual int skill2(role &r) = 0;
    virtual int skill3(role &r) = 0;

protected:
    string name;//名字
    int HP;//血量
    int CUR_HP;//当前血量
    int attk;//攻击
    int defense;//防御
    string equipment;//装备
    int grade;//等级
    int experience;//经验
    int reward;//悬赏金额
    int gold_coins;//金币
    vector <string> skill;//技能


};

名字 血量 攻击 防御 装备 等级 经验 悬赏:(不同)升级也会上升

升级路线: 1

姓名: 蒙奇 D 路飞 艾斯 萨博

悬赏: 1000

血量: 100

攻击: 10

防御: 3

装备: 无

等级:1

经验:0

升级路线: 1-5级 经验达到100即可 升一级所有属性涨70%

90 100 30

2.设计怪物抽象类 -> 怪物类可以派生出不同的怪兽

名字 血量 攻击 防御 装备 等级 经验 悬赏:(不同)升级也会上升

升级路线: 1

姓名: 小丑·巴基 克洛克达尔 神—艾尼路 萨卡斯基-赤犬

悬赏: 900 2000 5000 20000

血量: 50 100 200 1000

攻击: 5 10 50 200

防御: 3 7 30 99

装备: 无

等级:1 2 3 5

升级路线: 怪物不用升级

3.设计一个背包类 -> 管理装备,药水。

药水类:小型药水 恢复 10 中型药水 30 大型药水 90

装备类: 大宝剑20 天候棒200 黑夜刀1000

增加攻击力: 10 50 500

防御 5 30 200

血量 15 25 450

太多了不贴代码了 

4.剧情地图类:不同地图生成怪物不同,

            if(ctrl == 0)//东岛篇  
            {
                game_map  *m;
  
                m =  new game_map("M",1); //新建地图
                baji b;
                //开始移动
                m->move_map(b,NPC,'M',bag,1);
     
            }else if(ctrl == 1)
            {
                 game_map  *m;

                m =  new game_map("K",2); //新建地图空岛篇
                //开始移动
                ainilu b;
                m->move_map(b,NPC,'K',bag,2);              
            }else if(ctrl == 2)
            {
                 game_map  *m;

                m =  new game_map("C",3); //新建地图顶上战争
                //开始移动
                chiquan b;
                m->move_map(b,NPC,'C',bag,3);              
            }    

‍‍1.东海篇 2.阿拉巴斯坦篇 3.空岛篇**4.顶上战争篇**

[《海贼王》中路飞打败过哪些人?_百度知道 (baidu.com)] (https://zhidao.baidu.com/question/311042049144736124.html)

5.设计一个商店类

商品列表:

小型药水 10 中型药水 20 大型药水 30

大宝剑 20 天候棒 200 黑刀夜 1000

购买完===》添加到背包里边的武器容器==》新建菜单 遍历显示武器

一起遍历出来 判断数量为0就不显示

6.NPC类(接任务 做任务 升级 奖励金币)

我的伙伴 一开始没有 接收任务 完成任务即可得到伙伴

索隆 娜美 乔巴

解救成功 ===》背包伙伴链表增加一个伙伴====》

class NPC
{
public:
    NPC()
    { 
       this->complete_sum1 = 0; //任务一完成打怪的次数
       this->complete_sum2 = 0;//任务二完成打怪的次数
       this->complete_sum3 = 0;//任务三完成打怪的次数

        this->first_flag = false;//接收任务标志
        this->sec_flag= false;
        this->third_flag= false;

        choices.push_back("任务1====》营救娜美");
        choices.push_back("任务2====》营救索隆");
        choices.push_back("任务3====》营救乔巴");
        choices.push_back("返回主界面");
    }
     
    void NPC_main(bag &bag)//NPC界面
    {
        //获取选项大小
        this->n_choices =  choices.size(); 

        //新建一个窗体     
        local_win = newwin(30,30,6,50); //h w y x 

       //获取当前菜单的宽度和高度 
        x = getmaxx(local_win);
        y = getmaxy(local_win);

        highlight = 0;

        mvprintw(0,0,"任务中心 x=%d ,y=%d",x,y);
        print_menu(local_win,highlight);
        move(5,0);
        for(int i=0;i<COLS;i++)
            addstr("_");
        wrefresh(local_win); //刷新窗体
        refresh();//刷新主窗体

        //营救索隆 娜美 乔巴

        while (1)
        {
            int  ctrl =  this->get_ctrl(); 
            if(ctrl == 0)//营救娜美
            {
                if(!first_flag)
                {
                    chose_task(first_flag,complete_sum1);
                    first_flag = true;
                }else{
                   int flag = chose_task(first_flag,complete_sum1);
                   if(flag == 1)
                   {
                    //将人物链表存入信息
                    //创建人物
                        bag.add_role(new namei);
                        mvprintw(0,0,"成功营救娜美");
                         refresh();//刷新主窗体
                   }
                }
                
            }else if(ctrl == 1)//营救索隆
            {
                if(!sec_flag)
                {
                    chose_task(sec_flag,complete_sum2);
                    sec_flag = true;
                }else{
                   int flag = chose_task(sec_flag,complete_sum2);
                   if(flag == 1)
                   {
                    //将人物链表存入信息
                    //创建人物
                        bag.add_role(new suolong);
                        mvprintw(0,0,"成功营救索隆");
                         refresh();//刷新主窗体
                   }
                }                             
                
            }else if(ctrl == 2)//营救乔巴
            {
                if(!third_flag)
                {
                    chose_task(third_flag,complete_sum3);
                    third_flag = true;
                }else{
                   int flag = chose_task(third_flag,complete_sum3);
                   if(flag == 1)
                   {
                    //将人物链表存入信息
                    //创建人物
                        bag.add_role(new qiaoba);
                        mvprintw(0,0,"成功营救乔巴");
                         refresh();//刷新主窗体
                   }
                }                               
                
            }else 
            {
              break;
            }
            

  

        }
        

    }

    int chose_task(bool flag,int complete_sum)//接任务 提交任务 离开菜单管理
    {
            vector<string> NPCMenu;
            NPCMenu.push_back("接任务");
            NPCMenu.push_back("提交任务");
            NPCMenu.push_back("离开");
            menu *cw =  new menu(win_x-20,win_y-11,20,10,NPCMenu); 
            while (1)
            {
                int ctrl = cw->get_ctrl();
                if(ctrl == 0)
                {
                    if(!flag )
                    {
                        clear();
                        mvprintw(11, 10, "接收任务成功!");   
                        refresh(); //刷新界面 
                        sleep(1); 
                        flag = true; 
                        delete cw; 
                        break;            
                    }else{
                        clear();
                        mvprintw(11, 10, "不允许重复接收任务!按上下键切回模式");   
                        refresh(); //刷新界面 
                        sleep(1);  
                                           
                    }
                                
                }else if(ctrl == 1)
                {
                    if(flag )
                    {
                        clear();
                        if(complete_sum>=2)
                        {
                            mvprintw(11, 10, "任务完成!解救伙伴成功!");   
                            refresh(); //刷新界面 
                            sleep(1); 
                            return 1;
                        }else{
                            mvprintw(11, 10, "当前完成的次数:%d",complete_sum);   
                            refresh(); //刷新界面 
                            sleep(1); 
                        }

                        flag = true; 
                        delete cw;  
                        break;            
                    }else{
                        clear();
                        mvprintw(11, 10, "还没接收任务!按上下键切回模式");   
                        refresh(); //刷新界面 
                        sleep(1);                     
                    }
                }else if(ctrl == 2)
                {
                    //返回
                    delete cw;
                    break;
                }
                
            }
            
        
    }

    bool get_first_flag(){return this->first_flag;}
    bool get_sec_flag(){return this->sec_flag;}
    bool get_third_flag(){return this->third_flag;}

    void add_sum1(){this->complete_sum1++;}
    void add_sum2(){this->complete_sum2++;}
    void add_sum3(){this->complete_sum3++;}
    //选择  
    int get_ctrl()
    {
         print_menu(local_win,highlight);
        int c;
         while(1)
	    {	
            //获取窗体的输入值
            c = wgetch(local_win);
            switch(c)
            {	case 'A':
                    if(highlight == -1)
                        highlight = n_choices;
                    else
                        --highlight;
                    break;
                case 'B':
                    if(highlight == n_choices+1)
                        highlight = 0;
                    else 
                        ++highlight;
                    break;
                default:
                    mvprintw(2, 0, "printed as %c",c); //输出到主窗体 
                    refresh();
            }

            //输出菜单 
            print_menu(local_win, highlight);
            if(c == 10)	/* User did a choice come out of the infinite loop */
            { 
                if(choices.size()!=0)
                {
                    mvprintw(0, 0, "printed as %s",this->choices.at(highlight).c_str());
    
                    refresh(); //刷新界面
                }


                return highlight;
	        }	
        }

    }

    //输出菜单 
    void print_menu(WINDOW *menu_win, int highlight)
{
	int x, y, i;	

	x = 2;
	y = 2;

    wattron(local_win,COLOR_PAIR(2));
	//box(menu_win, 0, 0);
    wborder(local_win, ' ', ' ', ' ',' ',' ',' ',' ',' '); //绘制边框
    wattroff(local_win,COLOR_PAIR(2));


	for(i = 0; i < n_choices; ++i)
	{	if(highlight == i ) /* High light the present choice */
		{	wattron(menu_win, COLOR_PAIR(1));  //设置当前窗体的颜色
			mvwprintw(menu_win, y, x, "%s", this->choices.at(highlight).c_str());
			wattroff(menu_win, COLOR_PAIR(1));
		}
		else
			mvwprintw(menu_win, y, x, "%s", this->choices.at(i).c_str());
		++y;
	}
    if(highlight == 0)
    {

        mvprintw(10, 0, "娜美 小时候为了救回家乡被迫加入了阿龙一伙。从橘子镇开始和草帽一伙合作,\n在路飞打倒了阿龙后正式加入了草帽一伙。梦想是绘画出全世界的地图。\n想要营救娜美需要前往东海篇打败小丑巴基2次!");   
        refresh(); //刷新界面     
    }else if(highlight == 1)
    {
        mvprintw(10, 0, "索隆 路飞跟克比一起探索到达海军基地寻找罗罗诺亚索隆,想让罗罗诺亚.索隆一起做海贼。\n但到海军基地的时候,得知罗罗诺亚.索隆被卡蒙上校儿子囚绑起来,限制人身自由,\n为了救出索隆需要打败第二关的怪物2次!");   
        refresh(); //刷新界面     
    }else if(highlight == 2)
    {
        mvprintw(10, 0, "乔巴 路飞在打倒瓦尔波后,多次邀请乔巴加入成为伙伴。\n但乔巴的内心却一直交战着,反复认为自己是驯鹿所以没资格加入,\n为了救出索隆需要打败第三关的怪物2次!");   
        refresh(); //刷新界面     
    }

	wrefresh(menu_win);
}  


    ~NPC()
    {
        //清空窗体,指定窗体
        wclear(local_win); 

        //刷新窗体
        wrefresh(local_win);

        //销毁窗体
        delwin(local_win);
    }



private:
//窗口对象
WINDOW *local_win;
//地址
int x;
int y;
int highlight; //高亮区 
int    n_choices;//选项
vector<string> choices;
int complete_sum1;
int complete_sum2;
int complete_sum3;

bool first_flag ;
bool sec_flag;
bool third_flag;

};

7.设计界面类(控制整个程序)

初始界面

1.新建角色 :选择初始人物--->进入游戏界面 ​ 2.读取进度 :读取文件信息--->成功后进行游戏界面 ​ 3.退出游戏

   role *people;
    bag bag;
    save save;
    NPC NPC;
    init_interface();//初始化界面接口
    //主控界面
     menu  *cw = new menu(win_x/2-10,win_y/2-5,20,10,controlMenu); 
    // //开始选择 
    int  ctrl =  cw->get_ctrl(); 
    delete  cw; //销毁窗体 
    //********************新建角色
    if(ctrl == 0)
    {
        //人物选择
        menu  *rw = new menu(win_x/2-10,win_y/2-5,20,10,roleMenu); 
        // 开始选择 
        ctrl =  cw->get_ctrl(); 
        delete  cw; //销毁窗体     
        
        if(ctrl == 0)
        {
            people = new lufei ;
        }else if(ctrl == 1)
        {
            people = new aisi ;
        }
            bag.add_role(people);
     //********************读取文档
    }else if(ctrl == 1)
    {
        save.read_all_role(bag);
        save.read_potion(bag);
        save.read_equipment(bag);
            //主角色 读取文件的第一个英雄 
        people = bag.return_role_in(0);
            attron(COLOR_PAIR(4));  //添加颜色1 
        mvprintw(10, 10, "读取游戏存档中。。。。请稍后>>>>>>>>>>>>>>>>>>>>>>>>");   
         attron(COLOR_PAIR(4));  //添加颜色1 
        refresh(); //刷新界面   
        sleep(1);
        mvprintw(10, 10, "游戏存档读取成功!欢迎回到海贼王 *-*                 ");   
        refresh(); //刷新界面    
        sleep(1);  
        attron(COLOR_PAIR(5));  //添加颜色1   
        mvprintw(10, 10, "                                                     ");   
        refresh(); //刷新界面           
    }else if(ctrl == 2)
    {
        mvprintw(10, 10, "年轻人 欢迎下次再来战斗吧!>>>>>>>>>>>>>>>>>>>>>>>>");   
        refresh(); //刷新界面   
        sleep(1);
        system("killall -9 a.out");
        exit(0);
        
    }     
    //**************刷新界面功能显示 商店 装备背包 冒险地图 治疗 存档退出
    while (1)
    {
   
   

8.战斗类

首先选择出站的人物==》选择背包人物里边的角色===

战斗可以选择吃药 等功能

一个人败北 就选择新的人物

判断血量都少于0就都阵亡 需要回到治疗。

遇到怪物 开始战斗

选择技能攻击 1 2 3

打一次怪物回打一下

战斗胜利

打赢即可拿到对方的悬赏金额 然后提升自己的悬赏金额

第一关 增加随机金币10-50 增加经验25

第二关 增加随机金币50-100 增加经验50

第三关 增加随机金币500-1000 增加经验100

经验达到100即可升级 最高5级。

//战斗界面类 
class battle
{
public:
    battle()
    {
        //创建窗体
        local_win = newwin(win_y-6,win_x,5,0);
        box(local_win, 0 , 0);      /* 0, 0 是字符默认的行列起始位置*/
        
        int y,x; 
        getmaxyx(local_win,y,x);
        x_w = x; 
        y_h = y;
        mvprintw(0,0,"y=%d",y); //y=30 
        mvprintw(0,6,"x=%d",x);//x=135

        /* 绘制探索地图 */
        /* 背景 */
        wattron(local_win,COLOR_PAIR(0));

        for (int d_y = 0; d_y < LINES; d_y++) {
            mvwhline(local_win,d_y, 0,' ',x); //COLS线长
        }

        wattroff(local_win,COLOR_PAIR(1));

        //生成怪物  
       // mvwprintw(local_win,10,10,"D海贼名称"); //y=30 

        /*刷新窗口缓冲,显示box */
        wrefresh(local_win);  

    }

    //选择技能
    void chose_skill_attk(role &r1, role &r2,NPC N,int flag,int skill_flag)
    {
        int attk1 = 0;
        if(skill_flag == 1)//1技能
        {
            attk1 = r1.skill1(r2);
        }else if(skill_flag == 2)
        {
            attk1 = r1.skill2(r2);            
        }else if(skill_flag == 3)
        {
            attk1 = r1.skill3(r2);            
        }

        mvwprintw(local_win,9,0,"%s :发起 %s : %d",r1.get_name().c_str(),r1.get_skill(0).c_str(), attk1); //y=30
        r2.be_hurt(attk1);
        // wrefresh(local_win);  
        if(r2.get_CUR_HP() <= 0)
        {
            
            wrefresh(local_win); 
            if(flag == 1)
            {
            r1.add_Exp(20);
                r1.add_coin(30);
            if(N.get_first_flag())//判断任务是否接收
            {
                N.add_sum1();
            }
                mvwprintw(local_win,13,0,"战斗胜利 获得20点经验值 30金币!"); //y=30   

            }else if(flag ==2)
            {
                r1.add_Exp(40);
                r1.add_coin(300);
            if(N.get_sec_flag())
            {
                    N.add_sum2();
            }
                mvwprintw(local_win,13,0,"战斗胜利 获得40点经验值 300金币!"); //y=30   


            }else if(flag == 3)
            {
                r1.add_Exp(100);
                r1.add_coin(1000);
            if(N.get_third_flag())
            {
                    N.add_sum3();
            }
                mvwprintw(local_win,13,0,"战斗胜利 获得100点经验值 1000金币!"); //y=30   

            }

        } 

        int attk2 = 0;
        if(skill_flag == 1)//1技能
        {
            attk2 = r2.skill1(r1);
        }else if(skill_flag == 2)
        {
            attk2 = r2.skill2(r1);            
        }else if(skill_flag == 3)
        {
            attk2 = r2.skill3(r1);            
        }        
            mvwprintw(local_win,10,0,"%s :发起 %s : %d",r2.get_name().c_str(),r2.get_skill(0).c_str(), attk2);
            wrefresh(local_win); 
        r1.be_hurt(attk2);
        if(r1.get_CUR_HP()<=0)
        {
            mvwprintw(local_win,13,0,"战斗失败 请重新选择人物出战!"); //   
                wrefresh(local_win); 
        }
    }

    //设置战斗场景  flag用来判断任务一二三
    void battle_win(role &r1,role &r2,NPC &N,bag &bag,int flag)
    {
            //r1 是角色   r2是怪物
            int attk1 = 0,attk2 = 0;
            //输出各自信息:
            output_role_msg(r1,r2);
            //选择技能 //开启菜单  
            menu  *cw = new menu(win_x-21,win_y-11,20,10,skillMenu); 
            //开始选择 
            int  ctrl =  cw->get_ctrl(); 
            

            while (1)
            {
                int  ctrl =  cw->get_ctrl(); 
                if(ctrl == 0)//技能1 普通攻击
                {

                    attk1 = r1.skill1(r2);
                    mvwprintw(local_win,9,0,"%s :发起 %s : %d",r1.get_name().c_str(),r1.get_skill(0).c_str(), attk1); //y=30
                    r2.be_hurt(attk1);
                   // wrefresh(local_win);  
                    if(r2.get_CUR_HP() <= 0)
                    {
                     
                         if(flag == 1)
                         {
                            r1.add_Exp(20);
                             r1.add_coin(30);
                            if(N.get_first_flag())//判断任务是否接收
                            {
                                N.add_sum1();
                            }
                               mvwprintw(local_win,13,0,"战斗胜利 获得20点经验值 30金币!"); //y=30   
                                     wrefresh(local_win); 

                         }else if(flag ==2)
                         {
                            r1.add_Exp(40);
                             r1.add_coin(300);
                            if(N.get_sec_flag())
                            {
                                 N.add_sum2();
                            }
                             mvwprintw(local_win,13,0,"战斗胜利 获得40点经验值 300金币!"); //y=30   
                                    wrefresh(local_win); 

                         }else if(flag == 3)
                         {
                             r1.add_Exp(100);
                             r1.add_coin(1000);
                            if(N.get_third_flag())
                            {
                                 N.add_sum3();
                            }
                             mvwprintw(local_win,13,0,"战斗胜利 获得100点经验值 1000金币!"); //y=30   
                                wrefresh(local_win); 
                         }
 
                         break;
                    } 
                    attk2 = r2.skill1(r1);
                     mvwprintw(local_win,10,0,"%s :发起 %s : %d",r2.get_name().c_str(),r2.get_skill(0).c_str(), attk2);
                     wrefresh(local_win); 
                    r1.be_hurt(attk2);
                    if(r1.get_CUR_HP()<=0)
                    {
                        mvwprintw(local_win,13,0,"战斗失败 请重新选择人物出战!"); //   
                         wrefresh(local_win); 
                          break;
                    }
                }

                if(ctrl == 1)//技能2 
                {
                    attk1 = r1.skill2(r2);
                    mvwprintw(local_win,9,0,"%s :发起 %s : %d",r1.get_name().c_str(),r1.get_skill(0).c_str(), attk1); //y=30
                    r2.be_hurt(attk1);
                   // wrefresh(local_win);  
                    if(r2.get_CUR_HP() <= 0)
                    {
                     
                         if(flag == 1)
                         {
                            r1.add_Exp(20);
                             r1.add_coin(30);
                            if(N.get_first_flag())//判断任务是否接收
                            {
                                N.add_sum1();
                            }
                               mvwprintw(local_win,13,0,"战斗胜利 获得20点经验值 30金币!"); //y=30   
                                     wrefresh(local_win); 

                         }else if(flag ==2)
                         {
                            r1.add_Exp(40);
                             r1.add_coin(300);
                            if(N.get_sec_flag())
                            {
                                 N.add_sum2();
                            }
                             mvwprintw(local_win,13,0,"战斗胜利 获得40点经验值 300金币!"); //y=30   
                                    wrefresh(local_win); 

                         }else if(flag == 3)
                         {
                             r1.add_Exp(100);
                             r1.add_coin(1000);
                            if(N.get_third_flag())
                            {
                                 N.add_sum3();
                            }
                             mvwprintw(local_win,13,0,"战斗胜利 获得100点经验值 1000金币!"); //y=30   
                                wrefresh(local_win); 
                         }
 
                         break;
                    } 
                    attk2 = r2.skill2(r1);
                     mvwprintw(local_win,10,0,"%s :发起 %s : %d",r2.get_name().c_str(),r2.get_skill(0).c_str(), attk2);
                     wrefresh(local_win); 
                    r1.be_hurt(attk2);
                    if(r1.get_CUR_HP()<=0)
                    {
                        mvwprintw(local_win,13,0,"战斗失败 请重新选择人物出战!"); //   
                         wrefresh(local_win); 
                          break;
                    }                   
                }

                if(ctrl == 2)//技能3 
                {
                    attk1 = r1.skill3(r2);
                    mvwprintw(local_win,9,0,"%s :发起 %s : %d",r1.get_name().c_str(),r1.get_skill(0).c_str(), attk1); //y=30
                    r2.be_hurt(attk1);
                   // wrefresh(local_win);  
                    if(r2.get_CUR_HP() <= 0)
                    {
                     
                         if(flag == 1)
                         {
                            r1.add_Exp(20);
                             r1.add_coin(30);
                            if(N.get_first_flag())//判断任务是否接收
                            {
                                N.add_sum1();
                            }
                               mvwprintw(local_win,13,0,"战斗胜利 获得20点经验值 30金币!"); //y=30   
                                     wrefresh(local_win); 

                         }else if(flag ==2)
                         {
                            r1.add_Exp(40);
                             r1.add_coin(300);
                            if(N.get_sec_flag())
                            {
                                 N.add_sum2();
                            }
                             mvwprintw(local_win,13,0,"战斗胜利 获得40点经验值 300金币!"); //y=30   
                                    wrefresh(local_win); 

                         }else if(flag == 3)
                         {
                             r1.add_Exp(100);
                             r1.add_coin(1000);
                            if(N.get_third_flag())
                            {
                                 N.add_sum3();
                            }
                             mvwprintw(local_win,13,0,"战斗胜利 获得100点经验值 1000金币!"); //y=30   
                                wrefresh(local_win); 
                         }
 
                         break;
                    } 
                    attk2 = r2.skill3(r1);
                     mvwprintw(local_win,10,0,"%s :发起 %s : %d",r2.get_name().c_str(),r2.get_skill(0).c_str(), attk2);
                     wrefresh(local_win); 
                    r1.be_hurt(attk2);
                    if(r1.get_CUR_HP()<=0)
                    {
                        mvwprintw(local_win,13,0,"战斗失败 请重新选择人物出战!"); //   
                         wrefresh(local_win); 
                          break;
                    }
                }
                if(ctrl == 3)//其他操作
                {
                potionMenu.clear();
                bag.show_potion();
                potionMenu.push_back("返回");
                    //其他操作 补血
                    menu  *cw = new menu(win_x-61,win_y-11,61,10,potionMenu); 
                    //开始选择 
                    int  ctrl =  cw->get_ctrl(); 
                    if(ctrl == 0)
                    {
                        bag.admin_menu(r1,10,1,1,"小型药水",1);
                    }else if(ctrl == 1)
                    {
                        bag.admin_menu(r1,30,1,1,"中型药水",1);
                    }else if(ctrl == 2)
                    {
                        bag.admin_menu(r1,60,1,1,"大型药水",1);
                    }else{
                        delete cw;
                        continue;
                    }
                   


                }
                if(ctrl == 4)
                {
                    break;
                }
                  
                  mvwprintw(local_win,9,0,"                                                     ");
                  mvwprintw(local_win,10,0,"                                                    ");
                sleep(1);
                 output_role_msg(r1,r2);
                                   
            }
            
            delete  cw; //销毁窗体


    }


    //输出人物信息
    void output_role_msg(role &r1,role &r2)
    {
        mvwprintw(local_win,3,0,"            "); //y=30 
        mvwprintw(local_win,3,50,"          "); //y=30 
        //输出各自信息:
        mvwprintw(local_win,1,0,"海贼名称:%s",r1.get_name().c_str()); //y=30 
        mvwprintw(local_win,2,0,"等级:%d",r1.get_grade()); //y=30 
        mvwprintw(local_win,3,0,"生命值:%d ",r1.get_CUR_HP()); //y=30 
        mvwprintw(local_win,4,0,"攻击力:%d",r1.get_attk()); //y=30 
        mvwprintw(local_win,5,0,"装备:%s",r1.get_equimnet().c_str()); //y=30 
        mvwprintw(local_win,6,0,"经验值:%d/100",r1.get_experience()); //y=30 
        mvwprintw(local_win,7,0,"悬赏金额:%d",r1.get_reward()); //y=30 

        mvwprintw(local_win,1,50,"海贼名称:%s",r2.get_name().c_str()); //y=30 
        mvwprintw(local_win,2,50,"等级:%d",r2.get_grade()); //y=30 
        mvwprintw(local_win,3,50,"生命值:%d",r2.get_CUR_HP()); //y=30 
        mvwprintw(local_win,4,50,"攻击力:%d",r2.get_attk()); //y=30 
        mvwprintw(local_win,5,50,"装备:%s",r2.get_equimnet().c_str()); //y=30  
        mvwprintw(local_win,6,50,"经验值:%d/100",r2.get_experience()); //y=30               
        mvwprintw(local_win,7,50,"悬赏金额:%d",r2.get_reward()); //y=30 
        wrefresh(local_win);          
    }



//析构函数
~battle()
{
    //清空窗体,指定窗体
    wclear(local_win); 


    //刷新窗体
    wrefresh(local_win);

    //销毁窗体
    delwin(local_win);
}

private:
WINDOW *local_win;
int x_w; 
int y_h;
//移动的位置
int m_x = 0; 
int m_y = 0;
};

9.设计一个存档类

读取背包 人物等级经验。 伙伴的信息

系统框架

实现过程

  1. 首先设计好角色抽象类,派生出人物和怪物的子类并重写抽象显示接口后边可以通过基类指针调用实现多态

  1. 设计一个背包类,管理装备基类和药水基类,派生出不同的药水和装备

  1. 设计剧情地图类,通过菜单选择不同的场景实现不通的怪物

  1. 设计商店类,通过购买商品 把商品加入背包类里边相应的list容器中

  1. 设计NPC类 通过菜单选择不同任务 ,通过设计标志来实现判断接收任务状态和实现任务的次数

  1. 主界面地图菜单等功能是利用curses终端库来设计

  1. 存档类利用fwrite和fread 写入和读取

心得体会

在做项目过程中进一步加深系统编程的知识内容的理解,认识到c++面向对象编程思想的在编写代码更加的简洁方便 复用性高,加深对c++的继承封装多态的理解。让自己代码编写更加规范,提高自己对做项目的整体框架思路

需要全的代码可以私信我 一起交流学习

猜你喜欢

转载自blog.csdn.net/aaa2540567665/article/details/127090109
今日推荐