开源软件:Windows10 devc+

部分Windows版本需要开管理员权限才能读取与保存存档;商店选择物品的方法用A和D来操作,退出商店用ESC;移动也是用A和D,炮口的方向使用W和S来切换,使用物品用对应的数字键。

制作不易,点赞是对我最大的鼓励,谢谢!

#include<bits/stdc++.h>
#include<windows.h>
#include<conio.h>
using namespace std;
struct asdfg{
	int x=10;
	int y=17;
	int h=100;
	int sp;	
	int par=1;
	bool dead=1;
	bool v;
	int coin=1000;
	int ammo=100;
	vector<int> bag;
	int bagnum=0;
}play;
struct PlayerData {
    string name;
    string password;
    int coins = 1000;
    int highScore = 0;
    bool ci[20]; 
}playtext;
struct hjkl{
	int x;
	int y;
	int par;
	bool use;
	int dev;
	bool team;
}ammo[1001];
struct zxcv{
	int x;
	int y;
	int par;
	bool dead=0;
	bool v;
	bool v2;
	bool v3;
}enemy[1001];
struct bnm{
	int x;
	int y;
	int par;
	int use;
}gift[100]; 
struct qwe{
	int x,y,par,h;
	bool u=0;
}boss;
struct iop{
	int x,y,par,h,t;
	bool u=0;
}bigboss; 
struct cnm{
	int x,y,h;
	int sx=0;
	int s[100];
	bool u=0;
}bplane[10];
char thing[5][3][3]{
{{' ',' ','L'},
{' ','/',' '},
{'/',' ',' '}},
{{' ','O',' '},
{' ','*',' '},
{' ',' ',' '}},
{{'^','^','^'},
{'#','#','#'},
{'#','#','#'}},
{{' ','|',' '},
{' ','|',' '},
{' ','#',' '}},
{{' ','!',' '},
{'#','^','#'},
{'#','+','#'}},
};
char bigBoss[5][5] = {
    { '[', 'O', 'O', 'O', ']' },  // 核心机身
    { '|', ' ', 'X', ' ', '|' },  // 机身中部(X为驾驶舱)
    { '=', '=', 'H', '=', '=' },  // 武器基座(H为连接部)
    { '>', '>', '|', '<', '<' },  // 双向炮管(俯视角度)
    { ' ', ' ', '|', ' ', ' ' }    // 前向主炮(可选)
};
ofstream g_gameLog;
void clear();
vector<int> ammopl; 
int price[10]{200,400,100,300,1000},cs[20]{3000,2500,5000,4000};
int mapx[60][20],am=0,randx[1000],ra=0,en=0,gi=0,tx=0,tx1,boss1n=0,bp=0,zt=0,ci[20];
bool boom=0,tell=0,zp=0;
int color(int x){
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),x);
}
// 保存存档
void savePlayerData(const PlayerData& data) {
	for(int i = 0; i < 20; i++) {
        playtext.ci[i] = ci[i];
    }
    std::ofstream outFile("player_data.dat", std::ios::binary);
    if (!outFile) {
        std::cerr << "无法打开文件保存数据" << std::endl;
        return;
    } 
    // 写入字符串长度和内容 
    //size_t nameLength = data.name.size();
    int nameLength=data.name.size();
    outFile.write(reinterpret_cast<const char*>(&nameLength), sizeof(nameLength));
    outFile.write(data.name.c_str(), nameLength);
    

    size_t passLength = data.password.size();
    outFile.write(reinterpret_cast<const char*>(&passLength), sizeof(passLength));
    outFile.write(data.password.c_str(), passLength);

    // 写入其他数据
    outFile.write(reinterpret_cast<const char*>(&data.coins), sizeof(data.coins));
    outFile.write(reinterpret_cast<const char*>(&data.highScore), sizeof(data.highScore));
    
    // 写入词条数据
    for(int i = 0; i < 20; i++) {
        outFile.write(reinterpret_cast<const char*>(&data.ci[i]), sizeof(bool));
    }

    outFile.close();
}

// 从文件加载玩家数据
bool loadPlayerData(PlayerData& data) {
    std::ifstream inFile("player_data.dat", std::ios::binary);
    if (!inFile) {
        std::cerr << "无法打开文件加载数据" << std::endl;
        return false;
    }

    // 读取名称
    size_t nameLength;
    inFile.read(reinterpret_cast<char*>(&nameLength), sizeof(nameLength));
    data.name.resize(nameLength);
    inFile.read(&data.name[0], nameLength);

    // 读取密码
    size_t passLength;
    inFile.read(reinterpret_cast<char*>(&passLength), sizeof(passLength));
    data.password.resize(passLength);
    inFile.read(&data.password[0], passLength);

    // 读取其他数据
    inFile.read(reinterpret_cast<char*>(&data.coins), sizeof(data.coins));
    inFile.read(reinterpret_cast<char*>(&data.highScore), sizeof(data.highScore));
    
    // 读取词条数据
    for(int i = 0; i < 20; i++) {
        inFile.read(reinterpret_cast<char*>(&data.ci[i]), sizeof(bool));
    }

    inFile.close();
    return true;
}
int dfp(int a1){
	if(a1==3){
		a1=13;
	}else if(a1==0){
		a1=10;
	}else if(a1==2){
		a1=12;
	}
	switch(a1){
		case(10):return ' ';break;
		case(13):return '*';break;
		case(101):return ' ';break;
		case(102):return '!';break;
		case(103):return ' ';break;
		case(104):return '/';break;
		case(105):return 'A';break;
		case(106):return '\\';break;
		case(107):return '|';break;
		case(108):return '+';break;
		case(109):return '|';break;
		case(111):return ' ';
		case(112):return '!';
		case(113):return ' ';
		case(114):return '#';
		case(115):return '^';
		case(116):return '#';
		case(117):return '#';
		case(118):return '+';
		case(119):return '#';
		case(200):return '.';break;
		case(201):return 'O';break;
		case(202):return '*';
		case(300):return 'A'; 
		case(301):return 'T';
		case(302):return 'O';
		case(400):return 'o';break;
		case(401):return 'o';break;
		case(402):return 'o';break;
		case(403):return 'o';break;
		case(404):return 'o';break;
		case(405):return 'o';break;
		case(12):return '#';break;
	}
}
void textcolor(int y, int x) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    WORD colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; // 默认白色
    
    // 获取当前单元格的字符值
    int cellValue = mapx[y][x];
    static DWORD lastTick = GetTickCount();
    DWORD currentTick = GetTickCount();
    bool blinkPhase = (currentTick % 400) < 200; // 闪烁周期
    
    // 根据不同的地图值设置颜色
    switch(cellValue) {
        // 玩家飞船 (多色设计)
        case 100: case 101: case 102: case 103: case 104: case 105: case 106: case 107: case 108: case 109:
        case 110: case 111: case 112: case 113: case 114: case 115: case 116: case 117: case 118: case 119:
            // 飞船主体 - 根据部位不同设置不同颜色
            if (cellValue == 105 || cellValue == 106) { // 机翼
                colorAttr = FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY; // 青色
            } else if (cellValue == 107 || cellValue == 109) { // 引擎/推进器
                colorAttr = FOREGROUND_RED | FOREGROUND_INTENSITY; // 亮红色
            } else { // 机身
                colorAttr = FOREGROUND_BLUE | FOREGROUND_INTENSITY; // 亮蓝色
            }
            break;
            
        // 普通子弹 (白色带闪烁尾迹)
        case 200:
            colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | 
                       (blinkPhase ? FOREGROUND_INTENSITY : 0);
            break;
            
        // 火箭子弹 (多色动态效果)
        case 201: {
            int colorShift = (currentTick / 100) % 3;
            switch(colorShift) {
                case 0: colorAttr = FOREGROUND_RED | FOREGROUND_INTENSITY; break;
                case 1: colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; break;
                case 2: colorAttr = FOREGROUND_GREEN | FOREGROUND_INTENSITY; break;
            }
            break;
        }
            
        // 火箭尾焰 (动态红色/橙色)
        case 202:
            colorAttr = FOREGROUND_RED | ((currentTick % 200 < 100) ? FOREGROUND_GREEN : 0) | FOREGROUND_INTENSITY;
            break;
            
        // 背景/太空 (黑色)
        case 0:
            colorAttr = 0;
            break;
            
        // 爆炸效果 (闪烁红色,无背景色)
        case 3:
            if (blinkPhase) {
                colorAttr = FOREGROUND_RED | FOREGROUND_INTENSITY;
            } else {
                colorAttr = FOREGROUND_RED | FOREGROUND_GREEN; // 橙色
            }
            break;
            
        // 岩石 (灰色带纹理效果)
        case 2: {
            int texture = (x + y + currentTick/300) % 3;
            switch(texture) {
                case 0: colorAttr = FOREGROUND_INTENSITY; break; // 亮灰
                case 1: colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break; // 白色
                case 2: colorAttr = FOREGROUND_RED | FOREGROUND_GREEN; break; // 黄色(模拟矿物反光)
            }
            break;
        }
            
        // 敌人 (动态红色系)
        case 300: case 301: case 302: {
            int colorMode = (currentTick / 150 + x + y) % 4;
            switch(colorMode) {
                case 0: colorAttr = FOREGROUND_RED; break;
                case 1: colorAttr = FOREGROUND_RED | FOREGROUND_INTENSITY; break;
                case 2: colorAttr = FOREGROUND_RED | FOREGROUND_GREEN; break; // 橙色
                case 3: colorAttr = FOREGROUND_RED | FOREGROUND_BLUE; break; // 紫色
            }
            break;
        }
            
        // 道具 (闪烁绿色系)
        case 400: case 401: case 402: case 403: case 404: case 405:
            if (blinkPhase) {
                colorAttr = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
            } else {
                colorAttr = FOREGROUND_GREEN | ((cellValue % 2) ? FOREGROUND_BLUE : 0);
            }
            break;
            
        // 特殊物品 (动态紫色)
        case 12: {
            int pulse = (currentTick / 50) % 8;
            if (pulse < 4) {
                colorAttr = FOREGROUND_RED | FOREGROUND_BLUE | (pulse % 2 ? FOREGROUND_INTENSITY : 0);
            } else {
                colorAttr = FOREGROUND_BLUE | ((pulse % 2) ? FOREGROUND_INTENSITY : 0);
            }
            break;
        }
    }
    
    // BOSS飞船多色渲染
    if (boss1n && (y == boss.y || y == boss.y+1) && (x >= boss.x-1 && x <= boss.x+1)) {
        if (boss.par == 0) { // 第一种BOSS形态
            if (y == boss.y && x == boss.x) { // 核心
                colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; // 黄色
            } else if (y == boss.y+1 && x == boss.x) { // 引擎
                colorAttr = FOREGROUND_RED | FOREGROUND_INTENSITY; // 亮红色
            } else { // 武器
                colorAttr = FOREGROUND_BLUE | FOREGROUND_INTENSITY; // 亮蓝色
            }
        } else { // 第二种BOSS形态
            int partColor = (x - boss.x + 1) + (y - boss.y) * 3;
            switch(partColor) {
                case 0: case 2: case 6: case 8: // 角落
                    colorAttr = FOREGROUND_RED | FOREGROUND_INTENSITY; break;
                case 1: case 3: case 5: case 7: // 边缘
                    colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY; break;
                case 4: // 中心
                    colorAttr = FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY; break;
            }
        }
    }
    
    // BIGBOSS多部位多色渲染
    if (bigboss.u && (y >= bigboss.y-2 && y <= bigboss.y+2) && (x >= bigboss.x-2 && x <= bigboss.x+2)) {
        char bossChar = bigBoss[y - (bigboss.y-2)][x - (bigboss.x-2)];
        switch(bossChar) {
            case 'O': // 核心部件 - 脉冲红色
                colorAttr = FOREGROUND_RED | ((currentTick % 200 < 100) ? FOREGROUND_INTENSITY : 0);
                break;
            case 'X': // 驾驶舱 - 闪烁青色
                colorAttr = FOREGROUND_GREEN | FOREGROUND_BLUE | 
                           (blinkPhase ? FOREGROUND_INTENSITY : 0);
                break;
            case 'H': // 武器基座 - 交替红黄
                colorAttr = (currentTick % 300 < 150) ? 
                    (FOREGROUND_RED | FOREGROUND_INTENSITY) : 
                    (FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
                break;
            case '|': // 主炮 - 强白色
                colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
                break;
            case '>': case '<': // 副炮 - 橙色
                colorAttr = FOREGROUND_RED | FOREGROUND_GREEN | 
                          ((currentTick % 150 < 75) ? FOREGROUND_INTENSITY : 0);
                break;
            case '[': case ']': // 外壳框架 - 暗红色
                colorAttr = FOREGROUND_RED;
                break;
            case '=': // 装甲板 - 金属灰
                colorAttr = FOREGROUND_INTENSITY;
                break;
            default: // 其他部分
                colorAttr = FOREGROUND_RED | FOREGROUND_BLUE; // 紫色
                break;
        }
    }
    
    // 应用颜色
    COORD coord = {static_cast<SHORT>(x), static_cast<SHORT>(y)};
    DWORD written;
    WriteConsoleOutputAttribute(hConsole, &colorAttr, 1, coord, &written);
}
void fastcls() {
    static HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    static CONSOLE_CURSOR_INFO oldCursor;
    static bool firstRun = true;
    if(firstRun) {
        CONSOLE_CURSOR_INFO cursor = {100, FALSE};
        GetConsoleCursorInfo(hOut, &oldCursor);
        SetConsoleCursorInfo(hOut, &cursor);
        firstRun = false;
    }
    SetConsoleCursorPosition(hOut, COORD{0,0});
    for(int i=0; i<3; i++) { 
        WriteConsoleA(hOut, " \b", 2, NULL, NULL); 
    }
}
void screen(){
	fastcls();
	//clear();
	if(boss1n){
		if(boss.par==0){
			mapx[boss.y][boss.x]=108;
			mapx[boss.y][boss.x+1]=108;
			mapx[boss.y][boss.x-1]=108;
			mapx[boss.y+1][boss.x]=109;
		}
	}
	for(int i=0;i<27;i++){
		cout<<"#";
		for(int ii=0;ii<20;ii++){
			cout<<char(dfp(mapx[i][ii]));
			
		}
		cout<<"#";
		cout<<endl;
	}
	cout<<endl<<endl; 
	 for(int i=0;i<20;i++){
	 	cout<<"--";
	 }cout<<endl<<endl;
	for(int i=0;i<20;i++){
	 	cout<<"--";
	 }cout<<endl;
}
void clear(){
	DWORD written;
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	for(int i=0;i<90;i++){
		COORD startPos = {0, i};
		SetConsoleCursorPosition(hConsole, startPos);
    	FillConsoleOutputCharacter(hConsole, ' ', 100, startPos, &written);
	}
	COORD startPos = {0, 0};
	SetConsoleCursorPosition(hConsole, startPos);
}
void ClearScreen() {
	if(bigboss.u){
		int xn=0,yn=0;
		for(int i=bigboss.y-2;i<=bigboss.y+1;i++){
			xn=0;
			for(int ii=bigboss.x-2;ii<=bigboss.x+2;ii++){
				mapx[i][ii]=bigBoss[yn][xn];
				xn++;
			}
			yn++;
		}
		mapx[bigboss.y+2][bigboss.x]='|';
	}
	if(boss1n){
		if(boss.par==0){
			mapx[boss.y][boss.x]=108;
			mapx[boss.y][boss.x+1]=108;
			mapx[boss.y][boss.x-1]=108;
			mapx[boss.y+1][boss.x]=109;
		}else if(boss.par==1){
			mapx[boss.y][boss.x]=105;
			mapx[boss.y][boss.x+1]=106;
			mapx[boss.y][boss.x-1]=104;
			mapx[boss.y+1][boss.x]=109;
		}
	}
	if(bp>0){
		for(int i=0;i<30;i++){
			if(bplane[i].u){
				mapx[bplane[i].y][bplane[i].x]=301;
			}
		}
	}
	int a2=0;if(play.dead==1){
	for(int i=play.y-1;i<=play.y+1;i++){
				for(int ii=play.x-1;ii<=play.x+1;ii++){
					if((i==play.y-1&&ii==play.x-1)||(i==play.y-1&&ii==play.x+1)){
						a2++;
						continue;
					}
					a2++;
					if(play.par==0){
						mapx[i][ii]=100+a2;
					}else if(play.par==1){
						mapx[i][ii]=110+a2;
					}
					
				}
			}}else{
				for(int i=play.y-1;i<=play.y+1;i++){
				for(int ii=play.x-1;ii<=play.x+1;ii++){
					mapx[i][ii]=3;
				}
			}
			}
	if(gi>=0){
		for(int i=0;i<100;i++){
			if(gift[i].use==1){
				mapx[gift[i].y][gift[i].x]=gift[i].par+400;
			}
		}
	}
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    if (hConsole == INVALID_HANDLE_VALUE) {
        std::cerr << "无法获取控制台句柄" << std::endl;
        exit(0);
    }
    for(int i=0;i<26;i++){
    	for(int ii=1;ii<=20;ii++){
  	  		  SHORT y = i;  // 行号(从0开始)
 		 	  SHORT x = ii;  // 列号(从0开始)
 	 		  COORD coord = {x, y};
   			  char buffer;
   			  DWORD charsRead;
  			  BOOL success = ReadConsoleOutputCharacterA(hConsole, &buffer, 1, coord, &charsRead);  
   			  if (!success || charsRead != 1) {
        	  	 std::cerr << "读取失败,错误代码: " << GetLastError() << std::endl;
      		 	 return ;
   			  }
   			  if(static_cast<int>(buffer)!=dfp(mapx[i][ii])){
   			  	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  			  	COORD startPos = {ii, i}; // 
    		  	DWORD written;
    		  	if(dfp(mapx[i][ii])>30){
    		  		FillConsoleOutputCharacter(hConsole, dfp(mapx[i][ii]), 1, startPos, &written);
    		  		textcolor(i,ii);
				  }
  			  	
					
				}
				
   			  
		}
	}
	//HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
  	COORD startPos = {24, 0}; // 
    DWORD written;
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    cout<<"炮向:"; 
	if(play.v){
		cout<<"前";
	}else{
		cout<<"后";
	}
    startPos = {24, 1};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    cout<<"heart:"<<play.h;
    startPos = {24, 2};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    cout<<"ammo:"<<play.ammo;
    startPos = {24, 6};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    startPos = {24, 3};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    cout<<"time:"<<tx1;
    startPos = {24, 4};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    cout<<"coin:"<<play.coin;
    startPos = {24, 5};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    if(boss1n){
    cout<<"boss:"<<boss.h;
	}
	if(bigboss.u==1){
		cout<<"bigboss:"<<bigboss.h;
	}
	startPos = {24, 6};
    SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    if(bigboss.u==1){
    	cout<<"warning:"<<bigboss.t;
	}
	for(int i=0;i<3;i++){
		startPos = {24, i+9};
    	SetConsoleCursorPosition(hConsole, startPos);
    	FillConsoleOutputCharacter(hConsole, ' ', 20, startPos, &written);
    	cout<<i+1<<".";
    	if(play.bag.size()<i+1){
    		cout<<"nothing";
    		continue;
		}
    	if(play.bag[i]==1){
    		cout<<"fix+";
		}
		else if(play.bag[i]==2){
    		cout<<"rocket";
		}
		else if(play.bag[i]==3){
    		cout<<"ammo+";
		}
		else if(play.bag[i]==4){
    		cout<<"X-ray";
		}
		else if(play.bag[i]==5){
    		cout<<"rush-Z";
		}
		else if(play.bag[i]==0||play.bag.begin()+i>play.bag.end()){
    		cout<<"nothing";
		}
	}
	startPos = {0, 29};
    SetConsoleCursorPosition(hConsole, startPos);
}
void speak(bool a1,int a2){
	DWORD written;
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD startPos = {0, 27};
	SetConsoleCursorPosition(hConsole, startPos);
    FillConsoleOutputCharacter(hConsole, ' ', 80, startPos, &written);
    tell=1;
	if(a1==0){
		if(a2==-1){
			cout<<"Game over";
		}
		if(a2==0){
		cout<<"coin!";
		return;
		}
		if(a2==1){
		cout<<"fix!";
		return;
		}
		if(a2==2){
		cout<<"ammo!";
		return;
		}
		if(a2==3){
		cout<<"rocket help!";
		return;
		}
		if(a2==4){
			cout<<"bang!";
			return;
		}
		if(a2==5){
		cout<<"enemies are comming!";
		return;
		}
		if(a2==6){
		cout<<"be careful of rocks!";
		return;
		}
		if(a2==7){
			cout<<"use the key of 'a' 'd' to move";
			return;
		}
		if(a2==8){
		cout<<"here we go!";
		return;
		}
		if(a2==9){
			cout<<"use the key of space to shoot";
			return;
		}
		if(a2==10){
			cout<<"use the key of 'w' 'd' to change the orientation of your space ship";
			return ;
		}
		if(a2==11){
			cout<<"use the key of '1' '2' '3' to use the things you buy";
			return;
		}
		if(a2==12){
			cout<<"use the key 'a' 'd' to change the thing you choose in the shop";
			return;
		}
		if(a2==13){
			cout<<"pick up the 'o' in the space to get some good things";
			return;
		}
		if(a2==14){
			cout<<"you can shoot the stone and enemy";
			return;
		}
		if(a2==100){
			cout<<"oh guy,you're great that you come";
			return;
		}
		if(a2==101){
			cout<<"but...";
			return;
		}
		if(a2==102){
			cout<<"there is a dart team ''Marzh'',you'll face marzh's attack";
			return;
		}
		if(a2==103){
			cout<<"good luck";
			return;
		}
		if(a2==104){
			cout<<"Marzh:Insects... you dare trespass into my domain?";
			return;
		}
		if(a2==105){
			cout<<"I used to be a horse wrangler,";
			return;
		}
		if(a2==106){
			cout<<"but now,I can kill you easily";
		}
		if(a2==107){
			cout<<"Do you even know who you're facing?";
			return;
		}
		if(a2==108){
			cout<<"PREPARE TO DIE!";
			return;
		}
		if(a2==109){
			cout<<"attack!";
			return;
		}
	}
}
void adicent(int x,int y){
	if(boss1n){
		if((x==boss.x-1||x==boss.x+1||x==boss.x)&&y==boss.y&&boss.y>5){
			boss.h-=10;
			if(boss.h<=0){
				boss.u=0;
				boss1n=0;
				for(int i=boss.x-1;i<=boss.x+1;i++){
					for(int ii=boss.y-1;ii<=boss.y+1;ii++){
						mapx[ii][i]=3;
					}
				}
				boom=1;
			}
			return ;
		}
	}
	if(bigboss.u){
		for(int i=bigboss.y;i<=bigboss.y+1;i++){
			for(int ii=bigboss.x-2;ii<=bigboss.x+2;ii++){
				if(i==y&&ii==x){
					bigboss.h-=10;
					if(bigboss.h<=0){
						for(int k=bigboss.y-2;k<=bigboss.y+2;k++){
							for(int kk=bigboss.x-2;kk<=bigboss.x+2;kk++){
								mapx[k][kk]=3;
							}
						}
						boom=1;
						play.coin+=1000;
						bigboss.u=0; 
					}
					return;
				}
			}
		}
	}
		int a1=0;
		for(int i=0;i<501;i++){
			if(a1>=en){
				return ;
			}
		if(enemy[i].dead==1){
			a1++;
			if(enemy[i].x==x&&enemy[i].y==y){
			enemy[i].dead=0;
			for(int i=y-1;i<=y+1;i++){
				for(int ii=x-1;ii<=x+1;ii++){
					mapx[i][ii]=3;
				}
			}
			
			boom=1;
			
			return ;
		}
		}
		
	}
	/*}else{
		int a1=0;
		for(int i=0;i<1000;i++){
			if(ammo[i].use==1){
				a1++;
				if(ammo[i].x==x&&ammo[i].y==y){
					ammo[i].use=0;
					return 1;
				}
			}
		}
	}*/
	
}
void ammox() {
    vector<int> to_keep;
    
    for (size_t i = 0; i < ammopl.size(); ++i) {
        int idx = ammopl[i];
        if (ammo[idx].use == 0) {
            continue;
        }

        mapx[ammo[idx].y][ammo[idx].x] = 0;
        if (ammo[idx].par == 1) {
            if (ammo[idx].dev == 0) mapx[ammo[idx].y+1][ammo[idx].x] = 0;
            else if (ammo[idx].dev == 1) mapx[ammo[idx].y][ammo[idx].x-1] = 0;
            else if (ammo[idx].dev == 2) mapx[ammo[idx].y-1][ammo[idx].x] = 0;
            else if (ammo[idx].dev == 3) mapx[ammo[idx].y][ammo[idx].x+1] = 0;
        }

        if (ammo[idx].dev == 0) ammo[idx].y--;
        else if (ammo[idx].dev == 1) ammo[idx].x++;
        else if (ammo[idx].dev == 2) ammo[idx].y++;
        else if (ammo[idx].dev == 3) ammo[idx].x--;

        if (mapx[ammo[idx].y][ammo[idx].x] != 0 && mapx[ammo[idx].y][ammo[idx].x] != 200 && 
            mapx[ammo[idx].y][ammo[idx].x] != 201 && mapx[ammo[idx].y][ammo[idx].x] != 202 && 
            mapx[ammo[idx].y][ammo[idx].x] != 3) {
            
            if (ammo[idx].par == 0) {
                if (((ammo[idx].y == play.y-1 && ammo[idx].x == play.x) || 
                    (ammo[idx].y == play.y && ammo[idx].x == play.x-1) ||
                    (ammo[idx].y == play.y+1 && ammo[idx].x == play.x) ||
                    (ammo[idx].y == play.y && ammo[idx].x == play.x+1)) && ammo[idx].team == 0) {
                    play.h -= 10;
                }
                else if (mapx[ammo[idx].y][ammo[idx].x] == 2) {
                    mapx[ammo[idx].y][ammo[idx].x] = 3;
                    boom = 1;
                }
                else if (ammo[idx].team == 1) {
                    adicent(ammo[idx].x, ammo[idx].y);
                }
            }
            else if (ammo[idx].par == 1) {
                for (int k = ammo[idx].y-1; k <= ammo[idx].y+1; k++) {
                    for (int ii = ammo[idx].x-1; ii <= ammo[idx].x+1; ii++) {
                        mapx[k][ii] = 3;
                        if (((k == play.y-1 && ii == play.x) || 
                            (k == play.y && ii == play.x-1) ||
                            (k == play.y+1 && ii == play.x) ||
                            (k == play.y && ii == play.x+1)) && ammo[idx].team == 0) {
                            play.h -= 10;
                        }
                        adicent(ammo[idx].x, ammo[idx].y);
                    }
                }
                boom = 1;
            }
            ammo[idx].use = 0;
            continue;
        }

        if (ammo[idx].y < 0 || ammo[idx].y > 26) {
            ammo[idx].use = 0;
            continue;
        }

        to_keep.push_back(idx);

        if (ammo[idx].par == 0) {
            mapx[ammo[idx].y][ammo[idx].x] = 200;
        }
        else if (ammo[idx].par == 1) {
            mapx[ammo[idx].y][ammo[idx].x] = 201;
            if (ammo[idx].dev == 0) mapx[ammo[idx].y+1][ammo[idx].x] = 202;
            else if (ammo[idx].dev == 1) mapx[ammo[idx].y][ammo[idx].x+1] = 202;
            else if (ammo[idx].dev == 2) mapx[ammo[idx].y-1][ammo[idx].x] = 202;
            else if (ammo[idx].dev == 3) mapx[ammo[idx].y][ammo[idx].x-1] = 202;
        }
    }

    ammopl = to_keep;
    am = ammopl.size();
}
void rock(int a1){
	for(int i=26;i>=0;i--){
		for(int ii=19;ii>=0;ii--){
			if(mapx[i][ii]==2){
				if((i+1==play.y&&ii==play.x+1)||(i+1==play.y&&ii==play.x-1)||(i+1==play.y-1&&ii==play.x)){
					mapx[i+1][ii]=3;
					boom=1;
					play.dead=0;
					continue;
				}
				mapx[i][ii]=0;
				mapx[i+1][ii]=2;
				continue;
			}
			if(mapx[i][ii]==3&&mapx[i+1][ii]==0){
				mapx[i][ii]=0;
				mapx[i+1][ii]=3; 
			}
		}
	}
	for(int i=1;i<=randx[0]%(a1+1);i++){
		mapx[0][randx[i]]=2;
	}
	ra=0;
}
void rands(){
	int a=0;
	struct timeb timeSeed;
    ftime(&timeSeed);
   	srand(timeSeed.time * 1000 + timeSeed.millitm); // milli time
    unsigned int range = a - 20 + 1;
	unsigned int crand = rand() % range + 20;
	randx[ra]=crand%20;
	ra++;
}
void enemyx(int a1,int p,bool v){
	int a2=0;
	en+=a1;
	if(v==1){
		for(int i=20;i<27;i++){
			for(int ii=0;ii<20;ii++){
				mapx[i][ii]=3;
				boom=1;
			}
		}
	}
	for(int i=0;i<=500;i++){
		if(a2==a1){
			return ;
		}
		if(enemy[i].dead==0){
			enemy[i].dead=1;
			enemy[i].par=p;
			enemy[i].v=v;
			enemy[i].v3=v;
			if(enemy[i].v){
				enemy[i].y=26;
			}else{
				enemy[i].y=0;
			}
			enemy[i].x=20/a1*a2;
			//enemy[i].x=10;
			enemy[i].v2=randx[a2]%2;
			a2++;
		}
	}
	ra=0;
}
void enemy2(){
	int a1=0;
	for(int i=0;i<=500;i++){
		if(a1==en){
			return;
		}
		if(enemy[i].dead==1){
			a1++;
			mapx[enemy[i].y][enemy[i].x]=0;
			if(enemy[i].v2){
				enemy[i].x++;
			}else{
				enemy[i].x--;
			}
			if(enemy[i].x>=26){
				enemy[i].v2=0;
			}else if(enemy[i].x<=1){
				enemy[i].v2=1;
			}
			if(enemy[i].v3){
				if(mapx[enemy[i].y-1][enemy[i].x]==2){
					mapx[enemy[i].y-1][enemy[i].x]=3;
					enemy[i].dead=0;
					continue;
				}else if(mapx[enemy[i].y-1][enemy[i].x]==200||mapx[enemy[i].y-1][enemy[i].x]==201){
					
				}
				enemy[i].y--;
			}else{
				if(mapx[enemy[i].y+1][enemy[i].x]==2){
					mapx[enemy[i].y+1][enemy[i].x]=3;
					enemy[i].dead=0;
						continue;
				}
				enemy[i].y++;
			}
		if(enemy[i].y==22||enemy[i].y==6||enemy[i].y==0||enemy[i].y==26){
			if(enemy[i].v3){
				enemy[i].v3=0;
			}else{
				enemy[i].v3=1;
			}
		}
		if(enemy[i].par==0){
			if(enemy[i].v){
				mapx[enemy[i].y][enemy[i].x]=300;
			}else{
				mapx[enemy[i].y][enemy[i].x]=301;
			}
			
		}else if(enemy[i].par==1){
			mapx[enemy[i].y][enemy[i].x]=301;
		}
		}
		
}
	
	}
void bplane2(){
	int a1=0;
	for(int i=0;i<9;i++){
		if(a1>bp){
			return;
		}
		if(bplane[i].u==1){
			a1++;
			mapx[bplane[i].y][bplane[i].x]=0;
			if(bplane[i].s[bplane[i].sx]==0){
				bplane[i].y++;
				bplane[i].x--;
			}else if(bplane[i].s[bplane[i].sx]==1){
				bplane[i].y++;
			}else if(bplane[i].s[bplane[i].sx]==2){
				bplane[i].y++;
				bplane[i].x++;
			}
			bplane[i].sx++;
			//mapx[bplane[i].y][bplane[i].x]=301;
			if(bplane[i].sx==17){
				bplane[i].u=0;
				for(int ii=bplane[i].y-1;ii<=bplane[i].y+1;ii++){
					for(int iii=bplane[i].x-1;iii<bplane[i].x+1;iii++){
						mapx[ii][iii]=3;
						adicent(iii,ii);
					}
				}
				boom=1;
			}
		}
	}
}
void attack() {
    for (int k = 0; k <= 500; k++) {
        if (enemy[k].dead == 1) {
            for (int i = 0; i < 1001; i++) {
                if (ammo[i].use == 0) {
                    if (enemy[k].x < 0 || enemy[k].x >= 20 || 
                        enemy[k].y < 0 || enemy[k].y >= 27) continue;
                        
                    ammo[i].use = 1;
                    ammo[i].x = enemy[k].x;
                    ammo[i].y = enemy[k].v ? enemy[k].y-1 : enemy[k].y+1;
                    ammo[i].par = enemy[k].par;
                    ammo[i].dev = enemy[k].v ? 0 : 2;
                    ammo[i].team = 0;
                    ammopl.push_back(i);
                    am = ammopl.size();
                    break;
                }
            }
        }
    }
}
void giftx(){
	int a1=0,a2=0;gi++;
	for(int i=0;i<abs(randx[0]+randx[1]+1)%(randx[0]+1)+1;i++){
		if(mapx[0][a1]==2){
			continue;
		}
		if(a1==20){
			a1=0;
		}
		a1++;
		a2++;
		if(a2>=25){
			break;
		}
	}
	for(int i=0;i<100;i++){
		if(gift[i].use==0){
			gift[i].use=1;
			gift[i].y=0;
			gift[i].x=a1;
			gift[i].par=randx[4]%5;
			break;
		}
	}
	ra=0;
}
void gift2(){
	for(int i=0;i<100;i++){
		if(gift[i].use==1){
			mapx[gift[i].y][gift[i].x]=0;
			gift[i].y++;
			if(((gift[i].x==play.x&&gift[i].y==play.y)||(gift[i].x==play.x-1&&gift[i].y==play.y)||(gift[i].x==play.x+1&&gift[i].y==play.y)||(gift[i].x==play.x&&gift[i].y==play.y+1)||(gift[i].x==play.x-1&&gift[i].y==play.y+1)||(gift[i].x==play.x+1&&gift[i].y==play.y+1))&&gift[i].use){
			gift[i].use=0;
			if(gift[i].par==0){
				play.h+=20;
				speak(0,1);
			}else if(gift[i].par==1){
				play.coin+=100;
				speak(0,0);
			}else if(gift[i].par==2){
				play.ammo+=100;
				speak(0,2);
			}
		}
		if(gift[i].y>=27){
			gift[i].use=0;
		}
		}
		
	}
}
void bossx(){
	mapx[boss.y][boss.x]=0;
	mapx[boss.y][boss.x+1]=0;
	mapx[boss.y][boss.x-1]=0;
	mapx[boss.y+1][boss.x]=0;
	if(boss.y<7){
		boss.y++;
		return;
	}
	if(boss.x>play.x){
		boss.x--;
	}else if(boss.x<play.x){
		boss.x++;
	}
	if(abs(boss.x-play.x)<3){
	if(boss.par==0){
		for(int k=-1;k<=1;k++){
			for(int i=0;i<1001;i++){
				if(ammo[i].use==0){
					ammo[i].use=1;
					ammo[i].x=boss.x+k;
					if(k==0){
						ammo[i].y=boss.y;
					}else{
						ammo[i].y=boss.y-1;	
					}									
					ammo[i].par=0;
					ammo[i].dev=2;	
					ammo[i].team=0;
					am++;
					ammopl.push_back(i);
					break;
				}	
			}
		}	
		}else if(boss.par==1){
			for(int i=0;i<1001;i++){
				if(ammo[i].use==0){
					ammo[i].use=1;
					ammo[i].x=boss.x;
					ammo[i].y=boss.y+1;									
					ammo[i].par=1;
					ammo[i].dev=2;	
					ammo[i].team=0;
					am++;
					ammopl.push_back(i);
					break;
					}	
				}
		}
		
	}
}
bool dfs(int s,int par,int x,int y){
	if((y==play.y&&x==play.x)||(y==play.y&&x==play.x-1)||(y==play.y&&x==play.x+1)){
		return 1;
	}
	if(y>20||x<0||x>=20){
		return 0;
	}
	for(int i=0;i<3;i++){
		if(i==1){
			if(mapx[y+1][x]!=3){
				bplane[par].s[s]=i;
				if(dfs(s+1,par,x,y+1)){
					return 1;
				}
			}
		}
		if(i==0){
			if(mapx[y+1][x-1]!=3){
				bplane[par].s[s]=i;
				if(dfs(s+1,par,x-1,y+1)){
					return 1;
				}
			}
		}
		if(i==2){
			if(mapx[y+1][x+1]!=3){
				bplane[par].s[s]=i;
				if(dfs(s+1,par,x+1,y+1)){
					return 1;
				}
			}
		}
	}
}
void bplanex(int a1){
	bool ok=0;
	for(int i=0;i<a1;i++){
		ok=0;
		for(int k=0;k<30;k++){
			if(bplane[k].u){
				continue;
			}
			for(int ii=0;ii<20;ii++){
				if(dfs(0,k,ii,0)){
					bplane[k].h=50;
					bplane[k].y=0;
					bplane[k].x=ii;
					bplane[k].u=1;
					bplane[k].sx=0;
					bp++;
					ok=1;
					break;
				}else{
					memset(bplane[k].s,0,sizeof(bplane[k].s));
				}
			}	
			if(ok){
				break;
			}
		}
		
		
	}
}
int xa[3];
void clearshop(int a1,int a2,int a3,int ax){
	xa[0]=a1;
	xa[1]=a2;
	xa[2]=a3;
	clear();
	DWORD written;
	HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD startPos = {0, 0};
	SetConsoleCursorPosition(hConsole, startPos);
	cout<<"      small shop"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"#                     #"<<endl;
	cout<<"code "<<xa[0]<<" "<<xa[1]<<" "<<xa[2];
	startPos = {3, 5};
	SetConsoleCursorPosition(hConsole, startPos);
	
	for(int i=0;i<3;i++){
		for(int ii=0;ii<3;ii++){
			startPos = {3+7*i, 5+ii};
			SetConsoleCursorPosition(hConsole, startPos);
			for(int iii=0;iii<3;iii++){
				cout<<thing[xa[i]-1][ii][iii];
			}
		}
		startPos = {2+i*7, 8};
		SetConsoleCursorPosition(hConsole, startPos);
		if(xa[i]==1){
			cout<<"fix+";
		}else if(xa[i]==2){
			cout<<"rocket";
		}else if(xa[i]==3){
			cout<<"ammo+";
		}else if(xa[i]==4){
			cout<<"X-ray";
		}else if(xa[i]==5){
			cout<<"rush-Z";
		}
		startPos = {2+i*7, 9};
		SetConsoleCursorPosition(hConsole, startPos);
		cout<<price[xa[i]-1]<<"$"; 
	}
	if(ax==1){
		COORD startPos = {4, 10};
		SetConsoleCursorPosition(hConsole, startPos);
	}else if(ax==2){
		COORD startPos = {10, 10};
		SetConsoleCursorPosition(hConsole, startPos);
	}else if(ax==3){
		COORD startPos = {16, 10};
		SetConsoleCursorPosition(hConsole, startPos);
	}
	cout<<"^";
	startPos = {1, 12};
	SetConsoleCursorPosition(hConsole, startPos);
	cout<<"coin:"<<play.coin;
	startPos = {1, 13};
	SetConsoleCursorPosition(hConsole, startPos);
	cout<<"use 'a' 'd' to change the thing you choose , use 'esc' to quit";
}
int xa2[3];
int buy(int a2,int a3,int a4,int a1){
	a1--;
	xa2[0]=a2;
	xa2[1]=a3;
	xa2[2]=a4;
	if(xa2[a1]==1){
		if(play.coin>=200&&play.bagnum<3){
		play.coin-=200;	
		play.bag.push_back(xa2[a1]);
		play.bagnum++;
		return 1;	
	}else{
		return 0;
	} 
	}
	if(xa2[a1]==2){
		if(play.coin>=400&&play.bagnum<3){
		play.coin-=400;
		play.bag.push_back(xa2[a1]);
		play.bagnum++;
			return 1;
	}else return 0;
	}
	if(xa2[a1]==3){
		if(play.coin>=100&&play.bagnum<3){
		play.coin-=100;
		play.bag.push_back(xa2[a1]);
		play.bagnum++;						
	}else return 0;
	}
	if(xa2[a1]==4){
		if(play.coin>=300&&play.bagnum<3){
		play.coin-=300;
		play.bag.push_back(xa2[a1]);
		play.bagnum++;						
	}else return 0;
	}
	if(xa2[a1]==5){
		if(play.coin>=1000&&play.bagnum<3){
		play.coin-=1000;
		play.bag.push_back(xa2[a1]);
		play.bagnum++;						
	}else return 0;
	}
		
}
void shop(){
	clear();
	int a1,a2=1,a3=randx[4]%5+1,a4=randx[5]%5+1,a5=randx[6]%5+1;
	clearshop(a3,a4,a5,a2);
	while(1){
		if(_kbhit()){
			a1=getch();
			if(a1=='a'&&a2-1>0){
				a2--;
			}
			if(a1=='d'&&a2+1<4){
				a2++;
			}
			if(a1==27){
				break;
			}
			if(a1==32){
				buy(a3,a4,a5,a2);
			}
			clearshop(a3,a4,a5,a2);
		}	
	}
	
	clear();
	screen();
	}
void baguse(int a1){
	a1--;
	if(play.bag.begin()+a1>play.bag.end()){
		return;
	}
	if(play.bag[a1]==1){
		play.h+=100;
	}else if(play.bag[a1]==2){
		am+=3;
		for(int i=play.x-1;i<=play.x+1;i++){
			for(int ii=0;ii<500;ii++){
				if(ammo[ii].use==0){
					ammo[ii].use=1;
					ammo[ii].y=27;
					ammo[ii].x=i;
					ammo[ii].dev=0;
					ammo[ii].team=0;
					ammo[ii].par=1;
					break;
				}
			}			
		}
	}else if(play.bag[a1]==3){
		play.ammo+=100;
	}else if(play.bag[a1]==4){
		for(int i=play.x-1;i<=play.x+1;i++){
			for(int ii=play.y;ii>=0;ii--){
				if(mapx[ii][i]==2){
					mapx[ii][i]=3;
					
				}
			}
		}
		boom=1;
	}else if(play.bag[a1]==5){
		zp=1;
		play.h=1000;
		zt=30000;
	}
	play.bag.erase(play.bag.begin()+a1);
}
void bigbossx(){
	for(int i=bigboss.y-2;i<=bigboss.y+2;i++){
		for(int ii=bigboss.x-2;ii<=bigboss.x+2;ii++){
			mapx[i][ii]=0;
		}
	}
	if(bigboss.x==0&&bigboss.y==0){
		for(int i=0;i<10;i++){
			for(int ii=0;ii<20;ii++){
				if(mapx[i][ii]==2){
					mapx[i][ii]=3;
				}
			}
		}
		bigboss.x=10;
		bigboss.y=7;
		return ;
	}
	if(bigboss.x>play.x&&bigboss.x-4>=0){
		bigboss.x--;
	}else if(bigboss.x<play.x&&bigboss.y+4<20){
		bigboss.x++; 
	}
	if(bigboss.t<=0){
		bigboss.t=5; 
		int a1=randx[0]%3;
		if(a1==0){
			enemyx(5,0,0);
		}
		else if(a1==1){
			int a2=0;
			am+=3;
			for(int k=-2;k<=2;k++){
				for(int i=a2;i<1000;i++){
					if(ammo[i].use==0){
						ammo[i].use=1;
						ammo[i].par=1;
						ammo[i].dev=2;
						ammo[i].team=0;
						ammo[i].x=bigboss.x+k;
						ammo[i].y=bigboss.y+3;
						ammopl.push_back(i);
						break;
					}
					a2++;
				}
			}
			
		}else if(a1==2){
			enemyx(5,0,1);
		}
	}else{
		bigboss.t--;
	}
	if(abs(bigboss.x-play.x)<=3){
		am+=5;
		int a2=0;
		for(int k=-1;k<=1;k++){		
		for(int i=a2;i<1000;i++){
			if(ammo[i].use==0){
				ammo[i].use=1;
				if(k==0){
					ammo[i].par=1;
					ammo[i].y=bigboss.y+3;
				}else{
					ammo[i].par=0;
					ammo[i].y=bigboss.y+2;
				}		
				ammo[i].dev=2;
				ammo[i].team=0;
				ammo[i].x=bigboss.x+k;
				ammopl.push_back(i);
				break;
			}
			a2++;
		}}
	}
	
}
void gameloop2(){
	clear();
	color(2);
	cout<<"       ********************************"<<endl;
	cout<<"         ###   #    ##   #    #  ####"<<endl;
	cout<<"         #  #  #   #  #  ##   #  #"<<endl;
	cout<<"         ###   #   ####  # #  #  #"<<endl;
	cout<<"         #     #   #  #  #  # #  ####"<<endl;
	cout<<"         #     #   #  #  #   ##  #"<<endl;
	cout<<"         #     ##  #  #  #    #  ####"<<endl;
	cout<<"       ********************************"<<endl;
	color(14);
	cout<<"               &    battle    &"<<endl;	
	cout<<"           & made by chonggg2 gang &    "<<endl;
	color(4);
	cout<<"     welcome "<<playtext.name<<endl;
	color(1);
	cout<<"     coin:"<<playtext.coins<<endl;
	color(5);
	cout<<"     highscore:"<<playtext.highScore<<endl;
	color(15);
	cout<<"     use '1' '2' '3' to choose "<<endl;
	cout<<"     1.start game"<<endl;
	cout<<"     2.change your password"<<endl;
	cout<<"     3.save/load game"<<endl;
	cout<<"     4.trait"<<endl<<endl<<endl<<endl;
	cout<<">>想要上信息课打游戏无忧?登录csdn官网,搜索chonggg2,"<<endl;
	cout<<"获取免费脱控软件。" <<endl<<"www.csdn.net";
}
void gameloop() {
    gameloop2();
    while(1) {
        if(_kbhit()) {
            int a1 = getch();
            if(a1 == '1') {
                clear();
                screen();
                return;
            }
            if(a1 == '2') {
                clear();
                string x1;
                cout << "Please input your old password" << endl;
                cin >> x1;
                if(x1 == playtext.password) {
                    cout << "Please input your new password" << endl;
                    cin >> x1;
                    playtext.password = x1;
                    savePlayerData(playtext); // 保存修改后的密码
                }
            }
            if(a1 == '3') {
                clear();
                cout << "1. Save game" << endl;
                cout << "2. Load game" << endl;
                cout << "3. Back to menu" << endl;
                
                while(true) {
                    if(_kbhit()) {
                        int choice = getch();
                        if(choice == '1') {
                            savePlayerData(playtext);
                            cout << "Game saved successfully!" << endl;
                            Sleep(1000);
                            break;
                        }
                        else if(choice == '2') {
                            if(loadPlayerData(playtext)) {
                                cout << "Game loaded successfully!" << endl;
                                Sleep(1000);
                            } else {
                                cout << "No save file found!" << endl;
                                Sleep(1000);
                            }
                            break;
                        }
                        else if(choice == '3') {
                            break;
                        }
                    }
                }
            }
            if(a1=='4'){
            	bool a78=0;
            	cout<<"1. My trait"<<endl;
            	cout<<"2. Shop"<<endl;
            	cout<<"3. Back to menu"<<endl;
            	while(true) {
                    if(_kbhit()) {
                        int choice = getch();
                        if(choice == '1') {
                            clear();
                            for(int i=0;i<20;i++){
                            	if(ci[i]){
                            		cout<<"        ";
                            		if(i==0){
                            			cout<<i<<" . 量子飞翼 : 散射子弹"<<endl;
									}else if(i==1){
                            			cout<<i<<" . 两肋插刀 : 向前后发射子弹"<<endl;
									}else if(i==2){
                            			cout<<i<<" . 盆满钵满 : 收集金币速度加快"<<endl;
									}else if(i==3){
                            			cout<<i<<" . 坚如磐石 : 初始血量为800"<<endl;
									} 
								}
								
							}cout<<"按任意键退出";
							while(1){
								if(_kbhit()){
									a78=1;
									break;
								}
							}
                        }
                        else if(choice == '2') {
                        	clear();
                            for(int i=0;i<20;i++){
                            	if(i==0){
                            		cout<<i<<" . 量子飞翼 : 散射子弹";
								}else if(i==1){
                            		cout<<i<<" . 两肋插刀 : 向前后发射子弹";
								}else if(i==2){
                           			cout<<i<<" . 盆满钵满 : 收集金币速度加快";
								}else if(i==3){
                            		cout<<i<<" . 坚如磐石 : 初始血量为800";
								}
								if(cs[i]!=0){
									cout<<"     "<<cs[i]<<"$"<<endl;
								}
								
							}
							cout<<"输入要购买的商品(输入-1返回) ";
							int a78;
							cin>>a78;
							if(a78==-1||a78<0||a78>20){
								break;
							}
							if(play.coin>=cs[a78]){
								ci[a78]=1;
								play.coin-=cs[a78];
								cout<<"已购买";
							}else{
								cout<<"金币不足  还需要"<<cs[a78]-play.coin<<"$";
								cout<<play.coin;
							}
							Sleep(1000);
							break;
                        }
                        else if(choice == '3') {
                            break;
                        }
                    }
                    if(a78){
                    	break;
					}
                }
			}
            gameloop2();
        }
    }
}
bool isFirstTimePlayer() {
    std::ifstream inFile("player_data.dat", std::ios::binary);
    return !inFile.good(); // 文件不存在返回true
}

// 初始化新玩家存档
void initializeNewPlayer() {
    PlayerData newPlayer;
    
    clear();
    color(14);
    cout << "====================================" << endl;
    cout << "       Welcome New Pilot!" << endl;
    cout << "====================================" << endl;
    color(15);
    
    // 获取玩家名称
    cout << "Enter your callsign (max 15 chars): ";
    getline(cin, newPlayer.name);
    if(newPlayer.name.empty()) {
        newPlayer.name = "UnknownPilot";
    } else if(newPlayer.name.size() > 15) {
        newPlayer.name = newPlayer.name.substr(0, 15);
    }
    
    // 设置初始密码
    color(11);
    cout << "\nSet your security code (max 12 chars): ";
    getline(cin, newPlayer.password);
    if(newPlayer.password.empty()) {
        newPlayer.password = "123456";
    } else if(newPlayer.password.size() > 12) {
        newPlayer.password = newPlayer.password.substr(0, 12);
    }
    
    // 初始化游戏数据
    newPlayer.coins = 1000;
    newPlayer.highScore = 0;
    
    // 保存初始数据
    savePlayerData(newPlayer);
    
    // 显示欢迎信息
    color(10);
    cout << "\nWelcome aboard, " << newPlayer.name << "!" << endl;
    cout << "Your starting credits: 1000" << endl;
    color(15);
    Sleep(2000);
    
    // 将新玩家数据赋给当前游戏
    playtext = newPlayer;
}
void startgame(){
    play.x=10;
    play.y=17;
    play.h=100;
    play.sp;    
    play.par=0;
    play.dead=1;
    play.v;
    play.coin=1000;
    play.ammo=100;
    play.bag.clear();
    play.bagnum=0;
    memset(ammo,0,sizeof(ammo));
    memset(enemy,0,sizeof(enemy));
    memset(gift,0,sizeof(gift));
    memset(bplane,0,sizeof(bplane));
    boss.x=0;
    boss.y=0;
    boss.par=0;
    boss.u=0;
    boss.h=0;
    bigboss.h=0;
    bigboss.u=0;
    am=0;
    boom=0;
    boss1n=0;
    bp=0;
    en=0;
    gi=0;
    memset(mapx,0,sizeof(mapx));
    ra=0;
    memset(randx,0,sizeof(randx));
    tell=0;
    tx=0;
    tx1=0;
    zp=0;
    zt=0;
    play.coin=playtext.coins;
    
    for(int i = 0; i < 20; i++) {
        ci[i] = playtext.ci[i];
    }
    
    if(ci[3]) {
        play.h = 800;
    }
}
void InitGameLog() {
    g_gameLog.open("game_log.txt", std::ios::app); // 追加模式
    if (!g_gameLog.is_open()) {
        MessageBoxA(NULL, "无法创建游戏日志文件!", "错误", MB_ICONERROR);
        exit(1);
    }
    
    // 获取当前时间(C++98方式)
    time_t rawtime;
    time(&rawtime);
    g_gameLog << "\n\n=== 游戏会话开始 === " << ctime(&rawtime) << std::endl;
}

// 日志记录函数(支持可变参数,C++98兼容)
void LogMessage(const char* format, ...) {
    char buffer[256];
    va_list args;
    va_start(args, format);
    vsprintf(buffer, format, args);
    va_end(args);
    
    g_gameLog << buffer << std::endl;
    g_gameLog.flush(); // 立即写入文件
    
    // 可选:同时在控制台输出(调试用)
    //std::cout << "[LOG] " << buffer << std::endl;
}

LONG WINAPI CrashHandler(_EXCEPTION_POINTERS* ex) {
    // 确保日志文件可用
    if (!g_gameLog.is_open()) {
        g_gameLog.open("crash_log.txt");
    }
    
    // 记录基本崩溃信息
    g_gameLog << "\n!!! CRASH !!!\n";
    g_gameLog << "错误代码: 0x" << std::hex << ex->ExceptionRecord->ExceptionCode << std::dec << "\n";
    
    // 记录调用栈(需要DBGHELP)
    void* stack[100];
    WORD frames = CaptureStackBackTrace(0, 100, stack, NULL);
    
    g_gameLog << "调用栈 (最近" << frames << "帧):\n";
    for (WORD i = 0; i < frames; ++i) {
        g_gameLog << "[" << i << "] 0x" << stack[i] << "\n";
    }
    
    g_gameLog.flush();
    return EXCEPTION_EXECUTE_HANDLER; // 结束程序
}
void InitCrashHandler() {
    SetUnhandledExceptionFilter(CrashHandler); // 设置崩溃捕获函数
}
int main(){
	int t1=0,t2=0,t3=0,mis=1,t4=0,t5=0,t6=0,t7=0;
	int ri;
    //InitCrashHandler();
	InitGameLog();
	if(isFirstTimePlayer()) {
        initializeNewPlayer();
    } else {
        // 加载已有存档
        if(!loadPlayerData(playtext)) {
            // 如果加载失败(如文件损坏),初始化新玩家
            cout << "存档损坏,将创建新存档..." << endl;
            Sleep(1500);
            // 删除损坏的文件
            remove("player_data.dat"); 
            clear();
            initializeNewPlayer();
        }else{
        	string x2;
        	cout<<"input your password:";
        	cin>>x2;
        	if(x2==playtext.password){
        		cout<<"welcome"<<endl;
        		Sleep(1000);
        		clear();
			}else{
				cout<<"wrong password!";
				exit(0);
			}
		}
    }
	startgame();
	gameloop();
	
	screen();
	speak(0,7);
	
	while(1){
		
		if(_kbhit()){
			for(int i=play.y-1;i<=play.y+1;i++){
				for(int ii=play.x-1;ii<=play.x+1;ii++){
					if((i==play.y-1&&ii==play.x-1)||(ii==play.x+1&&i==play.y-1)){
						continue;
					}
					mapx[i][ii]=0;
				}
			}
			int a1=getch();
			LogMessage("按键输入: %c (ASCII %d)", a1, a1);
			if((a1=='a'||a1=='A')&&play.x-2>=1){
				if(mapx[play.y][play.x-2]==2||mapx[play.y+1][play.x-2]==2){
					play.dead=0; 
				}
				play.x--;
			}
			if((a1=='d'||a1=='D')&&play.x+2<=20){
				if(mapx[play.y][play.x+2]==2||mapx[play.y+1][play.x+2]==2){
					play.dead=0; 
				}
				play.x++;
			}
			if(a1=='w'||a1=='W'){
				play.v=1;
			}
			if(a1=='s'||a1=='S'){
				play.v=0;
			}
			if(a1=='P'||a1=='p'){
				int a11=0;
				while(a11!='p'||a11!='P'){
					if(_kbhit()){
						a11=getch();
						if(a11=='p'||a11=='P'){
							break;
						}
					}
				}
			}
			if(a1>='1'&&a1<='3'){
				baguse(a1-'0');
			}
			if(a1=='t'||a1=='T'){
				string a2;
				speak(0,-2);
				HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
				COORD startPos = {0, 28};
				SetConsoleCursorPosition(hConsole, startPos);
				cin>>a2;
				if(a2=="time"){
					speak(0,-2);
					int a3;
					cin>>a3;
					tx=abs(a3);
				}else if(a2=="bang"){
					memset(mapx,0,sizeof(mapx));
				}else if(a2=="enemy"){
					speak(0,-2);
					int a3,a4;
					cin>>a3>>a4;
					enemyx(a3,0,a4);
				}else if(a2=="fill"){
					speak(0,-2);
					int a3,a4,a5,a6,a7;
					cin>>a3>>a4>>a6>>a7>>a5;
					for(int i=a3;i<a6;i++){
						for(int ii=a4;ii<a7;ii++){
							mapx[i][ii]=a5;
						}
					}
				}else if(a2=="rock"){
					speak(0,-2);
					int a3;
					cin>>a3;
					ri=a3;
				}else if(a2=="find"){
					speak(0,-2);
					int a3,a4;
					cin>>a3>>a4;
					speak(0,-2);
					cout<<mapx[a3][a4];
					Sleep(2000);
				}else if(a2=="coin"){
					int a3;
					cin>>a3;
					play.coin=a3;
				}
				speak(0,-2);
			}
			if(a1==32){
				if(play.ammo>0){
					play.ammo--;
					int x1;
					for(int i=0;i<1001;i++){
						if(ammo[i].use==0){
							ammo[i].use=1;
							ammo[i].x=play.x;
							if(play.v){
								ammo[i].y=play.y-2;
								ammo[i].dev=0;
							}else{
								ammo[i].y=play.y+1;
								ammo[i].dev=2;
							}					
							ammo[i].par=play.par;				
							ammo[i].team=1;
							ammopl.push_back(i);
							x1=i;
							break;
						}
					}
					if(ci[1]){
						for(int i=x1+1;i<1001;i++){
						if(ammo[i].use==0){
							ammo[i].use=1;
							ammo[i].x=play.x;
							ammo[i].y=play.y+1;
							ammo[i].dev=2;					
							ammo[i].par=0;				
							ammo[i].team=1;
							x1=i;
							am++;
							ammopl.push_back(i);
							break;
						}}
					}
					if(play.par==1||ci[0]){
						for(int i=x1+1;i<1001;i++){
						if(ammo[i].use==0){
							ammo[i].use=1;
							ammo[i].x=play.x-1;
							if(play.v){
								ammo[i].y=play.y-1;
								ammo[i].dev=0;
							}else{
								ammo[i].y=play.y+1;
								ammo[i].dev=2;
							}					
							ammo[i].par=0;				
							ammo[i].team=1;
							x1=i;
							am++;
							ammopl.push_back(i);
							break;
						}
						}
						for(int i=x1+1;i<1001;i++){
						if(ammo[i].use==0){
							ammo[i].use=1;
							ammo[i].x=play.x+1;
							if(play.v){
								ammo[i].y=play.y-1;
								ammo[i].dev=0;
							}else{
								ammo[i].y=play.y+1;
								ammo[i].dev=2;
							}					
							ammo[i].par=0;				
							ammo[i].team=1;
							am++;
							ammopl.push_back(i);
							break;
						}
						}
					}			
				am++;
				t3=500;
				}else{
					
				}
				
			}			
			
		}
		tx1=tx/100;
		t1++;
		if(boom){
			t2++;
		}
		if(tell){
			t7++;
		}
		if(t7>=200){
			t7=0;
			tell=0;
			speak(0,-2);
		}
		if(t1>=50&&gi>0){
			gift2();
		}
		if(tx==200){
			speak(0,9);
		}
		if(tx==400){
			speak(0,10);
		}
		if(tx==600){
			speak(0,11);
		}
		if(tx==800){
			speak(0,12);
		}
		if(tx==1000){
			speak(0,13);
		}
		if(tx==1200){
			speak(0,14);
		}
		if(mis==1){
			if(tx==100){
				shop();
				bplanex(1);
				ri=5;
			}
			if(tx==1000){
				ri=0;
			}
			if(tx==2500){
				ri=5;
			}
			if(tx==3700){
				ri=0;
			}
			if(tx==5000){
				ri=3;
			}
			if(tx==1700){
				speak(0,5);
				enemyx(2,0,0);
			}
			if(tx==2500){
				speak(0,8);
			}
			if(tx==4000){
				speak(0,5);
				enemyx(5,0,0);
			}
			if(tx==5000){
				speak(0,5);
				enemyx(8,0,1);
			}
			if(tx==7500){
				shop();
			}
			if(tx==7000){
				
				ri=0;
				enemyx(5,0,0);
				boss.u=1;
				boss1n=1;
				boss.par=0;
				boss.y=0;
				boss.x=10;
				boss.h=100;
			}
			if(tx==9000){
				ri=2;
			}
			if(tx==10000){
				ri=5;
			}
			if(tx==10700){
				ri=0;
			}
			if(tx==11500){
				shop();
			}
			if(tx==11000){
				
				bplanex(1);
				speak(0,5);
				enemyx(12,0,1);
				boss.u=1;
				boss1n=1;
				boss.par=1;
				boss.y=0;
				boss.x=10;
				boss.h=150;
			}
			if(tx==13000){
				ri=3;
			}
			if(tx==14000){
				ri=5;
			}
			if(tx==15000){
				ri=0;
			}
			if(tx==15500){
				speak(0,5);
				enemyx(8,0,1);
			}
			if(tx==16500){
				speak(0,5);
				enemyx(8,0,0);
			}
			if(tx==17000){
				ri=3;
			}
			if(tx==17600){
				bplanex(1);
			}
			if(tx==17700){
				bplanex(1);
			}
			if(tx==18000){
				ri=0;
			}
			if(tx==18500){
				shop();
				enemyx(10,0,0);
				boss.u=1;
				boss1n=1;
				boss.par=0;
				boss.y=0;
				boss.x=10;
				boss.h=250;
			}
			if(tx==19000){
				speak(0,5);
				enemyx(5,0,1);
			}
			if(tx==20000){
				ri=5;
			}
			if(tx==22000){
				bplanex(1);
				speak(0,5);
				enemyx(10,0,1);
			}
			if(tx==24000){
				ri=0;
			}
			if(tx==25000){
				shop();
				enemyx(8,0,1);
				boss.u=1;
				boss1n=1;
				boss.par=1;
				boss.y=0;
				boss.x=10;
				boss.h=300;
			}
			if(tx==27000){
				ri=1;
			}
			if(tx>=28000&&tx<29800&&tx%200==0){
				speak(0,(tx-28000)/200+100);
			}
			if(tx==30000){
				bigboss.u=1;
				bigboss.h=1000;
				bigboss.x=0;
				bigboss.y=0;
				bigboss.par=0;
				bigboss.t=0;
			} 
			if(t1>=50){
				t1=0;
				rock(ri);
			}
			if(tx>=30000&&bigboss.h<=0){
				Sleep(5000);
				clear();
				cout<<"YOU WIN"<<endl;
				Sleep(3000);
				playtext.coins=play.coin;
				startgame();
				gameloop();				
			}
		}
		if(tx%5==0){
			LogMessage("游戏时间:%d 子弹数量:%d",tx,am);
		}
		if(tx%1000==0){
			giftx();
		}
		if(en>=0){
			t4++;
			t5++;
		}
		if(t4>=10){
			t4=0;
			enemy2();
			if(bp>0){
				bplane2();
			}
			
		}
		if(t5%25==0){
			if(bigboss.u){
				bigbossx();
			}
		}
		if(t5>=50){
			t5=0;
			attack();
			if(boss1n){
				bossx();
			}
			
		}
		if(zp==1){
			play.par=1;
			zt--;
		}
		if(zt<=0&&zp!=0){
			zp=0;
			play.par=0;
			play.h=150;
		}
		if(t2>=100){
			t2=0;
			boom=0;
			for(int i=0;i<27;i++){
				for(int ii=0;ii<20;ii++){
					if(mapx[i][ii]==3){
						mapx[i][ii]=0;
					}
				}
			}
		}
		if(am>0){
			t3++;
		}
		if(t3>=10){
			t3=0;
			ammox();
		}
		t1++;
		rands();		
		
		if(t6>=50){
			t6=0;
			if(play.h<150){
				play.h++;
			}
			
		}
		tx++;
		t6++;
		ClearScreen();
		if(play.dead==0||play.h<0){
			speak(0,-1);
			playtext.highScore=max(playtext.highScore,tx);
            Sleep(3000);
            playtext.coins=play.coin;
            startgame();
            gameloop();
            
		}
		if(tx%100==0){
			if(ci[2]){
				play.coin+=4;
			}
			play.coin++;
		}
		
		Sleep(1);
	}
}
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐