C++火影忍者1.1版本

添加可用角色:大筒木博人、千手柱间、佐助(六道-阴)

适当削弱了人机,给技能判定做了增强

代码如下:

cpp 复制代码
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <thread>
#include <chrono>
#include <cmath>

using namespace std;

void setColor(int color) { HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(hConsole, color); }
void gotoxy(int x, int y) { if (x < 0) x = 0; if (y < 0) y = 0; COORD coord; coord.X = (SHORT)x; coord.Y = (SHORT)y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); }
void hideCursor() { HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO info; info.dwSize = 100; info.bVisible = FALSE; SetConsoleCursorInfo(consoleHandle, &info); }
void clearScreen() { system("cls"); }

struct Skill { string name; int cooldown; int currentCD; int damageMin; int damageMax; string displayChar; int duration; };
struct Character { string name; int hp; int maxHp; int x, y; bool available; vector<Skill> skills; int characterType; };

const int MAP_WIDTH = 100; const int MAP_HEIGHT = 24; const int MAP_START_X = 2; const int MAP_START_Y = 3; const int CHARACTER_ROW = MAP_HEIGHT - 1;

Character player, enemy;
bool gameRunning = false, skillInProgress = false, enemySkillInProgress = false;
int playerCharacterType = 0, enemyCharacterType = 0;

chrono::steady_clock::time_point playerSkill1CDEnd, playerSkill2CDEnd, playerSkill3CDEnd;
chrono::steady_clock::time_point enemySkill1CDEnd, enemySkill2CDEnd, enemySkill3CDEnd;

int playerShinraTenseiStack = 0, playerShinraTenseiRadius = 1, playerShinraTenseiCurrentCD = 15;
chrono::steady_clock::time_point playerShinraTenseiStart; bool playerShinraTenseiActive = false;
int enemyShinraTenseiStack = 0, enemyShinraTenseiRadius = 1, enemyShinraTenseiCurrentCD = 15;
chrono::steady_clock::time_point enemyShinraTenseiStart; bool enemyShinraTenseiActive = false;

bool playerBanshoTeninActive = false, enemyBanshoTeninActive = false;
chrono::steady_clock::time_point playerBanshoTeninEnd, enemyBanshoTeninEnd;
int playerBlackRodLeftX = 0, playerBlackRodRightX = 0, enemyBlackRodLeftX = 0, enemyBlackRodRightX = 0;
chrono::steady_clock::time_point lastEnemyAction;

bool playerNarutoTailActive = false, enemyNarutoTailActive = false;
chrono::steady_clock::time_point playerNarutoTailEnd, enemyNarutoTailEnd;
int playerNarutoTailX[3] = { 0 }, enemyNarutoTailX[3] = { 0 };

bool playerPainRodActive = false, enemyPainRodActive = false;
int playerPainRodX = 0, enemyPainRodX = 0;
chrono::steady_clock::time_point playerPainRodEnd, enemyPainRodEnd;
bool playerRodHitting = false, enemyRodHitting = false;
chrono::steady_clock::time_point playerRodHitEnd, enemyRodHitEnd;

bool playerObitoKickActive = false, playerObitoWoodSpikeActive = false, playerObitoEnemyTrapped = false;
chrono::steady_clock::time_point playerObitoKickEnd, playerObitoWoodSpikeEnd, playerObitoEnemyTrappedEnd;
int playerObitoKickX = 0, playerObitoWoodSpikeX = 0;
bool playerObitoKamuiActive = false, playerObitoKamuiSpaceActive = false, playerObitoEnemyInSpace = false;
chrono::steady_clock::time_point playerObitoKamuiEnd, playerObitoKamuiSpaceEnd;
int playerObitoSavedX = 0;
bool playerObitoFireActive = false, playerObitoWoodStormActive = false, playerObitoUltimateActive = false;

bool enemyObitoKickActive = false, enemyObitoWoodSpikeActive = false, enemyObitoEnemyTrapped = false;
chrono::steady_clock::time_point enemyObitoKickEnd, enemyObitoWoodSpikeEnd, enemyObitoEnemyTrappedEnd;
int enemyObitoKickX = 0, enemyObitoWoodSpikeX = 0;
bool enemyObitoKamuiActive = false, enemyObitoKamuiSpaceActive = false, enemyObitoPlayerInSpace = false;
chrono::steady_clock::time_point enemyObitoKamuiEnd, enemyObitoKamuiSpaceEnd;
int enemyObitoSavedX = 0;
bool enemyObitoFireActive = false, enemyObitoWoodStormActive = false, enemyObitoUltimateActive = false;

bool playerBorutoSwordActive = false; chrono::steady_clock::time_point playerBorutoSwordEnd;
int playerBorutoSwordX = 0; bool playerBorutoSwordSlashing = false;
bool playerBorutoRasenganActive = false; chrono::steady_clock::time_point playerBorutoRasenganEnd; bool playerBorutoRasenganHit = false;
bool playerBorutoMarkActive = false; chrono::steady_clock::time_point playerBorutoMarkEnd; int playerBorutoMarkX = 0;
bool playerBorutoTeleported = false; int playerBorutoTeleportSavedX = 0; bool playerBorutoTeleportBack = false;
chrono::steady_clock::time_point playerBorutoTeleportTime;
bool playerBorutoKarmaActive = false; chrono::steady_clock::time_point playerBorutoKarmaEnd;
bool playerBorutoFlying = false; chrono::steady_clock::time_point playerBorutoFlyingEnd;
int playerBorutoEnhancedAttackCount = 0; chrono::steady_clock::time_point playerBorutoEnhancedAttackCD;
bool playerBorutoBigRasenganActive = false; chrono::steady_clock::time_point playerBorutoBigRasenganDotEnd; bool playerBorutoBigRasenganHit = false;
bool playerBorutoEnhancedAttackActive = false; chrono::steady_clock::time_point playerBorutoEnhancedAttackEnd; int playerBorutoEnhancedAttackX = 0;
bool playerBorutoBigRasenganBallActive = false;

bool enemyBorutoSwordActive = false; chrono::steady_clock::time_point enemyBorutoSwordEnd;
int enemyBorutoSwordX = 0; bool enemyBorutoSwordSlashing = false;
bool enemyBorutoRasenganActive = false; chrono::steady_clock::time_point enemyBorutoRasenganEnd; bool enemyBorutoRasenganHit = false;
bool enemyBorutoMarkActive = false; chrono::steady_clock::time_point enemyBorutoMarkEnd; int enemyBorutoMarkX = 0;
bool enemyBorutoTeleported = false; int enemyBorutoTeleportSavedX = 0; bool enemyBorutoTeleportBack = false;
chrono::steady_clock::time_point enemyBorutoTeleportTime;
bool enemyBorutoKarmaActive = false; chrono::steady_clock::time_point enemyBorutoKarmaEnd;
bool enemyBorutoFlying = false; chrono::steady_clock::time_point enemyBorutoFlyingEnd;
int enemyBorutoEnhancedAttackCount = 0; chrono::steady_clock::time_point enemyBorutoEnhancedAttackCD;

bool playerHashiramaStompActive = false; chrono::steady_clock::time_point playerHashiramaStompEnd; int playerHashiramaStompX = 0;
bool playerHashiramaWoodDragonActive = false; chrono::steady_clock::time_point playerHashiramaWoodDragonEnd; int playerHashiramaWoodDragonX = 0;
bool playerHashiramaWoodDragonHit = false; chrono::steady_clock::time_point playerHashiramaWoodDragonTrapEnd; bool playerHashiramaEnemyTrapped = false;
bool playerHashiramaMyojinmonActive = false; bool playerHashiramaMyojinmonUsed = false;
bool playerHashiramaWoodGolemActive = false; chrono::steady_clock::time_point playerHashiramaWoodGolemEnd;
int playerHashiramaWoodGolemAttackCount = 0; chrono::steady_clock::time_point playerHashiramaWoodGolemAttackCD;
bool playerHashiramaUltimateActive = false;

bool enemyHashiramaStompActive = false; chrono::steady_clock::time_point enemyHashiramaStompEnd; int enemyHashiramaStompX = 0;
bool enemyHashiramaWoodDragonActive = false; chrono::steady_clock::time_point enemyHashiramaWoodDragonEnd; int enemyHashiramaWoodDragonX = 0;
bool enemyHashiramaWoodDragonHit = false; chrono::steady_clock::time_point enemyHashiramaWoodDragonTrapEnd; bool enemyHashiramaEnemyTrapped = false;
bool enemyHashiramaMyojinmonActive = false; bool enemyHashiramaMyojinmonUsed = false;
bool enemyHashiramaWoodGolemActive = false; chrono::steady_clock::time_point enemyHashiramaWoodGolemEnd;
int enemyHashiramaWoodGolemAttackCount = 0; chrono::steady_clock::time_point enemyHashiramaWoodGolemAttackCD;
bool enemyHashiramaUltimateActive = false;

bool playerSasukeSlashActive = false; chrono::steady_clock::time_point playerSasukeSlashEnd; chrono::steady_clock::time_point playerSasukeSlashCD;
int playerSasukeSlashX = 0;
bool playerSasukeAmaterasuActive = false; chrono::steady_clock::time_point playerSasukeAmaterasuEnd; chrono::steady_clock::time_point playerSasukeAmaterasuTick;
bool playerSasukeAmaterasuHit = false;
bool playerSasukeSusanooActive = false; chrono::steady_clock::time_point playerSasukeSusanooEnd;
int playerSasukeSusanooSlashCount = 0; chrono::steady_clock::time_point playerSasukeSusanooSlashCD;
bool playerSasukeSusanooSlashActive = false; chrono::steady_clock::time_point playerSasukeSusanooSlashEnd;
bool playerSasukeUltimateActive = false; chrono::steady_clock::time_point playerSasukeSubSkillCD;

bool enemySasukeSlashActive = false; chrono::steady_clock::time_point enemySasukeSlashEnd; chrono::steady_clock::time_point enemySasukeSlashCD;
int enemySasukeSlashX = 0;
bool enemySasukeAmaterasuActive = false; chrono::steady_clock::time_point enemySasukeAmaterasuEnd; chrono::steady_clock::time_point enemySasukeAmaterasuTick;
bool enemySasukeAmaterasuHit = false;
bool enemySasukeSusanooActive = false; chrono::steady_clock::time_point enemySasukeSusanooEnd;
int enemySasukeSusanooSlashCount = 0; chrono::steady_clock::time_point enemySasukeSusanooSlashCD;
bool enemySasukeSusanooSlashActive = false; chrono::steady_clock::time_point enemySasukeSusanooSlashEnd;
bool enemySasukeUltimateActive = false; chrono::steady_clock::time_point enemySasukeSubSkillCD;

int enemyPhase = 0, enemyNormalAttackCount = 0; chrono::steady_clock::time_point enemyPhaseStart; bool enemyUltimateReady = false;
int enemyAIMood = 0, enemyConsecutiveSkills = 0, enemyStuckCounter = 0, enemyLastActionType = -1;
chrono::steady_clock::time_point enemyLastSkillTime; bool enemyJustMoved = false;

int getRemainingCD(chrono::steady_clock::time_point cdEnd) { auto now = chrono::steady_clock::now(); if (now >= cdEnd) return 0; return chrono::duration_cast<chrono::seconds>(cdEnd - now).count() + 1; }

vector<Character> getAllCharacters() {
    vector<Character> chars;
    Character c1 = { "漩涡鸣人(九尾查克拉)",300,300,0,0,true,{{"螺旋丸",8,0,8,15,"O",1},{"九尾抓取",15,0,20,25,"------",0},{"尾兽玉",0,0,35,35,"0",3}},0 };
    Character c10 = { "佩恩(天道)",300,300,0,0,true,{{"万象天引",12,0,10,13,"\\/",5},{"神罗天征",15,0,8,15,"()",3},{"超神罗天征",0,0,50,50,"{}",5}},1 };
    Character c13 = { "宇智波带土(忍界大战)",300,300,0,0,true,{{"木遁-扦插/火遁-火龙卷",20,0,12,16,"-",15},{"神威/神威-空间",10,0,0,0,"()",5},{"十尾入侵",0,0,50,50,"*",5}},2 };
    Character c70 = { "大筒木博人",300,300,0,0,true,{{"螺旋丸-涡彦/大筒木-飞行",18,0,8,12,"O",3},{"亚-飞雷神/超大玉-螺旋丸-涡彦",8,0,10,18,"----",5},{"楔",45,0,0,0,"*",60}},3 };
    Character c71 = { "千手柱间",300,300,0,0,true,{{"木龙扦插之术/明神门",15,0,15,20,"~",8},{"木人之术",18,0,22,35,"¥",5},{"千手观音",0,0,80,80,"\\",3}},4 };
    Character c72 = { "宇智波佐助(六道-阴)",300,300,0,0,true,{{"天照",10,0,5,5,"-",5},{"天手力",8,0,12,18,")",2},{"地爆天星-斩",0,0,20,35,"*",5}},5 };
    chars.push_back(c1); chars.push_back({ "佐助(鹰小队)",300,300,0,0,false,{},0 }); chars.push_back({ "旗木卡卡西(万花筒写轮眼)",300,300,0,0,false,{},0 });
    chars.push_back({ "波风水门(四代目火影)",300,300,0,0,false,{},0 }); chars.push_back({ "春野樱(百豪怪力)",300,300,0,0,false,{},0 });
    chars.push_back({ "自来也(仙人模式)",300,300,0,0,false,{},0 }); chars.push_back({ "纲手(百豪)",300,300,0,0,false,{},0 });
    chars.push_back({ "大蛇丸(八岐之术)",300,300,0,0,false,{},0 }); chars.push_back({ "漩涡长门(轮回之力)",300,300,0,0,false,{},0 });
    chars.push_back(c10); chars.push_back({ "佩恩(修罗道)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波斑(虎皮面具男)",300,300,0,0,false,{},0 });
    chars.push_back(c13); chars.push_back(c70); chars.push_back(c71); chars.push_back(c72);
    chars.push_back({ "佩恩(畜生道-男)",300,300,0,0,false,{},0 }); chars.push_back({ "佩恩(畜生道-女)",300,300,0,0,false,{},0 });
    chars.push_back({ "佩恩(人间道)",300,300,0,0,false,{},0 }); chars.push_back({ "佩恩(地狱道)",300,300,0,0,false,{},0 });
    chars.push_back({ "佩恩(饿鬼道)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波斑",300,300,0,0,false,{},0 });
    chars.push_back({ "千手柱间(已选)",300,300,0,0,false,{},0 }); chars.push_back({ "千手扉间",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波斑(秽土转生)",300,300,0,0,false,{},0 }); chars.push_back({ "千手柱间(秽土转生)",300,300,0,0,false,{},0 });
    chars.push_back({ "千手扉间(秽土转生)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波鼬(灭族之夜)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波鼬(晓)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波鼬(秽土转生)",300,300,0,0,false,{},0 });
    chars.push_back({ "面具男(灭族之夜)",300,300,0,0,false,{},0 }); chars.push_back({ "旗木卡卡西(须佐能乎)",300,300,0,0,false,{},0 });
    chars.push_back({ "黑绝",300,300,0,0,false,{},0 }); chars.push_back({ "绝(晓)",300,300,0,0,false,{},0 });
    chars.push_back({ "鬼鲛(晓)",300,300,0,0,false,{},0 }); chars.push_back({ "鬼鲛(鲛肌)",300,300,0,0,false,{},0 });
    chars.push_back({ "迪达拉(晓)",300,300,0,0,false,{},0 }); chars.push_back({ "迪达拉(秽土转生)",300,300,0,0,false,{},0 });
    chars.push_back({ "蝎(晓)",300,300,0,0,false,{},0 }); chars.push_back({ "蝎(秽土转生)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波止水(万花筒写轮眼)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波止水(须佐能乎)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波佐助(须佐能乎)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波佐助(六道-阴已选)",300,300,0,0,false,{},0 });
    chars.push_back({ "漩涡鸣人(六道-阳)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波泉奈",300,300,0,0,false,{},0 });
    chars.push_back({ "神农",300,300,0,0,false,{},0 }); chars.push_back({ "我爱罗(青年)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波带土(十尾人柱力)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波斑(十尾人柱力)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波斑(六道)",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波带土(双神威)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波带土(百战成灰)",300,300,0,0,false,{},0 }); chars.push_back({ "春野樱(忍战)",300,300,0,0,false,{},0 });
    chars.push_back({ "我爱罗(忍战)",300,300,0,0,false,{},0 }); chars.push_back({ "大筒木辉夜",300,300,0,0,false,{},0 });
    chars.push_back({ "角都(晓)",300,300,0,0,false,{},0 }); chars.push_back({ "角都(秽土转生)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波佐良娜",300,300,0,0,false,{},0 }); chars.push_back({ "漩涡博人",300,300,0,0,false,{},0 });
    chars.push_back({ "漩涡向日葵",300,300,0,0,false,{},0 }); chars.push_back({ "宇智波佐良娜(万花筒写轮眼)",300,300,0,0,false,{},0 });
    chars.push_back({ "川木(楔)",300,300,0,0,false,{},0 }); chars.push_back({ "漩涡博人(桃式)",300,300,0,0,false,{},0 });
    chars.push_back({ "漩涡向日葵(九尾查克拉)",300,300,0,0,false,{},0 });
    chars.push_back({ "漩涡川木(青年)",300,300,0,0,false,{},0 }); chars.push_back({ "漩涡鸣人(重粒子模式)",300,300,0,0,false,{},0 });
    chars.push_back({ "宇智波佐助(轮回眼)",300,300,0,0,false,{},0 }); chars.push_back({ "大筒木桃式",300,300,0,0,false,{},0 });
    chars.push_back({ "大筒木金式",300,300,0,0,false,{},0 }); chars.push_back({ "大筒木壹式",300,300,0,0,false,{},0 });
    return chars;
}

void drawStartScreen() { clearScreen(); hideCursor(); setColor(6); gotoxy(35, 10); cout << "========================="; gotoxy(35, 11); cout << "||                     ||"; gotoxy(35, 12); cout << "||      火影忍者       ||"; gotoxy(35, 13); cout << "||                     ||"; gotoxy(35, 14); cout << "========================="; setColor(7); gotoxy(35, 17); cout << "按 ENTER 进入游戏"; }
void drawLaunchScreen(int selectedIndex) { clearScreen(); hideCursor(); setColor(6); gotoxy(40, 5); cout << "火 影 忍 者"; setColor(7); vector<string> options = { "对决模式","剧情模式","打开官网","退出游戏" }; for (int i = 0;i < options.size();i++) { gotoxy(35, 10 + i * 3); if (i == selectedIndex) { setColor(10);cout << "> "; } else { cout << "  "; } setColor(7); cout << options[i]; } setColor(8); gotoxy(30, 25); cout << "W/S - 选择  |  ENTER - 确认"; }
void drawSelectScreen(int selectedIndex) { clearScreen(); hideCursor(); setColor(6); gotoxy(35, 2); cout << "=== 选择你的忍者 ==="; vector<Character> chars = getAllCharacters(); int row = 0, col = 0; for (int i = 0;i < chars.size();i++) { int x = 2 + col * 24; int y = 5 + row * 3; gotoxy(x, y); if (i == selectedIndex) { setColor(10);cout << "> "; } else { cout << "  "; } if (chars[i].available) { setColor(10); } else { setColor(12); } cout << chars[i].name; cout << "  "; col++; if (col >= 5) { col = 0;row++; } } }

void drawBattleMap() {
    clearScreen(); hideCursor(); gotoxy(2, 0); setColor(10); cout << player.name; gotoxy(2, 1); cout << "HP: ["; int hpBars = player.hp * 50 / player.maxHp; if (hpBars < 0)hpBars = 0; for (int i = 0;i < 50;i++) { if (i < hpBars) { setColor(10);cout << "#"; } else { setColor(8);cout << "-"; } } setColor(7); cout << "] " << player.hp << "/" << player.maxHp; gotoxy(MAP_WIDTH + MAP_START_X - 20, 0); setColor(12); cout << enemy.name; gotoxy(MAP_WIDTH + MAP_START_X - 20, 1); cout << "HP: ["; hpBars = enemy.hp * 50 / enemy.maxHp; if (hpBars < 0)hpBars = 0; for (int i = 0;i < 50;i++) { if (i < hpBars) { setColor(12);cout << "#"; } else { setColor(8);cout << "-"; } } setColor(7); cout << "] " << enemy.hp << "/" << enemy.maxHp; setColor(7); gotoxy(MAP_START_X, MAP_START_Y); for (int i = 0;i < MAP_WIDTH;i++)cout << "-"; gotoxy(MAP_START_X, MAP_START_Y + MAP_HEIGHT); for (int i = 0;i < MAP_WIDTH;i++)cout << "-"; for (int i = 0;i < MAP_HEIGHT;i++) { gotoxy(MAP_START_X, MAP_START_Y + i);cout << "|";gotoxy(MAP_START_X + MAP_WIDTH, MAP_START_Y + i);cout << "|"; } int charY = MAP_START_Y + CHARACTER_ROW; if (!playerObitoEnemyInSpace && !enemyObitoPlayerInSpace) { gotoxy(MAP_START_X + enemy.x, charY);setColor(12);cout << "&"; } int borutoY = charY; if (playerBorutoFlying) { auto now = chrono::steady_clock::now();if (now < playerBorutoFlyingEnd)borutoY = charY - 2;else playerBorutoFlying = false; } if (enemyBorutoFlying) { auto now = chrono::steady_clock::now();if (now < enemyBorutoFlyingEnd)charY = MAP_START_Y + CHARACTER_ROW - 2;else enemyBorutoFlying = false; } gotoxy(MAP_START_X + player.x, borutoY);setColor(10);cout << "@";
    if (playerNarutoTailActive) { auto now = chrono::steady_clock::now();if (now < playerNarutoTailEnd) { for (int i = 0;i < 3;i++) { if (playerNarutoTailX[i] > 0 && playerNarutoTailX[i] < MAP_WIDTH && playerNarutoTailX[i] != enemy.x) { gotoxy(MAP_START_X + playerNarutoTailX[i], charY);setColor(14);cout << "-"; } } } else { playerNarutoTailActive = false; } }
    if (enemyNarutoTailActive) { auto now = chrono::steady_clock::now();if (now < enemyNarutoTailEnd) { for (int i = 0;i < 3;i++) { if (enemyNarutoTailX[i] > 0 && enemyNarutoTailX[i] < MAP_WIDTH && enemyNarutoTailX[i] != player.x) { gotoxy(MAP_START_X + enemyNarutoTailX[i], charY);setColor(14);cout << "-"; } } } else { enemyNarutoTailActive = false; } }
    if (playerPainRodActive) { auto now = chrono::steady_clock::now();if (now < playerPainRodEnd) { if (playerPainRodX > 0 && playerPainRodX < MAP_WIDTH && playerPainRodX != enemy.x && playerPainRodX != player.x) { gotoxy(MAP_START_X + playerPainRodX, charY);setColor(8);cout << "\\"; } } else { playerPainRodActive = false;playerRodHitting = false; } }
    if (enemyPainRodActive) { auto now = chrono::steady_clock::now();if (now < enemyPainRodEnd) { if (enemyPainRodX > 0 && enemyPainRodX < MAP_WIDTH && enemyPainRodX != player.x && enemyPainRodX != enemy.x) { gotoxy(MAP_START_X + enemyPainRodX, charY);setColor(8);cout << "\\"; } } else { enemyPainRodActive = false;enemyRodHitting = false; } }
    if (playerBanshoTeninActive) { auto now = chrono::steady_clock::now();if (now < playerBanshoTeninEnd) { if (playerBlackRodLeftX > 0 && playerBlackRodLeftX != enemy.x && playerBlackRodLeftX != player.x) { gotoxy(MAP_START_X + playerBlackRodLeftX, charY);setColor(8);cout << "\\"; }if (playerBlackRodRightX < MAP_WIDTH && playerBlackRodRightX != enemy.x && playerBlackRodRightX != player.x) { gotoxy(MAP_START_X + playerBlackRodRightX, charY);cout << "/"; } } else { playerBanshoTeninActive = false; } }
    if (enemyBanshoTeninActive) { auto now = chrono::steady_clock::now();if (now < enemyBanshoTeninEnd) { if (enemyBlackRodLeftX > 0 && enemyBlackRodLeftX != player.x && enemyBlackRodLeftX != enemy.x) { gotoxy(MAP_START_X + enemyBlackRodLeftX, charY);setColor(8);cout << "\\"; }if (enemyBlackRodRightX < MAP_WIDTH && enemyBlackRodRightX != player.x && enemyBlackRodRightX != enemy.x) { gotoxy(MAP_START_X + enemyBlackRodRightX, charY);cout << "/"; } } else { enemyBanshoTeninActive = false; } }
    if (playerObitoKickActive) { auto now = chrono::steady_clock::now();if (now < playerObitoKickEnd) { if (playerObitoKickX > 0 && playerObitoKickX < MAP_WIDTH && playerObitoKickX != enemy.x) { gotoxy(MAP_START_X + playerObitoKickX, charY);setColor(8);cout << "-"; } } else { playerObitoKickActive = false; } }
    if (enemyObitoKickActive) { auto now = chrono::steady_clock::now();if (now < enemyObitoKickEnd) { if (enemyObitoKickX > 0 && enemyObitoKickX < MAP_WIDTH && enemyObitoKickX != player.x) { gotoxy(MAP_START_X + enemyObitoKickX, charY);setColor(8);cout << "-"; } } else { enemyObitoKickActive = false; } }
    if (playerObitoWoodSpikeActive) { auto now = chrono::steady_clock::now();if (now < playerObitoWoodSpikeEnd && playerObitoWoodSpikeX>0 && playerObitoWoodSpikeX < MAP_WIDTH) { if (playerObitoWoodSpikeX != enemy.x && playerObitoWoodSpikeX != player.x) { gotoxy(MAP_START_X + playerObitoWoodSpikeX, charY);setColor(2);cout << "-"; } }if (playerObitoEnemyTrapped && now < playerObitoEnemyTrappedEnd) { if (enemy.x - 1 > 0 && enemy.x - 1 != player.x) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(2);cout << ">"; }if (enemy.x + 1 < MAP_WIDTH && enemy.x + 1 != player.x) { gotoxy(MAP_START_X + enemy.x + 1, charY);setColor(2);cout << "<"; } } else if (now >= playerObitoEnemyTrappedEnd) { playerObitoEnemyTrapped = false;playerObitoWoodSpikeActive = false; } }
    if (enemyObitoWoodSpikeActive) { auto now = chrono::steady_clock::now();if (now < enemyObitoWoodSpikeEnd && enemyObitoWoodSpikeX>0 && enemyObitoWoodSpikeX < MAP_WIDTH) { if (enemyObitoWoodSpikeX != player.x && enemyObitoWoodSpikeX != enemy.x) { gotoxy(MAP_START_X + enemyObitoWoodSpikeX, charY);setColor(2);cout << "-"; } }if (enemyObitoEnemyTrapped && now < enemyObitoEnemyTrappedEnd) { if (player.x - 1 > 0 && player.x - 1 != enemy.x) { gotoxy(MAP_START_X + player.x - 1, charY);setColor(2);cout << ">"; }if (player.x + 1 < MAP_WIDTH && player.x + 1 != enemy.x) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(2);cout << "<"; } } }
    if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive) { auto now = chrono::steady_clock::now();if (now < playerObitoKamuiEnd) { if (player.x - 1 > 0) { gotoxy(MAP_START_X + player.x - 1, charY);setColor(4);cout << "("; }if (player.x + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(4);cout << ")"; } } else { playerObitoKamuiActive = false; } }
    if (enemyObitoKamuiActive && !enemyObitoKamuiSpaceActive) { auto now = chrono::steady_clock::now();if (now < enemyObitoKamuiEnd) { if (enemy.x - 1 > 0) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(4);cout << "("; }if (enemy.x + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + enemy.x + 1, charY);setColor(4);cout << ")"; } } else { enemyObitoKamuiActive = false; } }
    if (playerBorutoSwordActive && playerBorutoSwordSlashing) { if (playerBorutoSwordX > 0 && playerBorutoSwordX < MAP_WIDTH) { gotoxy(MAP_START_X + playerBorutoSwordX, charY);setColor(15);cout << "-";if (playerBorutoSwordX + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + playerBorutoSwordX + 1, charY);setColor(15);cout << "-"; } } }
    if (enemyBorutoSwordActive && enemyBorutoSwordSlashing) { if (enemyBorutoSwordX > 0 && enemyBorutoSwordX < MAP_WIDTH) { gotoxy(MAP_START_X + enemyBorutoSwordX, charY);setColor(15);cout << "-";if (enemyBorutoSwordX + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + enemyBorutoSwordX + 1, charY);setColor(15);cout << "-"; } } }
    if (playerBorutoRasenganActive) { auto now = chrono::steady_clock::now();if (now < playerBorutoRasenganEnd) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(11);cout << "O"; } else { playerBorutoRasenganActive = false; } }
    if (enemyBorutoRasenganActive) { auto now = chrono::steady_clock::now();if (now < enemyBorutoRasenganEnd) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(11);cout << "O"; } else { enemyBorutoRasenganActive = false; } }
    if (playerBorutoMarkActive) { auto now = chrono::steady_clock::now();if (now < playerBorutoMarkEnd) { if (playerBorutoMarkX > 0 && playerBorutoMarkX < MAP_WIDTH) { gotoxy(MAP_START_X + playerBorutoMarkX, charY - 1);setColor(9);cout << "*"; } } else { playerBorutoMarkActive = false; } }
    if (enemyBorutoMarkActive) { auto now = chrono::steady_clock::now();if (now < enemyBorutoMarkEnd) { if (enemyBorutoMarkX > 0 && enemyBorutoMarkX < MAP_WIDTH) { gotoxy(MAP_START_X + enemyBorutoMarkX, charY - 1);setColor(9);cout << "*"; } } else { enemyBorutoMarkActive = false; } }
    if (playerHashiramaStompActive) { auto now = chrono::steady_clock::now();if (now < playerHashiramaStompEnd) { if (playerHashiramaStompX > 0 && playerHashiramaStompX < MAP_WIDTH && playerHashiramaStompX != enemy.x) { gotoxy(MAP_START_X + playerHashiramaStompX, charY);setColor(8);cout << "L"; } } else { playerHashiramaStompActive = false; } }
    if (enemyHashiramaStompActive) { auto now = chrono::steady_clock::now();if (now < enemyHashiramaStompEnd) { if (enemyHashiramaStompX > 0 && enemyHashiramaStompX < MAP_WIDTH && enemyHashiramaStompX != player.x) { gotoxy(MAP_START_X + enemyHashiramaStompX, charY);setColor(8);cout << "L"; } } else { enemyHashiramaStompActive = false; } }
    if (playerHashiramaWoodDragonActive) { auto now = chrono::steady_clock::now();if (now < playerHashiramaWoodDragonEnd) { for (int i = 0;i < 10;i++) { int dx = player.x + 1 + i;if (dx < MAP_WIDTH && dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, charY);setColor(2);cout << "~"; } }if (player.x + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(2);cout << "€"; } }if (playerHashiramaEnemyTrapped && now < playerHashiramaWoodDragonTrapEnd) { if (enemy.x - 1 > 0 && enemy.x - 1 != player.x) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(2);cout << ">"; }if (enemy.x + 1 < MAP_WIDTH && enemy.x + 1 != player.x) { gotoxy(MAP_START_X + enemy.x + 1, charY);setColor(2);cout << "<"; } } }
    if (enemyHashiramaWoodDragonActive) { auto now = chrono::steady_clock::now();if (now < enemyHashiramaWoodDragonEnd) { for (int i = 0;i < 10;i++) { int dx = enemy.x - 1 - i;if (dx > 0 && dx != player.x && dx != enemy.x) { gotoxy(MAP_START_X + dx, charY);setColor(2);cout << "~"; } }if (enemy.x - 1 > 0) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(2);cout << "€"; } }if (enemyHashiramaEnemyTrapped && now < enemyHashiramaWoodDragonTrapEnd) { if (player.x - 1 > 0 && player.x - 1 != enemy.x) { gotoxy(MAP_START_X + player.x - 1, charY);setColor(2);cout << ">"; }if (player.x + 1 < MAP_WIDTH && player.x + 1 != enemy.x) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(2);cout << "<"; } } }
    if (playerHashiramaMyojinmonActive) { if (enemy.x - 2 > 0 && enemy.x - 2 != player.x) { gotoxy(MAP_START_X + enemy.x - 2, charY);setColor(12);cout << "|"; }if (enemy.x + 2 < MAP_WIDTH && enemy.x + 2 != player.x) { gotoxy(MAP_START_X + enemy.x + 2, charY);setColor(12);cout << "|"; } }
    if (enemyHashiramaMyojinmonActive) { if (player.x - 2 > 0 && player.x - 2 != enemy.x) { gotoxy(MAP_START_X + player.x - 2, charY);setColor(12);cout << "|"; }if (player.x + 2 < MAP_WIDTH && player.x + 2 != enemy.x) { gotoxy(MAP_START_X + player.x + 2, charY);setColor(12);cout << "|"; } }
    if (playerBorutoBigRasenganHit) { auto now = chrono::steady_clock::now();if (now < playerBorutoBigRasenganDotEnd) { int dotDamage = rand() % 4 + 2;enemy.hp -= dotDamage;if (enemy.hp < 0)enemy.hp = 0; } else { playerBorutoBigRasenganHit = false; } }
    if (playerBorutoKarmaActive) { auto now = chrono::steady_clock::now();if (now >= playerBorutoKarmaEnd) { playerBorutoKarmaActive = false;playerBorutoFlying = false;playerBorutoEnhancedAttackCount = 0;playerBorutoBigRasenganHit = false; } }
    if (enemyBorutoKarmaActive) { auto now = chrono::steady_clock::now();if (now >= enemyBorutoKarmaEnd) { enemyBorutoKarmaActive = false;enemyBorutoFlying = false;enemyBorutoEnhancedAttackCount = 0; } }
    if (playerHashiramaWoodGolemActive) { auto now = chrono::steady_clock::now();if (now < playerHashiramaWoodGolemEnd) { for (int row = 0;row < 3;row++) { for (int col = 0;col < 4;col++) { int gx = player.x - 1 + col;int gy = charY - 3 - row;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);setColor(6);cout << "¥"; } } } } else { playerHashiramaWoodGolemActive = false;playerHashiramaWoodGolemAttackCount = 0; } }
    if (enemyHashiramaWoodGolemActive) { auto now = chrono::steady_clock::now();if (now < enemyHashiramaWoodGolemEnd) { for (int row = 0;row < 3;row++) { for (int col = 0;col < 4;col++) { int gx = enemy.x - 1 + col;int gy = charY - 3 - row;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);setColor(6);cout << "¥"; } } } } else { enemyHashiramaWoodGolemActive = false;enemyHashiramaWoodGolemAttackCount = 0; } }
    if (playerSasukeSlashActive) { auto now = chrono::steady_clock::now();if (now < playerSasukeSlashEnd) { if (playerSasukeSlashX > 0 && playerSasukeSlashX < MAP_WIDTH && playerSasukeSlashX != enemy.x) { gotoxy(MAP_START_X + playerSasukeSlashX, charY);setColor(13);cout << ")"; } } else { playerSasukeSlashActive = false; } }
    if (enemySasukeSlashActive) { auto now = chrono::steady_clock::now();if (now < enemySasukeSlashEnd) { if (enemySasukeSlashX > 0 && enemySasukeSlashX < MAP_WIDTH && enemySasukeSlashX != player.x) { gotoxy(MAP_START_X + enemySasukeSlashX, charY);setColor(13);cout << ")"; } } else { enemySasukeSlashActive = false; } }
    if (playerSasukeAmaterasuActive) { auto now = chrono::steady_clock::now();if (now < playerSasukeAmaterasuEnd) { for (int i = 1;i <= 8;i++) { int ax = player.x + i;if (ax < MAP_WIDTH && ax < enemy.x && ax != player.x) { gotoxy(MAP_START_X + ax, charY);setColor(13);cout << "-"; } }if (enemy.x - 1 > 0) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(13);cout << "|"; }if (enemy.x + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + enemy.x + 1, charY);setColor(13);cout << "|"; }if (playerSasukeAmaterasuHit) { if (now >= playerSasukeAmaterasuTick) { enemy.hp -= 5;if (enemy.hp < 0)enemy.hp = 0;playerSasukeAmaterasuTick = now + chrono::milliseconds(500); } } } else { playerSasukeAmaterasuActive = false;playerSasukeAmaterasuHit = false; } }
    if (enemySasukeAmaterasuActive) { auto now = chrono::steady_clock::now();if (now < enemySasukeAmaterasuEnd) { for (int i = 1;i <= 8;i++) { int ax = enemy.x - i;if (ax > 0 && ax > player.x && ax != enemy.x) { gotoxy(MAP_START_X + ax, charY);setColor(13);cout << "-"; } }if (player.x - 1 > 0) { gotoxy(MAP_START_X + player.x - 1, charY);setColor(13);cout << "|"; }if (player.x + 1 < MAP_WIDTH) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(13);cout << "|"; }if (enemySasukeAmaterasuHit) { if (now >= enemySasukeAmaterasuTick) { player.hp -= 5;if (player.hp < 0)player.hp = 0;enemySasukeAmaterasuTick = now + chrono::milliseconds(500); } } } else { enemySasukeAmaterasuActive = false;enemySasukeAmaterasuHit = false; } }
    if (playerSasukeSusanooActive) { auto now = chrono::steady_clock::now();if (now < playerSasukeSusanooEnd) { for (int row = 0;row < 8;row++) { for (int col = 0;col < 4;col++) { int sx = player.x - 1 + col;int sy = charY - 2 - row;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);setColor(13);cout << "#"; } } } }if (playerSasukeSusanooSlashActive) { for (int row = 0;row < 8;row++) { int sx = player.x + 3;int sy = charY - 2 - row;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);setColor(13);cout << "}"; } } } }
    else { playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0;playerSasukeUltimateActive = false; }
    if (enemySasukeSusanooActive) { auto now = chrono::steady_clock::now();if (now < enemySasukeSusanooEnd) { for (int row = 0;row < 8;row++) { for (int col = 0;col < 4;col++) { int sx = enemy.x - 1 + col;int sy = charY - 2 - row;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);setColor(13);cout << "#"; } } } }if (enemySasukeSusanooSlashActive) { for (int row = 0;row < 8;row++) { int sx = enemy.x - 3;int sy = charY - 2 - row;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);setColor(13);cout << "}"; } } } }
    else { enemySasukeSusanooActive = false;enemySasukeSusanooSlashCount = 0;enemySasukeUltimateActive = false; }
    setColor(7); gotoxy(MAP_START_X, MAP_START_Y + MAP_HEIGHT + 2);
    if (playerCharacterType == 0) { int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-普攻 | J-螺旋丸";if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-九尾抓取";if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | O-尾兽玉(敌HP<=35)"; }
    else if (playerCharacterType == 1) { int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-普攻 | J-万象天引";if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-神罗天征";if (playerShinraTenseiActive) { setColor(11);cout << "(激活中)"; } else if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | O-超神罗天征(敌HP<=50)"; }
    else if (playerCharacterType == 2) { int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-普攻 | J-";if (playerObitoEnemyTrapped) { if (playerObitoFireActive) { cout << "火遁-火龙卷(已用)"; } else { cout << "火遁-火龙卷(可用)"; } } else { cout << "木遁-扦插"; }if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-";if (playerObitoKamuiSpaceActive) { cout << "神威空间";setColor(11);cout << "(空间中)"; } else if (playerObitoEnemyTrapped && !playerObitoWoodStormActive) { cout << "木遁-暴风乱舞(可用)"; } else if (playerObitoEnemyTrapped && playerObitoWoodStormActive) { cout << "暴风乱舞(已用)"; } else if (playerObitoKamuiActive) { cout << "神威-空间";setColor(11);cout << "(虚化中)"; } else { cout << "神威";if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; } }setColor(7);cout << " | O-十尾入侵(敌HP<=50)"; }
    else if (playerCharacterType == 3) { if (playerBorutoKarmaActive) { auto now = chrono::steady_clock::now();int remaining = chrono::duration_cast<chrono::seconds>(playerBorutoKarmaEnd - now).count();if (remaining < 0)remaining = 0;int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-";if (playerBorutoFlying) { cout << "强化螺旋丸(" << 3 - playerBorutoEnhancedAttackCount << ")"; } else { cout << "普攻"; }cout << " | J-大筒木飞行";if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-超大玉螺旋丸";if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | 楔:" << remaining << "s"; } else { int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-普攻 | J-螺旋丸涡彦";if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-亚飞雷神";if (playerBorutoTeleported && playerBorutoTeleportBack) { setColor(10);cout << "(可返回)"; } else if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);int ultimateCD = getRemainingCD(playerSkill3CDEnd);if (ultimateCD > 0) { cout << " | O-楔(CD:" << ultimateCD << "s)"; } else { cout << " | O-楔(可用)"; } } }
    else if (playerCharacterType == 4) { int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-普攻 | J-";if (playerHashiramaEnemyTrapped && !playerHashiramaMyojinmonUsed) { cout << "明神门(可用)"; } else { cout << "木龙扦插之术"; }if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-木人之术";if (playerHashiramaWoodGolemActive) { cout << "(激活中";if (playerHashiramaWoodGolemAttackCount < 2) { cout << ",可按K攻击"; }cout << ")"; } else if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);if (enemy.hp <= 80 && getRemainingCD(playerSkill3CDEnd) <= 0) { cout << " | O-千手观音(可用)"; } else { cout << " | O-千手观音(不可用)"; } }
    else if (playerCharacterType == 5) { int cd1 = getRemainingCD(playerSkill1CDEnd);int cd2 = getRemainingCD(playerSkill2CDEnd);cout << "技能: K-普攻 | J-天照";if (cd1 > 0) { setColor(8);cout << "(CD:" << cd1 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | I-天手力";if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | U-须佐能乎";if (playerSasukeSusanooActive) { cout << "(开启中,可关闭)"; } else { int subCD = getRemainingCD(playerSasukeSubSkillCD);if (subCD > 0) { setColor(8);cout << "(CD:" << subCD << "s)"; } else { setColor(10);cout << "(可用)"; } }setColor(7);if (playerSasukeSusanooActive && enemy.hp <= 65) { cout << " | O-地爆天星斩(可用)"; } else { cout << " | O-地爆天星斩(不可用)"; } }
    gotoxy(MAP_START_X, MAP_START_Y + MAP_HEIGHT + 3); cout << "移动: A-左移 D-右移";
}
int getShinraTenseiDamage(int stack) { int minDamage, maxDamage;switch (stack) { case 1:minDamage = 8;maxDamage = 12;break;case 2:minDamage = 9;maxDamage = 13;break;case 3:minDamage = 10;maxDamage = 14;break;case 4:minDamage = 11;maxDamage = 15;break;case 5:minDamage = 12;maxDamage = 15;break;default:minDamage = 8;maxDamage = 12;break; }return rand() % (maxDamage - minDamage + 1) + minDamage; }

                                                                                       void playerNarutoNormalAttack() { int distance = abs(player.x - enemy.x);int charY = MAP_START_Y + CHARACTER_ROW;if (player.x < enemy.x && distance >= 1 && distance <= 3) { int damage = rand() % 4 + 3;if (playerNarutoTailActive) { for (int i = 0;i < 3;i++) { if (playerNarutoTailX[i] > 0 && playerNarutoTailX[i] < MAP_WIDTH && playerNarutoTailX[i] != enemy.x) { gotoxy(MAP_START_X + playerNarutoTailX[i], charY);cout << " "; } } }playerNarutoTailActive = true;playerNarutoTailEnd = chrono::steady_clock::now() + chrono::milliseconds(1500);for (int i = 0;i < 3;i++) { playerNarutoTailX[i] = player.x + 1 + i;if (playerNarutoTailX[i] >= enemy.x) { playerNarutoTailX[i] = 0;break; } }enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "玩家普攻造成 " << damage << " 点伤害!     "; } else { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << (player.x >= enemy.x ? "无法向后攻击!                          " : "距离太远,无法攻击!                    "); } }
                                                                                       void playerNarutoSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill1CDEnd) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "螺旋丸冷却中...                        ";return; }skillInProgress = true;int charY = MAP_START_Y + CHARACTER_ROW;int targetX = enemy.x - 1;if (targetX < player.x + 1)targetX = player.x + 1;while (player.x < targetX) { player.x++;if (player.x >= enemy.x) { player.x = enemy.x - 1;break; }drawBattleMap();this_thread::sleep_for(chrono::milliseconds(50)); }int spiralX = player.x + 1;if (spiralX < enemy.x && spiralX != enemy.x && spiralX != player.x) { gotoxy(MAP_START_X + spiralX, charY);setColor(14);cout << "O"; }this_thread::sleep_for(chrono::seconds(1));if (spiralX < enemy.x && spiralX != enemy.x && spiralX != player.x) { gotoxy(MAP_START_X + spiralX, charY);cout << " "; }int damage = rand() % 8 + 8;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "螺旋丸造成 " << damage << " 点伤害!                ";playerSkill1CDEnd = now + chrono::seconds(8);skillInProgress = false; }
                                                                                       void playerNarutoSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill2CDEnd) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "九尾抓取冷却中...                      ";return; }skillInProgress = true;int charY = MAP_START_Y + CHARACTER_ROW;bool caught = false;int tailLength = 20;for (int i = 0;i < tailLength;i++) { int checkX = player.x + 1 + i;if (checkX >= MAP_WIDTH || checkX >= enemy.x)break;if (checkX != enemy.x && checkX != player.x) { gotoxy(MAP_START_X + checkX, charY);setColor(14);cout << "-"; }if (checkX == enemy.x - 1) { caught = true;break; } }if (caught && enemy.x - 1 != player.x && enemy.x - 1 != enemy.x) { gotoxy(MAP_START_X + (enemy.x - 1), charY);setColor(14);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(500));for (int i = 0;i < tailLength;i++) { int clearX = player.x + 1 + i;if (clearX >= MAP_WIDTH || clearX >= enemy.x)break;if (clearX != enemy.x && clearX != player.x) { gotoxy(MAP_START_X + clearX, charY);cout << " "; } }if (caught) { int damage = rand() % 6 + 20;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "九尾抓取造成 " << damage << " 点伤害!              ";playerSkill2CDEnd = now + chrono::seconds(15); } else { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "未抓取到敌人,CD减半                   ";playerSkill2CDEnd = now + chrono::seconds(7); }skillInProgress = false; }
                                                                                       void playerNarutoUltimate() { if (skillInProgress || enemySkillInProgress)return;if (enemy.hp > 35) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方HP需低于或等于35才能释放!          ";return; }skillInProgress = true;int charY = MAP_START_Y + CHARACTER_ROW;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "尾兽玉蓄力中...                        ";int startX = player.x + 1;int endX = enemy.x - 1;int distance = endX - startX;int steps = 30;for (int i = 0;i <= steps;i++) { int currentX = startX + (distance * i / steps);if (currentX >= enemy.x)currentX = enemy.x - 1;if (i > 0) { int prevX = startX + (distance * (i - 1) / steps);if (prevX >= enemy.x)prevX = enemy.x - 1;if (prevX != enemy.x && prevX != player.x) { gotoxy(MAP_START_X + prevX, charY);cout << " "; } }if (currentX != enemy.x && currentX != player.x) { gotoxy(MAP_START_X + currentX, charY);setColor(14);cout << "0"; }this_thread::sleep_for(chrono::milliseconds(100)); }if (endX != enemy.x && endX != player.x) { gotoxy(MAP_START_X + endX, charY);cout << " "; }enemy.hp -= 35;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "尾兽玉造成35点伤害!                    ";skillInProgress = false; }

                                                                                       void playerPainNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!                          ";return; }if (playerPainRodActive) { if (playerPainRodX > 0 && playerPainRodX < MAP_WIDTH && playerPainRodX != enemy.x && playerPainRodX != player.x) { gotoxy(MAP_START_X + playerPainRodX, charY);cout << " "; }playerPainRodActive = false;playerRodHitting = false; }int rodX = player.x + 3;if (rodX >= enemy.x)rodX = enemy.x - 1;if (rodX <= player.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "敌人太近,无法攻击!                    ";return; }if (rodX == enemy.x)rodX = enemy.x - 1;playerPainRodActive = true;playerPainRodX = rodX;playerPainRodEnd = chrono::steady_clock::now() + chrono::milliseconds(1500);int damage = rand() % 3 + 4;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;if (rodX == enemy.x - 1) { playerRodHitting = true;playerRodHitEnd = playerPainRodEnd;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "黑棒命中!钉住敌人1.5秒,造成 " << damage << " 点伤害!  "; } else { playerRodHitting = false;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "黑棒造成 " << damage << " 点伤害!              "; } }
                                                                                       void playerPainSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill1CDEnd) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "万象天引冷却中...                      ";return; }int targetX = player.x + 2;if (targetX >= MAP_WIDTH - 1)targetX = MAP_WIDTH - 2;enemySkillInProgress = true;while (enemy.x > targetX) { enemy.x--;if (enemy.x <= player.x) { enemy.x = player.x + 2;break; }drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }enemy.x = targetX;playerBlackRodLeftX = enemy.x - 1;playerBlackRodRightX = enemy.x + 1;playerBanshoTeninActive = true;playerBanshoTeninEnd = now + chrono::seconds(5);int damage = rand() % 4 + 10;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "万象天引造成 " << damage << " 点伤害! 敌人被控5秒  ";playerSkill1CDEnd = now + chrono::seconds(12);enemySkillInProgress = false; }
                                                                                       void finishPlayerShinraTensei() { int charY = MAP_START_Y + CHARACTER_ROW;for (int r = 1;r <= playerShinraTenseiRadius;r++) { int leftX = player.x - r;int rightX = player.x + r;if (leftX > 0 && leftX != enemy.x && leftX != player.x) { gotoxy(MAP_START_X + leftX, charY);cout << " "; }if (rightX < MAP_WIDTH && rightX != enemy.x && rightX != player.x) { gotoxy(MAP_START_X + rightX, charY);cout << " "; } }playerSkill2CDEnd = chrono::steady_clock::now() + chrono::seconds(playerShinraTenseiCurrentCD);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神罗天征结束,CD:" << playerShinraTenseiCurrentCD << "s           ";playerShinraTenseiActive = false;playerShinraTenseiStack = 0;playerShinraTenseiRadius = 1;skillInProgress = false; }
                                                                                       void playerPainSkill2() { if (enemySkillInProgress)return;if (skillInProgress && !playerShinraTenseiActive)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (!playerShinraTenseiActive) { if (now < playerSkill2CDEnd) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神罗天征冷却中...                      ";return; }playerShinraTenseiActive = true;playerShinraTenseiStack = 1;playerShinraTenseiRadius = 1;playerShinraTenseiStart = now;playerShinraTenseiCurrentCD = 15;skillInProgress = true;int damage = getShinraTenseiDamage(1);bool hitEnemy = false;int leftBound = player.x - playerShinraTenseiRadius;int rightBound = player.x + playerShinraTenseiRadius;if (enemy.x >= leftBound && enemy.x <= rightBound) { enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;hitEnemy = true; }for (int r = 1;r <= playerShinraTenseiRadius;r++) { int leftX = player.x - r;if (leftX > 0 && leftX != enemy.x && leftX != player.x) { gotoxy(MAP_START_X + leftX, charY);setColor(11);cout << "("; }int rightX = player.x + r;if (rightX < MAP_WIDTH && rightX != enemy.x && rightX != player.x) { gotoxy(MAP_START_X + rightX, charY);cout << ")"; } }gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << (hitEnemy ? "神罗天征第1层造成 " + to_string(damage) + " 点伤害!        " : "神罗天征激活! 再次按I叠加              ");this_thread::sleep_for(chrono::milliseconds(500)); } else { auto elapsed = chrono::duration_cast<chrono::seconds>(now - playerShinraTenseiStart).count();if (elapsed >= 3) { finishPlayerShinraTensei();return; }if (playerShinraTenseiStack < 5) { playerShinraTenseiStack++;playerShinraTenseiRadius++;playerShinraTenseiCurrentCD += 2;int damage = getShinraTenseiDamage(playerShinraTenseiStack);bool hitEnemy = false;int leftBound = player.x - playerShinraTenseiRadius;int rightBound = player.x + playerShinraTenseiRadius;if (enemy.x >= leftBound && enemy.x <= rightBound) { enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;hitEnemy = true; }for (int r = 1;r < playerShinraTenseiRadius;r++) { int leftX = player.x - r;int rightX = player.x + r;if (leftX > 0 && leftX != enemy.x && leftX != player.x) { gotoxy(MAP_START_X + leftX, charY);cout << " "; }if (rightX < MAP_WIDTH && rightX != enemy.x && rightX != player.x) { gotoxy(MAP_START_X + rightX, charY);cout << " "; } }for (int r = 1;r <= playerShinraTenseiRadius;r++) { int leftX = player.x - r;if (leftX > 0 && leftX != enemy.x && leftX != player.x) { gotoxy(MAP_START_X + leftX, charY);setColor(11);cout << "("; }int rightX = player.x + r;if (rightX < MAP_WIDTH && rightX != enemy.x && rightX != player.x) { gotoxy(MAP_START_X + rightX, charY);cout << ")"; } }gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << (hitEnemy ? "神罗天征第" + to_string(playerShinraTenseiStack) + "层造成 " + to_string(damage) + " 点伤害!   " : "神罗天征扩大到第" + to_string(playerShinraTenseiStack) + "层              "); }this_thread::sleep_for(chrono::milliseconds(500)); }auto checkNow = chrono::steady_clock::now();auto elapsed = chrono::duration_cast<chrono::seconds>(checkNow - playerShinraTenseiStart).count();if (elapsed >= 3 || playerShinraTenseiStack >= 5) { this_thread::sleep_for(chrono::milliseconds(500));finishPlayerShinraTensei(); } }
                                                                                       void playerPainUltimate() { if (skillInProgress || enemySkillInProgress)return;if (enemy.hp > 50) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方HP需低于50才能释放!                ";return; }skillInProgress = true;int charY = MAP_START_Y + CHARACTER_ROW;int targetX = MAP_WIDTH / 2;while (player.x != targetX) { if (player.x < targetX)player.x++;else if (player.x > targetX)player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }for (int second = 1;second <= 5;second++) { for (int r = 1;r <= second;r++) { int leftX = player.x - r;if (leftX > 1 && leftX != enemy.x && leftX != player.x) { gotoxy(MAP_START_X + leftX, charY);setColor(13);cout << "{"; }int rightX = player.x + r;if (rightX < MAP_WIDTH && rightX != enemy.x && rightX != player.x) { gotoxy(MAP_START_X + rightX, charY);cout << "}"; } }enemy.hp -= 10;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "超神罗天征第" << second << "秒扩大,造成10点伤害! ";this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }for (int r = 1;r <= 5;r++) { int leftX = player.x - r;int rightX = player.x + r;if (leftX > 1 && leftX != enemy.x && leftX != player.x) { gotoxy(MAP_START_X + leftX, charY);cout << " "; }if (rightX < MAP_WIDTH && rightX != enemy.x && rightX != player.x) { gotoxy(MAP_START_X + rightX, charY);cout << " "; } }playerSkill1CDEnd = chrono::steady_clock::now();gotoxy(2, MAP_START_Y + MAP_HEIGHT + 5);cout << "万象天引CD已重置!                      ";skillInProgress = false; }

                                                                                       void playerObitoNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!                          ";return; }int distance = abs(player.x - enemy.x);if (distance < 1 || distance>2) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "距离不合适,无法攻击!                  ";return; }int kickX = player.x + 1;if (kickX >= enemy.x)kickX = enemy.x - 1;if (kickX <= player.x)return;playerObitoKickActive = true;playerObitoKickX = kickX;playerObitoKickEnd = chrono::steady_clock::now() + chrono::milliseconds(1000);int damage = rand() % 3 + 6;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "踢腿造成 " << damage << " 点伤害!          "; }
                                                                                       void playerObitoSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (playerObitoEnemyTrapped && !playerObitoFireActive) { int savedX = player.x;int targetX = enemy.x - 3;if (targetX < 2)targetX = 2;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;skillInProgress = true;playerObitoFireActive = true;player.x = targetX;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));int fireX = player.x + 1;for (int i = 0;i < 8;i++) { int fx = fireX + i;if (fx < MAP_WIDTH && fx != enemy.x && fx != player.x) { gotoxy(MAP_START_X + fx, charY);setColor(6);cout << "~"; } }int damage = rand() % 5 + 14;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "火遁-火龙卷造成 " << damage << " 点伤害!      ";this_thread::sleep_for(chrono::seconds(2));for (int i = 0;i < 8;i++) { int fx = fireX + i;if (fx < MAP_WIDTH && fx != enemy.x && fx != player.x) { gotoxy(MAP_START_X + fx, charY);cout << " "; } }player.x = savedX;playerObitoFireActive = false;skillInProgress = false;return; }if (now < playerSkill1CDEnd) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木遁-扦插冷却中...                     ";return; }skillInProgress = true;playerObitoWoodSpikeX = player.x + 1;playerObitoWoodSpikeActive = true;playerObitoWoodSpikeEnd = now + chrono::milliseconds(500);bool hitEnemy = false;for (int i = 0;i < 30;i++) { int checkX = player.x + 1 + i;if (checkX >= MAP_WIDTH || checkX >= enemy.x)break;if (checkX != enemy.x && checkX != player.x) { gotoxy(MAP_START_X + checkX, charY);setColor(2);cout << "-"; }if (checkX == enemy.x - 1) { hitEnemy = true;break; }this_thread::sleep_for(chrono::milliseconds(20)); }if (hitEnemy) { playerObitoEnemyTrapped = true;playerObitoEnemyTrappedEnd = now + chrono::seconds(15);int damage = rand() % 5 + 12;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木遁-扦插命中!造成 " << damage << " 点伤害! 钉住15秒"; } else { playerObitoWoodSpikeActive = false;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木遁-扦插未命中!                       "; }for (int i = 0;i < 30;i++) { int clearX = player.x + 1 + i;if (clearX >= MAP_WIDTH || clearX >= enemy.x)break;if (clearX != enemy.x && clearX != player.x) { gotoxy(MAP_START_X + clearX, charY);cout << " "; } }playerSkill1CDEnd = now + chrono::seconds(hitEnemy ? 20 : 10);skillInProgress = false; }
                                                                                       void playerObitoSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive) { playerObitoKamuiActive = false;playerObitoKamuiSpaceActive = true;playerObitoSavedX = player.x;int targetX = enemy.x - 1;if (targetX < 1)targetX = 1;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;player.x = targetX;playerObitoEnemyInSpace = true;playerObitoKamuiSpaceEnd = now + chrono::seconds(3);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神威-空间!敌人被吸入3秒              ";drawBattleMap();this_thread::sleep_for(chrono::milliseconds(500));for (int sec = 0;sec < 3;sec++) { int damage = rand() % 3 + 8;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神威空间第" << sec + 1 << "秒造成 " << damage << " 点伤害! ";this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }playerObitoEnemyInSpace = false;playerObitoKamuiSpaceActive = false;enemy.x = player.x + 3;if (enemy.x >= MAP_WIDTH - 2)enemy.x = MAP_WIDTH - 3;if (enemy.x < 1)enemy.x = 1;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "敌人被吐出神威空间!                   ";playerSkill2CDEnd = now + chrono::seconds(10);this_thread::sleep_for(chrono::milliseconds(500));return; }if (playerObitoEnemyTrapped && !playerObitoWoodStormActive) { skillInProgress = true;playerObitoWoodStormActive = true;int savedX = player.x;int targetX = enemy.x - 5;if (targetX < 2)targetX = 2;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;player.x = targetX;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));for (int i = 0;i < 20;i++) { int branchX = player.x + 1 + i;if (branchX >= MAP_WIDTH || branchX >= enemy.x)break;if (branchX != enemy.x && branchX != player.x) { gotoxy(MAP_START_X + branchX, charY - 1);setColor(2);cout << "_";gotoxy(MAP_START_X + branchX, charY);setColor(2);cout << "-"; } }for (int sec = 0;sec < 6;sec++) { if (abs(player.x - enemy.x) <= 20) { enemy.hp -= 8;if (enemy.hp < 0)enemy.hp = 0; }gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "暴风乱舞第" << sec + 1 << "秒造成8点伤害!   ";this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }for (int i = 0;i < 20;i++) { int branchX = player.x + 1 + i;if (branchX >= MAP_WIDTH)break;if (branchX != enemy.x && branchX != player.x) { gotoxy(MAP_START_X + branchX, charY - 1);cout << " ";gotoxy(MAP_START_X + branchX, charY);cout << " "; } }player.x = savedX;playerObitoWoodStormActive = false;skillInProgress = false;return; }if (now < playerSkill2CDEnd) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神威冷却中...                          ";return; }playerObitoKamuiActive = true;playerObitoKamuiEnd = now + chrono::seconds(5);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神威激活!免疫伤害5秒,按I进入空间    "; }
                                                                                       void playerObitoUltimate() { if (skillInProgress || enemySkillInProgress)return;if (enemy.hp > 50) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方HP需低于等于50才能释放!            ";return; }skillInProgress = true;playerObitoUltimateActive = true;int charY = MAP_START_Y + CHARACTER_ROW;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "十尾入侵!                             ";int tenTailBaseY = charY - 5;for (int row = 0;row < 5;row++) { for (int col = 0;col < 10;col++) { int x = player.x - 5 + col;int y = tenTailBaseY - row;if (x > 0 && x < MAP_WIDTH && y>0) { gotoxy(MAP_START_X + x, MAP_START_Y + y);setColor(8);cout << "*"; } } }gotoxy(MAP_START_X + player.x, MAP_START_Y + tenTailBaseY - 5);setColor(10);cout << "@";this_thread::sleep_for(chrono::seconds(2));int ballX = player.x;for (int step = 0;step < 25;step++) { int ballY = tenTailBaseY - 5 + step;if (ballY >= charY)break;if (step > 0) { int prevY = tenTailBaseY - 5 + step - 1;if (prevY < charY && prevY>0) { gotoxy(MAP_START_X + ballX, MAP_START_Y + prevY);cout << " "; } }if (ballY > 0 && ballX != enemy.x) { gotoxy(MAP_START_X + ballX, MAP_START_Y + ballY);setColor(7);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(150)); }gotoxy(MAP_START_X + ballX, MAP_START_Y + charY - 1);cout << " ";for (int row = 0;row < 5;row++) { for (int col = 0;col < 10;col++) { int x = player.x - 5 + col;int y = tenTailBaseY - row;if (x > 0 && x < MAP_WIDTH && y>0) { gotoxy(MAP_START_X + x, MAP_START_Y + y);cout << " "; } } }gotoxy(MAP_START_X + player.x, MAP_START_Y + tenTailBaseY - 5);cout << " ";enemy.hp -= 50;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "十尾入侵造成50点伤害!                  ";playerObitoUltimateActive = false;skillInProgress = false; }

                                                                                       void playerBorutoNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!                          ";return; }int distance = abs(player.x - enemy.x);if (distance < 1 || distance>4) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "距离不合适,无法攻击!                  ";return; }if (enemyObitoKamuiActive && !enemyObitoKamuiSpaceActive) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方处于虚化状态,攻击无效!            ";return; }playerBorutoSwordActive = true;playerBorutoSwordSlashing = true;playerBorutoSwordEnd = chrono::steady_clock::now() + chrono::milliseconds(2000);playerBorutoSwordX = player.x + 1;int damage1 = rand() % 3 + 7;enemy.hp -= damage1;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "第一刀造成 " << damage1 << " 点伤害!     ";this_thread::sleep_for(chrono::milliseconds(400));if (playerRodHitting || playerBanshoTeninActive || playerObitoEnemyTrapped || playerHashiramaEnemyTrapped || playerSasukeAmaterasuHit) { playerBorutoSwordActive = false;playerBorutoSwordSlashing = false;return; }int damage2 = rand() % 4 + 7;enemy.hp -= damage2;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "第二刀造成 " << damage2 << " 点伤害!     ";this_thread::sleep_for(chrono::milliseconds(400));if (playerRodHitting || playerBanshoTeninActive || playerObitoEnemyTrapped || playerHashiramaEnemyTrapped || playerSasukeAmaterasuHit) { playerBorutoSwordActive = false;playerBorutoSwordSlashing = false;return; }int damage3 = rand() % 5 + 8;enemy.hp -= damage3;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "第三刀造成 " << damage3 << " 点伤害!     ";playerBorutoSwordActive = false;playerBorutoSwordSlashing = false; }
                                                                                       void playerBorutoEnhancedAttack() { if (!playerBorutoFlying)return;if (playerBorutoEnhancedAttackCount >= 3)return;auto now = chrono::steady_clock::now();if (now < playerBorutoEnhancedAttackCD)return;playerBorutoEnhancedAttackActive = true;playerBorutoEnhancedAttackCount++;playerBorutoEnhancedAttackCD = now + chrono::milliseconds(2500);int charY = MAP_START_Y + CHARACTER_ROW;int startX = player.x + 1;int endX = enemy.x;int steps = 25;int lastX = 0;for (int i = 0;i <= steps;i++) { int currentX = startX + ((endX - startX) * i / steps);if (currentX >= enemy.x)break;if (i > 0) { int prevX = startX + ((endX - startX) * (i - 1) / steps);if (prevX != enemy.x && prevX != player.x) { gotoxy(MAP_START_X + prevX, charY);cout << " "; } }if (currentX != enemy.x && currentX != player.x) { gotoxy(MAP_START_X + currentX, charY);setColor(11);cout << "O"; }lastX = currentX;this_thread::sleep_for(chrono::milliseconds(100)); }int damage = rand() % 7 + 8;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "强化螺旋丸造成 " << damage << " 点伤害!    ";playerBorutoEnhancedAttackActive = false;if (lastX != enemy.x && lastX != player.x) { gotoxy(MAP_START_X + lastX, charY);cout << " "; } }
                                                                                       void playerBorutoSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (playerBorutoKarmaActive) { if (playerBorutoFlying)return;if (now < playerSkill1CDEnd)return;playerBorutoFlying = true;playerBorutoFlyingEnd = now + chrono::seconds(10);playerBorutoEnhancedAttackCount = 0;playerSkill1CDEnd = now + chrono::seconds(6);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "大筒木-飞行!向上移动2格              ";return; }if (now < playerSkill1CDEnd)return;skillInProgress = true;int targetX = enemy.x - 3;if (targetX < 2)targetX = 2;while (player.x > targetX) { player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }while (player.x < targetX) { player.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }playerBorutoRasenganActive = true;playerBorutoRasenganEnd = now + chrono::seconds(3);playerBorutoRasenganHit = true;for (int sec = 0;sec < 3;sec++) { int damage = rand() % 5 + 8;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "螺旋丸涡彦第" << sec + 1 << "秒造成 " << damage << " 点伤害! ";this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }playerBorutoRasenganActive = false;targetX = enemy.x - 8;if (targetX < 1)targetX = 1;player.x = targetX;playerBorutoMarkActive = true;playerBorutoMarkX = enemy.x;playerBorutoMarkEnd = now + chrono::seconds(10);playerBorutoTeleported = false;playerBorutoTeleportBack = false;playerSkill1CDEnd = now + chrono::seconds(18);skillInProgress = false; }
                                                                                       void playerBorutoSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (playerBorutoKarmaActive) { if (playerBorutoFlying)return;if (now < playerSkill2CDEnd)return;skillInProgress = true;playerBorutoBigRasenganBallActive = true;int ballX = player.x + 1;for (int step = 0;step < 20;step++) { int currentX = ballX + step;if (currentX >= enemy.x)break;if (step > 0) { gotoxy(MAP_START_X + currentX - 1, charY);cout << " "; }if (currentX != enemy.x && currentX != player.x) { gotoxy(MAP_START_X + currentX, charY);setColor(11);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(50)); }int damage = rand() % 6 + 15;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;playerBorutoBigRasenganHit = true;playerBorutoBigRasenganDotEnd = now + chrono::seconds(5);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "超大玉螺旋丸造成 " << damage << " 点伤害!    ";gotoxy(MAP_START_X + enemy.x - 1, charY);cout << " ";playerBorutoBigRasenganBallActive = false;playerSkill2CDEnd = now + chrono::seconds(15);skillInProgress = false;return; }if (playerBorutoMarkActive && !playerBorutoTeleported) { playerBorutoTeleportSavedX = player.x;player.x = enemy.x - 3;if (player.x < 1)player.x = 1;playerBorutoTeleported = true;playerBorutoTeleportTime = now;int damage = rand() % 9 + 10;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "飞雷神·草薙剑造成 " << damage << " 点伤害!    ";playerBorutoTeleportBack = true;return; }if (playerBorutoTeleported && playerBorutoTeleportBack) { auto timeSinceTeleport = chrono::duration_cast<chrono::seconds>(now - playerBorutoTeleportTime).count();if (timeSinceTeleport <= 5) { player.x = playerBorutoTeleportSavedX;playerBorutoTeleported = false;playerBorutoTeleportBack = false;playerSkill2CDEnd = now + chrono::seconds(8);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "飞雷神返回!                            ";return; } else { playerBorutoTeleportBack = false; } }if (now < playerSkill2CDEnd)return; }
                                                                                       void playerBorutoUltimate() { if (skillInProgress || enemySkillInProgress)return;if (playerBorutoKarmaActive)return;auto now = chrono::steady_clock::now();if (now < playerSkill3CDEnd)return;skillInProgress = true;playerBorutoKarmaActive = true;playerBorutoKarmaEnd = now + chrono::seconds(60);playerSkill3CDEnd = now + chrono::seconds(45);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "楔激活!持续60秒,技能强化中...        ";skillInProgress = false; }

                                                                                       void playerHashiramaNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!                          ";return; }int distance = abs(player.x - enemy.x);if (distance < 1 || distance>5) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "距离不合适,无法攻击!                  ";return; }playerHashiramaStompActive = true;playerHashiramaStompX = player.x + 1;playerHashiramaStompEnd = chrono::steady_clock::now() + chrono::milliseconds(800);int damage = rand() % 3 + 8;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "跺脚造成 " << damage << " 点伤害!          "; }
                                                                                       void playerHashiramaWoodGolemAttack() { if (!playerHashiramaWoodGolemActive)return;if (playerHashiramaWoodGolemAttackCount >= 2)return;auto now = chrono::steady_clock::now();if (now < playerHashiramaWoodGolemAttackCD)return;playerHashiramaWoodGolemAttackCount++;playerHashiramaWoodGolemAttackCD = now + chrono::milliseconds(2000);int charY = MAP_START_Y + CHARACTER_ROW;int startX = player.x + 1;for (int i = 0;i < 15;i++) { int dx = startX + i;if (dx >= MAP_WIDTH || dx >= enemy.x)break;if (dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, charY);setColor(2);cout << "~"; }this_thread::sleep_for(chrono::milliseconds(30)); }int damage = rand() % 14 + 22;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "化龙造成 " << damage << " 点伤害!           ";for (int i = 0;i < 15;i++) { int dx = startX + i;if (dx >= MAP_WIDTH || dx >= enemy.x)break;if (dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, charY);cout << " "; } } }
                                                                                       void playerHashiramaSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (playerHashiramaEnemyTrapped && !playerHashiramaMyojinmonUsed) { skillInProgress = true;playerHashiramaMyojinmonActive = true;playerHashiramaMyojinmonUsed = true;int damage = rand() % 16 + 20;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "明神门造成 " << damage << " 点伤害!           ";this_thread::sleep_for(chrono::seconds(2));playerHashiramaMyojinmonActive = false;playerHashiramaEnemyTrapped = false;playerHashiramaWoodDragonActive = false;skillInProgress = false;return; }if (now < playerSkill1CDEnd)return;skillInProgress = true;playerHashiramaWoodDragonActive = true;playerHashiramaWoodDragonEnd = now + chrono::milliseconds(1000);int startX = player.x + 1;bool hit = false;for (int i = 0;i < 20;i++) { int dx = startX + i;if (dx >= MAP_WIDTH || dx >= enemy.x)break;if (dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, charY);setColor(2);cout << "~"; }if (dx == enemy.x - 1) { hit = true;break; }this_thread::sleep_for(chrono::milliseconds(30)); }if (hit) { playerHashiramaEnemyTrapped = true;playerHashiramaWoodDragonTrapEnd = now + chrono::seconds(8);playerHashiramaMyojinmonUsed = false;int damage = rand() % 6 + 15;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木龙扦插命中!造成 " << damage << " 点伤害! 钉住8秒"; } else { playerHashiramaWoodDragonActive = false;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木龙未命中!                            "; }playerSkill1CDEnd = now + chrono::seconds(15);skillInProgress = false; }
                                                                                       void playerHashiramaSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill2CDEnd)return;if (playerHashiramaWoodGolemActive)return;skillInProgress = true;playerHashiramaWoodGolemActive = true;playerHashiramaWoodGolemEnd = now + chrono::seconds(5);playerHashiramaWoodGolemAttackCount = 0;playerHashiramaWoodGolemAttackCD = now;playerSkill2CDEnd = now + chrono::seconds(18);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木人之术!持续5秒,可按K攻击2次       ";skillInProgress = false; }
                                                                                       void playerHashiramaUltimate() { if (skillInProgress || enemySkillInProgress)return;if (enemy.hp > 80) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方HP需低于等于80才能释放!            ";return; }skillInProgress = true;playerHashiramaUltimateActive = true;int targetX = 15;while (player.x > targetX) { player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int charY = MAP_START_Y + CHARACTER_ROW;for (int row = 0;row < 3;row++) { for (int col = 0;col < 4;col++) { int gx = player.x - 1 + col;int gy = charY - 3 - row;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);setColor(6);cout << "¥"; } } }for (int i = 0;i < 10;i++) { int armX = player.x + 4 + i;if (armX < MAP_WIDTH && armX != enemy.x) { gotoxy(MAP_START_X + armX, charY);setColor(6);cout << "\\"; }this_thread::sleep_for(chrono::milliseconds(100)); }enemy.hp -= 80;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "千手观音造成80点伤害!                  ";this_thread::sleep_for(chrono::seconds(2));for (int i = 0;i < 10;i++) { int armX = player.x + 4 + i;if (armX < MAP_WIDTH) { gotoxy(MAP_START_X + armX, charY);cout << " "; } }for (int row = 0;row < 3;row++) { for (int col = 0;col < 4;col++) { int gx = player.x - 1 + col;int gy = charY - 3 - row;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);cout << " "; } } }playerHashiramaUltimateActive = false;skillInProgress = false; }

                                                                                       void playerSasukeNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!                          ";return; }int distance = abs(player.x - enemy.x);if (distance < 1 || distance>10) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "距离不合适,无法攻击!                  ";return; }auto now = chrono::steady_clock::now();if (now < playerSasukeSlashCD)return;if (playerSasukeSusanooActive && playerSasukeSusanooSlashCount < 3) { playerSasukeSusanooSlashActive = true;playerSasukeSusanooSlashEnd = now + chrono::milliseconds(1500);playerSasukeSusanooSlashCount++;int startX = player.x + 3;for (int i = 0;i <= distance;i++) { int currentX = startX + i;if (currentX >= enemy.x)break;if (i > 0) { int prevX = startX + (i - 1);for (int row = 0;row < 8;row++) { int sy = charY - 2 - row;if (sy > 0) { gotoxy(MAP_START_X + prevX, MAP_START_Y + sy);cout << " "; } } }for (int row = 0;row < 8;row++) { int sy = charY - 2 - row;if (sy > 0 && currentX != enemy.x && currentX != player.x) { gotoxy(MAP_START_X + currentX, MAP_START_Y + sy);setColor(13);cout << "}"; } }this_thread::sleep_for(chrono::milliseconds(80)); }int lastX = startX + distance;if (lastX >= enemy.x)lastX = enemy.x - 1;for (int row = 0;row < 8;row++) { int sy = charY - 2 - row;if (sy > 0) { gotoxy(MAP_START_X + lastX, MAP_START_Y + sy);cout << " "; } }int damage = rand() % 6 + 25;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "须佐能乎斩造成 " << damage << " 点伤害!      ";if (playerSasukeSusanooSlashCount >= 3) { playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0; }return; }playerSasukeSlashActive = true;playerSasukeSlashEnd = now + chrono::milliseconds(500);playerSasukeSlashCD = now + chrono::milliseconds(1500);int startX = player.x + 1;for (int i = 0;i <= distance;i++) { int currentX = startX + i;if (currentX >= enemy.x)break;if (i > 0) { int prevX = startX + (i - 1);if (prevX != enemy.x && prevX != player.x) { gotoxy(MAP_START_X + prevX, charY);cout << " "; } }if (currentX != enemy.x && currentX != player.x) { gotoxy(MAP_START_X + currentX, charY);setColor(13);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lastX = startX + distance;if (lastX >= enemy.x)lastX = enemy.x - 1;if (lastX != enemy.x && lastX != player.x) { gotoxy(MAP_START_X + lastX, charY);cout << " "; }int damage = rand() % 3 + 8;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "剑气造成 " << damage << " 点伤害!          "; }
                                                                                       void playerSasukeSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill1CDEnd)return;int distance = abs(player.x - enemy.x);if (distance > 8)return;skillInProgress = true;playerSasukeAmaterasuActive = true;playerSasukeAmaterasuEnd = now + chrono::seconds(5);playerSasukeAmaterasuTick = now + chrono::milliseconds(500);playerSasukeAmaterasuHit = true;playerSkill1CDEnd = now + chrono::seconds(10);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "天照!每0.5秒造成5点伤害,持续5秒     ";skillInProgress = false; }
                                                                                       void playerSasukeSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill2CDEnd)return;skillInProgress = true;int targetX = enemy.x - 5;if (targetX < 1)targetX = 1;player.x = targetX;int damage = rand() % 7 + 12;enemy.hp -= damage;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "天手力造成 " << damage << " 点伤害!          ";playerSkill2CDEnd = now + chrono::seconds(8);skillInProgress = false; }
                                                                                       void playerSasukeSubSkill() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSasukeSubSkillCD)return;if (playerSasukeSusanooActive) { playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0;playerSasukeUltimateActive = false;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "须佐能乎关闭!                          ";return; }playerSasukeSusanooActive = true;playerSasukeSusanooEnd = now + chrono::seconds(45);playerSasukeSusanooSlashCount = 0;playerSasukeSubSkillCD = now + chrono::seconds(15);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "完全体须佐能乎!持续45秒              "; }
                                                                                       void playerSasukeUltimate() { if (skillInProgress || enemySkillInProgress)return;if (!playerSasukeSusanooActive)return;if (enemy.hp > 65) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方HP需低于等于65才能释放!            ";return; }skillInProgress = true;playerSasukeUltimateActive = true;int charY = MAP_START_Y + CHARACTER_ROW;int targetX = 5;while (player.x > targetX) { player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int dmg1 = rand() % 16 + 20;enemy.hp -= dmg1;if (enemy.hp < 0)enemy.hp = 0;for (int row = 0;row < 5;row++) { for (int col = 0;col < 5;col++) { int bx = enemy.x - 2 + col;int by = charY - 4 - row;if (bx > 0 && bx < MAP_WIDTH && by>0) { gotoxy(MAP_START_X + bx, MAP_START_Y + by);setColor(8);cout << "*"; } } }this_thread::sleep_for(chrono::seconds(1));for (int row = 0;row < 8;row++) { int sx = player.x + 3;int sy = charY - 2 - row;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);setColor(13);cout << "}"; } }enemy.hp -= 45;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "地爆天星斩造成 " << dmg1 + 45 << " 点伤害!       ";this_thread::sleep_for(chrono::seconds(2));for (int row = 0;row < 5;row++) { for (int col = 0;col < 5;col++) { int bx = enemy.x - 2 + col;int by = charY - 4 - row;if (bx > 0 && bx < MAP_WIDTH && by>0) { gotoxy(MAP_START_X + bx, MAP_START_Y + by);cout << " "; } } }for (int row = 0;row < 8;row++) { int sx = player.x + 3;int sy = charY - 2 - row;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);cout << " "; } }playerSasukeUltimateActive = false;playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0;skillInProgress = false; }

                                                                                       void playerNormalAttack() { if (playerCharacterType == 0)playerNarutoNormalAttack();else if (playerCharacterType == 1)playerPainNormalAttack();else if (playerCharacterType == 2)playerObitoNormalAttack();else if (playerCharacterType == 3) { if (playerBorutoKarmaActive && playerBorutoFlying)playerBorutoEnhancedAttack();else playerBorutoNormalAttack(); } else if (playerCharacterType == 4) { if (playerHashiramaWoodGolemActive)playerHashiramaWoodGolemAttack();else playerHashiramaNormalAttack(); } else if (playerCharacterType == 5)playerSasukeNormalAttack(); }
                                                                                       void playerSkill1() { if (playerCharacterType == 0)playerNarutoSkill1();else if (playerCharacterType == 1)playerPainSkill1();else if (playerCharacterType == 2)playerObitoSkill1();else if (playerCharacterType == 3)playerBorutoSkill1();else if (playerCharacterType == 4)playerHashiramaSkill1();else if (playerCharacterType == 5)playerSasukeSkill1(); }
                                                                                       void playerSkill2() { if (playerCharacterType == 0)playerNarutoSkill2();else if (playerCharacterType == 1)playerPainSkill2();else if (playerCharacterType == 2)playerObitoSkill2();else if (playerCharacterType == 3)playerBorutoSkill2();else if (playerCharacterType == 4)playerHashiramaSkill2();else if (playerCharacterType == 5)playerSasukeSkill2(); }
                                                                                       void playerUltimate() { if (playerCharacterType == 0)playerNarutoUltimate();else if (playerCharacterType == 1)playerPainUltimate();else if (playerCharacterType == 2)playerObitoUltimate();else if (playerCharacterType == 3)playerBorutoUltimate();else if (playerCharacterType == 4)playerHashiramaUltimate();else if (playerCharacterType == 5)playerSasukeUltimate(); }

                                                                                       void enemyNarutoNormalAttack() { int distance = abs(player.x - enemy.x);if (enemy.x > player.x && distance >= 1 && distance <= 3) { int damage = rand() % 4 + 3;enemyNarutoTailActive = true;enemyNarutoTailEnd = chrono::steady_clock::now() + chrono::milliseconds(1500);for (int i = 0;i < 3;i++) { enemyNarutoTailX[i] = enemy.x - 1 - i;if (enemyNarutoTailX[i] <= player.x) { enemyNarutoTailX[i] = 0;break; } }player.hp -= damage;if (player.hp < 0)player.hp = 0;enemyNormalAttackCount++; } }
                                                                                       void enemyNarutoSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill1CDEnd)return;enemySkillInProgress = true;int targetX = player.x + 1;while (enemy.x > targetX) { enemy.x--;if (enemy.x <= player.x) { enemy.x = player.x + 1;break; }this_thread::sleep_for(chrono::milliseconds(50)); }int damage = rand() % 8 + 8;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemySkill1CDEnd = now + chrono::seconds(8);enemySkillInProgress = false; }
                                                                                       void enemyNarutoSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill2CDEnd)return;enemySkillInProgress = true;bool caught = false;for (int i = 0;i < 20;i++) { int checkX = enemy.x - 1 - i;if (checkX <= 0 || checkX <= player.x)break;if (checkX == player.x + 1) { caught = true;break; } }this_thread::sleep_for(chrono::milliseconds(500));if (caught) { int damage = rand() % 6 + 20;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemySkill2CDEnd = now + chrono::seconds(15); } else { enemySkill2CDEnd = now + chrono::seconds(7); }enemySkillInProgress = false; }
                                                                                       void enemyNarutoUltimate() { if (enemySkillInProgress || skillInProgress)return;if (player.hp > 35)return;enemySkillInProgress = true;player.hp -= 35;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(3));enemySkillInProgress = false; }
                                                                                       void enemyPainNormalAttack() { if (enemy.x <= player.x)return;int charY = MAP_START_Y + CHARACTER_ROW;if (enemyPainRodActive) { if (enemyPainRodX > 0 && enemyPainRodX < MAP_WIDTH && enemyPainRodX != player.x && enemyPainRodX != enemy.x) { gotoxy(MAP_START_X + enemyPainRodX, charY);cout << " "; }enemyPainRodActive = false;enemyRodHitting = false; }int rodX = enemy.x - 3;if (rodX <= player.x)rodX = player.x + 1;if (rodX >= enemy.x)return;if (rodX == player.x)rodX = player.x + 1;enemyPainRodActive = true;enemyPainRodX = rodX;enemyPainRodEnd = chrono::steady_clock::now() + chrono::milliseconds(1500);int damage = rand() % 3 + 4;player.hp -= damage;if (player.hp < 0)player.hp = 0;if (rodX == player.x + 1) { enemyRodHitting = true;enemyRodHitEnd = enemyPainRodEnd; } else { enemyRodHitting = false; }enemyNormalAttackCount++; }
                                                                                       void enemyPainSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill1CDEnd)return;skillInProgress = true;enemySkillInProgress = true;int targetX = enemy.x - 2;while (player.x < targetX) { player.x++;if (player.x >= enemy.x) { player.x = enemy.x - 2;break; }this_thread::sleep_for(chrono::milliseconds(30)); }player.x = targetX;enemyBanshoTeninActive = true;enemyBanshoTeninEnd = now + chrono::seconds(5);int damage = rand() % 4 + 10;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemySkill1CDEnd = now + chrono::seconds(12);enemySkillInProgress = false;skillInProgress = false; }
                                                                                       void enemyPainSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill2CDEnd)return;enemySkillInProgress = true;int damage = rand() % 5 + 8;if (abs(player.x - enemy.x) <= 1) { player.hp -= damage;if (player.hp < 0)player.hp = 0; }this_thread::sleep_for(chrono::seconds(1));enemySkill2CDEnd = now + chrono::seconds(15);enemySkillInProgress = false; }
                                                                                       void enemyPainUltimate() { if (enemySkillInProgress || skillInProgress)return;if (player.hp > 50)return;enemySkillInProgress = true;int targetX = MAP_WIDTH / 2;while (enemy.x != targetX) { if (enemy.x < targetX)enemy.x++;else if (enemy.x > targetX)enemy.x--;this_thread::sleep_for(chrono::milliseconds(20)); }for (int second = 1;second <= 5;second++) { player.hp -= 10;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(1));if (player.hp <= 0)break; }enemySkillInProgress = false; }

                                                                                       void enemyObitoNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (enemy.x <= player.x)return;int distance = abs(player.x - enemy.x);if (distance < 1 || distance>2)return;int kickX = enemy.x - 1;if (kickX <= player.x)kickX = player.x + 1;if (kickX >= enemy.x)return;enemyObitoKickActive = true;enemyObitoKickX = kickX;enemyObitoKickEnd = chrono::steady_clock::now() + chrono::milliseconds(1000);int damage = rand() % 3 + 6;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemyNormalAttackCount++; }
                                                                                       void enemyObitoSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (enemyObitoEnemyTrapped && !enemyObitoFireActive) { int savedX = enemy.x;int targetX = player.x + 3;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;if (targetX < 1)targetX = 1;enemySkillInProgress = true;enemyObitoFireActive = true;enemy.x = targetX;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));int fireX = enemy.x - 1;for (int i = 0;i < 8;i++) { int fx = fireX - i;if (fx > 0 && fx != player.x && fx != enemy.x) { gotoxy(MAP_START_X + fx, charY);setColor(6);cout << "~"; } }int damage = rand() % 5 + 14;player.hp -= damage;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(2));for (int i = 0;i < 8;i++) { int fx = fireX - i;if (fx > 0 && fx != player.x && fx != enemy.x) { gotoxy(MAP_START_X + fx, charY);cout << " "; } }enemy.x = savedX;enemyObitoFireActive = false;enemySkillInProgress = false;return; }if (now < enemySkill1CDEnd)return;enemySkillInProgress = true;enemyObitoWoodSpikeX = enemy.x - 1;enemyObitoWoodSpikeActive = true;enemyObitoWoodSpikeEnd = now + chrono::milliseconds(500);bool hitEnemy = false;for (int i = 0;i < 30;i++) { int checkX = enemy.x - 1 - i;if (checkX <= 0 || checkX <= player.x)break;if (checkX != player.x && checkX != enemy.x) { gotoxy(MAP_START_X + checkX, charY);setColor(2);cout << "-"; }if (checkX == player.x + 1) { hitEnemy = true;break; }this_thread::sleep_for(chrono::milliseconds(20)); }if (hitEnemy) { enemyObitoEnemyTrapped = true;enemyObitoEnemyTrappedEnd = now + chrono::seconds(15);int damage = rand() % 5 + 12;player.hp -= damage;if (player.hp < 0)player.hp = 0; } else { enemyObitoWoodSpikeActive = false; }for (int i = 0;i < 30;i++) { int clearX = enemy.x - 1 - i;if (clearX <= 0 || clearX <= player.x)break;if (clearX != player.x && clearX != enemy.x) { gotoxy(MAP_START_X + clearX, charY);cout << " "; } }enemySkill1CDEnd = now + chrono::seconds(hitEnemy ? 20 : 10);enemySkillInProgress = false; }
                                                                                       void enemyObitoSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();int charY = MAP_START_Y + CHARACTER_ROW;if (enemyObitoKamuiActive && !enemyObitoKamuiSpaceActive) { enemyObitoKamuiActive = false;enemyObitoKamuiSpaceActive = true;enemyObitoSavedX = enemy.x;int targetX = player.x + 1;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;if (targetX < 1)targetX = 1;enemy.x = targetX;enemyObitoPlayerInSpace = true;enemyObitoKamuiSpaceEnd = now + chrono::seconds(3);drawBattleMap();this_thread::sleep_for(chrono::milliseconds(500));for (int sec = 0;sec < 3;sec++) { int damage = rand() % 3 + 8;player.hp -= damage;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(1));if (player.hp <= 0)break; }enemyObitoPlayerInSpace = false;enemyObitoKamuiSpaceActive = false;player.x = enemy.x - 3;if (player.x < 1)player.x = 1;if (player.x >= MAP_WIDTH - 2)player.x = MAP_WIDTH - 3;enemySkill2CDEnd = now + chrono::seconds(10);return; }if (enemyObitoEnemyTrapped && !enemyObitoWoodStormActive) { enemySkillInProgress = true;enemyObitoWoodStormActive = true;int savedX = enemy.x;int targetX = player.x - 5;if (targetX < 2)targetX = 2;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;enemy.x = targetX;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));for (int i = 0;i < 20;i++) { int branchX = enemy.x + 1 + i;if (branchX >= MAP_WIDTH || branchX >= player.x)break;if (branchX != player.x && branchX != enemy.x) { gotoxy(MAP_START_X + branchX, charY - 1);setColor(2);cout << "_";gotoxy(MAP_START_X + branchX, charY);setColor(2);cout << "-"; } }for (int sec = 0;sec < 6;sec++) { if (abs(enemy.x - player.x) <= 20) { player.hp -= 8;if (player.hp < 0)player.hp = 0; }this_thread::sleep_for(chrono::seconds(1));if (player.hp <= 0)break; }for (int i = 0;i < 20;i++) { int branchX = enemy.x + 1 + i;if (branchX >= MAP_WIDTH)break;if (branchX != player.x && branchX != enemy.x) { gotoxy(MAP_START_X + branchX, charY - 1);cout << " ";gotoxy(MAP_START_X + branchX, charY);cout << " "; } }enemy.x = savedX;enemyObitoWoodStormActive = false;enemySkillInProgress = false;return; }if (now < enemySkill2CDEnd)return;enemyObitoKamuiActive = true;enemyObitoKamuiEnd = now + chrono::seconds(5); }
                                                                                       void enemyObitoUltimate() { if (enemySkillInProgress || skillInProgress)return;if (player.hp > 50)return;enemySkillInProgress = true;enemyObitoUltimateActive = true;int charY = MAP_START_Y + CHARACTER_ROW;int tenTailBaseY = charY - 5;for (int row = 0;row < 5;row++) { for (int col = 0;col < 10;col++) { int x = enemy.x - 5 + col;int y = tenTailBaseY - row;if (x > 0 && x < MAP_WIDTH && y>0) { gotoxy(MAP_START_X + x, MAP_START_Y + y);setColor(8);cout << "*"; } } }gotoxy(MAP_START_X + enemy.x, MAP_START_Y + tenTailBaseY - 5);setColor(12);cout << "&";this_thread::sleep_for(chrono::seconds(2));player.hp -= 50;if (player.hp < 0)player.hp = 0;for (int row = 0;row < 5;row++) { for (int col = 0;col < 10;col++) { int x = enemy.x - 5 + col;int y = tenTailBaseY - row;if (x > 0 && x < MAP_WIDTH && y>0) { gotoxy(MAP_START_X + x, MAP_START_Y + y);cout << " "; } } }gotoxy(MAP_START_X + enemy.x, MAP_START_Y + tenTailBaseY - 5);cout << " ";enemyObitoUltimateActive = false;enemySkillInProgress = false; }

                                                                                       void enemyBorutoNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (enemy.x <= player.x)return;int distance = abs(player.x - enemy.x);if (distance < 1 || distance>4)return;if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive)return;enemyBorutoSwordActive = true;enemyBorutoSwordSlashing = true;enemyBorutoSwordEnd = chrono::steady_clock::now() + chrono::milliseconds(2000);enemyBorutoSwordX = enemy.x - 1;int damage1 = rand() % 3 + 7;player.hp -= damage1;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::milliseconds(400));if (enemyRodHitting || enemyBanshoTeninActive || enemyObitoEnemyTrapped || enemyHashiramaEnemyTrapped || enemySasukeAmaterasuHit) { enemyBorutoSwordActive = false;enemyBorutoSwordSlashing = false;return; }int damage2 = rand() % 4 + 7;player.hp -= damage2;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::milliseconds(400));if (enemyRodHitting || enemyBanshoTeninActive || enemyObitoEnemyTrapped || enemyHashiramaEnemyTrapped || enemySasukeAmaterasuHit) { enemyBorutoSwordActive = false;enemyBorutoSwordSlashing = false;return; }int damage3 = rand() % 5 + 8;player.hp -= damage3;if (player.hp < 0)player.hp = 0;enemyBorutoSwordActive = false;enemyBorutoSwordSlashing = false;enemyNormalAttackCount++; }
                                                                                       void enemyBorutoSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (enemyBorutoKarmaActive) { if (enemyBorutoFlying)return;if (now < enemySkill1CDEnd)return;enemyBorutoFlying = true;enemyBorutoFlyingEnd = now + chrono::seconds(10);enemyBorutoEnhancedAttackCount = 0;enemySkill1CDEnd = now + chrono::seconds(6);return; }if (now < enemySkill1CDEnd)return;enemySkillInProgress = true;int targetX = player.x + 3;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;while (enemy.x < targetX) { enemy.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }while (enemy.x > targetX) { enemy.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }enemyBorutoRasenganActive = true;enemyBorutoRasenganEnd = now + chrono::seconds(3);enemyBorutoRasenganHit = true;for (int sec = 0;sec < 3;sec++) { int damage = rand() % 5 + 8;player.hp -= damage;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(1));if (player.hp <= 0)break; }enemyBorutoRasenganActive = false;targetX = player.x + 8;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;enemy.x = targetX;enemyBorutoMarkActive = true;enemyBorutoMarkX = player.x;enemyBorutoMarkEnd = now + chrono::seconds(10);enemyBorutoTeleported = false;enemyBorutoTeleportBack = false;enemySkill1CDEnd = now + chrono::seconds(18);enemySkillInProgress = false; }
                                                                                       void enemyBorutoSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (enemyBorutoKarmaActive) { if (enemyBorutoFlying)return;if (now < enemySkill2CDEnd)return;enemySkillInProgress = true;int ballX = enemy.x - 1;int charY = MAP_START_Y + CHARACTER_ROW;for (int step = 0;step < 20;step++) { int currentX = ballX - step;if (currentX <= player.x)break;if (step > 0) { gotoxy(MAP_START_X + currentX + 1, charY);cout << " "; }if (currentX != player.x && currentX != enemy.x) { gotoxy(MAP_START_X + currentX, charY);setColor(11);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(50)); }int damage = rand() % 6 + 15;player.hp -= damage;if (player.hp < 0)player.hp = 0;gotoxy(MAP_START_X + player.x + 1, charY);cout << " ";enemySkill2CDEnd = now + chrono::seconds(15);enemySkillInProgress = false;return; }if (enemyBorutoMarkActive && !enemyBorutoTeleported) { enemyBorutoTeleportSavedX = enemy.x;enemy.x = player.x + 3;if (enemy.x >= MAP_WIDTH - 2)enemy.x = MAP_WIDTH - 3;enemyBorutoTeleported = true;enemyBorutoTeleportTime = now;int damage = rand() % 9 + 10;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemyBorutoTeleportBack = true;return; }if (enemyBorutoTeleported && enemyBorutoTeleportBack) { auto timeSinceTeleport = chrono::duration_cast<chrono::seconds>(now - enemyBorutoTeleportTime).count();if (timeSinceTeleport <= 5) { enemy.x = enemyBorutoTeleportSavedX;enemyBorutoTeleported = false;enemyBorutoTeleportBack = false;enemySkill2CDEnd = now + chrono::seconds(8);return; } else { enemyBorutoTeleportBack = false; } }if (now < enemySkill2CDEnd)return; }
                                                                                       void enemyBorutoUltimate() { if (enemySkillInProgress || skillInProgress)return;if (enemyBorutoKarmaActive)return;auto now = chrono::steady_clock::now();if (now < enemySkill3CDEnd)return;enemySkillInProgress = true;enemyBorutoKarmaActive = true;enemyBorutoKarmaEnd = now + chrono::seconds(60);enemySkill3CDEnd = now + chrono::seconds(45);enemySkillInProgress = false; }

                                                                                       void enemyHashiramaNormalAttack() { if (enemy.x <= player.x)return;int distance = abs(player.x - enemy.x);if (distance < 1 || distance>5)return;enemyHashiramaStompActive = true;enemyHashiramaStompX = enemy.x - 1;enemyHashiramaStompEnd = chrono::steady_clock::now() + chrono::milliseconds(800);int damage = rand() % 3 + 8;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemyNormalAttackCount++; }
                                                                                       void enemyHashiramaSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (enemyHashiramaEnemyTrapped && !enemyHashiramaMyojinmonUsed) { enemySkillInProgress = true;enemyHashiramaMyojinmonActive = true;enemyHashiramaMyojinmonUsed = true;int damage = rand() % 16 + 20;player.hp -= damage;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(2));enemyHashiramaMyojinmonActive = false;enemyHashiramaEnemyTrapped = false;enemyHashiramaWoodDragonActive = false;enemySkillInProgress = false;return; }if (now < enemySkill1CDEnd)return;enemySkillInProgress = true;enemyHashiramaWoodDragonActive = true;enemyHashiramaWoodDragonEnd = now + chrono::milliseconds(1000);int startX = enemy.x - 1;bool hit = false;int charY = MAP_START_Y + CHARACTER_ROW;for (int i = 0;i < 20;i++) { int dx = startX - i;if (dx <= 0 || dx <= player.x)break;if (dx != player.x && dx != enemy.x) { gotoxy(MAP_START_X + dx, charY);setColor(2);cout << "~"; }if (dx == player.x + 1) { hit = true;break; }this_thread::sleep_for(chrono::milliseconds(30)); }if (hit) { enemyHashiramaEnemyTrapped = true;enemyHashiramaWoodDragonTrapEnd = now + chrono::seconds(8);enemyHashiramaMyojinmonUsed = false;int damage = rand() % 6 + 15;player.hp -= damage;if (player.hp < 0)player.hp = 0; } else { enemyHashiramaWoodDragonActive = false; }enemySkill1CDEnd = now + chrono::seconds(15);enemySkillInProgress = false; }
                                                                                       void enemyHashiramaSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill2CDEnd)return;if (enemyHashiramaWoodGolemActive)return;enemySkillInProgress = true;enemyHashiramaWoodGolemActive = true;enemyHashiramaWoodGolemEnd = now + chrono::seconds(5);enemyHashiramaWoodGolemAttackCount = 0;enemySkill2CDEnd = now + chrono::seconds(18);enemySkillInProgress = false; }
                                                                                       void enemyHashiramaUltimate() { if (enemySkillInProgress || skillInProgress)return;if (player.hp > 80)return;enemySkillInProgress = true;enemyHashiramaUltimateActive = true;int targetX = MAP_WIDTH - 15;while (enemy.x < targetX) { enemy.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int charY = MAP_START_Y + CHARACTER_ROW;for (int row = 0;row < 3;row++) { for (int col = 0;col < 4;col++) { int gx = enemy.x - 1 + col;int gy = charY - 3 - row;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);setColor(6);cout << "¥"; } } }for (int i = 0;i < 10;i++) { int armX = enemy.x - 4 - i;if (armX > 0 && armX != player.x) { gotoxy(MAP_START_X + armX, charY);setColor(6);cout << "\\"; }this_thread::sleep_for(chrono::milliseconds(100)); }player.hp -= 80;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(2));for (int i = 0;i < 10;i++) { int armX = enemy.x - 4 - i;if (armX > 0) { gotoxy(MAP_START_X + armX, charY);cout << " "; } }for (int row = 0;row < 3;row++) { for (int col = 0;col < 4;col++) { int gx = enemy.x - 1 + col;int gy = charY - 3 - row;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);cout << " "; } } }enemyHashiramaUltimateActive = false;enemySkillInProgress = false; }

                                                                                       void enemySasukeNormalAttack() { int charY = MAP_START_Y + CHARACTER_ROW;if (enemy.x <= player.x)return;int distance = abs(player.x - enemy.x);if (distance < 1 || distance>10)return;auto now = chrono::steady_clock::now();if (now < enemySasukeSlashCD)return;if (enemySasukeSusanooActive && enemySasukeSusanooSlashCount < 3) { enemySasukeSusanooSlashActive = true;enemySasukeSusanooSlashEnd = now + chrono::milliseconds(1500);enemySasukeSusanooSlashCount++;int startX = enemy.x - 3;for (int i = 0;i <= distance;i++) { int currentX = startX - i;if (currentX <= player.x)break;if (i > 0) { int prevX = startX - (i - 1);for (int row = 0;row < 8;row++) { int sy = charY - 2 - row;if (sy > 0) { gotoxy(MAP_START_X + prevX, MAP_START_Y + sy);cout << " "; } } }for (int row = 0;row < 8;row++) { int sy = charY - 2 - row;if (sy > 0 && currentX != player.x && currentX != enemy.x) { gotoxy(MAP_START_X + currentX, MAP_START_Y + sy);setColor(13);cout << "}"; } }this_thread::sleep_for(chrono::milliseconds(80)); }int lastX = startX - distance;if (lastX <= player.x)lastX = player.x + 1;for (int row = 0;row < 8;row++) { int sy = charY - 2 - row;if (sy > 0) { gotoxy(MAP_START_X + lastX, MAP_START_Y + sy);cout << " "; } }int damage = rand() % 6 + 25;player.hp -= damage;if (player.hp < 0)player.hp = 0;if (enemySasukeSusanooSlashCount >= 3) { enemySasukeSusanooActive = false;enemySasukeSusanooSlashCount = 0; }enemyNormalAttackCount++;return; }enemySasukeSlashActive = true;enemySasukeSlashEnd = now + chrono::milliseconds(500);enemySasukeSlashCD = now + chrono::milliseconds(1500);int startX = enemy.x - 1;for (int i = 0;i <= distance;i++) { int currentX = startX - i;if (currentX <= player.x)break;if (i > 0) { int prevX = startX - (i - 1);if (prevX != player.x && prevX != enemy.x) { gotoxy(MAP_START_X + prevX, charY);cout << " "; } }if (currentX != player.x && currentX != enemy.x) { gotoxy(MAP_START_X + currentX, charY);setColor(13);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lastX = startX - distance;if (lastX <= player.x)lastX = player.x + 1;if (lastX != player.x && lastX != enemy.x) { gotoxy(MAP_START_X + lastX, charY);cout << " "; }int damage = rand() % 3 + 8;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemyNormalAttackCount++; }
                                                                                       void enemySasukeSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill1CDEnd)return;int distance = abs(player.x - enemy.x);if (distance > 8)return;enemySkillInProgress = true;enemySasukeAmaterasuActive = true;enemySasukeAmaterasuEnd = now + chrono::seconds(5);enemySasukeAmaterasuTick = now + chrono::milliseconds(500);enemySasukeAmaterasuHit = true;enemySkill1CDEnd = now + chrono::seconds(10);enemySkillInProgress = false; }
                                                                                       void enemySasukeSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill2CDEnd)return;enemySkillInProgress = true;int targetX = player.x + 5;if (targetX >= MAP_WIDTH - 2)targetX = MAP_WIDTH - 3;enemy.x = targetX;int damage = rand() % 7 + 12;player.hp -= damage;if (player.hp < 0)player.hp = 0;enemySkill2CDEnd = now + chrono::seconds(8);enemySkillInProgress = false; }
                                                                                       void enemySasukeSubSkill() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySasukeSubSkillCD)return;if (enemySasukeSusanooActive) { enemySasukeSusanooActive = false;enemySasukeSusanooSlashCount = 0;enemySasukeUltimateActive = false;return; }enemySasukeSusanooActive = true;enemySasukeSusanooEnd = now + chrono::seconds(45);enemySasukeSusanooSlashCount = 0;enemySasukeSubSkillCD = now + chrono::seconds(15); }
                                                                                       void enemySasukeUltimate() { if (enemySkillInProgress || skillInProgress)return;if (!enemySasukeSusanooActive)return;if (player.hp > 65)return;enemySkillInProgress = true;enemySasukeUltimateActive = true;int charY = MAP_START_Y + CHARACTER_ROW;int targetX = MAP_WIDTH - 5;while (enemy.x < targetX) { enemy.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int dmg1 = rand() % 16 + 20;player.hp -= dmg1;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(2));player.hp -= 45;if (player.hp < 0)player.hp = 0;enemySasukeUltimateActive = false;enemySasukeSusanooActive = false;enemySasukeSusanooSlashCount = 0;enemySkillInProgress = false; }

                                                                                       void enemyNormalAttack() { if (enemyCharacterType == 0)enemyNarutoNormalAttack();else if (enemyCharacterType == 1)enemyPainNormalAttack();else if (enemyCharacterType == 2)enemyObitoNormalAttack();else if (enemyCharacterType == 3)enemyBorutoNormalAttack();else if (enemyCharacterType == 4)enemyHashiramaNormalAttack();else if (enemyCharacterType == 5)enemySasukeNormalAttack(); }
                                                                                       void enemySkill1() { if (enemyCharacterType == 0)enemyNarutoSkill1();else if (enemyCharacterType == 1)enemyPainSkill1();else if (enemyCharacterType == 2)enemyObitoSkill1();else if (enemyCharacterType == 3)enemyBorutoSkill1();else if (enemyCharacterType == 4)enemyHashiramaSkill1();else if (enemyCharacterType == 5)enemySasukeSkill1(); }
                                                                                       void enemySkill2() { if (enemyCharacterType == 0)enemyNarutoSkill2();else if (enemyCharacterType == 1)enemyPainSkill2();else if (enemyCharacterType == 2)enemyObitoSkill2();else if (enemyCharacterType == 3)enemyBorutoSkill2();else if (enemyCharacterType == 4)enemyHashiramaSkill2();else if (enemyCharacterType == 5)enemySasukeSkill2(); }
                                                                                       void enemyUltimate() { if (enemyCharacterType == 0)enemyNarutoUltimate();else if (enemyCharacterType == 1)enemyPainUltimate();else if (enemyCharacterType == 2)enemyObitoUltimate();else if (enemyCharacterType == 3)enemyBorutoUltimate();else if (enemyCharacterType == 4)enemyHashiramaUltimate();else if (enemyCharacterType == 5)enemySasukeUltimate(); }

                                                                                       void enemyAI() { if (playerRodHitting) { auto now = chrono::steady_clock::now();if (now < playerRodHitEnd)return;else playerRodHitting = false; }if (playerBanshoTeninActive) { auto now = chrono::steady_clock::now();if (now < playerBanshoTeninEnd)return;else playerBanshoTeninActive = false; }if (playerObitoEnemyTrapped) { auto now = chrono::steady_clock::now();if (now < playerObitoEnemyTrappedEnd)return;else playerObitoEnemyTrapped = false; }if (playerHashiramaEnemyTrapped) { auto now = chrono::steady_clock::now();if (now < playerHashiramaWoodDragonTrapEnd)return;else playerHashiramaEnemyTrapped = false; }if (playerSasukeAmaterasuHit) { auto now = chrono::steady_clock::now();if (now < playerSasukeAmaterasuEnd)return;else playerSasukeAmaterasuHit = false; }if (playerObitoEnemyInSpace)return;if (enemyObitoPlayerInSpace)return;if (enemyObitoEnemyTrapped) { auto now = chrono::steady_clock::now();if (now < enemyObitoEnemyTrappedEnd)return;else enemyObitoEnemyTrapped = false; }if (enemyHashiramaEnemyTrapped) { auto now = chrono::steady_clock::now();if (now < enemyHashiramaWoodDragonTrapEnd)return;else enemyHashiramaEnemyTrapped = false; }if (enemySasukeAmaterasuHit) { auto now = chrono::steady_clock::now();if (now < enemySasukeAmaterasuEnd)return;else enemySasukeAmaterasuHit = false; }if (playerBorutoRasenganHit) { auto now = chrono::steady_clock::now();if (now < playerBorutoRasenganEnd)return; }if (enemySkillInProgress || skillInProgress)return;if (playerShinraTenseiActive || enemyShinraTenseiActive)return;if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive)return;auto now = chrono::steady_clock::now();int distance = abs(player.x - enemy.x);double hpRatio = (double)enemy.hp / enemy.maxHp;if (hpRatio > 0.7)enemyAIMood = 0;else if (hpRatio > 0.35)enemyAIMood = 1;else enemyAIMood = 2;bool canUseUltimate = (enemyCharacterType == 0 && player.hp <= 35) || (enemyCharacterType == 1 && player.hp <= 50) || (enemyCharacterType == 2 && player.hp <= 50) || (enemyCharacterType == 3 && player.hp <= 50) || (enemyCharacterType == 4 && player.hp <= 80) || (enemyCharacterType == 5 && enemySasukeSusanooActive && player.hp <= 65);if (canUseUltimate && !enemyUltimateReady)enemyUltimateReady = true;if (enemyUltimateReady) { if (enemyAIMood == 2 || (enemyAIMood == 1 && hpRatio < 0.5) || (enemyAIMood == 0 && hpRatio < 0.3)) { enemyUltimate();enemyUltimateReady = false;enemyLastActionType = 4;enemyConsecutiveSkills = 0;return; } }bool skill1Ready = (now >= enemySkill1CDEnd);bool skill2Ready = (now >= enemySkill2CDEnd);auto timeSinceLastSkill = chrono::duration_cast<chrono::milliseconds>(now - enemyLastSkillTime).count();bool canUseSkill = (timeSinceLastSkill > 2000 || enemyConsecutiveSkills < 2);if (enemyCharacterType == 5 && !enemySasukeSusanooActive) { auto subCD = chrono::duration_cast<chrono::seconds>(enemySasukeSubSkillCD - now).count();if (subCD <= 0 && rand() % 100 < 30) { enemySasukeSubSkill();enemyLastActionType = 5;enemyConsecutiveSkills = 0;return; } }if (enemyCharacterType == 5 && enemySasukeSusanooActive && enemySasukeSusanooSlashCount < 3 && distance <= 10) { if (rand() % 100 < 50) { enemyNormalAttack();enemyLastActionType = 1;enemyConsecutiveSkills = 0;return; } }if (enemyCharacterType == 2 && skill2Ready && enemyAIMood == 0 && distance <= 3 && !enemyObitoKamuiActive && !enemyObitoKamuiSpaceActive) { if (rand() % 100 < 25) { enemySkill2();enemyLastActionType = 3;enemyLastSkillTime = now;enemyConsecutiveSkills++;return; } }if (enemyCharacterType == 2 && enemyObitoEnemyTrapped) { if (!enemyObitoFireActive && skill1Ready) { enemySkill1();enemyLastActionType = 2;enemyLastSkillTime = now;enemyConsecutiveSkills++;return; }if (!enemyObitoWoodStormActive && skill2Ready) { enemySkill2();enemyLastActionType = 3;enemyLastSkillTime = now;enemyConsecutiveSkills++;return; } }if (enemyCharacterType == 4 && enemyHashiramaEnemyTrapped) { if (!enemyHashiramaMyojinmonUsed && skill1Ready) { enemySkill1();enemyLastActionType = 2;enemyLastSkillTime = now;enemyConsecutiveSkills++;return; } }if (enemyCharacterType == 4 && skill2Ready && enemyAIMood <= 1 && distance <= 5 && !enemyHashiramaWoodGolemActive) { enemySkill2();enemyLastActionType = 3;enemyLastSkillTime = now;enemyConsecutiveSkills++;return; }if (enemyCharacterType == 4 && enemyHashiramaWoodGolemActive && enemyHashiramaWoodGolemAttackCount < 2) { enemyNormalAttack();enemyLastActionType = 1;enemyConsecutiveSkills = 0;return; }if (enemyCharacterType == 3 && enemyBorutoKarmaActive && enemyBorutoFlying && enemyBorutoEnhancedAttackCount < 3) { if (rand() % 100 < 40) { enemyNormalAttack();enemyLastActionType = 1;enemyConsecutiveSkills = 0;return; } }int actionRoll = rand() % 100;if (distance <= 3) { if (canUseSkill && skill1Ready && actionRoll < 20 + enemyAIMood * 15) { enemySkill1();enemyLastActionType = 2;enemyLastSkillTime = now;enemyConsecutiveSkills++; } else if (canUseSkill && skill2Ready && actionRoll < 40 + enemyAIMood * 20) { enemySkill2();enemyLastActionType = 3;enemyLastSkillTime = now;enemyConsecutiveSkills++; } else if (actionRoll < 70) { if (enemyLastActionType != 1 || enemyConsecutiveSkills < 4) { enemyNormalAttack();enemyLastActionType = 1;enemyConsecutiveSkills = 0; } else { if (enemy.x < MAP_WIDTH - 3 && rand() % 2 == 0)enemy.x++;else enemy.x--;enemyLastActionType = 0;enemyConsecutiveSkills = 0;enemyJustMoved = true; } } else { if (enemyAIMood == 0 && enemy.x < MAP_WIDTH - 3) { enemy.x++; } else if (enemyAIMood == 2 && enemy.x > player.x + 1) { enemy.x--; } else { if (rand() % 2 == 0 && enemy.x < MAP_WIDTH - 3)enemy.x++;else if (enemy.x > player.x + 2)enemy.x--; }enemyLastActionType = 0;enemyConsecutiveSkills = 0;enemyJustMoved = true; } } else if (distance <= 6) { if (canUseSkill && skill1Ready && (enemyCharacterType == 0 || enemyCharacterType == 2 || enemyCharacterType == 4 || enemyCharacterType == 5) && actionRoll < 35) { enemySkill1();enemyLastActionType = 2;enemyLastSkillTime = now;enemyConsecutiveSkills++; } else if (canUseSkill && skill2Ready && actionRoll < 25) { enemySkill2();enemyLastActionType = 3;enemyLastSkillTime = now;enemyConsecutiveSkills++; } else if (actionRoll < 60) { if (enemy.x > player.x + 2) { enemy.x--;enemyLastActionType = 0;enemyJustMoved = true; }enemyConsecutiveSkills = 0; } else { if (enemyAIMood == 0) { if (enemy.x < MAP_WIDTH - 3)enemy.x++; } else { if (enemy.x > player.x + 2)enemy.x--; }enemyLastActionType = 0;enemyConsecutiveSkills = 0; } } else { if (enemy.x > player.x + 3) { enemy.x--;enemyConsecutiveSkills = 0;enemyLastActionType = 0; } else { if (enemyAIMood == 0 && enemy.x < MAP_WIDTH - 3)enemy.x++;else if (enemy.x > player.x + 2)enemy.x--; }enemyLastActionType = 0;enemyConsecutiveSkills = 0; }if (enemyLastActionType == 0 && !enemyJustMoved)enemyStuckCounter++;else enemyStuckCounter = 0;if (enemyStuckCounter > 3) { if (enemy.x > 3)enemy.x--;else if (enemy.x < MAP_WIDTH - 3)enemy.x++;enemyStuckCounter = 0; }enemyJustMoved = false; }

bool battleLoop() { player.x = 10;enemy.x = MAP_WIDTH - 10;gameRunning = true;skillInProgress = false;enemySkillInProgress = false;playerShinraTenseiActive = false;playerShinraTenseiStack = 0;playerBanshoTeninActive = false;enemyShinraTenseiActive = false;enemyBanshoTeninActive = false;playerNarutoTailActive = false;enemyNarutoTailActive = false;playerPainRodActive = false;enemyPainRodActive = false;playerRodHitting = false;enemyRodHitting = false;playerObitoKickActive = false;playerObitoWoodSpikeActive = false;playerObitoEnemyTrapped = false;playerObitoKamuiActive = false;playerObitoKamuiSpaceActive = false;playerObitoEnemyInSpace = false;playerObitoFireActive = false;playerObitoWoodStormActive = false;playerObitoUltimateActive = false;enemyObitoKickActive = false;enemyObitoWoodSpikeActive = false;enemyObitoEnemyTrapped = false;enemyObitoKamuiActive = false;enemyObitoKamuiSpaceActive = false;enemyObitoPlayerInSpace = false;enemyObitoFireActive = false;enemyObitoWoodStormActive = false;enemyObitoUltimateActive = false;playerBorutoSwordActive = false;playerBorutoRasenganActive = false;playerBorutoMarkActive = false;playerBorutoTeleported = false;playerBorutoTeleportBack = false;playerBorutoKarmaActive = false;playerBorutoFlying = false;playerBorutoBigRasenganActive = false;playerBorutoBigRasenganHit = false;playerBorutoEnhancedAttackActive = false;playerBorutoEnhancedAttackCount = 0;playerBorutoBigRasenganBallActive = false;enemyBorutoSwordActive = false;enemyBorutoRasenganActive = false;enemyBorutoMarkActive = false;enemyBorutoTeleported = false;enemyBorutoTeleportBack = false;enemyBorutoKarmaActive = false;enemyBorutoFlying = false;enemyBorutoEnhancedAttackCount = 0;playerHashiramaStompActive = false;playerHashiramaWoodDragonActive = false;playerHashiramaWoodDragonHit = false;playerHashiramaEnemyTrapped = false;playerHashiramaMyojinmonActive = false;playerHashiramaMyojinmonUsed = false;playerHashiramaWoodGolemActive = false;playerHashiramaWoodGolemAttackCount = 0;playerHashiramaUltimateActive = false;enemyHashiramaStompActive = false;enemyHashiramaWoodDragonActive = false;enemyHashiramaWoodDragonHit = false;enemyHashiramaEnemyTrapped = false;enemyHashiramaMyojinmonActive = false;enemyHashiramaMyojinmonUsed = false;enemyHashiramaWoodGolemActive = false;enemyHashiramaWoodGolemAttackCount = 0;enemyHashiramaUltimateActive = false;playerSasukeSlashActive = false;playerSasukeAmaterasuActive = false;playerSasukeAmaterasuHit = false;playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0;playerSasukeSusanooSlashActive = false;playerSasukeUltimateActive = false;enemySasukeSlashActive = false;enemySasukeAmaterasuActive = false;enemySasukeAmaterasuHit = false;enemySasukeSusanooActive = false;enemySasukeSusanooSlashCount = 0;enemySasukeSusanooSlashActive = false;enemySasukeUltimateActive = false;enemyPhase = 0;enemyNormalAttackCount = 0;enemyUltimateReady = false;enemyAIMood = 0;enemyConsecutiveSkills = 0;enemyStuckCounter = 0;enemyLastActionType = -1;enemyJustMoved = false;auto now = chrono::steady_clock::now();playerSkill1CDEnd = now;playerSkill2CDEnd = now;playerSkill3CDEnd = now;enemySkill1CDEnd = now;enemySkill2CDEnd = now;enemySkill3CDEnd = now;lastEnemyAction = now;enemyLastSkillTime = now;playerBorutoEnhancedAttackCD = now;enemyBorutoEnhancedAttackCD = now;playerHashiramaWoodGolemAttackCD = now;enemyHashiramaWoodGolemAttackCD = now;playerSasukeSlashCD = now;playerSasukeSubSkillCD = now;enemySasukeSlashCD = now;enemySasukeSubSkillCD = now;while (gameRunning) { drawBattleMap();if (_kbhit()) { char key = _getch();key = tolower(key);bool enemyRodControl = false;if (enemyRodHitting) { auto nowCheck = chrono::steady_clock::now();if (nowCheck < enemyRodHitEnd)enemyRodControl = true;else enemyRodHitting = false; }bool enemyBanshoControl = false;if (enemyBanshoTeninActive) { auto nowCheck = chrono::steady_clock::now();if (nowCheck < enemyBanshoTeninEnd)enemyBanshoControl = true;else enemyBanshoTeninActive = false; }bool enemyObitoRodControl = false;if (enemyObitoEnemyTrapped) { auto nowCheck = chrono::steady_clock::now();if (nowCheck < enemyObitoEnemyTrappedEnd)enemyObitoRodControl = true;else enemyObitoEnemyTrapped = false; }bool enemyHashiramaRodControl = false;if (enemyHashiramaEnemyTrapped) { auto nowCheck = chrono::steady_clock::now();if (nowCheck < enemyHashiramaWoodDragonTrapEnd)enemyHashiramaRodControl = true;else enemyHashiramaEnemyTrapped = false; }bool enemySasukeRodControl = false;if (enemySasukeAmaterasuHit) { auto nowCheck = chrono::steady_clock::now();if (nowCheck < enemySasukeAmaterasuEnd)enemySasukeRodControl = true;else enemySasukeAmaterasuHit = false; }bool canMove = !skillInProgress && !playerShinraTenseiActive && !enemySkillInProgress && !enemyRodControl && !enemyBanshoControl && !enemyObitoRodControl && !enemyHashiramaRodControl && !enemySasukeRodControl;bool canMoveInSpace = playerObitoKamuiSpaceActive;bool canAct = (!skillInProgress && !enemySkillInProgress && !enemyRodControl && !enemyObitoRodControl && !enemyHashiramaRodControl && !enemySasukeRodControl && !playerObitoKamuiSpaceActive) || playerBanshoTeninActive;if (canAct || canMoveInSpace || (playerShinraTenseiActive && key == 'i') || (playerObitoKamuiActive && key == 'i')) { switch (key) { case 'a':if ((canMove || canMoveInSpace) && player.x > 2 && player.x < enemy.x)player.x--;break;case 'd':if ((canMove || canMoveInSpace) && player.x < MAP_WIDTH - 2 && player.x < enemy.x - 1)player.x++;break;case 'k':if (!playerShinraTenseiActive && !playerObitoKamuiActive && !playerObitoKamuiSpaceActive)playerNormalAttack();break;case 'j':if (!playerShinraTenseiActive && !playerObitoKamuiSpaceActive)playerSkill1();break;case 'i':if (!playerObitoKamuiSpaceActive)playerSkill2();break;case 'o':if (!playerShinraTenseiActive && !playerObitoKamuiSpaceActive)playerUltimate();break;case 'u':if (!playerShinraTenseiActive && !playerObitoKamuiSpaceActive && playerCharacterType == 5)playerSasukeSubSkill();break; } }if (enemy.hp <= 0) { gameRunning = false;clearScreen();gotoxy(35, 10);setColor(10);cout << "胜利!按任意键返回...";_getch();return true; }if (player.hp <= 0) { gameRunning = false;clearScreen();gotoxy(35, 10);setColor(12);cout << "失败!按任意键返回...";_getch();return false; } }auto currentTime = chrono::steady_clock::now();if (chrono::duration_cast<chrono::milliseconds>(currentTime - lastEnemyAction).count() >= 1500) { enemyAI();lastEnemyAction = currentTime;if (player.hp <= 0) { gameRunning = false;clearScreen();gotoxy(35, 10);setColor(12);cout << "失败!按任意键返回...";_getch();return false; } }this_thread::sleep_for(chrono::milliseconds(30)); }return false; }

void selectCharacter() { vector<Character> chars = getAllCharacters();int selectedIndex = 0;bool selecting = true;while (selecting) { drawSelectScreen(selectedIndex);char key = _getch();key = tolower(key);switch (key) { case 'w':if (selectedIndex >= 5)selectedIndex -= 5;break;case 's':if (selectedIndex + 5 < chars.size())selectedIndex += 5;break;case 'a':if (selectedIndex > 0)selectedIndex--;break;case 'd':if (selectedIndex < chars.size() - 1)selectedIndex++;break;case 13:if (chars[selectedIndex].available) { player = chars[selectedIndex];player.maxHp = 300;player.hp = 300;playerCharacterType = player.characterType;vector<int> availableIndices;for (int i = 0;i < chars.size();i++) { if (chars[i].available)availableIndices.push_back(i); }int enemyIndex;do { enemyIndex = availableIndices[rand() % availableIndices.size()]; } while (enemyIndex == selectedIndex && availableIndices.size() > 1);enemy = chars[enemyIndex];enemy.maxHp = 300;enemy.hp = 300;enemyCharacterType = enemy.characterType;selecting = false;battleLoop(); } else { gotoxy(35, 32);setColor(12);cout << "该角色不可用!";this_thread::sleep_for(chrono::seconds(1)); }break; } } }

void launchScreen() { int selectedIndex = 0;bool launching = true;while (launching) { drawLaunchScreen(selectedIndex);char key = _getch();key = tolower(key);switch (key) { case 'w':if (selectedIndex > 0)selectedIndex--;break;case 's':if (selectedIndex < 3)selectedIndex++;break;case 13:switch (selectedIndex) { case 0:launching = false;selectCharacter();break;case 1:clearScreen();gotoxy(35, 12);setColor(14);cout << "该模式暂未开启!";gotoxy(30, 14);setColor(7);cout << "按任意键返回...";_getch();break;case 2:system("start https://blog.csdn.net/zhaozirui8290?spm=1000.2115.3001.5343");break;case 3:clearScreen();gotoxy(40, 12);setColor(12);cout << "感谢游玩!";gotoxy(35, 14);setColor(7);cout << "按任意键退出...";_getch();exit(0);break; }break; } } }

                                                                                                                                                                                    int main() { srand(time(nullptr));hideCursor();system("mode con cols=120 lines=36");system("title 火影忍者");while (true) { drawStartScreen();while (true) { if (_kbhit()) { char key = _getch();if (key == 13) { launchScreen();break; } } } }return 0; }
相关推荐
插件开发11 小时前
在VS2019编辑器环境中使用c++打造window服务程序基础框架详细步骤
c++·编辑器·服务程序
魔法阵维护师11 小时前
从零开发游戏需要学习的c#模块,第二十四章(场景管理 —— 标题、游戏、结束画面)
学习·游戏·c#
東雪木11 小时前
Java 基础语法与核心数据类型 专属复习笔记
java·开发语言·笔记·java面试
ch.ju11 小时前
Java程序设计(第3版)第四章——方法的重载
java·开发语言
ch.ju11 小时前
Java Programming Chapter 4——Overloading of method
java·开发语言
Teable任意门互动11 小时前
拆解 Teable 背后研发主体,开源多维表格平台实力与落地案例
开发语言·开源·excel·飞书·开源软件
吃好睡好便好11 小时前
用直接输入的方式创建矩阵
开发语言·人工智能·学习·线性代数·算法·matlab·矩阵
NiKick11 小时前
理解C++中的构造函数如何影响对象初始化
开发语言·c++
海上彼尚11 小时前
Nodejs也能写Agent - 9.Mastra篇 - Mastra客户端
开发语言·前端·javascript·人工智能·node.js