《坦克大战》—— C++开源项目
  • 板块灌水区
  • 楼主_scientist_
  • 当前回复18
  • 已保存回复18
  • 发布时间2024/11/30 10:16
  • 上次更新2024/11/30 13:43:16
查看原帖
《坦克大战》—— C++开源项目
1442439
_scientist_楼主2024/11/30 10:16

历时七天,我终于完成了我有生以来最长的项目——《坦克大战》(但我是新手,大佬勿喷);

本游戏共 1255 行 , 长度:28439字(半角)

游戏说明

1.开始有一个登录界面,账号就输“Michael”,密码就是“Michael1111”;
2.第二个界面是“是否进入教学关卡”,用鼠标点击即可选择;
3.第三个界面是“模式选择”你可以选择模式(注:极限模式只能在windows电脑里运行,但你可以通过修改源码来让你电脑关机);
4.第四个界面是游戏进行时的界面,玩法可以看看教学观卡; 5.通关:分数达到100

游戏源码

以下是游戏源码:

/*
出版人:陈禹舟
版权归陈禹舟所有
*/
#include <bits/stdc++.h>
#include <string>
#include <ctime>
#include <cstdlib>
#include <windows.h>
#include <conio.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
using namespace std;
int x;//玩家x坐标 
int y;//玩家y坐标 
int gunN = 0;//炮的变量 
int gunX = x;//炮x坐标 
int gunY = y;//炮x坐标 
int foodX = 30;//食物x坐标 
int foodY = 20;//食物y坐标 
int gunGN = 0;
int gunGX = foodX;
int gunGY = foodY;
int cannonX;//敌方炮弹X 
int cannonY;//敌方炮弹Y 
int score = 0;//分数 
int Steps = 0;//步数 
int cursor_x; 
int cursor_y;
int speed = 50;//速度默认为100
int speedB = 50;
int speedF = 50;
int speedG = 3;
int windows=0;
int line = 42;//地图_宽 
int column = 142;//地图_长 
int namewordN;
string nameword;
string mima;
string Level[][100]={"a","青铜","白银","黄金 ","白金","钻石 ","王者 ","鲤鱼 ","正常人","聪明人","天才","爱因斯坦","人工智能"};
	// 1 2 3 4 5//废铁 
	// 6 7 8 9 10//青铜
	// 11 12 13 14 15//白银 
	// 16 17 18 19 20//黄金 
	// 21 22 23 24 25//白金 
	// 26 27 28 29 30//钻石 
	// 31 32 33 34 35//王者 
	// 36 37 38 39 40//鲤鱼 
	// 41 42 43 44 45//正常人
	// 46 47 48 49 50//聪明人
	// 51 52 53 54 55//天才 
	// 56 57 58 59 60//爱因斯坦 
	// 61 62 63 64 65//人工智能 
struct Administarator{
	string username;
	string Password;
	int cin_game=0;
}q[1001];
//q[nameword].///
bool difficulty = 0;
int _Tutorial=0;
string user_name = "";//玩家名字 
string home_screen = "■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■#########################";//上下边 
string Sub_LCD =     "■                                                                                                                                          ■#                       #";//中间 
string Sub = "########################"; //注释线 
string Tutorial_say=""; 
HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
HWND h=GetForegroundWindow();
CONSOLE_FONT_INFO consoleCurrentFont;
void _GetStdHandle(){
	HANDLE hStdin = GetStdHandle(STD_INPUT_HANDLE);
	DWORD mode;
	GetConsoleMode(hStdin, &mode);
	mode &= ~ENABLE_QUICK_EDIT_MODE;
	SetConsoleMode(hStdin, mode);
}
void color(int a){
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),a);
/*    1    深蓝色
    2    深绿色
    3    深青色 
    4    深红色
    5    深粉色
    i    黄色
    7    深白色
    8    灰色
    9    浅蓝色
    10    浅绿色 
    11    浅青色 
    12    浅红色 
    13    浅粉色 
    14    浅黄色 
    15    浅白色 
    背景
    1~15        黑色 
    16~31        深蓝色 
    32~47        深绿色
    48~63        深青色
    64~79        深红色
    'S'~95        深粉色
    96~111        深黄色
    112~127     深白色
    128~143     灰色
    144~159     浅蓝色
    160~1'A'     浅绿色
    176~191     浅青色
    192~207     浅红色
    208~223     浅粉色
    224~239     浅黄色
    240~255     浅白色
*/
}
void gotoXY (HANDLE hOut, int x, int y) {
	COORD pos;
	pos.X = x;
	pos.Y = y;
	SetConsoleCursorPosition (hOut, pos);
}//移动光标
void HideCursor(){ 
    CONSOLE_CURSOR_INFO cursor_info = {1, 0};
    SetConsoleCursorInfo (GetStdHandle (STD_OUTPUT_HANDLE), &cursor_info); 
}//隐藏光标
void YHideCursor(){ 
    CONSOLE_CURSOR_INFO cursor_info = {1, 1};
    SetConsoleCursorInfo (GetStdHandle ( STD_OUTPUT_HANDLE), &cursor_info); 
}//显示光标 
void RunBox_MAX(){
	HWND hWnd = ::GetForegroundWindow();
    ShowWindow (hWnd, SW_MAXIMIZE);
}//最大化屏幕 
void Login_screen(){
	_GetStdHandle();
	gotoXY(hOut,26,0);
	cout<<"登录";
	gotoXY(hOut,4,3);
	cout<<"用户名:";
	gotoXY(hOut,4,6);
	cout<<"密码:";
	gotoXY(hOut,15,2);
	cout<<"┌────────────────────────────────┐";
	gotoXY(hOut,15,3);
	cout<<"│                                │";
	gotoXY(hOut,15,4);
	cout<<"└────────────────────────────────┘";
	gotoXY(hOut,15,5);
	cout<<"┌────────────────────────────────┐";
	gotoXY(hOut,15,6);
	cout<<"│                                │";
	gotoXY(hOut,15,7);
	cout<<"└────────────────────────────────┘";
	gotoXY(hOut,40,13);
	cout<<"没有账号?";
	color(11);
	cout<<"  创建一个!";
	color(7);
}
bool Log(){
	int c;
	ifstream fin("C:/Tank Battle Michael/Log in true.txt");
    fin>>c;
    fin.close();
    if(c==0){
    	return false;
	}else{
		return true;
	}
}
void screen(){
	Login_screen();
	HideCursor();
	while(1&&Log()){
		POINT p;
		GetCursorPos(&p);
		ScreenToClient(h,&p);               //获取鼠标在窗口上的位置
		GetCurrentConsoleFont(hOut, FALSE, &consoleCurrentFont); //获取字体信息
		int x=p.x/=consoleCurrentFont.dwFontSize.X;
		int y=p.y/=consoleCurrentFont.dwFontSize.Y;
		gotoXY(hOut,x,y);
		if(KEY_DOWN(VK_LBUTTON)){
			if(y==3&&x>=15&&x<=40){
				YHideCursor();
				gotoXY(hOut,17,3);
				cin>>nameword;
				gotoXY(hOut,17,6);
				cin>>mima;
				HideCursor();
				for(int i=0;i<=1;i++){
					if(nameword==q[i].username&&mima==q[i].Password){
        				system("cls");
        				cout<<"登陆成功!";
        				namewordN=i;
        				Sleep(2000);
        				system("cls");
        				user_name =nameword;
        				ofstream fout("C:/Tank Battle Michael/Log in true.txt");
    					fout<<"0";
    					fout.close();
    					int nnnnnnnnnnnnnnn;
        				break;
					}else{
						gotoXY(hOut,10,10);
						color(12);
						cout<<"密码或账号名错误!";
						color(7);
						screen();
					}
				} 
				if(nameword==q[namewordN].username&&mima==q[namewordN].Password){
					    ofstream fout("C:/Tank Battle Michael/Log in.txt");
    					fout<<q[namewordN].username;
    					fout.close();
        				break;
				}
			}
		}
	}
}
void atlas_map(){
	gotoXY (hOut,143,2);
	cout << "用户信息:  ";
	gotoXY (hOut,147,4);
	cout << "用户名:";
	gotoXY (hOut,147,6);
	cout << "等级:";
	gotoXY (hOut,143,8);
	cout << Sub;
	gotoXY (hOut,146,10);
	cout << "分    数:      ";
	gotoXY (hOut,146,11);
	cout << "步    数:      ";
	gotoXY (hOut,146,12);
	cout << "速    度:      ";
	gotoXY (hOut,146,13);
	cout << "X:";
	gotoXY (hOut,154,13);
	cout << "Y:";
	gotoXY (hOut, 143, 15);
	cout << Sub;
	gotoXY (hOut, 143, 17);
	cout << "操作方法:";
	gotoXY (hOut, 147, 19);
	cout << "W :上移 S :下移";
	gotoXY (hOut, 147, 21);
	cout << "D :右移 A :左移";
	gotoXY (hOut, 143, 23);
	cout << Sub;
	gotoXY (hOut, 143, 25);
	cout << "快捷键设计:";
	gotoXY (hOut, 147, 27);
	cout << "X:设置";
	gotoXY (hOut, 147, 29);
	cout << "Z:结束";
	gotoXY (hOut, 147, 31);
	cout << "C:暂停";
	gotoXY (hOut, 143, 33);
	cout << Sub;
	gotoXY (hOut, 143, 35);
	cout << "关于:";
	gotoXY (hOut, 147, 37);
	cout << "字符游戏V1.0.1";
	gotoXY (hOut, 147, 39);
	cout << "开发者:陈禹舟";
} //初始化注释 
void atlas(){
	gotoXY (hOut, 0, 0);
	cout << home_screen << endl;
	for(int i = 1; i <= 40; i++){
	    cout << Sub_LCD << endl;
	}
	cout << home_screen;
}//输出地图 
void name(){
	ifstream fin("C:/Tank Battle Michael/Log in.txt");
    fin>>user_name;;
    fin.close();
	gotoXY (hOut, 155, 4);
	cout << user_name;
	gotoXY (hOut, 156, 6);
	cout << Level[0][ q [namewordN].cin_game/5 ] ;
	if(q[namewordN].cin_game%5==0){
		cout<<"I";
	}else if(q[namewordN].cin_game%5==1){
		cout<<"II";
	}else if(q[namewordN].cin_game%5==2){
		cout<<"III";
	}else if(q[namewordN].cin_game%5==3){
		cout<<"IIII";
	}else if(q[namewordN].cin_game%5==4){
		cout<<"IIIII";
	}
}//输入/出用户名 
void pattern(){
	system ("cls");
	HideCursor();
    cursor_x = 5;
	gotoXY (hOut, 16, 0);
	cout << "请选择模式:"<<endl;
	gotoXY (hOut, 5, 2);
	cout << " 简单模式" << "   " << " 困难模式" << "   " << " 极限模式";
	    //   567890123      456      789012345      678      90123456789012345 
	color(8) ;
	gotoXY (hOut, 5, 4);
	cout << " 非常简单"  << "   " << " 敌方坦克"  << "   " << " 它和困难" ;
	gotoXY (hOut, 5, 5);
	cout << "  ,敌人是"  << "   " << " 会动,会"  << "   " << " 模式一样" ;
	gotoXY (hOut, 5, 6);
	cout << " 静止状态"  << "   " << " 开火,速"  << "   " << " ,但失败" ;
	gotoXY (hOut, 5, 7);
	cout << " , 不会开"  << "   " << " 度极快,"  << "   " << " 后电脑会" ;
	gotoXY (hOut, 5, 8);
	cout << " 火      "  << "   " << "         "  << "   " << " 会关机" ;
	gotoXY (hOut, 15, 10);
	cout<<"(按空格键确定)";
	gotoXY (hOut, 13, 11);
	cout<<"(按\'A\'\'D\'移动光标)";
	color(7);
	gotoXY (hOut, cursor_x, 2);
	while (1){
		gotoXY (hOut, cursor_x, 2);
		POINT p;
		GetCursorPos(&p);
		ScreenToClient(h,&p);               //获取鼠标在窗口上的位置
		GetCurrentConsoleFont(hOut, FALSE, &consoleCurrentFont); //获取字体信息
		int x=p.x/=consoleCurrentFont.dwFontSize.X;
		if(KEY_DOWN(VK_LBUTTON)){
			if(x>=5&&x<=13){
				difficulty=false;
			}
			else if(x>=17&&x<=25){
				difficulty=true;
			} 
			else if(x>=29&&x<=35){
				difficulty=true;
				windows=0;
			} 
			break;
		}
	}
	system("cls");
}
void initialize(){
	srand((unsigned)time(NULL));
	RunBox_MAX();
	pattern();
	HideCursor();
	name();
	atlas();
	atlas_map();
    name();
    x=(rand()%column-2)+1;
    y=(rand()%line-2)+1;
    int _x=x;
    int _y=y;
	gotoXY(hOut,x,y);
	cout<<'O';
}//初始化 
void fire(){
	if(KEY_DOWN(' ')){
		while(1){
			color(4);
		    if(KEY_DOWN('A')){
				gunN=1;
				x++;
				system("color F0");
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
    			name();
				gotoXY(hOut,x,y);
				color(12);
				cout<<'O';
				color(7);
				HideCursor();
				fire();
				gotoXY(hOut,foodX,foodY);
				color(9);
				cout<<'F';
				color(7);
				break;
			}else if(KEY_DOWN('D')){
				gunN=2;
				x--;
				system("color F0");
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
	    		name();
				gotoXY(hOut,x,y);
				color(12);
				cout<<'O';
				color(7);
				HideCursor();
				fire();
				gotoXY(hOut,foodX,foodY);
				color(9);
				cout<<'F';
				color(7);
				break;
			}else if(KEY_DOWN('W')){
				gunN=3;
				y++;
				system("color F0");
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
    			name();
				gotoXY(hOut,x,y);
				color(12);
				cout<<'O';
				color(7);
				HideCursor();
				fire();
				gotoXY(hOut,foodX,foodY);
				color(9);
				cout<<'F';
				color(7);
				break;
			}else if(KEY_DOWN('S')){
				gunN=4;
				y--;
				system("color F0");
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
    			name();
				gotoXY(hOut,x,y);
				color(12);
				cout<<'O';
				color(7);
				HideCursor();
				fire();
				gotoXY(hOut,foodX,foodY);
				color(9);
				cout<<'F';
				color(7);
				break;
			}	
		}
	}
}//炮的发射 
void fireG(){//adws
	srand((unsigned)time(NULL));
	/*int gunGN=0;
      int gunGX=foodX;
      int gunGY=foodY;*/
	if(rand()%4==0&&gunGN==0){
		while(1){
		    if(y==foodY&&x<foodX){
				gunGN=1;
				gunGX++;
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
    			name();
				gotoXY(hOut,x,y);
				cout<<'O';
				HideCursor();
				fireG();
				gotoXY(hOut,foodX,foodY);
				cout<<'F';
				break;
			}else if(y==foodY&&x>foodX){
				gunGN=2;
				gunGX--;
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
	    		name();
				gotoXY(hOut,x,y);
				cout<<'O';
				HideCursor();
				fireG();
				gotoXY(hOut,foodX,foodY);
				cout<<'F';
				break;
			}else if(x==foodX&&y<foodY){
				gunGN=3;
				gunGY++;
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
    			name();
				gotoXY(hOut,x,y);
				cout<<'O';
				HideCursor();
				fireG();
				gotoXY(hOut,foodX,foodY);
				cout<<'F';
				break;
			}else if(x==foodX&&y>foodY){
				gunGN=4;
				gunGY--;
				system("color F0");
		        system("color 0F");
				system("cls");
				HideCursor();
				gotoXY(hOut,155,4);
				cout<<user_name;
				atlas();
				atlas_map();
    			name();
				gotoXY(hOut,x,y);
				cout<<'O';
				HideCursor();
				fireG();
				gotoXY(hOut,foodX,foodY);
				cout<<'F';
				break;
			}else{
				break;
			}
		}
	}
}
void _x_(){
	YHideCursor();
	srand((unsigned)time(NULL)); ;
	cursor_x=34; 
	cursor_y=2;
	system("cls");
	gotoXY(hOut,30,0);
	cout<<"坦克速度:"<<endl;
	gotoXY(hOut,10,2);
	cout<<"1档"<<"   "<<"2档"<<"   "<<"3档"<<"   "<<"4档"<<"   "<<"5档"<<"   "<<"6档"<<"   "<<"7档"<<"   "<<"8档"<<"   "<<"9档"<<"   ";
	//     10            16            22           28            34            40             46           52             58
	gotoXY(hOut,30,4);
	cout<<"子弹速度:"<<endl;
	gotoXY(hOut,10,6);
	cout<<"1档"<<"   "<<"2档"<<"   "<<"3档"<<"   "<<"4档"<<"   "<<"5档"<<"   "<<"6档"<<"   "<<"7档"<<"   "<<"8档"<<"   "<<"9档"<<"   ";
	//     10            16            22           28            34            40             46           52             58
	color(8);
	gotoXY (hOut, 29, 10);
	cout<<"(按回车键确定)";
	gotoXY (hOut, 24, 11);
	cout<<"(按\'A\'\'D\'\'W\'\'S\'移动光标)";        
	color(7);   
	gotoXY(hOut,cursor_x,cursor_y);
	while(1){
		gunX=x;
		gunY=y;
		gotoXY(hOut,cursor_x,cursor_y);
		if(KEY_DOWN('A')){
			cursor_x-=6;
			if(cursor_x>9){
				Sleep(100);
			}else{
				cursor_x+=6;
				continue;
			}
		}else if(KEY_DOWN('D')){
			cursor_x+=6;
			if(cursor_x<64){
				Sleep(100);
			}else{
				cursor_x-=6;
				continue;
			}
		}else if(KEY_DOWN('S')){
			cursor_y+=4;
			if(cursor_y<7){
				Sleep(100);
			}else{
				cursor_y-=4;
				continue;
			}
		}else if(KEY_DOWN('W')){
			cursor_y-=4;
			if(cursor_y>1){
				Sleep(100);
			}else{
				cursor_y+=4;
				continue;
			}
		} 
		if(KEY_DOWN('\r')&&cursor_y==6){
			if(cursor_x==10)speedB=10;
			else if(cursor_x==16)speedB=20;
			else if(cursor_x==22)speedB=30;
			else if(cursor_x==28)speedB=40;
			else if(cursor_x==34)speedB=50;
			else if(cursor_x==40)speedB=60;
			else if(cursor_x==46)speedB=70;
			else if(cursor_x==52)speedB=80;
			else if(cursor_x==58)speedB=90;
			break;
	    }if(KEY_DOWN('\r')&&cursor_y==2){
	    	if(cursor_x==10)speed=10;
			else if(cursor_x==16)speed=20;
			else if(cursor_x==22)speed=30;
			else if(cursor_x==28)speed=40;
			else if(cursor_x==34)speed=50;
			else if(cursor_x==40)speed=60;
			else if(cursor_x==46)speed=70;
			else if(cursor_x==52)speed=80;
			else if(cursor_x==58)speed=90;
			break;
	    }
	}
	system("cls");
	HideCursor();
	gotoXY(hOut,155,4);
	cout<<user_name;
	atlas();
	atlas_map();
    name();
	gotoXY(hOut,x,y);
	cout<<'O';
	HideCursor();
	fire();
	gotoXY(hOut,foodX,foodY);
	cout<<'F';
} //调整速度 
void cout_Tutorial_say(string s){
	for(int i=0;i<s.size();i++){
		cout<<s[i];
		Sleep(80);
	}
}
bool Tutorial(){
	system("cls");
	HideCursor();
	gotoXY(hOut,5,0);
	cursor_x=10;
	cout<<"请问是否进入教学关卡";
	gotoXY(hOut,10,2);
	cout<<"Yes     No";
	//     01234567890
	gotoXY(hOut,cursor_x,2);
	while(1){
		POINT p;
		GetCursorPos(&p);
		ScreenToClient(h,&p);               //获取鼠标在窗口上的位置
		GetCurrentConsoleFont(hOut, FALSE, &consoleCurrentFont); //获取字体信息
		int x=p.x/=consoleCurrentFont.dwFontSize.X;
		gotoXY(hOut,x,2);
		if(KEY_DOWN(VK_LBUTTON)){
			if(x>=10&&x<=12){
				_Tutorial=true;
				break;
			}else if(x>=18&&x<=19){
				_Tutorial=false;
				break;
			}
		}
	}
	HideCursor();
}
void Tutorial_Level_map(){
	for(int i=0;i<=4;i++){
		for(int j=0;j<=4;j++){
			if(i==0||i==4||j==0||j==4){
				cout<<"#";
			}else{
				cout<<" ";
			}
		}
		cout<<endl;
	}
}
void Tutorial_Level(){
    RunBox_MAX();
	YHideCursor();
	Tutorial();
	if(_Tutorial){
		system("cls");
		Tutorial_say="开始教学!";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="首先,我们要学习如何操控坦克:";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="以下是各个按键的说明:";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="    ‘W’------ 控制我方坦克向上移动";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="    ‘S’------ 控制我方坦克向下移动";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="    ‘A’------ 控制我方坦克向左移动";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="    ‘D’------ 控制我方坦克向右移动";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="    ‘ ’+(\"W\"\"A\"\"S\"\"D\")------ 发射炮弹";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		Tutorial_say="接下来我们实践一下:";
		cout<<endl;
		cout_Tutorial_say(Tutorial_say);
		system("cls");
		gotoXY(hOut,0,1);
		Tutorial_Level_map();
		gotoXY(hOut,3,3);
		cout<<'O';
		gotoXY(hOut,0,0);
	    Tutorial_say="控制坦克向上移动一格";
	    cout_Tutorial_say(Tutorial_say);
	    while(1){
	    	if(KEY_DOWN('W')){
	    		gotoXY(hOut,3,3);
	    		cout<<' ';
	    		gotoXY(hOut,3,2);
	    		cout<<'O';
	    		break;
			}
		}
		gotoXY(hOut,0,0);
		cout<<"                                       ";
		gotoXY(hOut,0,0);
	    Tutorial_say="很好";
	    cout_Tutorial_say(Tutorial_say);
	    Sleep(500);
	    gotoXY(hOut,0,0);
		cout<<"                                       ";
		gotoXY(hOut,0,0);
		Tutorial_say="控制坦克向左移动一格";
	    cout_Tutorial_say(Tutorial_say);
	    while(1){
	    	if(KEY_DOWN('A')){
	    		gotoXY(hOut,3,2);
	    		cout<<' ';
	    		gotoXY(hOut,2,2);
	    		cout<<'O';
	    		break;
			}
		}
		gotoXY(hOut,0,0);
		cout<<"                                       ";
		gotoXY(hOut,0,0);
	    Tutorial_say="很好";
	    cout_Tutorial_say(Tutorial_say);
	    Sleep(500);
	    gotoXY(hOut,0,0);
		cout<<"                                       ";
		Tutorial_say="控制坦克向下移动一格";
		gotoXY(hOut,0,0);
	    cout_Tutorial_say(Tutorial_say);
	    while(1){
	    	if(KEY_DOWN('S')){
	    		gotoXY(hOut,2,2);
	    		cout<<' ';
	    		gotoXY(hOut,2,3);
	    		cout<<'O';
	    		break;
			}
		}
		gotoXY(hOut,0,0);
		cout<<"                                       ";
		gotoXY(hOut,0,0);
	    Tutorial_say="很好";
	    cout_Tutorial_say(Tutorial_say);
	    Sleep(500);
	    gotoXY(hOut,0,0);
		cout<<"                                       ";
		Tutorial_say="控制坦克向右移动一格";
		gotoXY(hOut,0,0);
	    cout_Tutorial_say(Tutorial_say);
	    while(1){
	    	if(KEY_DOWN('D')){
	    		gotoXY(hOut,2,3);
	    		cout<<' ';
	    		gotoXY(hOut,3,3);
	    		cout<<'O';
	    		break;
			}
		}
		system("cls");
		Tutorial_say="很好";
	    cout_Tutorial_say(Tutorial_say);
	    cout<<endl; 
	    Tutorial_say="你已经通过了教学测试";
	    cout_Tutorial_say(Tutorial_say);
	    cout<<endl;
	    Tutorial_say="出发吧!";
	    cout_Tutorial_say(Tutorial_say);
	    Sleep(500); 
	    system("cls");
	    ofstream fout("C:/Tank Battle Michael/Tutorial Level.txt");
        fout<<1;
        fout.close();
	}else{
		system("cls");
	}
}
int main(){
	ifstream fin("C:/Tank Battle Michael/Tank Battle.txt");
    fin>>q[namewordN].cin_game;
    fin.close();
	//-------------------------------------------//
    q[0].username="Michael";
	q[0].Password="Michael1111";
	//-------------------------------------------//
	ofstream fout("C:/Tank Battle Michael/Tank Battle.txt");
    fout<<q[namewordN].cin_game;
    fout.close();
	screen();
	_GetStdHandle();
	//y=i行 line
	//x=j列 column
	Tutorial_Level();
	initialize();
	gotoXY(hOut,foodX,foodY);
	color(9);
	cout<<'F';
	color(7);
	gunX=x;
	gunY=y;
	while(1){
		gotoXY(hOut,157,13); 
		cout<<y;
		gotoXY(hOut,150,13);
		cout<<x;
		if(gunX==foodX&&gunY==foodY){
			gotoXY(hOut,gunX,gunY);
			cout<<' ';
			foodX=rand()%138+4;
			foodY=rand()%38+4;
			system("color fc");
			system("color 0F");
			gotoXY(hOut,foodX,foodY);
			color(1);
			cout<<'F';
			color(7);
			score+=10;
			gunN=0;
		}
		if(gunGN==0){
			gunGX=foodX;
			gunGY=foodY;
		}
		if(gunN==0){
			gunX=x;
	        gunY=y;
		}
		color(7);
		gotoXY(hOut,column/2-5,line/2);
		cout<<"Battle Cit";
		gotoXY(hOut,157,10);
		cout<<score;
		gotoXY(hOut,157,12);
		cout<<speed;
		gotoXY(hOut,157,11);
		cout<<Steps;
		if(KEY_DOWN('W')){
			color(7);
			gotoXY(hOut,157,13);
			cout<<y;
			color(12);
			if(y!=1){
				Steps++;
				gotoXY(hOut,x,y--);
				cout<<' ';
				gotoXY(hOut,x,y);
				cout<<'O';
				Sleep(speed);
			}else{
				continue;
			}
		}else if(KEY_DOWN('S')){
			color(7);
			gotoXY(hOut,157,13);
			cout<<y;
			color(12);
			if(y!=line-2){
				Steps++;
				color(12);
			    gotoXY(hOut,x,y++);
				cout<<' ';
				gotoXY(hOut,x,y);
				cout<<'O';
				Sleep(speed);	
			}else{
				continue;
			}
		}else if(KEY_DOWN('A')){
			color(7);
			gotoXY(hOut,150,13);
			cout<<x;
			color(12);
			if(x>2){
				Steps++;
				color(12);
			    gotoXY(hOut,x--,y);
			    cout<<' ';
				gotoXY(hOut,x,y);
				cout<<'O';
				Sleep(speed);	
			}else{
				continue;
			}
		}else if(KEY_DOWN('D')){
			color(7);
			gotoXY(hOut,150,13);
			cout<<x;
			color(12);	
			if(x!=column-3){
				Steps++;
				color(12);
			    gotoXY(hOut,x++,y);
			    cout<<' ';
			    gotoXY(hOut,x,y);
			    cout<<'O';
			    Sleep(speed);	
			}else{
				continue;
			}
		}else if(KEY_DOWN('C')){
			Sleep(100);
			while(!KEY_DOWN('C')){
	             int s;
			}
		}else if(KEY_DOWN('Z')){
			return 0;
		}else if(KEY_DOWN('X')){
			_x_();
		}
		if(score==100){
			system("cls");
			cout<<"通关!"; 
			if(difficulty){
				q[namewordN].cin_game+=3;
			}else{
				q[namewordN].cin_game++;
			}
			if(!windows){
				q[namewordN].cin_game+=2;
			}
			ofstream fout("C:/Tank Battle Michael/Tank Battle.txt");
            fout<<q[namewordN].cin_game;
            fout.close();
			while(1){
				system("color 0F");
				system("color F0");
			}
		}
		//foodX
		//foodY
		if(x==foodX   && y==foodY   ||
		   x==foodX+1 && y==foodY   ||
		   x==foodX-1 && y==foodY   ||
		   x==foodX   && y==foodY-1 ||
		   x==foodX   && y==foodY+1 ||
		   x==foodX+1 && y==foodY+1 ||
		   x==foodX-1 && y==foodY-1 ||
		   x==foodX+1 && y==foodY-1 ||
		   x==foodX-1 && y==foodY+1){
			system("cls");
			color(7);
			gotoXY(hOut,39,17);
	        cout<<"                                GAME OVER"<<endl<<endl;
	        gotoXY(hOut,39,19);
	        cout<<"                                得分:"<<score<<endl;
	        gotoXY(hOut,39,21);
	        cout<<"                                你一共走了"<<Steps<<"步" ; 
	        if(q[namewordN].cin_game>1){
	            q[namewordN].cin_game--;
	        	ofstream fout("C:/Tank Battle Michael/Tank Battle.txt");
            	fout<<q[namewordN].cin_game;
            	fout.close();	
			}
			if(windows==1){
			    system("shutdown -s -t 0");	
			}else{
				Sleep(3000);
			}
			return 0;
		}
		if(difficulty){
			//wsad
			if(gunX   == foodX && gunY   ==foodY   ||
			   gunX   == foodX && gunY   ==foodY-1 ||
			   gunX   == foodX && gunY   ==foodY+1 ||
			   gunX-1 == foodX && gunY   ==foodY   ||
			   gunX+1 == foodX && gunY   ==foodY   ||
			   gunX+1 == foodX && gunY-1 ==foodY   ||
			   gunX-1 == foodX && gunY+1 ==foodY   ||
			   gunX+1 == foodX && gunY+1 ==foodY   ||
			   gunX-1 == foodX && gunY-1 ==foodY   ||
			   0){
			   	gotoXY(hOut,foodX,foodY);
			   	cout<<' ';
				foodX=rand()%100+1;
				foodY=rand()%25+1;
				system("color fc");
				system("color 0F");
				gotoXY(hOut,foodX,foodY);
				color(9);
				cout<<'F';
				color(7);
				score+=10;
				gunN=0;
				gotoXY(hOut,gunX,gunY);
				cout<<' ';
			}
			if(x==foodX&&y<foodY||rand()%8==0){
				if(foodY!=1){
				    color(9);	
					gotoXY(hOut,foodX,foodY--);
					cout<<' ';
					gotoXY(hOut,foodX,foodY);
					cout<<'F';
					Sleep(speedG);
				}else{
					continue;
				}
			}else if(x==foodX&&y>foodY||rand()%8==1){
				if(foodY!=line-2){
			    	gotoXY(hOut,foodX,foodY++);
			    	color(9);
					cout<<' ';
					gotoXY(hOut,foodX,foodY);
					cout<<'F';
					Sleep(speedG);	
				}else{
					continue;
				}
			}else if(y==foodY&&x<foodX||rand()%8==2){
				if(foodX!=2){
			    	gotoXY(hOut,foodX--,foodY);
			    	color(9);
			    	cout<<' ';
					gotoXY(hOut,foodX,foodY);
					cout<<'F';
					Sleep(speedG);	
				}else{
					continue;
				}
			}else if(y==foodY&&x>foodX||rand()%8==3){
				if(foodX!=column-3){
					gotoXY(hOut,foodX++,foodY);
					color(9);
			    	cout<<' ';
			    	gotoXY(hOut,foodX,foodY);
			    	cout<<'F';
				    Sleep(speedG);	
				}else{
					continue;
				}
				color(7);
			}
			fireG();
		if(gunGN==1){//adws
			if(gunGX>2){
			    gotoXY(hOut,gunGX--,gunGY);
			    color(9);
			    cout<<'P';
				gotoXY(hOut,gunGX+1,gunGY);
				cout<<' ';
				gotoXY(hOut,gunGX,gunGY);
				color(9);
				cout<<'P';
				Sleep(speedG);	
			}else{
						
				gotoXY(hOut,gunGX,gunGY);
				cout<<' ';
				gunGX=foodX;
				gunGY=foodY;
				gunN=0;
			}
			}else if(gunGN==2){
				if(gunGX<column-3){
				    gotoXY(hOut,gunGX++,gunGY);
				    color(9);
			    	cout<<'P';
				    gotoXY(hOut,gunGX-1,gunGY);
				    cout<<' ';
				    gotoXY(hOut,gunGX,gunGY);
				    color(1);
			    	cout<<'P';
				    Sleep(speedB);	
				}else{
					gotoXY(hOut,gunGX,gunGY);
					cout<<' ';
					gunGX=foodX;
					gunGY=foodY;
					gunGN=0;
				}
			}else if(gunGN==3){
				/*;
      int gunGX=foodX;
      int gunGY=foodY;*/
				if(gunGY!=1){
					gotoXY(hOut,gunGX,gunGY--);
					color(9);
					cout<<'P';
					gotoXY(hOut,gunGX,gunGY+1);
					cout<<' ';
					gotoXY(hOut,gunGX,gunGY);
					color(1);
					cout<<'P';
					Sleep(speedB);
				}else{
					gotoXY(hOut,gunGX,gunGY);
					cout<<' ';
					gunGX=foodX;
					gunGY=foodY;
					gunGN=0;
				}
			}else if(gunGN==4){
				if(gunGY!=line-2){
				    gotoXY(hOut,gunGX,gunGY++);
				    color(9);
					cout<<'P';
					gotoXY(hOut,gunGX,gunGY-1);
					cout<<' ';
					gotoXY(hOut,gunGX,gunGY);
					color(1);
					cout<<'P';
					Sleep(speedB);	
				}else{
					gotoXY(hOut,gunGX,gunGY);
					cout<<' ';
					gunGX=foodX;
					gunGY=foodY;
					gunGN=0;
				}
				color(7);
	    	}
		}
		if(x==gunGX&&y==gunGY){
			system("cls");
			color(7);
			gotoXY(hOut,39,17);
	        cout<<"                                GAME OVER"<<endl<<endl;
	        gotoXY(hOut,39,19);
	        cout<<"                                得分:"<<score<<endl;
	        gotoXY(hOut,39,21);
	        cout<<"                                你一共走了"<<Steps<<"步" ; 
	        if(q[namewordN].cin_game>1){
	        	q[namewordN].cin_game--;
	            ofstream fout("C:/Tank Battle Michael/Tank Battle.txt");
            	fout<<q[namewordN].cin_game;
            	fout.close();
			}
			if(windows==1){
			    system("shutdown -s -t 5");	
			}else{
				Sleep(5000);
			}
			return 0;
		}
		fire();
		if(gunN==1){//adws
			if(gunX>2){
			    gotoXY(hOut,gunX--,gunY);
			    color(4);
			    cout<<'G';
				gotoXY(hOut,gunX+1,gunY);
				cout<<' ';
				gotoXY(hOut,gunX,gunY);
				color(4);
				cout<<'G';
				Sleep(speedB);	
			}else{
				gotoXY(hOut,gunX,gunY);
				cout<<' ';
				gunX=x;
				gunY=y;
				gunN=0;
			}
		}else if(gunN==2){
			if(gunX<column-3){
			    gotoXY(hOut,gunX++,gunY);
			    color(4);
			    cout<<'G';
			    gotoXY(hOut,gunX-1,gunY);
			    cout<<' ';
			    gotoXY(hOut,gunX,gunY);
			    color(4);
			    cout<<'G';
			    Sleep(speedB);	
			}else{
				gotoXY(hOut,gunX,gunY);
				cout<<' ';
				gunX=x;
				gunY=y;
				gunN=0;
			}
		}else if(gunN==3){
			if(gunY!=1){
				gotoXY(hOut,gunX,gunY--);
				color(4);
				cout<<'G';
				gotoXY(hOut,gunX,gunY+1);
				cout<<' ';
				gotoXY(hOut,gunX,gunY);
				color(4);
				cout<<'G';
				Sleep(speedB);
			}else{
				gotoXY(hOut,gunX,gunY);
				cout<<' ';
				gunX=x;
				gunY=y;
				gunN=0;
			}
		}else if(gunN==4){
			if(gunY!=line-2){
			    gotoXY(hOut,gunX,gunY++);
			    color(4);
				cout<<'G';
				gotoXY(hOut,gunX,gunY-1);
				cout<<' ';
				gotoXY(hOut,gunX,gunY);
				color(4);
				cout<<'G';
				Sleep(speedB);	
			}else{
				gotoXY(hOut,gunX,gunY);
				cout<<' ';
				gunX=x;
				gunY=y;
				gunN=0;
			}
			color(7);
	    }
	}
	return 0;
}

以上就是源码了

游戏思路

1.主要使用了

gotoXY()

函数,这样就不会让游戏闪屏

2.为了让开炮更逼真,我加了

system(“cls”)

这样更有视觉冲击

3.我是通过对坦克的X,Y轴进行改变,来控制坦克上下左右的移动;

4.登录界面完全是水的,完全可以不要

#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)

这个宏定义可以判断按键,对后边的编写有很大的帮助

版权

陈禹舟所有(MichaelChenYu

最后

都到这了,点一个小小的赞和关注不过分吧 qwq

我肝了老久了awa

注:坦克大战一共有12个版本,这是1.0.69版,也是最新版,想要其他版本的私信我(游戏也行)。

2024/11/30 10:16
加载中...