请留下您的邮箱,我们将在2小时内将文件发到您的邮箱
//vs2022编译通过
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <iomanip>
#include<stdio.h>
#include<windows.h>
#include < vector>
#include <string>
using namespace std;
/**************************************/
//隐藏光标
void HideCursor()
{
CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}
//文字颜色
void SetColor(unsigned short Color = 7)
{
HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); //本例以输出为例
SetConsoleTextAttribute(hCon, Color);
}
// 设置光标位置
void gotoxy(int x, int y)
{
COORD c;
c.X = x;
c.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}
/******************函数声明*********************************************/
void 开始菜单();
/********************************************************************/
/*******************************武器*************************************************/
class ptwq //普通武器
{
public:
ptwq(string name, int gjl, int jiage) :名称(name), 攻击力(gjl), 价格(jiage) {}
string 名称;
int 攻击力;
int 价格;
};
/******************************盔甲********************************************/
class kuijia
{
public:
kuijia(string name, int fyl, int jiage) :名称(name), 防御力(fyl), 价格(jiage) {}
string 名称;
int 防御力;
int 价格;
};
/******************************药品******************************************/
class yaopin
{
public:
yaopin(string name, int hfl, int jiage) :名称(name), 恢复力(hfl), 价格(jiage) {}
string 名称;
int 恢复力;
int 价格;
};
/*********************************声明***************************************************/
ptwq* wuqi[6];//武器
kuijia* kjia[5];
yaopin* ypin[3];
/**************************商品**********************************************************/
enum 商品 { 武器 = 1, 盔甲, 药品 };
class shangpin //商品
{
public:
shangpin(商品 leixing, int ID) :商品类型(leixing), 商品ID(ID) {}
int 商品类型;//武器 盔甲或 药品
int 商品ID;
};
/******************************怪物********************************/
enum guai { 小怪 = 1, 中怪, 大怪 };
class dongwu_Type //动物(怪物)类型
{
public:
dongwu_Type() {}
dongwu_Type(guai 怪物);
dongwu_Type(double 生命力, int gongjili, int fangyuli, int money, string name);
double 生命力 = 0;//定义主角初始生命力
int gongjili;//定义主角初始攻击力
int fangyuli;//定义主角初始防御力
int money;//定义主角初始金钱数量
string name;
public:
virtual void Showinfo(int n, int color);
public:
int 装备的武器 = 0;
int 装备的盔甲 = 0;
int 属性 = 0; //
vector <shangpin>背包; //背包/掉落物品
int 背包容量 = 10;
public:
bool 攻击(dongwu_Type* Enemy, int m);//攻击
};
dongwu_Type::dongwu_Type(double 生命力, int gongjili, int fangyuli, int money, string name)
{
this->生命力 = 生命力;
this->gongjili = gongjili;
this->fangyuli = fangyuli;
this->money = money;
this->name = name;
}
dongwu_Type::dongwu_Type(guai 怪物)
{
if (怪物 == 小怪)
{
this->生命力 = 100;
this->gongjili = 5;
this->fangyuli = 3;
this->money = 5;
this->name = "小怪";
}
else if (怪物 == 中怪)
{
this->生命力 = 1000;
this->gongjili = 100;
this->fangyuli = 100;
this->money = 100;
this->name = "中怪";
}
else if (怪物 == 大怪)
{
this->生命力 = 3600;
this->gongjili = 500;
this->fangyuli = 500;
this->money = 500;
this->name = "大怪";
}
else
{
throw ("怪物类型初始化错误");
}
}
bool dongwu_Type::攻击(dongwu_Type* Enemy, int m)//攻击
{
int tongji;
if (m == 1)gotoxy(0, 3); else gotoxy(0, 6);
::cout << this->name.c_str() << "对" << Enemy->name.c_str() << "发动了攻击" << endl;
tongji = this->gongjili wuqi[this->装备的武器]->攻击力 - Enemy->fangyuli - kjia[Enemy->装备的盔甲]->防御力;
if (tongji < 0)tongji = 0;
Enemy->生命力 = Enemy->生命力 - tongji;
::cout << this->name.c_str() << "打掉了 " << Enemy->name.c_str() << tongji << " 点生命!" << endl;
::cout << Enemy->name.c_str() << "还剩 " << Enemy->生命力 << " 点生命" << endl;
return (Enemy->生命力 > 0) ? true : false;
}
void dongwu_Type::Showinfo(int n = 60, int color = 11) //显示信息
{
SetColor(color);
gotoxy(n, 5); ::cout << "名字: " << this->name.c_str() << " " << endl;
gotoxy(n, 6); ::cout << "生命力:" << this->生命力 << " " << endl;
gotoxy(n, 7); ::cout << "攻击力:" << this->gongjili << " " << endl;
gotoxy(n, 8); ::cout << "防御力:" << this->fangyuli << " " << endl;
gotoxy(n, 9); ::cout << "钱:" << this->money << " " << endl;
SetColor(7);
}
/************************************玩家****************************/
class WanJia_Type :public dongwu_Type //玩家
{
public:
WanJia_Type() {};
WanJia_Type(double 生命力, int gongjili, int fangyuli, int money, string name) : dongwu_Type(生命力, gongjili, fangyuli, money, name)
{}
void wuqidian();//定义武器店函数
void yaodian();//定义药店函数
bool 战斗(dongwu_Type* Enemy);//战斗
void Showinfo(int n, int color);
public:
};
/***************************************玩家*******************************************/
void WanJia_Type::Showinfo(int n = 60, int color = 11) //显示信息
{
int tmp;
SetColor(color);
gotoxy(n, 5); ::cout << "名字: " << this->name << " " << endl;
gotoxy(n, 6); ::cout << "生命力:" << this->生命力 << " " << endl;
gotoxy(n, 7); ::cout << "攻击力:" << this->gongjili wuqi[this->装备的武器]->攻击力 << " " << endl;
gotoxy(n, 8); ::cout << "防御力:" << this->fangyuli kjia[this->装备的盔甲]->防御力 << " " << endl;
gotoxy(n, 9); ::cout << "钱:" << this->money << " " << endl;
gotoxy(n, 10); ::cout << "武器:" << wuqi[this->装备的武器]->名称 << " " << endl;
gotoxy(n, 11); ::cout << "盔甲:" << kjia[this->装备的盔甲]->名称 << " " << endl;
gotoxy(n, 12); ::cout << "背包:" << this->背包.size() << "/" << this->背包容量 << " " << endl;
SetColor(15);
for (int i = 0; i < this->背包.size(); i )
{
switch (this->背包[i].商品类型)
{
case 武器:
gotoxy(n, 13 i); ::cout << i << left << setw(12) << wuqi[this->背包[i].商品ID]->名称 << " 价格 " << wuqi[this->背包[i].商品ID]->价格 / 2 << endl;
break;
case 盔甲:
gotoxy(n, 13 i); ::cout << i << left << setw(12) << kjia[this->背包[i].商品ID]->名称 << " 价格 " << kjia[this->背包[i].商品ID]->价格 / 2 << endl;
break;
case 药品:
gotoxy(n, 13 i); ::cout << i << left << setw(12) << ypin[this->背包[i].商品ID]->名称 << " 价格 " << ypin[this->背包[i].商品ID]->价格 / 2 << endl;
break;
default:
break;
}
}
SetColor(7);
}
bool WanJia_Type::战斗(dongwu_Type* Enemy)//战斗
{
int xuanze = 0, huihe = 1;
::system("cls");
::cout << (this->name.c_str()) << "开始与" << Enemy->name.c_str() << "战斗!!!" << endl;
while (this->生命力 > 0 && Enemy->生命力 > 0 && xuanze != 2)
{
//::system("cls");
gotoxy(60, this->背包.size() 13); ::cout << " " << endl;
gotoxy(0, 9); ::cout << "现在是" << "第" << huihe << "回合!" << endl;
Showinfo(); Enemy->Showinfo(80, 12);
SetColor(14);
::cout << "请选择你的动作: \n" << "1、攻击 \n2、使用药品\n3、逃跑 \n";
SetColor(7);
gotoxy(0, 14); ::cout << " " << endl;
gotoxy(0, 14); cin >> xuanze;
switch ((xuanze))
{
case 1:if (this->攻击(Enemy, 1)) Enemy->攻击(this, 2); break;
case 2:
gotoxy(0, 10);
SetColor(14);
::cout << "请选择你要使用的药品: " << endl;
::cout << " " << endl;
::cout << " " << endl;
::cout << " " << endl;
SetColor(7);
gotoxy(0, 14); ::cout << " " << endl;
gotoxy(0, 14); cin >> xuanze;
if (this->背包.size() == 0 || this->背包.size() <= xuanze)
{
gotoxy(0, 11); ::cout << "你没有选择任何药品 " << endl;
Sleep(500);
break;
}
if (this->背包[xuanze].商品类型 == 药品)
{
this->生命力 = ypin[this->背包[xuanze].商品ID]->恢复力;
gotoxy(0, 11); ::cout << "你使用了" << ypin[this->背包[xuanze].商品ID]->名称 << "生命恢复:" << ypin[this->背包[xuanze].商品ID]->恢复力 << "点 " << endl;
this->背包.erase(this->背包.begin() xuanze);
Sleep(500);
}
else
{
gotoxy(0, 11); ::cout << "你使用的不是药品 " << endl;
Sleep(500);
}
break;
case 3:
::system("cls");
gotoxy(0, 9); ::cout << "你决定逃跑! " << endl;
::cout << "逃跑成功! " << endl; Showinfo();
gotoxy(0, 11);
system("pause"); 开始菜单(); Showinfo();
return false;
default: SetColor(15); gotoxy(0, 9); ::cout << "请不要乱选! " << endl; SetColor(7);
Sleep(500);
break;
}
(huihe) ;
}
if ((Enemy->生命力) <= 0)
{
Showinfo(); Enemy->Showinfo(80, 12);
Sleep(500);
::system("cls");
SetColor(13);
gotoxy(0, 9);
::cout << Enemy->name.c_str() << "被" << this->name.c_str() << "杀死了!" << this->name.c_str() << "真厉害!!!" << endl;
SetColor(7);
this->money = Enemy->money;
::cout << this->name.c_str() << "获得了金钱" << Enemy->money << "块" << "你的金钱增加了:";
SetColor(13); ::cout << (this->money - Enemy->money) << "->" << this->money << endl; SetColor(7);
Showinfo(); gotoxy(0, 11);
system("pause");
开始菜单(); Showinfo();
return true;
}
else
if (this->生命力 <= 0)
{
Showinfo();
Sleep(500);
::system("cls");
gotoxy(0, 9);
SetColor(13);
::cout << this->name.c_str() << "被" << Enemy->name.c_str() << "杀死了!" << Enemy->name.c_str() << "真厉害!!!" << endl;
::cout << "游戏结束" << endl; SetColor(7); Showinfo(); gotoxy(0, 11);
system("pause");
开始菜单(); Showinfo();
return false;
}
return false;
}
/********************************商店***************************************/
class shangdian //商店
{
public:
void load_shangpin();
void show();
int buy(shangpin& sp, WanJia_Type& player);
vector <shangpin>shpin;
};
/*****************************************************************************/
void load_weapon()
{
wuqi[0] = new ptwq("无", 0, 0);
wuqi[1] = new ptwq("小刀", 2, 10);
wuqi[2] = new ptwq("短剑", 20, 80);
wuqi[3] = new ptwq("大砍刀", 40, 140);
wuqi[4] = new ptwq("青龙掩月刀", 100, 300);
wuqi[5] = new ptwq("屠龙宝刀", 200, 1000);
}
void load_kuijia()
{
kjia[0] = new kuijia("无", 0, 0);
kjia[1] = new kuijia("布甲", 20, 100);
kjia[2] = new kuijia("铁甲", 100, 500);
kjia[3] = new kuijia("明光铠", 300, 1500);
kjia[4] = new kuijia("天蚕宝甲", 500, 3000);
}
void load_yaopin()
{
ypin[0] = new yaopin("无", 0, 0);
ypin[1] = new yaopin("草药", 200, 10);
ypin[2] = new yaopin("金疮药", 800, 50);
}
void shangdian::load_shangpin()//商店里面初始化商品
{
shangpin* shpin1; //这里的数据可以从数据文件中读取
for (int i = 1; i < 6; i )
{
shangpin tmp = shangpin(武器, i);
shpin1 = &tmp;
shpin.push_back(*shpin1);
}
for (int i = 1; i < 5; i )
{
shangpin tmp = shangpin(盔甲, i);
shpin1 = &tmp;
shpin.push_back(*shpin1);
}
for (int i = 1; i < 3; i )
{
shangpin tmp = shangpin(药品, i);
shpin1 = &tmp;
shpin.push_back(*shpin1);
}
}
void shangdian::show()
{
gotoxy(1, 3);
::cout << "欢迎来到小商店这里武器 盔甲 药品 应有尽有" << endl;
SetColor(15);
for (int i = 0; i < shpin.size(); i )
{
switch (shpin[i].商品类型)
{
case 武器:
::cout << left << setw(5) << i << ":" << left << setw(12) << wuqi[shpin[i].商品ID]->名称 << "攻击力: " << left << setw(8) << wuqi[shpin[i].商品ID]->攻击力 << left << setw(8) << " 价格 " << wuqi[shpin[i].商品ID]->价格 << endl;
break;
case 盔甲:
::cout << left << setw(5) << i << ":" << left << setw(12) << kjia[shpin[i].商品ID]->名称 << "防护力: " << left << setw(8) << kjia[shpin[i].商品ID]->防御力 << left << setw(8) << " 价格 " << kjia[shpin[i].商品ID]->价格 << endl;
break;
case 药品:
::cout << left << setw(5) << i << ":" << left << setw(12) << ypin[shpin[i].商品ID]->名称 << "药效: " << left << setw(8) << ypin[shpin[i].商品ID]->恢复力 << left << setw(8) << " 价格 " << ypin[shpin[i].商品ID]->价格 << endl;
break;
default:
break;
}
}
SetColor(7);
}
int shangdian::buy(shangpin& sp, WanJia_Type& player)
{
int t = 0;
if (player.背包.size() >= player.背包容量) return 2;
switch (sp.商品类型)
{
case 武器:
if (player.money >= wuqi[sp.商品ID]->价格)
{
player.money -= wuqi[sp.商品ID]->价格;
t = 1;
}
else
t = 0;
break;
case 盔甲:
if (player.money >= kjia[sp.商品ID]->价格)
{
player.money -= kjia[sp.商品ID]->价格;
t = 1;
}
else
t = 0;
break;
case 药品:
if (player.money >= ypin[sp.商品ID]->价格)
{
player.money -= ypin[sp.商品ID]->价格;
t = 1;
}
else
t = 0;
break;
default:
break;
}
if (t == 1) player.背包.push_back(sp);
return t;
}
/*******************商店**********************************/
void shangdian_proc(WanJia_Type& player)
{
shangdian sd;
sd.load_shangpin();//初始化商品
int xuanze = -1;
int siz = sd.shpin.size();
while (xuanze != 99)//输入7时结束函数
{
sd.show(); //显示商品
player.Showinfo();
gotoxy(0, siz 4); ::cout << "输入99" << "返回" << endl;
::cout << " ";
gotoxy(0, siz 5); cin >> xuanze;
if (xuanze == 99)break;
if (xuanze < siz)
{
gotoxy(0, siz 6);
switch (sd.buy(sd.shpin[xuanze], player))
{
case 0:
SetColor(10); ::cout << "钱不够 了 " << endl; SetColor(7);
break;
case 1:
SetColor(15); ::cout << "购买成功 " << endl; SetColor(7);
break;
case 2:
SetColor(10); ::cout << "背包满了 " << endl; SetColor(7);
break;
default:
break;
}
}
}
开始菜单();
player.Showinfo();
}
void show_sell_info(int siz)
{
gotoxy(30, siz 11);
SetColor(10); ::cout << "出售成功" << endl; SetColor(7);
Sleep(500);
}
void shangdian_chushou(WanJia_Type& player)//出售道具
{
int xuanze = -1;
int siz = player.背包.size();
while (siz > 0 && xuanze != 99)
{
system("cls");
siz = player.背包.size();
gotoxy(0, 3); ::cout << "选择你要出售的商品" << endl;
gotoxy(0, 4); ::cout << "输入 99" << "返回:" << endl;
player.Showinfo(0, 11);
gotoxy(0, siz 13); ::cout << " ";
gotoxy(0, siz 14); ::cout << " ";
gotoxy(0, siz 14); ::cin >> xuanze;
if (xuanze == 99)break;
if (xuanze < siz)
{
gotoxy(0, siz 6);
switch (player.背包[xuanze].商品类型)
{
case 武器:
player.money = wuqi[player.背包[xuanze].商品ID]->价格;
player.背包.erase(player.背包.begin() xuanze);
show_sell_info(xuanze);
break;
case 盔甲:
player.money = kjia[player.背包[xuanze].商品ID]->价格;
player.背包.erase(player.背包.begin() xuanze);
show_sell_info(xuanze);
break;
case 药品:
player.money = ypin[player.背包[xuanze].商品ID]->价格;
player.背包.erase(player.背包.begin() xuanze);
show_sell_info(xuanze);
break;
default:
break;
}
}
}
开始菜单(); player.Showinfo();
}
void zhuangpei_proc(WanJia_Type& player)//装备武器
{
system("cls");
int xuanze = -1;
int siz = player.背包.size(); int siz2 = siz;
while (xuanze != 99)
{
siz2 = player.背包.size();
gotoxy(0, 3); ::cout << "选择你要装备的商品" << endl;
gotoxy(0, 4); ::cout << "输入 99" << "返回:" << endl;
player.Showinfo(0, 11);
gotoxy(0, siz2 13); ::cout << " ";
gotoxy(0, siz 14); ::cout << " ";
gotoxy(0, siz 14); ::cin >> xuanze;
if (xuanze == 99)break;
if (xuanze < siz2)
{
int tmp;
//gotoxy(0, siz 6);
switch (player.背包[xuanze].商品类型)
{
case 武器:
tmp = player.装备的武器;
player.装备的武器 = player.背包[xuanze].商品ID;
if (tmp == 0)
player.背包.erase(player.背包.begin() xuanze);
else
{
player.背包[xuanze].商品ID = tmp; player.背包[xuanze].商品类型 = 武器;
}
gotoxy(0, siz 15);
SetColor(10); ::cout << "装备了" << wuqi[player.装备的武器]->名称 << "攻击力" << wuqi[tmp]->攻击力 << "-->" << wuqi[player.装备的武器]->攻击力 << " " << endl; SetColor(7);
break;
case 盔甲:
tmp = player.装备的盔甲;
player.装备的盔甲 = player.背包[xuanze].商品ID;
if (tmp == 0)
player.背包.erase(player.背包.begin() xuanze);
else
{
player.背包[xuanze].商品ID = tmp; player.背包[xuanze].商品类型 = 盔甲;
}
gotoxy(0, siz 15);
SetColor(10); ::cout << "装备了" << kjia[player.装备的盔甲]->名称 << "防御力" << kjia[tmp]->防御力 << "-->" << kjia[player.装备的盔甲]->防御力 << " " << endl; SetColor(7);
break;
case 药品:
Beep(2000, 100);
SetColor(10); ::cout << "不能装配药品! " << endl; SetColor(7);
break;
default:
break;
}
}
}
开始菜单(); player.Showinfo();
}
/******************************************************************************/
void 开始菜单()
{
load_weapon();//初始化武器
system("cls");
SetColor(7);
gotoxy(0, 0); ::cout << "欢迎你开始玩打怪物小游戏!\n";
gotoxy(0, 1); ::cout << "老镇\n";
gotoxy(0, 2); ::cout << "一个1000年的老镇。周围有一条河,有一片树林,很多房子和很多人。\n有一家商店" << endl;
SetColor(15);
gotoxy(0, 5); ::cout << "1.去商店(购买)" << endl;
gotoxy(0, 6); ::cout << "2.去商店(出售)" << endl;
gotoxy(0, 7); ::cout << "3. 装备道具" << endl;
gotoxy(0, 8); ::cout << "4.去打小怪物" << endl;
gotoxy(0, 9); ::cout << "5.去打中怪物" << endl;
gotoxy(0, 10); ::cout << "6.去打大怪物" << endl;
gotoxy(0, 11); ::cout << "7.退出游戏" << endl;
}
///
/***********************初始化*********************************/
void init()
{
//公用数据
::load_weapon();
::load_kuijia();
::load_yaopin();
}
int main()
{
init();
system("mode con cols=100 lines=42"); //控制窗口大小
/*
LPRECT _st_rcDesktop = &RECT{0,0,0,0};
HWND fwnd = GetConsoleWindow();
HWND _hDesktop =::GetDesktopWindow();
::GetWindowRect(_hDesktop, _st_rcDesktop);
int wx = (_st_rcDesktop->right - _st_rcDesktop->left) / 2;
int wy = (_st_rcDesktop->bottom - _st_rcDesktop->top) * 2 / 3;
MoveWindow(fwnd, wx-350, 200, wx, wy, 1);
*/
system("cls");
SetColor(7);
gotoxy(0, 0); ::cout << "欢迎你开始玩打怪物小游戏!\n";
gotoxy(0, 1); ::cout << "老镇\n";
gotoxy(0, 2); ::cout << "一个1000年的老镇。周围有一条河,有一片树林,很多房子和很多人。\n有一家商店" << endl;
string name;
::cout << "请输入你的名字:";
cin >> name;
WanJia_Type player(2000, 150, 200, 200, name);
gotoxy(0, 4);
开始菜单(); //显示开始菜单
player.Showinfo();
int xiaozhen;//定义选择项目
cin >> xiaozhen;
while (xiaozhen != 7)//输入5时退出游戏
{
dongwu_Type* 怪;
if (player.生命力 <= 0)//主角生命力小于等于0时游戏结束
{
gotoxy(0, 15); ::cout << "你死啦! Game Over." << endl;
break;//游戏结束
}
if (player.money > 50000)
{
gotoxy(0, 15); ::cout << "金钱超过50000 你赢了!!! 恭喜通关!" << endl; //胜利 游戏结束
break;
}
if (xiaozhen == 7)
{
gotoxy(0, 15); ::cout << "正在退出游戏……" << endl;
Sleep(500);
break;//游戏结束
}
else
switch (xiaozhen)
{
case 1: shangdian_proc(player); break;
case 2: shangdian_chushou(player); break;
case 3: zhuangpei_proc(player); break; //装备道具
case 4:
怪 = new dongwu_Type(小怪);
player.战斗(怪);
delete (怪);
break;
case 5:
怪 = new dongwu_Type(中怪);
player.战斗(怪);
delete (怪);
break;
case 6:
怪 = new dongwu_Type(大怪);
player.战斗(怪);
delete (怪);
break;
default: gotoxy(0, 15); ::cout << "请不要乱选!" << endl; break;
}
cin.ignore();//
::cout << endl;
::cin >> xiaozhen;
开始菜单();
}
system("pause");
return 0;
}