C++火影忍者1.1.2

更新宇智波泉奈

代码如下

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; int playerBorutoEnhancedAttackX = 0;

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;
bool playerHashiramaEnemyTrapped = false; chrono::steady_clock::time_point playerHashiramaWoodDragonTrapEnd;
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;
bool enemyHashiramaEnemyTrapped = false; chrono::steady_clock::time_point enemyHashiramaWoodDragonTrapEnd;
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;
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;
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;

bool playerIzunaSlashActive = false; chrono::steady_clock::time_point playerIzunaSlashEnd; chrono::steady_clock::time_point playerIzunaSlashCD;
bool playerIzunaFireballActive = false; chrono::steady_clock::time_point playerIzunaFireballEnd;
bool playerIzunaCounterActive = false; chrono::steady_clock::time_point playerIzunaCounterEnd;
bool playerIzunaCounterTriggered = false;
bool playerIzunaSwordActive = false; chrono::steady_clock::time_point playerIzunaSwordEnd;
chrono::steady_clock::time_point playerIzunaSword2ndWindow; bool playerIzunaSword2ndUsed = false;
bool playerIzunaUltimateActive = false;

bool enemyIzunaSlashActive = false; chrono::steady_clock::time_point enemyIzunaSlashEnd; chrono::steady_clock::time_point enemyIzunaSlashCD;
bool enemyIzunaFireballActive = false; chrono::steady_clock::time_point enemyIzunaFireballEnd;
bool enemyIzunaCounterActive = false; chrono::steady_clock::time_point enemyIzunaCounterEnd;
bool enemyIzunaCounterTriggered = false;
bool enemyIzunaSwordActive = false; chrono::steady_clock::time_point enemyIzunaSwordEnd;
bool enemyIzunaUltimateActive = false;

int enemyPhase = 0, enemyNormalAttackCount = 0; 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;
    chars.push_back({ "漩涡鸣人(九尾查克拉)",300,300,0,0,true,{{"螺旋丸",8,0,8,15,"O",1},{"九尾抓取",15,0,20,25,"------",0},{"尾兽玉",0,0,35,35,"0",3}},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,true,{{"万象天引",12,0,10,13,"\\/",5},{"神罗天征",15,0,8,15,"()",3},{"超神罗天征",0,0,50,50,"{}",5}},1 });
    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,true,{{"木遁-扦插/火遁-火龙卷",20,0,12,16,"-",15},{"神威/神威-空间",10,0,0,0,"()",5},{"十尾入侵",0,0,50,50,"*",5}},2 });
    chars.push_back({ "大筒木博人",300,300,0,0,true,{{"螺旋丸-涡彦/大筒木-飞行",18,0,8,12,"O",3},{"亚-飞雷神/超大玉螺旋丸",8,0,10,18,"----",5},{"楔",45,0,0,0,"*",60}},3 });
    chars.push_back({ "千手柱间",300,300,0,0,true,{{"木龙扦插之术/明神门",15,0,15,20,"~",8},{"木人之术",18,0,22,35,"¥",5},{"千手观音",0,0,80,80,"\\",3}},4 });
    chars.push_back({ "宇智波佐助(六道-阴)",300,300,0,0,true,{{"天照",10,0,5,5,"-",5},{"天手力",8,0,12,18,")",2},{"地爆天星-斩",0,0,20,35,"*",5}},5 });
    chars.push_back({ "宇智波泉奈",300,300,0,0,true,{{"火遁-豪火球",18,0,18,21,"-",3},{"宇智波流剑术",20,0,20,24,"-",3},{"宇智波的荣耀",0,0,40,40,"|",5}},6 });
    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 (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) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(13);cout << ")"; } else { playerSasukeSlashActive = false; } }
    if (enemySasukeSlashActive) { auto now = chrono::steady_clock::now();if (now < enemySasukeSlashEnd) { gotoxy(MAP_START_X + enemy.x - 1, 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; }
    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; }
    if (playerIzunaSlashActive) { auto now = chrono::steady_clock::now();if (now < playerIzunaSlashEnd) { gotoxy(MAP_START_X + player.x + 1, charY);setColor(9);cout << ")"; } else { playerIzunaSlashActive = false; } }
    if (enemyIzunaSlashActive) { auto now = chrono::steady_clock::now();if (now < enemyIzunaSlashEnd) { gotoxy(MAP_START_X + enemy.x - 1, charY);setColor(9);cout << ")"; } else { enemyIzunaSlashActive = false; } }
    if (playerIzunaFireballActive) { auto now = chrono::steady_clock::now();if (now < playerIzunaFireballEnd) { for (int i = 0;i < 6;i++) { int fx = player.x + 1 + i;if (fx < MAP_WIDTH && fx != enemy.x && fx != player.x) { gotoxy(MAP_START_X + fx, charY);setColor(12);cout << "-"; } }if (player.x + 7 < MAP_WIDTH) { gotoxy(MAP_START_X + player.x + 7, charY);setColor(14);cout << "*"; } } else { playerIzunaFireballActive = false; } }
    if (enemyIzunaFireballActive) { auto now = chrono::steady_clock::now();if (now < enemyIzunaFireballEnd) { for (int i = 0;i < 6;i++) { int fx = enemy.x - 1 - i;if (fx > 0 && fx != player.x && fx != enemy.x) { gotoxy(MAP_START_X + fx, charY);setColor(12);cout << "-"; } }if (enemy.x - 7 > 0) { gotoxy(MAP_START_X + enemy.x - 7, charY);setColor(14);cout << "*"; } } else { enemyIzunaFireballActive = false; } }
    if (playerIzunaSwordActive) { auto now = chrono::steady_clock::now();if (now < playerIzunaSwordEnd) { for (int i = 0;i < 3;i++) { int sx = player.x + 1 + i;if (sx < MAP_WIDTH && sx != enemy.x && sx != player.x) { gotoxy(MAP_START_X + sx, charY);setColor(9);cout << "-"; } } } }
    else { playerIzunaSwordActive = false; }
    if (enemyIzunaSwordActive) { auto now = chrono::steady_clock::now();if (now < enemyIzunaSwordEnd) { for (int i = 0;i < 3;i++) { int sx = enemy.x - 1 - i;if (sx > 0 && sx != player.x && sx != enemy.x) { gotoxy(MAP_START_X + sx, charY);setColor(9);cout << "-"; } } } }
    else { enemyIzunaSwordActive = false; }
    if (playerIzunaCounterActive && !playerIzunaCounterTriggered) { gotoxy(MAP_START_X + player.x, charY - 1);setColor(11);cout << "!"; }
    if (enemyIzunaCounterActive && !enemyIzunaCounterTriggered) { gotoxy(MAP_START_X + enemy.x, charY - 1);setColor(11);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; } }
    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 ucd = getRemainingCD(playerSkill3CDEnd);if (ucd > 0) { cout << " | O-楔(CD:" << ucd << "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 scd = getRemainingCD(playerSasukeSubSkillCD);if (scd > 0) { setColor(8);cout << "(CD:" << scd << "s)"; } else { setColor(10);cout << "(可用)"; } }setColor(7);if (playerSasukeSusanooActive && enemy.hp <= 65) { cout << " | O-地爆天星斩(可用)"; } else { cout << " | O-地爆天星斩(不可用)"; } }
    else if (playerCharacterType == 6) { 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-宇智波流剑术";auto nc = chrono::steady_clock::now();if (playerIzunaSword2ndWindow > nc && !playerIzunaSword2ndUsed) { setColor(10);cout << "(二段可用)"; } else if (cd2 > 0) { setColor(8);cout << "(CD:" << cd2 << "s)"; } else { setColor(10);cout << "(就绪)"; }setColor(7);cout << " | U-宇智波防反";int scd = getRemainingCD(playerSkill3CDEnd);if (scd > 0) { setColor(8);cout << "(CD:" << scd << "s)"; } else { setColor(10);cout << "(可用)"; }setColor(7);if (enemy.hp <= 70 && getRemainingCD(playerSkill3CDEnd) <= 0) { 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 d = abs(player.x - enemy.x);if (player.x < enemy.x && d >= 1 && d <= 3) { int dmg = 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], MAP_START_Y + CHARACTER_ROW);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 -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "玩家普攻造成 " << dmg << " 点伤害!     "; } 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 t = enemy.x - 1;if (t < player.x + 1)t = player.x + 1;while (player.x < t) { player.x++;if (player.x >= enemy.x) { player.x = enemy.x - 1;break; }drawBattleMap();this_thread::sleep_for(chrono::milliseconds(50)); }int sx = player.x + 1;if (sx < enemy.x && sx != enemy.x && sx != player.x) { gotoxy(MAP_START_X + sx, MAP_START_Y + CHARACTER_ROW);setColor(14);cout << "O"; }this_thread::sleep_for(chrono::seconds(1));if (sx < enemy.x && sx != enemy.x && sx != player.x) { gotoxy(MAP_START_X + sx, MAP_START_Y + CHARACTER_ROW);cout << " "; }int dmg = rand() % 8 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "螺旋丸造成 " << dmg << " 点伤害!";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;bool caught = false;int len = 20;for (int i = 0;i < len;i++) { int cx = player.x + 1 + i;if (cx >= MAP_WIDTH || cx >= enemy.x)break;if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(14);cout << "-"; }if (cx == 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), MAP_START_Y + CHARACTER_ROW);setColor(14);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(500));for (int i = 0;i < len;i++) { int cx = player.x + 1 + i;if (cx >= MAP_WIDTH || cx >= enemy.x)break;if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (caught) { int dmg = rand() % 6 + 20;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "九尾抓取造成 " << dmg << " 点伤害!";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;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "尾兽玉蓄力中...";int sx = player.x + 1, ex = enemy.x - 1, dist = ex - sx, steps = 30;for (int i = 0;i <= steps;i++) { int cx = sx + (dist * i / steps);if (cx >= enemy.x)cx = enemy.x - 1;if (i > 0) { int px = sx + (dist * (i - 1) / steps);if (px >= enemy.x)px = enemy.x - 1;if (px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(14);cout << "0"; }this_thread::sleep_for(chrono::milliseconds(100)); }if (ex != enemy.x && ex != player.x) { gotoxy(MAP_START_X + ex, MAP_START_Y + CHARACTER_ROW);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() { 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, MAP_START_Y + CHARACTER_ROW);cout << " "; }playerPainRodActive = false;playerRodHitting = false; }int rx = player.x + 3;if (rx >= enemy.x)rx = enemy.x - 1;if (rx <= player.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "敌人太近!";return; }if (rx == enemy.x)rx = enemy.x - 1;playerPainRodActive = true;playerPainRodX = rx;playerPainRodEnd = chrono::steady_clock::now() + chrono::milliseconds(1500);int dmg = rand() % 3 + 4;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;if (rx == enemy.x - 1) { playerRodHitting = true;playerRodHitEnd = playerPainRodEnd;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "黑棒命中!造成" << dmg << "点伤害!"; } else { playerRodHitting = false;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "黑棒造成" << dmg << "点伤害!"; } }
                                                                                       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 tx = player.x + 2;if (tx >= MAP_WIDTH - 1)tx = MAP_WIDTH - 2;enemySkillInProgress = true;while (enemy.x > tx) { enemy.x--;if (enemy.x <= player.x) { enemy.x = player.x + 2;break; }drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }enemy.x = tx;playerBlackRodLeftX = enemy.x - 1;playerBlackRodRightX = enemy.x + 1;playerBanshoTeninActive = true;playerBanshoTeninEnd = now + chrono::seconds(5);int dmg = rand() % 4 + 10;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "万象天引造成" << dmg << "点伤害!";playerSkill1CDEnd = now + chrono::seconds(12);enemySkillInProgress = false; }
                                                                                       void finishPlayerShinraTensei() { for (int r = 1;r <= playerShinraTenseiRadius;r++) { int lx = player.x - r, rx = player.x + r;if (lx > 0 && lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }if (rx < MAP_WIDTH && rx != enemy.x && rx != player.x) { gotoxy(MAP_START_X + rx, MAP_START_Y + CHARACTER_ROW);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();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 dmg = getShinraTenseiDamage(1);bool hit = false;int lb = player.x - playerShinraTenseiRadius, rb = player.x + playerShinraTenseiRadius;if (enemy.x >= lb && enemy.x <= rb) { enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;hit = true; }for (int r = 1;r <= playerShinraTenseiRadius;r++) { int lx = player.x - r, rx = player.x + r;if (lx > 0 && lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);setColor(11);cout << "("; }if (rx < MAP_WIDTH && rx != enemy.x && rx != player.x) { gotoxy(MAP_START_X + rx, MAP_START_Y + CHARACTER_ROW);cout << ")"; } }gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << (hit ? "神罗天征造成" + to_string(dmg) + "点伤害!" : "神罗天征激活!再次按I叠加");this_thread::sleep_for(chrono::milliseconds(500)); } else { auto el = chrono::duration_cast<chrono::seconds>(now - playerShinraTenseiStart).count();if (el >= 3) { finishPlayerShinraTensei();return; }if (playerShinraTenseiStack < 5) { playerShinraTenseiStack++;playerShinraTenseiRadius++;playerShinraTenseiCurrentCD += 2;int dmg = getShinraTenseiDamage(playerShinraTenseiStack);bool hit = false;int lb = player.x - playerShinraTenseiRadius, rb = player.x + playerShinraTenseiRadius;if (enemy.x >= lb && enemy.x <= rb) { enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;hit = true; }for (int r = 1;r < playerShinraTenseiRadius;r++) { int lx = player.x - r, rx = player.x + r;if (lx > 0 && lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }if (rx < MAP_WIDTH && rx != enemy.x && rx != player.x) { gotoxy(MAP_START_X + rx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }for (int r = 1;r <= playerShinraTenseiRadius;r++) { int lx = player.x - r, rx = player.x + r;if (lx > 0 && lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);setColor(11);cout << "("; }if (rx < MAP_WIDTH && rx != enemy.x && rx != player.x) { gotoxy(MAP_START_X + rx, MAP_START_Y + CHARACTER_ROW);cout << ")"; } }gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << (hit ? "神罗天征第" + to_string(playerShinraTenseiStack) + "层造成" + to_string(dmg) + "点伤害!" : "扩大到第" + to_string(playerShinraTenseiStack) + "层"); }this_thread::sleep_for(chrono::milliseconds(500)); }auto cn = chrono::steady_clock::now();auto el = chrono::duration_cast<chrono::seconds>(cn - playerShinraTenseiStart).count();if (el >= 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 tx = MAP_WIDTH / 2;while (player.x != tx) { if (player.x < tx)player.x++;else player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }for (int s = 1;s <= 5;s++) { for (int r = 1;r <= s;r++) { int lx = player.x - r, rx = player.x + r;if (lx > 1 && lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);setColor(13);cout << "{"; }if (rx < MAP_WIDTH && rx != enemy.x && rx != player.x) { gotoxy(MAP_START_X + rx, MAP_START_Y + CHARACTER_ROW);cout << "}"; } }enemy.hp -= 10;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "超神罗天征第" << s << "秒造成10点伤害!";this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }for (int r = 1;r <= 5;r++) { int lx = player.x - r, rx = player.x + r;if (lx > 1 && lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }if (rx < MAP_WIDTH && rx != enemy.x && rx != player.x) { gotoxy(MAP_START_X + rx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }playerSkill1CDEnd = chrono::steady_clock::now();gotoxy(2, MAP_START_Y + MAP_HEIGHT + 5);cout << "万象天引CD已重置!";skillInProgress = false; }

                                                                                       void playerObitoNormalAttack() { if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!";return; }int d = abs(player.x - enemy.x);if (d < 1 || d>2) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "距离不合适!";return; }int kx = player.x + 1;if (kx >= enemy.x)kx = enemy.x - 1;if (kx <= player.x)return;playerObitoKickActive = true;playerObitoKickX = kx;playerObitoKickEnd = chrono::steady_clock::now() + chrono::milliseconds(1000);int dmg = rand() % 3 + 6;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "踢腿造成" << dmg << "点伤害!"; }
                                                                                       void playerObitoSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (playerObitoEnemyTrapped && !playerObitoFireActive) { int sx = player.x, tx = enemy.x - 3;if (tx < 2)tx = 2;skillInProgress = true;playerObitoFireActive = true;player.x = tx;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));int fx = player.x + 1;for (int i = 0;i < 8;i++) { int px = fx + i;if (px < MAP_WIDTH && px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);setColor(6);cout << "~"; } }int dmg = rand() % 5 + 14;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "火遁-火龙卷造成" << dmg << "点伤害!";this_thread::sleep_for(chrono::seconds(2));for (int i = 0;i < 8;i++) { int px = fx + i;if (px < MAP_WIDTH && px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }player.x = sx;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 hit = false;for (int i = 0;i < 30;i++) { int cx = player.x + 1 + i;if (cx >= MAP_WIDTH || cx >= enemy.x)break;if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(2);cout << "-"; }if (cx == enemy.x - 1) { hit = true;break; }this_thread::sleep_for(chrono::milliseconds(20)); }if (hit) { playerObitoEnemyTrapped = true;playerObitoEnemyTrappedEnd = now + chrono::seconds(15);int dmg = rand() % 5 + 12;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木遁-扦插命中!"; } else { playerObitoWoodSpikeActive = false;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "未命中!"; }for (int i = 0;i < 30;i++) { int cx = player.x + 1 + i;if (cx >= MAP_WIDTH || cx >= enemy.x)break;if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }playerSkill1CDEnd = now + chrono::seconds(hit ? 20 : 10);skillInProgress = false; }
                                                                                       void playerObitoSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive) { playerObitoKamuiActive = false;playerObitoKamuiSpaceActive = true;playerObitoSavedX = player.x;int tx = enemy.x - 1;if (tx < 1)tx = 1;player.x = tx;playerObitoEnemyInSpace = true;playerObitoKamuiSpaceEnd = now + chrono::seconds(3);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "神威-空间!";drawBattleMap();this_thread::sleep_for(chrono::milliseconds(500));for (int s = 0;s < 3;s++) { int dmg = rand() % 3 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;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;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "敌人被吐出!";playerSkill2CDEnd = now + chrono::seconds(10);return; }if (playerObitoEnemyTrapped && !playerObitoWoodStormActive) { skillInProgress = true;playerObitoWoodStormActive = true;int sx = player.x, tx = enemy.x - 5;if (tx < 2)tx = 2;player.x = tx;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));for (int i = 0;i < 20;i++) { int bx = player.x + 1 + i;if (bx >= MAP_WIDTH || bx >= enemy.x)break;if (bx != enemy.x && bx != player.x) { gotoxy(MAP_START_X + bx, MAP_START_Y + CHARACTER_ROW - 1);setColor(2);cout << "_";gotoxy(MAP_START_X + bx, MAP_START_Y + CHARACTER_ROW);setColor(2);cout << "-"; } }for (int s = 0;s < 6;s++) { if (abs(player.x - enemy.x) <= 20) { enemy.hp -= 8;if (enemy.hp < 0)enemy.hp = 0; }this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }for (int i = 0;i < 20;i++) { int bx = player.x + 1 + i;if (bx >= MAP_WIDTH)break;if (bx != enemy.x && bx != player.x) { gotoxy(MAP_START_X + bx, MAP_START_Y + CHARACTER_ROW - 1);cout << " ";gotoxy(MAP_START_X + bx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }player.x = sx;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 << "神威激活!按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 cy = MAP_START_Y + CHARACTER_ROW;int tby = cy - 5;for (int r = 0;r < 5;r++)for (int c = 0;c < 10;c++) { int x = player.x - 5 + c, y = tby - r;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 + tby - 5);setColor(10);cout << "@";this_thread::sleep_for(chrono::seconds(2));int bx = player.x;for (int s = 0;s < 25;s++) { int by = tby - 5 + s;if (by >= cy)break;if (s > 0) { int py = tby - 5 + s - 1;if (py < cy && py>0) { gotoxy(MAP_START_X + bx, MAP_START_Y + py);cout << " "; } }if (by > 0 && bx != enemy.x) { gotoxy(MAP_START_X + bx, MAP_START_Y + by);setColor(7);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(150)); }gotoxy(MAP_START_X + bx, MAP_START_Y + cy - 1);cout << " ";for (int r = 0;r < 5;r++)for (int c = 0;c < 10;c++) { int x = player.x - 5 + c, y = tby - r;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 + tby - 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() { if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!";return; }int d = abs(player.x - enemy.x);if (d < 1 || d>4) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "距离不合适!";return; }if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive)return;playerBorutoSwordActive = true;playerBorutoSwordSlashing = true;playerBorutoSwordEnd = chrono::steady_clock::now() + chrono::milliseconds(2000);playerBorutoSwordX = player.x + 1;int d1 = rand() % 3 + 7;enemy.hp -= d1;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "第一刀造成" << d1 << "点伤害!";this_thread::sleep_for(chrono::milliseconds(400));if (playerRodHitting || playerBanshoTeninActive || playerObitoEnemyTrapped || playerHashiramaEnemyTrapped || playerSasukeAmaterasuHit || playerIzunaCounterActive) { playerBorutoSwordActive = false;playerBorutoSwordSlashing = false;return; }int d2 = rand() % 4 + 7;enemy.hp -= d2;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "第二刀造成" << d2 << "点伤害!";this_thread::sleep_for(chrono::milliseconds(400));if (playerRodHitting || playerBanshoTeninActive || playerObitoEnemyTrapped || playerHashiramaEnemyTrapped || playerSasukeAmaterasuHit || playerIzunaCounterActive) { playerBorutoSwordActive = false;playerBorutoSwordSlashing = false;return; }int d3 = rand() % 5 + 8;enemy.hp -= d3;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "第三刀造成" << d3 << "点伤害!";playerBorutoSwordActive = false;playerBorutoSwordSlashing = false; }
                                                                                       void playerBorutoEnhancedAttack() { if (!playerBorutoFlying)return;if (playerBorutoEnhancedAttackCount >= 3)return;auto now = chrono::steady_clock::now();if (now < playerBorutoEnhancedAttackCD)return;playerBorutoEnhancedAttackCount++;playerBorutoEnhancedAttackCD = now + chrono::milliseconds(2500);int sx = player.x + 1, ex = enemy.x, steps = 25, lx = 0;for (int i = 0;i <= steps;i++) { int cx = sx + ((ex - sx) * i / steps);if (cx >= enemy.x)break;if (i > 0) { int px = sx + ((ex - sx) * (i - 1) / steps);if (px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(11);cout << "O"; }lx = cx;this_thread::sleep_for(chrono::milliseconds(100)); }int dmg = rand() % 7 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "强化螺旋丸造成" << dmg << "点伤害!";if (lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }
                                                                                       void playerBorutoSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();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 << "大筒木-飞行!";return; }if (now < playerSkill1CDEnd)return;skillInProgress = true;int tx = enemy.x - 3;if (tx < 2)tx = 2;while (player.x > tx) { player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }while (player.x < tx) { player.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }playerBorutoRasenganActive = true;playerBorutoRasenganEnd = now + chrono::seconds(3);playerBorutoRasenganHit = true;for (int s = 0;s < 3;s++) { int dmg = rand() % 5 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "螺旋丸涡彦第" << s + 1 << "秒造成" << dmg << "点伤害!";this_thread::sleep_for(chrono::seconds(1));if (enemy.hp <= 0)break; }playerBorutoRasenganActive = false;tx = enemy.x - 8;if (tx < 1)tx = 1;player.x = tx;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();if (playerBorutoKarmaActive) { if (playerBorutoFlying)return;if (now < playerSkill2CDEnd)return;skillInProgress = true;int bx = player.x + 1;for (int s = 0;s < 20;s++) { int cx = bx + s;if (cx >= enemy.x)break;if (s > 0) { gotoxy(MAP_START_X + cx - 1, MAP_START_Y + CHARACTER_ROW);cout << " "; }if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(11);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(50)); }int dmg = rand() % 6 + 15;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;playerBorutoBigRasenganHit = true;playerBorutoBigRasenganDotEnd = now + chrono::seconds(5);gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "超大玉螺旋丸造成" << dmg << "点伤害!";gotoxy(MAP_START_X + enemy.x - 1, MAP_START_Y + CHARACTER_ROW);cout << " ";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 dmg = rand() % 9 + 10;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "飞雷神·草薙剑造成" << dmg << "点伤害!";playerBorutoTeleportBack = true;return; }if (playerBorutoTeleported && playerBorutoTeleportBack) { auto ts = chrono::duration_cast<chrono::seconds>(now - playerBorutoTeleportTime).count();if (ts <= 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 << "楔激活!";skillInProgress = false; }

                                                                                       void playerHashiramaNormalAttack() { if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!";return; }int d = abs(player.x - enemy.x);if (d < 1 || d>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 dmg = rand() % 3 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "跺脚造成" << dmg << "点伤害!"; }
                                                                                       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 sx = player.x + 1;for (int i = 0;i < 15;i++) { int dx = sx + i;if (dx >= MAP_WIDTH || dx >= enemy.x)break;if (dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, MAP_START_Y + CHARACTER_ROW);setColor(2);cout << "~"; }this_thread::sleep_for(chrono::milliseconds(30)); }int dmg = rand() % 14 + 22;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "化龙造成" << dmg << "点伤害!";for (int i = 0;i < 15;i++) { int dx = sx + i;if (dx >= MAP_WIDTH || dx >= enemy.x)break;if (dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, MAP_START_Y + CHARACTER_ROW);cout << " "; } } }
                                                                                       void playerHashiramaSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (playerHashiramaEnemyTrapped && !playerHashiramaMyojinmonUsed) { skillInProgress = true;playerHashiramaMyojinmonActive = true;playerHashiramaMyojinmonUsed = true;int dmg = rand() % 16 + 20;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "明神门造成" << dmg << "点伤害!";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 sx = player.x + 1;bool hit = false;for (int i = 0;i < 20;i++) { int dx = sx + i;if (dx >= MAP_WIDTH || dx >= enemy.x)break;if (dx != enemy.x && dx != player.x) { gotoxy(MAP_START_X + dx, MAP_START_Y + CHARACTER_ROW);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 dmg = rand() % 6 + 15;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "木龙扦插命中!"; } 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 << "木人之术!";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;int tx = 15;while (player.x > tx) { player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int cy = MAP_START_Y + CHARACTER_ROW;for (int r = 0;r < 3;r++)for (int c = 0;c < 4;c++) { int gx = player.x - 1 + c, gy = cy - 3 - r;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 ax = player.x + 4 + i;if (ax < MAP_WIDTH && ax != enemy.x) { gotoxy(MAP_START_X + ax, cy);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 ax = player.x + 4 + i;if (ax < MAP_WIDTH) { gotoxy(MAP_START_X + ax, cy);cout << " "; } }for (int r = 0;r < 3;r++)for (int c = 0;c < 4;c++) { int gx = player.x - 1 + c, gy = cy - 3 - r;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);cout << " "; } }skillInProgress = false; }

                                                                                       void playerSasukeNormalAttack() { if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!";return; }int d = abs(player.x - enemy.x);if (d < 1 || d>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 sx = player.x + 3;for (int i = 0;i <= d;i++) { int cx = sx + i;if (cx >= enemy.x)break;if (i > 0) { int px = sx + (i - 1);for (int r = 0;r < 8;r++) { int sy = MAP_START_Y + CHARACTER_ROW - 2 - r;if (sy > 0) { gotoxy(MAP_START_X + px, MAP_START_Y + sy);cout << " "; } } }for (int r = 0;r < 8;r++) { int sy = MAP_START_Y + CHARACTER_ROW - 2 - r;if (sy > 0 && cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + sy);setColor(13);cout << "}"; } }this_thread::sleep_for(chrono::milliseconds(80)); }int lx = sx + d;if (lx >= enemy.x)lx = enemy.x - 1;for (int r = 0;r < 8;r++) { int sy = MAP_START_Y + CHARACTER_ROW - 2 - r;if (sy > 0) { gotoxy(MAP_START_X + lx, MAP_START_Y + sy);cout << " "; } }int dmg = rand() % 6 + 25;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "须佐能乎斩造成" << dmg << "点伤害!";if (playerSasukeSusanooSlashCount >= 3) { playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0; }return; }playerSasukeSlashActive = true;playerSasukeSlashEnd = now + chrono::milliseconds(500);playerSasukeSlashCD = now + chrono::milliseconds(1500);int sx = player.x + 1;for (int i = 0;i <= d;i++) { int cx = sx + i;if (cx >= enemy.x)break;if (i > 0) { int px = sx + (i - 1);if (px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(13);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lx = sx + d;if (lx >= enemy.x)lx = enemy.x - 1;if (lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }int dmg = rand() % 3 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "剑气造成" << dmg << "点伤害!"; }
                                                                                       void playerSasukeSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill1CDEnd)return;int d = abs(player.x - enemy.x);if (d > 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 << "天照!";skillInProgress = false; }
                                                                                       void playerSasukeSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill2CDEnd)return;skillInProgress = true;int tx = enemy.x - 5;if (tx < 1)tx = 1;player.x = tx;int dmg = rand() % 7 + 12;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "天手力造成" << dmg << "点伤害!";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;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 << "完全体须佐能乎!"; }
                                                                                       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;int tx = 5;while (player.x > tx) { player.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int cy = MAP_START_Y + CHARACTER_ROW;int d1 = rand() % 16 + 20;enemy.hp -= d1;if (enemy.hp < 0)enemy.hp = 0;for (int r = 0;r < 5;r++)for (int c = 0;c < 5;c++) { int bx = enemy.x - 2 + c, by = cy - 4 - r;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 r = 0;r < 8;r++) { int sx = player.x + 3, sy = cy - 2 - r;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 << "地爆天星斩造成" << d1 + 45 << "点伤害!";this_thread::sleep_for(chrono::seconds(2));for (int r = 0;r < 5;r++)for (int c = 0;c < 5;c++) { int bx = enemy.x - 2 + c, by = cy - 4 - r;if (bx > 0 && bx < MAP_WIDTH && by>0) { gotoxy(MAP_START_X + bx, MAP_START_Y + by);cout << " "; } }for (int r = 0;r < 8;r++) { int sx = player.x + 3, sy = cy - 2 - r;if (sx > 0 && sx < MAP_WIDTH && sy>0) { gotoxy(MAP_START_X + sx, MAP_START_Y + sy);cout << " "; } }playerSasukeSusanooActive = false;playerSasukeSusanooSlashCount = 0;skillInProgress = false; }

                                                                                       void playerIzunaNormalAttack() { if (player.x >= enemy.x) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "无法向后攻击!";return; }auto now = chrono::steady_clock::now();if (now < playerIzunaSlashCD)return;playerIzunaSlashActive = true;playerIzunaSlashEnd = now + chrono::milliseconds(2000);playerIzunaSlashCD = now + chrono::milliseconds(1500);int sx = player.x + 1, d = abs(player.x - enemy.x);for (int i = 0;i <= d;i++) { int cx = sx + i;if (cx >= enemy.x)break;if (i > 0) { int px = sx + (i - 1);if (px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(9);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lx = sx + d;if (lx >= enemy.x)lx = enemy.x - 1;if (lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }int dmg = rand() % 3 + 8;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "剑气造成" << dmg << "点伤害!"; }
                                                                                       void playerIzunaSkill1() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill1CDEnd)return;int d = abs(player.x - enemy.x);if (d > 8)return;skillInProgress = true;playerIzunaFireballActive = true;playerIzunaFireballEnd = now + chrono::milliseconds(1500);for (int i = 0;i < 8;i++) { int fx = player.x + 1 + i;if (fx < MAP_WIDTH && fx != enemy.x && fx != player.x) { gotoxy(MAP_START_X + fx, MAP_START_Y + CHARACTER_ROW);setColor(12);cout << "-"; }this_thread::sleep_for(chrono::milliseconds(30)); }if (player.x + 7 < MAP_WIDTH) { gotoxy(MAP_START_X + player.x + 7, MAP_START_Y + CHARACTER_ROW);setColor(14);cout << "*"; }int dmg = rand() % 4 + 18;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "火遁-豪火球造成" << dmg << "点伤害!";this_thread::sleep_for(chrono::milliseconds(500));for (int i = 0;i < 8;i++) { int fx = player.x + 1 + i;if (fx < MAP_WIDTH && fx != enemy.x && fx != player.x) { gotoxy(MAP_START_X + fx, MAP_START_Y + CHARACTER_ROW);cout << " "; } }playerIzunaFireballActive = false;playerSkill1CDEnd = now + chrono::seconds(18);skillInProgress = false; }
                                                                                       void playerIzunaSubSkill() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();if (now < playerSkill3CDEnd)return;if (playerIzunaCounterActive)return;playerIzunaCounterActive = true;playerIzunaCounterEnd = now + chrono::seconds(5);playerIzunaCounterTriggered = false;if (player.x > 2)player.x--;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "宇智波防反!"; }
                                                                                       void playerIzunaSkill2() { if (skillInProgress || enemySkillInProgress)return;auto now = chrono::steady_clock::now();int cy = MAP_START_Y + CHARACTER_ROW;if (playerIzunaSword2ndWindow > now && !playerIzunaSword2ndUsed) { playerIzunaSword2ndUsed = true;skillInProgress = true;for (int r = 0;r < 2;r++) { int sx = player.x + 1, d = abs(player.x - enemy.x), y = cy - 1 + r;for (int i = 0;i <= d;i++) { int cx = sx + i;if (cx >= enemy.x)break;if (i > 0) { int px = sx + (i - 1);if (px != enemy.x && px != player.x) { gotoxy(MAP_START_X + px, MAP_START_Y + y);cout << " "; } }if (cx != enemy.x && cx != player.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + y);setColor(9);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lx = sx + d;if (lx >= enemy.x)lx = enemy.x - 1;if (lx != enemy.x && lx != player.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + y);cout << " "; } }int dmg = rand() % 4 + 15;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "二段剑气造成" << dmg << "点伤害!";playerSkill2CDEnd = now + chrono::seconds(20);skillInProgress = false;return; }if (now < playerSkill2CDEnd)return;skillInProgress = true;playerIzunaSwordActive = true;playerIzunaSwordEnd = now + chrono::milliseconds(1000);for (int i = 0;i < 3;i++) { int sx = player.x + 1 + i;if (sx < MAP_WIDTH && sx != enemy.x && sx != player.x) { gotoxy(MAP_START_X + sx, cy);setColor(9);cout << "-"; } }int dmg = rand() % 5 + 20;enemy.hp -= dmg;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "宇智波流剑术造成" << dmg << "点伤害!";playerIzunaSword2ndWindow = now + chrono::seconds(3);playerIzunaSword2ndUsed = false;skillInProgress = false; }
                                                                                       void playerIzunaUltimate() { if (skillInProgress || enemySkillInProgress)return;if (enemy.hp > 70) { gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "对方HP需<=70!";return; }skillInProgress = true;int cy = MAP_START_Y + CHARACTER_ROW;int mx = MAP_WIDTH / 2;enemy.x = mx;for (int s = 0;s < 15;s++) { int ry = MAP_START_Y + s;for (int c = 0;c < MAP_WIDTH;c += 3) { if (c != player.x) { gotoxy(MAP_START_X + c, ry);setColor(12);cout << "|"; }if (c + 1 != player.x) { gotoxy(MAP_START_X + c + 1, ry);setColor(14);cout << "*"; } }this_thread::sleep_for(chrono::milliseconds(100));if (s > 0) { int py = MAP_START_Y + s - 1;for (int c = 0;c < MAP_WIDTH;c += 3) { gotoxy(MAP_START_X + c, py);cout << " ";gotoxy(MAP_START_X + c + 1, py);cout << " "; } } }enemy.hp -= 40;if (enemy.hp < 0)enemy.hp = 0;for (int i = 0;i < 3;i++) { int sx = player.x + 1 + i;if (sx < MAP_WIDTH) { gotoxy(MAP_START_X + sx, cy);setColor(9);cout << "-"; } }this_thread::sleep_for(chrono::seconds(1));enemy.hp -= 30;if (enemy.hp < 0)enemy.hp = 0;gotoxy(2, MAP_START_Y + MAP_HEIGHT + 4);cout << "宇智波的荣耀造成70点伤害!";for (int i = 0;i < 3;i++) { int sx = player.x + 1 + i;if (sx < MAP_WIDTH) { gotoxy(MAP_START_X + sx, cy);cout << " "; } }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();else if (playerCharacterType == 6)playerIzunaNormalAttack(); }
                                                                                       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();else if (playerCharacterType == 6)playerIzunaSkill1(); }
                                                                                       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();else if (playerCharacterType == 6)playerIzunaSkill2(); }
                                                                                       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();else if (playerCharacterType == 6)playerIzunaUltimate(); }
                                                                                       void enemyNarutoNormalAttack() { int d = abs(player.x - enemy.x);if (enemy.x > player.x && d >= 1 && d <= 3) { int dmg = 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 -= dmg;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 tx = player.x + 1;while (enemy.x > tx) { enemy.x--;if (enemy.x <= player.x) { enemy.x = player.x + 1;break; }this_thread::sleep_for(chrono::milliseconds(50)); }int dmg = rand() % 8 + 8;player.hp -= dmg;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 cx = enemy.x - 1 - i;if (cx <= 0 || cx <= player.x)break;if (cx == player.x + 1) { caught = true;break; } }this_thread::sleep_for(chrono::milliseconds(500));if (caught) { int dmg = rand() % 6 + 20;player.hp -= dmg;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 cy = MAP_START_Y + CHARACTER_ROW;if (enemyPainRodActive) { if (enemyPainRodX > 0 && enemyPainRodX < MAP_WIDTH && enemyPainRodX != player.x && enemyPainRodX != enemy.x) { gotoxy(MAP_START_X + enemyPainRodX, cy);cout << " "; }enemyPainRodActive = false;enemyRodHitting = false; }int rx = enemy.x - 3;if (rx <= player.x)rx = player.x + 1;if (rx >= enemy.x)return;if (rx == player.x)rx = player.x + 1;enemyPainRodActive = true;enemyPainRodX = rx;enemyPainRodEnd = chrono::steady_clock::now() + chrono::milliseconds(1500);int dmg = rand() % 3 + 4;player.hp -= dmg;if (player.hp < 0)player.hp = 0;if (rx == 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 tx = enemy.x - 2;while (player.x < tx) { player.x++;if (player.x >= enemy.x) { player.x = enemy.x - 2;break; }this_thread::sleep_for(chrono::milliseconds(30)); }player.x = tx;enemyBanshoTeninActive = true;enemyBanshoTeninEnd = now + chrono::seconds(5);int dmg = rand() % 4 + 10;player.hp -= dmg;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 dmg = rand() % 5 + 8;if (abs(player.x - enemy.x) <= 1) { player.hp -= dmg;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 tx = MAP_WIDTH / 2;while (enemy.x != tx) { if (enemy.x < tx)enemy.x++;else enemy.x--;this_thread::sleep_for(chrono::milliseconds(20)); }for (int s = 1;s <= 5;s++) { 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() { if (enemy.x <= player.x)return;int d = abs(player.x - enemy.x);if (d < 1 || d>2)return;int kx = enemy.x - 1;if (kx <= player.x)kx = player.x + 1;if (kx >= enemy.x)return;enemyObitoKickActive = true;enemyObitoKickX = kx;enemyObitoKickEnd = chrono::steady_clock::now() + chrono::milliseconds(1000);int dmg = rand() % 3 + 6;player.hp -= dmg;if (player.hp < 0)player.hp = 0;enemyNormalAttackCount++; }
                                                                                       void enemyObitoSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();int cy = MAP_START_Y + CHARACTER_ROW;if (enemyObitoEnemyTrapped && !enemyObitoFireActive) { int sx = enemy.x, tx = player.x + 3;if (tx >= MAP_WIDTH - 2)tx = MAP_WIDTH - 3;enemySkillInProgress = true;enemyObitoFireActive = true;enemy.x = tx;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));int fx = enemy.x - 1;for (int i = 0;i < 8;i++) { int px = fx - i;if (px > 0 && px != player.x && px != enemy.x) { gotoxy(MAP_START_X + px, cy);setColor(6);cout << "~"; } }int dmg = rand() % 5 + 14;player.hp -= dmg;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(2));for (int i = 0;i < 8;i++) { int px = fx - i;if (px > 0 && px != player.x && px != enemy.x) { gotoxy(MAP_START_X + px, cy);cout << " "; } }enemy.x = sx;enemyObitoFireActive = false;enemySkillInProgress = false;return; }if (now < enemySkill1CDEnd)return;enemySkillInProgress = true;enemyObitoWoodSpikeX = enemy.x - 1;enemyObitoWoodSpikeActive = true;enemyObitoWoodSpikeEnd = now + chrono::milliseconds(500);bool hit = false;for (int i = 0;i < 30;i++) { int cx = enemy.x - 1 - i;if (cx <= 0 || cx <= player.x)break;if (cx != player.x && cx != enemy.x) { gotoxy(MAP_START_X + cx, cy);setColor(2);cout << "-"; }if (cx == player.x + 1) { hit = true;break; }this_thread::sleep_for(chrono::milliseconds(20)); }if (hit) { enemyObitoEnemyTrapped = true;enemyObitoEnemyTrappedEnd = now + chrono::seconds(15);int dmg = rand() % 5 + 12;player.hp -= dmg;if (player.hp < 0)player.hp = 0; } else { enemyObitoWoodSpikeActive = false; }for (int i = 0;i < 30;i++) { int cx = enemy.x - 1 - i;if (cx <= 0 || cx <= player.x)break;if (cx != player.x && cx != enemy.x) { gotoxy(MAP_START_X + cx, cy);cout << " "; } }enemySkill1CDEnd = now + chrono::seconds(hit ? 20 : 10);enemySkillInProgress = false; }
                                                                                       void enemyObitoSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();int cy = MAP_START_Y + CHARACTER_ROW;if (enemyObitoKamuiActive && !enemyObitoKamuiSpaceActive) { enemyObitoKamuiActive = false;enemyObitoKamuiSpaceActive = true;enemyObitoSavedX = enemy.x;int tx = player.x + 1;if (tx >= MAP_WIDTH - 2)tx = MAP_WIDTH - 3;enemy.x = tx;enemyObitoPlayerInSpace = true;enemyObitoKamuiSpaceEnd = now + chrono::seconds(3);drawBattleMap();this_thread::sleep_for(chrono::milliseconds(500));for (int s = 0;s < 3;s++) { int dmg = rand() % 3 + 8;player.hp -= dmg;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;enemySkill2CDEnd = now + chrono::seconds(10);return; }if (enemyObitoEnemyTrapped && !enemyObitoWoodStormActive) { enemySkillInProgress = true;enemyObitoWoodStormActive = true;int sx = enemy.x, tx = player.x - 5;if (tx < 2)tx = 2;enemy.x = tx;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(300));for (int i = 0;i < 20;i++) { int bx = enemy.x + 1 + i;if (bx >= MAP_WIDTH || bx >= player.x)break;if (bx != player.x && bx != enemy.x) { gotoxy(MAP_START_X + bx, cy - 1);setColor(2);cout << "_";gotoxy(MAP_START_X + bx, cy);setColor(2);cout << "-"; } }for (int s = 0;s < 6;s++) { 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 bx = enemy.x + 1 + i;if (bx >= MAP_WIDTH)break;if (bx != player.x && bx != enemy.x) { gotoxy(MAP_START_X + bx, cy - 1);cout << " ";gotoxy(MAP_START_X + bx, cy);cout << " "; } }enemy.x = sx;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;int cy = MAP_START_Y + CHARACTER_ROW, tby = cy - 5;for (int r = 0;r < 5;r++)for (int c = 0;c < 10;c++) { int x = enemy.x - 5 + c, y = tby - r;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 + tby - 5);setColor(12);cout << "&";this_thread::sleep_for(chrono::seconds(2));player.hp -= 50;if (player.hp < 0)player.hp = 0;for (int r = 0;r < 5;r++)for (int c = 0;c < 10;c++) { int x = enemy.x - 5 + c, y = tby - r;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 + tby - 5);cout << " ";enemySkillInProgress = false; }

                                                                                       void enemyBorutoNormalAttack() { if (enemy.x <= player.x)return;int d = abs(player.x - enemy.x);if (d < 1 || d>4)return;if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive)return;enemyBorutoSwordActive = true;enemyBorutoSwordSlashing = true;enemyBorutoSwordEnd = chrono::steady_clock::now() + chrono::milliseconds(2000);enemyBorutoSwordX = enemy.x - 1;int d1 = rand() % 3 + 7;player.hp -= d1;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::milliseconds(400));if (enemyRodHitting || enemyBanshoTeninActive || enemyObitoEnemyTrapped || enemyHashiramaEnemyTrapped || enemySasukeAmaterasuHit || enemyIzunaCounterActive) { enemyBorutoSwordActive = false;enemyBorutoSwordSlashing = false;return; }int d2 = rand() % 4 + 7;player.hp -= d2;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::milliseconds(400));if (enemyRodHitting || enemyBanshoTeninActive || enemyObitoEnemyTrapped || enemyHashiramaEnemyTrapped || enemySasukeAmaterasuHit || enemyIzunaCounterActive) { enemyBorutoSwordActive = false;enemyBorutoSwordSlashing = false;return; }int d3 = rand() % 5 + 8;player.hp -= d3;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 tx = player.x + 3;if (tx >= MAP_WIDTH - 2)tx = MAP_WIDTH - 3;while (enemy.x < tx) { enemy.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }while (enemy.x > tx) { enemy.x--;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(30)); }enemyBorutoRasenganActive = true;enemyBorutoRasenganEnd = now + chrono::seconds(3);enemyBorutoRasenganHit = true;for (int s = 0;s < 3;s++) { int dmg = rand() % 5 + 8;player.hp -= dmg;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(1));if (player.hp <= 0)break; }enemyBorutoRasenganActive = false;tx = player.x + 8;if (tx >= MAP_WIDTH - 2)tx = MAP_WIDTH - 3;enemy.x = tx;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 bx = enemy.x - 1, cy = MAP_START_Y + CHARACTER_ROW;for (int s = 0;s < 20;s++) { int cx = bx - s;if (cx <= player.x)break;if (s > 0) { gotoxy(MAP_START_X + cx + 1, cy);cout << " "; }if (cx != player.x && cx != enemy.x) { gotoxy(MAP_START_X + cx, cy);setColor(11);cout << "O"; }this_thread::sleep_for(chrono::milliseconds(50)); }int dmg = rand() % 6 + 15;player.hp -= dmg;if (player.hp < 0)player.hp = 0;gotoxy(MAP_START_X + player.x + 1, cy);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 dmg = rand() % 9 + 10;player.hp -= dmg;if (player.hp < 0)player.hp = 0;enemyBorutoTeleportBack = true;return; }if (enemyBorutoTeleported && enemyBorutoTeleportBack) { auto ts = chrono::duration_cast<chrono::seconds>(now - enemyBorutoTeleportTime).count();if (ts <= 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 d = abs(player.x - enemy.x);if (d < 1 || d>5)return;enemyHashiramaStompActive = true;enemyHashiramaStompX = enemy.x - 1;enemyHashiramaStompEnd = chrono::steady_clock::now() + chrono::milliseconds(800);int dmg = rand() % 3 + 8;player.hp -= dmg;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 dmg = rand() % 16 + 20;player.hp -= dmg;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 sx = enemy.x - 1, cy = MAP_START_Y + CHARACTER_ROW;bool hit = false;for (int i = 0;i < 20;i++) { int dx = sx - i;if (dx <= 0 || dx <= player.x)break;if (dx != player.x && dx != enemy.x) { gotoxy(MAP_START_X + dx, cy);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 dmg = rand() % 6 + 15;player.hp -= dmg;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;int tx = MAP_WIDTH - 15;while (enemy.x < tx) { enemy.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int cy = MAP_START_Y + CHARACTER_ROW;for (int r = 0;r < 3;r++)for (int c = 0;c < 4;c++) { int gx = enemy.x - 1 + c, gy = cy - 3 - r;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 ax = enemy.x - 4 - i;if (ax > 0 && ax != player.x) { gotoxy(MAP_START_X + ax, cy);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 ax = enemy.x - 4 - i;if (ax > 0) { gotoxy(MAP_START_X + ax, cy);cout << " "; } }for (int r = 0;r < 3;r++)for (int c = 0;c < 4;c++) { int gx = enemy.x - 1 + c, gy = cy - 3 - r;if (gx > 0 && gx < MAP_WIDTH && gy>0) { gotoxy(MAP_START_X + gx, MAP_START_Y + gy);cout << " "; } }enemySkillInProgress = false; }

                                                                                       void enemySasukeNormalAttack() { if (enemy.x <= player.x)return;int d = abs(player.x - enemy.x);if (d < 1 || d>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 sx = enemy.x - 3;for (int i = 0;i <= d;i++) { int cx = sx - i;if (cx <= player.x)break;if (i > 0) { int px = sx - (i - 1);for (int r = 0;r < 8;r++) { int sy = MAP_START_Y + CHARACTER_ROW - 2 - r;if (sy > 0) { gotoxy(MAP_START_X + px, MAP_START_Y + sy);cout << " "; } } }for (int r = 0;r < 8;r++) { int sy = MAP_START_Y + CHARACTER_ROW - 2 - r;if (sy > 0 && cx != player.x && cx != enemy.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + sy);setColor(13);cout << "}"; } }this_thread::sleep_for(chrono::milliseconds(80)); }int lx = sx - d;if (lx <= player.x)lx = player.x + 1;for (int r = 0;r < 8;r++) { int sy = MAP_START_Y + CHARACTER_ROW - 2 - r;if (sy > 0) { gotoxy(MAP_START_X + lx, MAP_START_Y + sy);cout << " "; } }int dmg = rand() % 6 + 25;player.hp -= dmg;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 sx = enemy.x - 1;for (int i = 0;i <= d;i++) { int cx = sx - i;if (cx <= player.x)break;if (i > 0) { int px = sx - (i - 1);if (px != player.x && px != enemy.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (cx != player.x && cx != enemy.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(13);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lx = sx - d;if (lx <= player.x)lx = player.x + 1;if (lx != player.x && lx != enemy.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }int dmg = rand() % 3 + 8;player.hp -= dmg;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 d = abs(player.x - enemy.x);if (d > 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 tx = player.x + 5;if (tx >= MAP_WIDTH - 2)tx = MAP_WIDTH - 3;enemy.x = tx;int dmg = rand() % 7 + 12;player.hp -= dmg;if (player.hp < 0)player.hp = 0;enemySkill2CDEnd = now + chrono::seconds(8);enemySkillInProgress = false; }
                                                                                       void enemySasukeUltimate() { if (enemySkillInProgress || skillInProgress)return;if (!enemySasukeSusanooActive)return;if (player.hp > 65)return;enemySkillInProgress = true;int tx = MAP_WIDTH - 5;while (enemy.x < tx) { enemy.x++;drawBattleMap();this_thread::sleep_for(chrono::milliseconds(20)); }int d1 = rand() % 16 + 20;player.hp -= d1;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::seconds(2));player.hp -= 45;if (player.hp < 0)player.hp = 0;enemySasukeSusanooActive = false;enemySasukeSusanooSlashCount = 0;enemySkillInProgress = false; }

                                                                                       void enemyIzunaNormalAttack() { if (enemy.x <= player.x)return;auto now = chrono::steady_clock::now();if (now < enemyIzunaSlashCD)return;enemyIzunaSlashActive = true;enemyIzunaSlashEnd = now + chrono::milliseconds(2000);enemyIzunaSlashCD = now + chrono::milliseconds(1500);int sx = enemy.x - 1, d = abs(player.x - enemy.x);for (int i = 0;i <= d;i++) { int cx = sx - i;if (cx <= player.x)break;if (i > 0) { int px = sx - (i - 1);if (px != player.x && px != enemy.x) { gotoxy(MAP_START_X + px, MAP_START_Y + CHARACTER_ROW);cout << " "; } }if (cx != player.x && cx != enemy.x) { gotoxy(MAP_START_X + cx, MAP_START_Y + CHARACTER_ROW);setColor(9);cout << ")"; }this_thread::sleep_for(chrono::milliseconds(30)); }int lx = sx - d;if (lx <= player.x)lx = player.x + 1;if (lx != player.x && lx != enemy.x) { gotoxy(MAP_START_X + lx, MAP_START_Y + CHARACTER_ROW);cout << " "; }int dmg = rand() % 3 + 8;player.hp -= dmg;if (player.hp < 0)player.hp = 0;enemyNormalAttackCount++; }
                                                                                       void enemyIzunaSkill1() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill1CDEnd)return;int d = abs(player.x - enemy.x);if (d > 8)return;enemySkillInProgress = true;enemyIzunaFireballActive = true;enemyIzunaFireballEnd = now + chrono::milliseconds(1500);int cy = MAP_START_Y + CHARACTER_ROW;for (int i = 0;i < 8;i++) { int fx = enemy.x - 1 - i;if (fx > 0 && fx != player.x && fx != enemy.x) { gotoxy(MAP_START_X + fx, cy);setColor(12);cout << "-"; }this_thread::sleep_for(chrono::milliseconds(30)); }if (enemy.x - 7 > 0) { gotoxy(MAP_START_X + enemy.x - 7, cy);setColor(14);cout << "*"; }int dmg = rand() % 4 + 18;player.hp -= dmg;if (player.hp < 0)player.hp = 0;this_thread::sleep_for(chrono::milliseconds(500));for (int i = 0;i < 8;i++) { int fx = enemy.x - 1 - i;if (fx > 0 && fx != player.x && fx != enemy.x) { gotoxy(MAP_START_X + fx, cy);cout << " "; } }enemyIzunaFireballActive = false;enemySkill1CDEnd = now + chrono::seconds(18);enemySkillInProgress = false; }
                                                                                       void enemyIzunaSkill2() { if (enemySkillInProgress || skillInProgress)return;auto now = chrono::steady_clock::now();if (now < enemySkill2CDEnd)return;enemySkillInProgress = true;int cy = MAP_START_Y + CHARACTER_ROW;enemyIzunaSwordActive = true;enemyIzunaSwordEnd = now + chrono::milliseconds(1000);for (int i = 0;i < 3;i++) { int sx = enemy.x - 1 - i;if (sx > 0 && sx != player.x && sx != enemy.x) { gotoxy(MAP_START_X + sx, cy);setColor(9);cout << "-"; } }int dmg = rand() % 5 + 20;player.hp -= dmg;if (player.hp < 0)player.hp = 0;enemySkill2CDEnd = now + chrono::seconds(20);enemySkillInProgress = false; }
                                                                                       void enemyIzunaUltimate() { if (enemySkillInProgress || skillInProgress)return;if (player.hp > 70)return;enemySkillInProgress = true;int mx = MAP_WIDTH / 2;player.x = mx;int cy = MAP_START_Y + CHARACTER_ROW;for (int s = 0;s < 15;s++) { int ry = MAP_START_Y + s;for (int c = 0;c < MAP_WIDTH;c += 3) { if (c != enemy.x) { gotoxy(MAP_START_X + c, ry);setColor(12);cout << "|"; }if (c + 1 != enemy.x) { gotoxy(MAP_START_X + c + 1, ry);setColor(14);cout << "*"; } }this_thread::sleep_for(chrono::milliseconds(100));if (s > 0) { int py = MAP_START_Y + s - 1;for (int c = 0;c < MAP_WIDTH;c += 3) { gotoxy(MAP_START_X + c, py);cout << " ";gotoxy(MAP_START_X + c + 1, py);cout << " "; } } }player.hp -= 40;if (player.hp < 0)player.hp = 0;for (int i = 0;i < 3;i++) { int sx = enemy.x - 1 - i;if (sx > 0) { gotoxy(MAP_START_X + sx, cy);setColor(9);cout << "-"; } }this_thread::sleep_for(chrono::seconds(1));player.hp -= 30;if (player.hp < 0)player.hp = 0;for (int i = 0;i < 3;i++) { int sx = enemy.x - 1 - i;if (sx > 0) { gotoxy(MAP_START_X + sx, cy);cout << " "; } }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();else if (enemyCharacterType == 6)enemyIzunaNormalAttack(); }
                                                                                       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();else if (enemyCharacterType == 6)enemyIzunaSkill1(); }
                                                                                       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();else if (enemyCharacterType == 6)enemyIzunaSkill2(); }
                                                                                       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();else if (enemyCharacterType == 6)enemyIzunaUltimate(); }

                                                                                       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 (playerIzunaCounterActive) { auto now = chrono::steady_clock::now();if (now < playerIzunaCounterEnd)return;else playerIzunaCounterActive = 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 (enemyIzunaCounterActive) { auto now = chrono::steady_clock::now();if (now < enemyIzunaCounterEnd)return;else enemyIzunaCounterActive = false; }if (enemySkillInProgress || skillInProgress)return;if (playerShinraTenseiActive || enemyShinraTenseiActive)return;if (playerObitoKamuiActive && !playerObitoKamuiSpaceActive)return;auto now = chrono::steady_clock::now();int d = abs(player.x - enemy.x);double hr = (double)enemy.hp / enemy.maxHp;if (hr > 0.7)enemyAIMood = 0;else if (hr > 0.35)enemyAIMood = 1;else enemyAIMood = 2;bool s1 = (now >= enemySkill1CDEnd), s2 = (now >= enemySkill2CDEnd);int roll = rand() % 100;if (d <= 3) { if (s1 && roll < 30) { enemySkill1();enemyConsecutiveSkills++; } else if (s2 && roll < 55) { enemySkill2();enemyConsecutiveSkills++; } else if (roll < 80) { enemyNormalAttack();enemyConsecutiveSkills = 0; } else { if (enemyAIMood == 0 && enemy.x < MAP_WIDTH - 3)enemy.x++;else if (enemyAIMood == 2 && enemy.x > player.x + 1)enemy.x--;enemyConsecutiveSkills = 0; } } else if (d <= 6) { if (s1 && roll < 40) { enemySkill1(); } else if (s2 && roll < 30) { enemySkill2(); } else if (enemy.x > player.x + 2) { enemy.x--; }enemyConsecutiveSkills = 0; } else { if (enemy.x > player.x + 3) { enemy.x--; }enemyConsecutiveSkills = 0; } }

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;playerBorutoBigRasenganHit = false;playerBorutoEnhancedAttackCount = 0;enemyBorutoSwordActive = false;enemyBorutoRasenganActive = false;enemyBorutoMarkActive = false;enemyBorutoTeleported = false;enemyBorutoTeleportBack = false;enemyBorutoKarmaActive = false;enemyBorutoFlying = false;enemyBorutoEnhancedAttackCount = 0;playerHashiramaStompActive = false;playerHashiramaWoodDragonActive = false;playerHashiramaEnemyTrapped = false;playerHashiramaMyojinmonActive = false;playerHashiramaMyojinmonUsed = false;playerHashiramaWoodGolemActive = false;playerHashiramaWoodGolemAttackCount = 0;playerHashiramaUltimateActive = false;enemyHashiramaStompActive = false;enemyHashiramaWoodDragonActive = 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;playerIzunaSlashActive = false;playerIzunaFireballActive = false;playerIzunaCounterActive = false;playerIzunaCounterTriggered = false;playerIzunaSwordActive = false;playerIzunaSword2ndUsed = false;playerIzunaUltimateActive = false;enemyIzunaSlashActive = false;enemyIzunaFireballActive = false;enemyIzunaCounterActive = false;enemyIzunaCounterTriggered = false;enemyIzunaSwordActive = false;enemyIzunaUltimateActive = 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;playerIzunaSlashCD = now;playerIzunaSword2ndWindow = now;playerSasukeSlashCD = now;playerSasukeSubSkillCD = now;enemyIzunaSlashCD = now;enemySasukeSlashCD = now;enemySasukeSubSkillCD = now;while (gameRunning) { drawBattleMap();if (playerIzunaCounterActive && !playerIzunaCounterTriggered) { auto nc = chrono::steady_clock::now();if (nc >= playerIzunaCounterEnd) { playerIzunaCounterActive = false;playerSkill3CDEnd = nc + chrono::seconds(25); } }if (_kbhit()) { char key = _getch();key = tolower(key);bool canMove = !skillInProgress && !playerShinraTenseiActive && !enemySkillInProgress && !playerIzunaCounterActive;bool canAct = (!skillInProgress && !enemySkillInProgress && !playerIzunaCounterActive) || playerBanshoTeninActive;if (canAct || (playerShinraTenseiActive && key == 'i') || (playerObitoKamuiActive && key == 'i')) { switch (key) { case 'a':if (canMove && player.x > 2 && player.x < enemy.x)player.x--;break;case 'd':if (canMove && 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) { if (playerCharacterType == 5)playerSasukeSubSkill();else if (playerCharacterType == 6)playerIzunaSubSkill(); }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 ct = chrono::steady_clock::now();if (chrono::duration_cast<chrono::milliseconds>(ct - lastEnemyAction).count() >= 1500) { enemyAI();lastEnemyAction = ct;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> av;for (int i = 0;i < chars.size();i++) { if (chars[i].available)av.push_back(i); }int ei;do { ei = av[rand() % av.size()]; } while (ei == selectedIndex && av.size() > 1);enemy = chars[ei];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; }
相关推荐
basketball6161 小时前
C++ 中的 ptrdiff_t 详解
开发语言·c++
wunaiqiezixin1 小时前
互斥锁与自旋锁的区别
c++
月亮邮递员6162 小时前
Markdown语法总结
开发语言·前端·javascript
printfLILEI2 小时前
php中的类与对象以及反序列化
linux·开发语言·php
曹牧2 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
代码中介商2 小时前
深入解析STL中的stack、queue与priority_queue
开发语言·c++
彦为君2 小时前
JavaSE-07-异常机制
java·开发语言·后端·python·spring
OxyTheCrack2 小时前
【Golang】简述make与new内置函数以及两者的区别
开发语言·golang
Rain5092 小时前
mini-cc 的 MCP 协议:给 AI 装个 USB-C 接口
c语言·开发语言·前端·人工智能·架构·node.js·ai编程