C++小游戏2.0

还是和上次的一样,只不过新增了账号保存功能(关闭程序打开后仍能登录账号)

多支持支持孩子吧😭😭

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <string>
#include <windows.h>
#include <map>
#include <conio.h>
#include <fstream>
using namespace std;
// 用户名和密码存储的map
map<string, string> m;
string username, password;

// 保存账号信息到文件
void saveAccounts() {
    ofstream outFile("accounts.txt");
    if (outFile.is_open()) {
        for (map<string, string>::iterator it = m.begin(); it != m.end(); ++it) {
            outFile << it->first << " " << it->second << "\n";
        }
        outFile.close();
    }
}

// 从文件中读取账号信息
void loadAccounts() {
    ifstream inFile("accounts.txt");
    if (inFile.is_open()) {
        string user, pass;
        while (inFile >> user >> pass) {
            m[user] = pass;
        }
        inFile.close();
    }
}

// 清屏函数
void clearScreen() {
    system("cls");
}

// 装备类
class Equipment {
public:
    string name;  // 装备名称
    int attack;   // 攻击力
    int defense;  // 防御力

    // 构造函数
    Equipment(string n, int a, int d) : name(n), attack(a), defense(d) {}
};

// 玩家类
class Player {
public:
    int level;      // 等级
    int exp;        // 经验值
    int attack;     // 攻击力
    int defense;    // 防御力
    int health;     // 生命值
    Equipment* weapon;  // 武器
    Equipment* helmet;  // 头盔
    Equipment* armor;   // 战甲
    Equipment* boots;   // 靴子

    // 构造函数,初始化玩家属性
    Player() : level(1), exp(0), attack(10), defense(5), health(100), 
               weapon(NULL), helmet(NULL), armor(NULL), boots(NULL) {}

    // 装备物品
    void equip(Equipment* item) {
        // 装备新物品之前释放旧物品
        if (item->name == "武器" && weapon != NULL) delete weapon;
        else if (item->name == "头盔" && helmet != NULL) delete helmet;
        else if (item->name == "战甲" && armor != NULL) delete armor;
        else if (item->name == "靴子" && boots != NULL) delete boots;

        if (item->name == "武器") {
            weapon = item;
        } else if (item->name == "头盔") {
            helmet = item;
        } else if (item->name == "战甲") {
            armor = item;
        } else if (item->name == "靴子") {
            boots = item;
        }
        cout << "装备了 " << item->name << " (攻击: " << item->attack << ", 防御: " << item->defense << ")\n";
        updateStats();  // 更新玩家属性
    }

    // 更新玩家属性
    void updateStats() {
        attack = 10;
        defense = 5;
        health = 100 + (level - 1) * 10;

        if (weapon) attack += weapon->attack;
        if (helmet) defense += helmet->defense;
        if (armor) defense += armor->defense;
        if (boots) defense += boots->defense;
    }

    // 获得经验值并检查是否升级
    void gainExp(int amount) {
        exp += amount;
        cout << "获得了 " << amount << " 经验值.\n";
        if (exp >= level * 100) {
            exp -= level * 100;
            level++;
            cout << "升级了!当前等级: " << level << "\n";
            updateStats();  // 升级后更新属性
        }
    }

    // 显示玩家属性
    void displayStats() {
        cout << "-------------------- 玩家属性 --------------------\n";
        cout << "等级: " << level << " | 攻击: " << attack << " | 防御: " << defense << " | 生命值: " << health << "\n";
        cout << "-------------------------------------------------\n";
    }
};

// 怪物类
class Monster {
public:
    int level;   // 怪物等级
    int attack;  // 怪物攻击力
    int defense; // 怪物防御力
    int health;  // 怪物生命值
    bool isBoss; // 是否为头目

    // 根据玩家等级生成怪物属性
    Monster(int playerLevel, bool boss = false) : level(playerLevel), 
                                                  isBoss(boss),
                                                  attack(5 + playerLevel * 2), 
                                                  defense(3 + playerLevel), 
                                                  health(30 + playerLevel * 10) {
        if (boss) {
            attack += playerLevel * 2;  // 头目怪物更强
            defense += playerLevel; 
            health += playerLevel * 20;
        }
    }

    // 判断怪物是否存活
    bool isAlive() {
        return health > 0;
    }

    // 显示怪物属性
    void displayStats() {
        cout << "-------------------- " << (isBoss ? "头目" : "怪物") << "属性 --------------------\n";
        cout << "等级: " << level << " | 攻击: " << attack << " | 防御: " << defense << " | 生命值: " << health << "\n";
        cout << "-------------------------------------------------\n";
    }
};

// 玩家与怪物的战斗函数
void battle(Player& player, Monster& monster, int level) {
    cout << "当前关卡: " << level << "\n";  // 显示当前关卡
	Sleep(1000);
    while (monster.isAlive() && player.health > 0) {
        // 显示玩家和怪物的属性
        system("cls");  // 清屏,保持界面整洁
        player.displayStats();
        monster.displayStats();

        int damageToMonster = max(0, player.attack - monster.defense);
        int damageToPlayer = max(0, monster.attack - player.defense);

        monster.health -= damageToMonster;
        player.health -= damageToPlayer;

        cout << "你对怪物造成了 " << damageToMonster << " 点伤害.\n";
        cout << "怪物对你造成了 " << damageToPlayer << " 点伤害.\n";

        // 模拟战斗中的延迟
        Sleep(1000);

        if (!monster.isAlive()) {
            cout << "你击败了" << (monster.isBoss ? "头目!" : "怪物!") << "\n";
            player.gainExp(monster.level * 50);  // 击败怪物后获得经验
        } else if (player.health <= 0) {
            cout << "你被怪物击败了...\n";
        }
    }
}

// 生成掉落装备的函数
Equipment* generateLoot() {
    string names[] = { "武器", "头盔", "战甲", "靴子" };
    int attackValues[] = { 5, 0, 0, 2 };
    int defenseValues[] = { 0, 3, 5, 2 };

    int index = rand() % 4;
    Equipment* loot = new Equipment(names[index], attackValues[index], defenseValues[index]);
    return loot;
}
void yx(){
	system("cls");
	srand(time(0));

    Player player;
    int currentLevel = 1;

    cout << "欢迎来到游戏!这是你的初始属性:\n";
    player.displayStats();
    Sleep(3000); // 显示初始属性后暂停一会

    while (true) {
        // 清屏
        system("cls");
        cout << "\n--- 战斗开始 ---\n";
        cout << "\n一只怪物出现了!\n";
		Sleep(1000);
        bool isBoss = (currentLevel % 10 == 0);  // 每十关是头目战
        Monster monster(player.level, isBoss);
		
        battle(player, monster, currentLevel);  // 与怪物战斗

        if (player.health > 0) {
            if (rand() % 2 == 0) {
                Equipment* loot = generateLoot();
                cout << "怪物掉落了: " << loot->name << " (攻击: " << loot->attack << ", 防御: " << loot->defense << ")\n";
                player.equip(loot);  // 装备掉落物品
            }

            player.health = 100 + (player.level - 1) * 10; // 每次战斗后恢复生命值
            currentLevel++;  // 进入下一关

            // 等待用户按键
            cout << "按任意键继续...\n";
            system("pause>nul");
        } else {
            cout << "游戏结束!你达到了 " << player.level << " 级, 并通过了 " << currentLevel-1 << " 关.\n";
            break;
        }
    }

} 

// 进入游戏主界面
void zjm() {
    clearScreen();
    cout << "你好," << username << endl << endl << endl;
    cout << "       (1)          (2)" << endl;
    cout << "     进入游戏       退出" << endl;
    char p;
    cin >> p;
    if (p == '1') {
        yx(); // 开始游戏
    }
    return;
}

// 隐藏输入密码函数,支持退格删除
string inputPassword() {
    string password;
    char s;
    s = getch(); // 获取用户输入的字符
    while (s != '\r') { // 回车键结束输入
        if (s == '\b' && !password.empty()) { // 处理退格
            password = password.substr(0, password.size() - 1); // 删除最后一个字符
            cout << "\b \b"; // 在控制台删除最后一个字符显示
        } else if (s != '\b') {
            password += s;
            cout << "·"; // 输出星号代替实际字符
        }
        s = getch(); // 获取下一个字符
    }
    return password;
}

// 登录函数
void dl() {
    clearScreen();
    
    cout << "                   用户登录" << endl;
    cout << "           ----------------------------" << endl;
    cout << "           请输入用户名:";
    cin >> username;
    clearScreen();

    cout << "           请输入密码:";
    password = inputPassword();
    clearScreen();

    // 验证用户名和密码
    if (m.count(username) && m[username] == password) {
        cout << "           登录成功!" << endl;
        Sleep(1000); // 显示登录成功信息1秒
        zjm(); // 进入游戏主界面
    } else {
        cout << "           密码或用户名错误,请重试" << endl;
        cout << "           (1) 重试登录 (2) 返回主菜单" << endl;
        char choice;
        cin >> choice;
        if (choice == '1') {
            dl(); // 重新尝试登录
        }
    }
}

// 注册函数
void zc() {
    clearScreen();
    string username, password, confirmPassword;

    cout << "                   用户注册" << endl;
    cout << "           ----------------------------" << endl;
    cout << "           请输入用户名:";
    cin >> username;
    clearScreen();

    cout << "           请输入密码:";
    password = inputPassword();
    clearScreen();

    cout << "           请再次输入密码:";
    confirmPassword = inputPassword();
    clearScreen();

    // 检查两次输入的密码是否一致
    if (password == confirmPassword) {
        m[username] = password; // 将新用户的信息存储到map中
        saveAccounts(); // 保存账号信息
        cout << "           注册成功!请登录" << endl;
        Sleep(1000); // 显示注册成功信息1秒
        dl(); // 进入登录流程
    } else {
        cout << "           密码不一致,请重试" << endl;
        cout << "           (1) 重试注册 (2) 返回主菜单" << endl;
        char choice;
        cin >> choice;
        if (choice == '1') {
            zc(); // 重新尝试注册
        }
    }
}

// 主函数
int main() {
    loadAccounts(); // 加载已有账号信息

    clearScreen();
    cout << "        欢迎来到我的小游戏" << endl;
    cout << "       (1) 登录       (2) 注册       (3) 退出" << endl;
    char t;
    cin >> t;
    if (t == '1') {
        dl(); // 调用登录函数
    } else if (t == '2') {
        zc(); // 调用注册函数
        saveAccounts(); // 注册后保存账号信息
    } else if (t == '3') {
        return 0; // 退出程序
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值