• 个人简介

    硬币抛出之后,正逆的转换未曾停止——你或许也注意到了这件事——旅船是掩盖未来的虚影,战车正指引着我们的命运。前方是毁灭,亦是重生。——《Phigros》

    Byd.Vgs系列
    2023_Lhr
    2024_Phigros
    2025_█████

    WxdPes' ToolBox

    冲200道班级域AC

    会随机发题解,只有当难度≤3时才会发完整的,否则会有填空哦~~~

    image

    给你分享一个彩色字的方法 :

    <font color="颜色的英文名" size="输出字的大小,一般填 3 ">"这里填你要输出的文字"</font> [1]

    ↑ 一般用于oj的简介 ↑

    *[1] : 在这里 "" 号省略

    编译情况

    *1. Waiting 评测:评测请求正在等待被评测机抓取

    *2. Fetched 评测:评测请求已被评测机抓取,正在准备开始评测

    *3. Compiling 评测:正在编译中

    *4. Judging 评测:编译成功,正在评测中

    *5. Accepted 通过:程序输出完全正确

    *6. Wrong Answer 不通过:程序输出与标准答案不一致(不包括行末空格以及文件末空行)

    *7. Time Limit Exceeded 不通过:程序运行时间超过了题目限制

    *8. Memory Limit Exceeded 不通过:程序运行内存空间超过了题目限制

    *9. Runtime Error 不通过:程序运行时错误(如数组越界、被零除、运算溢出、栈溢出、无效指针等)

    *10. Compile Error 不通过:编译失败

    *11. System Error 错误:系统错误(如果您遇到此问题,请及时在讨论区进行反馈)

    *12. Canceled 其他:评测被取消

    *13. Unknown Error 其他:未知错误

    *14. Ignored 其他:被忽略

    我的博客

    密室逃脱代码持续更新

    Cilck Here Luogu

    Cilck Here Hydro

    代码系列

    结构体

    struct stu{
    	string a;
    	int b;
    	double c;
        char d;
        long long e;
    };
    

    冒泡排序

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int n,a[10005];
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>a[i];
        }
        for(int i=0;i<n-1;i++){
            for(int j=0;j<n-i-1;j++){
                int t;
                if(a[j]>a[j+1]){
                    t=a[j];
                    a[j]=a[j+1];
                    a[j+1]=t;
                }
            }
        }
        for(int i=0;i<n;i++){
            cout<<a[i]<<" ";
        }
        return 0;
    }
    

    判断回文数

    bool f(int n){
    	int s=0;
    	int t=n;
    	while(t){
    		s=s*10+t%10;
    		t/=10;
    	}
    	if(s==n){
    		return true;
    	} 
    	else{
    		return false;
    	}
    }
    

    彩色字

    void colorful(int word,string content){
    	int back=0;
    	WORD change=((back&0x0F)<<4)+(word&0x0F);
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),change);
    	cout<<content;
    	change=((back&0x0F)<<4)+(15&0x0F);
    	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),change);
    }
    

    Cmp函数

    bool cmp(int  n,int m){
            return n>m;
    }
    

    链表

    struct node{
        node *head,*r;//头节点和尾节点 
        head=new node;//动态申请存储空间 
        head->next=NULL;//指针域为空,表示没有下一个节点
    	r=head;//头节点也是尾节点 
    	node *p;//新节点p
    	p=new node;
    	p->date=3;// 数据域为3 
    
    	r->next=p; 
        r=p; 
        //更新尾节点 
    };
    cout<<p->next->data<<" ";
    p=p->next;
    //输出
    

    游戏系列

    密室逃脱代码

    数字卡牌

    #include <iostream>//卡牌
    #include <ctime>
    #include <cstdlib>
    #include <windows.h>
    using namespace std;
    int main(){
    	int num[5][5]={0};//16张卡牌背面的数字,由1~8组成,初始化为0 
    	int arr[5][5]={0};//标记卡牌是否被翻出,默认0未被翻出 
    	int flag[9]={0};//标记数字1~8在num数组中出现的次数,默认为0 
    	int temp;//随机生成的数字,由1-8组成 
    	int ix,iy,ia,ib;
    	int count = 0; 
    	cout << "记忆卡牌游戏规则" << endl;
    	cout << "现有16张数字卡牌,由数字1~8组成,每个数字只出现2次" << endl;
    	cout << "游戏者需要将卡牌翻至背面,找出所有相同的数字" << endl;
    	cout << "每一轮只允许翻两张卡牌" << endl;
    	cout << "如果卡牌数字相同,则将卡牌上有数字的一面显示出来" << endl;
    	cout << "否则将卡牌翻回正面,进行下一轮" << endl;
    	cout << "系统测量游戏者找出所有相同数字的卡牌所花费的步数(即进行多少轮)" << endl;
    	system("pause");
    	cout << endl;
    	srand(time(0));
    	for(int i=1;i<=4;i++){
    		for(int j=1;j<=4;j++){
    			while(true){
    				temp = rand()%8+1;
    				if(flag[temp]<2){
    					num[i][j]=temp;
    					flag[temp]++;
    					break;
    				}else{
    					continue;
    				}
    			}
    		}
    	}
    	for(int i=1;i<=4;i++){
    		for(int j=1;j<=4;j++){
    			cout << "* ";
    		}
    		cout << endl;
    	}
    	while(true){
    		count++;
    		int sum=0;
    
    		cout << "请输入第一次翻开卡片的行数和列数(使用空格隔开):" << endl;
    		cin >> ix >> iy;
    		arr[ix][iy]++;
    
    		system("cls"); 
    		for(int i=1;i<=4;i++){
    			for(int j=1;j<=4;j++){
    				if(arr[i][j] > 0)	cout << num[i][j] << " ";
    				else	cout << "* ";
    			}
    			cout << endl;
    		} 
    
    		cout << "请输入第二次翻开卡片的行数和列数(使用空格隔开):" << endl;
    		cin >> ia >> ib;
    		arr[ia][ib]++;
    		system("cls"); 
    		for(int i=1;i<=4;i++){
    			for(int j=1;j<=4;j++){
    				if(arr[i][j] > 0)	cout << num[i][j] << " ";
    				else	cout << "* ";
    			}
    			cout << endl;
    		} 
    
    		if(num[ix][iy] == num[ia][ib]){
    			cout << "恭喜您,此轮翻牌成功" << endl;
    		}
    
    		else{
    			cout << "很遗憾,此轮翻牌失败" << endl;
    			arr[ix][iy]--;
    			arr[ia][ib]--;
    			
    		} 
    			
    		cout << "2秒后进入下一轮"<<endl;
    		Sleep(2000);
    		system("cls"); 
    		for(int i=1;i<=4;i++){
    			for(int j=1;j<=4;j++){
    				if(arr[i][j] > 0){
    					sum += 1;
    					cout << num[i][j] << " ";
    				}
    				else	cout << "* ";
    			}
    			cout << endl;
    		} 
    
    		if(sum == 16){
    			/* 
    			string steps = "恭喜完成翻翻乐,使用步数为:";			//messagebox显示使用步数 
    			char num1[100]; 
    			itoa(count,num1,10);							//将记录玩家步数的变量sum,转成字符串,赋值给iToA数组 
    			steps += num1; 
    			MessageBox(0,steps.c_str(),"提示",MB_OK);//将获得的字符串显示在messagebox上
    			*/
    			cout << endl; 
    			cout << "一共使用" << count << "步";
    			break; 
    		}
    	}
    	return 0;
    }
    

    迷宫

    #include <bits/stdc++.h>
    #include <conio.h>
    using namespace std;
    int main(){
    	cout<<"                 雷达地图"<<endl;
    	cout<<"  +:你, !:目标, ^:钥匙, |:门, E:出口(入口), "<<endl;
    	char maze[18][24]= {"**************E********",
    						"*            * *      *",//2
    						"* ************ * ** * *",//3
    						"*            * **** * *",//4
    						"* ********** * *    * *",//5
    						"* **       *   * ******",//6
    						"* ** ***** ***** * **^*",//7
    						"*        *          * *",//8
    						"****** * **********   *",//9
    						"*    * * *        *   *",//10
    						"****** * * ****** *****",//11
    						"* * |  * * *    * *   *",//12
    						"* * ****** * ** * * * *",//13
    						"* *        * ** * * * *",//14
    						"* ********** **     * *",//15
    						"*               *     *",//16
    						"***************!*******",//17
    						"***********************"};//18
    	int ix=1,iy=14;
    	maze[ix][iy]='+';
    	for(int i=0;i<18;i++){
    		for(int j=0;j<24;j++){
    			cout<<maze[i][j]<<' ';
    		}
    		cout<<endl;
    	}
    	char a;
    	int win=0;
    	int won=0;
    	while(true){
    		a=getch();
    		system("cls");
    		if(a=='w'){
    			if(maze[ix-1][iy] != '*' && maze[ix-1][iy] != '|'){
    				if(maze[ix-1][iy] == '^') maze[11][4]=' ';
    				if(maze[ix-1][iy] == '!') win=1,won=1;
    				if(maze[ix-1][iy] == 'E' && win==1) break;
    				else if(maze[ix-1][iy] == 'E' && win==0){
    					won=0;
    					break;
    				}
    				maze[ix][iy]=' ';
    				ix--;
    				maze[ix][iy]='+';
    			}
    		}
    		if(a=='s'){
    			if(maze[ix+1][iy] != '*' && maze[ix+1][iy] != '|'){
    				if(maze[ix+1][iy] == '^') maze[11][4]=' ';
    				if(maze[ix+1][iy] == '!') win=1,won=1;
    				if(maze[ix+1][iy] == 'E' && win==1) break;
    				else if(maze[ix+1][iy] == 'E' && win==0){
    					won=0;
    					break;
    				}
    				maze[ix][iy]=' ';
    				ix++;
    				maze[ix][iy]='+';
    			}
    		}
    		if(a=='a'){
    			if(maze[ix][iy-1] != '*' && maze[ix][iy-1] != '|'){
    				if(maze[ix][iy-1] == '^') maze[11][4]=' ';
    				if(maze[ix][iy-1] == '!') win=1,won=1;
    				if(maze[ix][iy-1] == 'E' && win==1) break;
    				else if(maze[ix][iy-1] == 'E' && win==0){
    					won=0;
    					break;
    				}
    				maze[ix][iy]=' ';
    				iy--;
    				maze[ix][iy]='+';
    			}
    		}
    		if(a=='d'){
    			if(maze[ix][iy+1] != '*' && maze[ix][iy+1] != '|'){
    				if(maze[ix][iy+1] == '^') maze[11][4]=' ';
    				if(maze[ix][iy+1] == '!') win=1,won=1;
    				if(maze[ix][iy+1] == 'E' && win==1) break;
    				else if(maze[ix][iy+1] == 'E' && win==0){
    					won=0;
    					break;
    				}
    				maze[ix][iy]=' ';
    				iy++;
    				maze[ix][iy]='+';
    			}
    		}
    		cout<<"                 雷达地图"<<endl;
    		cout<<"  +:你, !:目标, ^:钥匙, |:门, E:出口(入口), "<<endl;
    		for(int i=0;i<18;i++){
    			for(int j=0;j<24;j++){
    				cout<<maze[i][j]<<' ';
    			}
    			cout<<endl;
    		}
    	}
    	system("cls");
    	if(won==1) cout<<"Victory";
    	else cout<<"Victory......?";
    	return 0;
    }
    

    摩斯密码翻译器(只限字母和数字)

    #include<iostream>
    #include<cstring>
    #include<cstdio>
    using namespace std;
    int main(){
    	//摩斯密码本 
    	char morse[37][6]={".-", "-...", "-.-.", "-..", ".",
    	                "..-.", "--.", "....", "..", ".---",
    	                "-.-", ".-..", "--", "-.", "---",
    	                ".--.", "--.-", ".-.", "...", "-",
    	                "..-", "...-", ".--", "-..-", "-.--","--..",
    					"-----",".----","..--","...--","....-",
    					".....","-....","--...","---..","----."
    					};   				             
    	cout<<"请输入密文:"<<endl;
    	char a[11][6]={},b[11]={},c[11]={},d[3][6]={};
    	for(int i=0;i<10;++i){
    		cin>>a[i];
    	}
    	//------------------------------------------------------------- 
    	//摩斯密码解密后存入一维数组 
    	int k=0;
    	for(int i=0;i<10;++i){
    		for(int j=0;j<36;++j){
    			if(strcmp(a[i],morse[j])==0){
    				if(j>=0&&j<26) b[k]=j+'a';
    				else if(j>=26) b[k]=j+22;
    				++k; 
    				break; 
    			}
    		}
    	}
    	cout<<"摩斯密码解密后的结果为:"<<b<<endl; 
    	//------------------------------------------------------------- 
    	//将解密后的摩斯密码进行凯撒解密
    	for(int i=0;i<10;++i){
    		if(b[i]>='a'&&b[i]<='c') c[i]=b[i]+23;
    		else if(b[i]>='d'&&b[i]<='z') c[i]=b[i]-3;
    		else c[i]=b[i];
    	}  
    	cout<<"凯撒密码解密后的结果为:"<<c<<endl; 
    	//------------------------------------------------------------- 
    	//栅栏解密存入二维数组 
    	k=0;
    	for(int i=0;i<2;++i){
    		for(int j=0;j<5;++j){
    			d[i][j]=c[k];
    			++k;
    		}
    	}
    	cout<<"栅栏密码解密后的最终结果为:";
    	for(int i=0;i<5;++i){
    		for(int j=0;j<2;++j){
    			cout<<d[j][i];
    		}
    	}
    		return 0;
    	}
    //测试代码: 
    //.---- -.- --.- -.... .-.. ----- -.. .--- --- ....
    

    华容道

    #include<iostream>
    #include<conio.h>
    #include<windows.h>
    using namespace std;
    int n_puzzle_3[3][3] = {1,2,3,4,5,6,7,8,0};
    int n_puzzle[3][3] = {1,3,8,7,0,2,5,6,4};
    void outArr()
    {
    for(int i=0;i<3;++i)
    {
    for(int j=0;j<3;++j){
    if(n_puzzle[i][j] != 0){
    cout << n_puzzle[i][j] << " ";
    }
    else{
    cout <<"  ";
    }
    }
    cout<<endl;	
    }
    }
    void change(int *one,int *two){
    int temp;
    temp = *one;
    *one = *two;
    *two = temp;
    }
    int main(){
    outArr();
    int x=1,y=1,count=0;
    while(true){		
    cout<<"请输入移动方向(wasd):"<<endl;
    char choose;
    choose = getch();
    ++count;
    if(choose == 'w')
    {
    if(x>=0 && x<2)
    {
    change(&n_puzzle[x][y],&n_puzzle[x+1][y]);
    ++x;
    }
    }
    if(choose == 'a')
    {
    if(y>=0 && y<2)
    {
    change(&n_puzzle[x][y],&n_puzzle[x][y+1]);
    ++y;
    }
    }
    if(choose == 's')
    {
    if(x>0 && x<=2)
    {
    change(&n_puzzle[x][y],&n_puzzle[x-1][y]);
    --x;
    }
    }
    if(choose == 'd')
    {
    if(y>0 && y<=2)
    {
    change(&n_puzzle[x][y],&n_puzzle[x][y-1]);
    --y;
    }
    }
    system("cls");
    outArr();
    int flag = 1;
    for(int i=0;i<3;++i)
    {
    for(int j=0;j<3;++j){
    if(n_puzzle[i][j] != n_puzzle_3[i][j])
    {
    flag=0;			
    }
    }
    }
    if(flag == 1)
    {
    string steps = "完成数字华容道,使用步数为:";			//messagebox显示使用步数
    char sum[100];
    itoa(count,sum,10);							//将记录玩家步数的变量sum,转成字符串,赋值给iToA数组
    steps += sum;
    MessageBox(0,steps.c_str(),"提示",MB_OK);//将获得的字符串显示在messagebox上
    //MessageBox(0,"恭喜你完成数字华容道","提示",MB_OK);
    break;
    }
    }
    return 0;
    }
    

    2048

    #include<iostream>
    #include<vector>
    #include<ctime>
    #include<cstdlib>
    #include<windows.h>
    using namespace std;
    class Game_2048
    {
    public:
        Game_2048();
        ~Game_2048();
        void introduction();
        bool judgeOver();                            //判断游戏是否结束
        void reSize();
        void printBoard();                          //打印函数
        void getRand();                              //随机在棋盘上生成2,4;
        void slide();                                //滑动
    private:
        int m=4, n=4;
        char op;                                   //用户操作
        vector< vector<int> >     board;                                //棋盘
        vector<int>  row;
        bool judgeInsert(int x,int y);
        bool judgeSlide();                               //判断是否能滑动,(未写完)
        void copyBoard(vector< vector<int> > &newBoard,vector< vector<int> > &board);
        void inputOp();
        char getOp();                            //返回操作符
     
        bool judgeLeftSlide(bool mark=true);
        void leftSlide();                            //左滑动
     
        bool judgeRightSlide(bool mark = true);
        void rightSlide();
     
        bool judgeUpSlide(bool mark = true);
        void upSlide();
     
        bool judgeDownSlide(bool mark = true);
        void downSlide();
     
        void reStart();
        void enlarge();                             //将值扩大二倍
    };
     
    int main()
    {
        Game_2048 NB;
        NB.introduction();
        NB.getRand();
        NB.printBoard();
        while (!NB.judgeOver())
        {
            NB.slide();
            NB.getRand();
            NB.printBoard();
        } 
        cout << "游戏结束!!!\n";
        system("pause");
        return 0;
     
    }
     
    void Game_2048::introduction()
    {
        cout << "这是一个2048游戏,规则如下:\n";
        cout << "上划:W;\n下滑:S;\n左划:A;\n右划:D;\n退出:Q;\n重新开始:R;\n需输入每次的操作+回车\n";
        Sleep(10000);
        cout << "开始";
    	Sleep(1000); 
    }
     
    void Game_2048::slide()
    {
        inputOp();
        switch (getOp())
        {
        case 'a':
        case 'A':
            if (judgeLeftSlide())
                do
                    leftSlide();
                while (judgeLeftSlide(false));
            else
            {
                cout << "无法左滑动,请重试!!!\n";
                slide();
            }
            break;
        case 'd':
        case 'D':
            if (judgeRightSlide())
                do
                    rightSlide();
            while (judgeRightSlide(false));    
            else
            {
                cout << "无法右滑动,请重试!!!\n";
                slide();
            }
            break;
        case 'w':
        case 'W':
            if(judgeUpSlide())
                do
                upSlide();
            while (judgeUpSlide(false));
            else
            {
                cout << "无法上滑动,请重试!!!\n";
                slide();
            }
            break;
        case 's':
        case 'S':
            if(judgeDownSlide())
                do  
                    downSlide();
                while (judgeDownSlide(false));
            else
            {
                cout << "无法下滑动,请重试!!!\n";
                slide();
            }
            break;
        case 'p':
        case 'P':
            enlarge();
            break;
        case 'q':
        case 'Q':
            exit(0);
            break;
        case 'r':
        case 'R':
            reStart();
            break;
        default:
            cout << "输入错误,作为惩罚,随机生成一个数!\n";
            break;
        }
    }
     
     
    void Game_2048::reStart()
    {
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                board[i][j] = 0;
            }
    }
     
    void Game_2048::enlarge()
    {
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                board[i][j] *= 2;
            }
    }
     
     
    char Game_2048::getOp()
    {
        return op;
    }
     
    void Game_2048::upSlide()
    {
        for (int j = 0; j < n; j++)
            for (int i = m - 1; i > 0; i--) {                              //n-1!!
                if (board[i][j] != 0 && board[i - 1][j] == 0)            //移动
                {
                        board[i - 1][j] = board[i][j];
                        board[i][j] = 0;
                }
            }
        for (int j = 0; j < n; j++)
            for (int i = m - 1; i > 0; i--) {
                if (board[i][j] != 0 && board[i-1][j] == board[i][j])  //覆盖
                {
                    board[i-1][j] += board[i][j];
                    board[i][j] = 0;
                }
            }
    }
     
    bool Game_2048::judgeUpSlide(bool mark)
    {
        if (mark)
        {
            for (int i = 0; i < m; i++)
                for (int j = n - 1; j > 0; j--)
                {
                    if (board[i][j] == 0)
                    return true;
                }
        }
        for (int j = 0; j < n; j++)
            for (int i = m - 1; i > 0; i--) {                              //n-1!!
                if (board[i][j] != 0 && board[i - 1][j] == 0)            //移动
                    return true;
                if (board[i][j] != 0 && board[i - 1][j] == board[i][j])  //覆盖
                    return true;
            }
        return false;
    }
     
    bool Game_2048::judgeDownSlide(bool mark)
    {
        if (mark) {
            for (int i = 0; i < m; i++)
                for (int j = n - 1; j > 0; j--)
                    {
                        if (board[i][j] == 0)
                            return true;
                    }
        
        }
        for (int j = 0; j < n; j++)
                    for (int i = 0; i < m - 1; i++) {                              //n-1!!
                        if (board[i][j] != 0 && board[i + 1][j] == 0)            //移动
                            return true;
                        if (board[i][j] != 0 && board[i + 1][j] == board[i][j])  //覆盖
                            return true;
     
                    }
        return false;
    }
     
    void Game_2048::downSlide()
    {
        for (int j = 0; j < n; j++)
            for (int i = 0; i < m - 1; i++) {                     
                if (board[i][j] != 0 && board[i + 1][j] == 0)            //移动
                {
                        board[i + 1][j] = board[i][j];
                        board[i][j] = 0;
                }
            }
        for (int j = 0; j < n; j++)
            for (int i = 0; i < m - 1; i++) {
                if (board[i][j] != 0 && board[i + 1][j] == board[i][j])  //覆盖
                {
                    board[i + 1][j] += board[i][j];
                    board[i][j] = 0;
                }
            }
    }
     
     
    void Game_2048::rightSlide()
    {
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n - 1; j++) {                              //n-1!!
                if (board[i][j] != 0 && board[i][j + 1] == 0)            //移动
                {
                        board[i][j + 1] = board[i][j];
                        board[i][j] = 0;
                }
            }
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n - 1; j++) {
                if (board[i][j] != 0 && board[i][j + 1] == board[i][j])  //覆盖
                {
                    board[i][j + 1] += board[i][j];
                    board[i][j] = 0;
                }
            }
    }
     
    bool Game_2048::judgeRightSlide(bool mark )
    {
        if (mark) {
            for (int i = 0; i < m; i++)
                for (int j = n - 1; j > 0; j--)
                {
                    if (board[i][j] == 0)
                        return true;
                }
        }
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n - 1; j++) {                              //n-1!!
                if (board[i][j] != 0 && board[i][j + 1] == board[i][j])  //覆盖
                    return true;
                if (board[i][j] != 0 && board[i][j + 1] == 0)
                    return true;
            }
        return false;
    }
     
    void Game_2048::leftSlide()
    {
        for (int i = 0; i < m; i++)
            for (int j = 1; j < n; j++) {                              //n-1!!
                if (board[i][j] != 0 && board[i][j - 1] == 0)            //移动
                {
                        board[i][j - 1] = board[i][j];
                        board[i][j] = 0;
                }
            }
        for (int i = 0; i < m; i++)
            for (int j = 1; j < n; j++) {
                if (board[i][j] != 0 && board[i][j - 1] == board[i][j])  //覆盖
                {
                    board[i][j - 1] += board[i][j];
                    board[i][j] = 0;
                }
            }
    }
     
    bool Game_2048::judgeLeftSlide(bool mark)
    {
        if (mark) {
            for (int i = 0; i < m; i++)
                    for (int j = n - 1; j > 0; j--)
                    {
                        if (board[i][j] == 0)
                            return true;
                    }
        }
        for (int i = 0; i < m; i++)
            for (int j = n - 1; j > 0; j--) {                              //n-1!!
                if (board[i][j] != 0 && board[i][j - 1] == 0)            //移动
                    return true;
                if (board[i][j] != 0 && board[i][j - 1] == board[i][j])  //覆盖
                    return true;
            }
        return false;
    }
     
    bool Game_2048::judgeOver()
    {
        if (op == 'q' || op == 'Q')
            return true;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                if (board[i][j] == 2048)
                {
                    printBoard();
                    cout << "有数字达到了2048,恭喜!!!\n";
                    return true;
                }  
            }
     
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++) {
                 if (board[i][j] == 0)
                    return false;
            }
        if (judgeSlide())
            return false;
        else
        {
            cout << "无法再滑动\n";
            return true;
        }
        
    }
     
    bool Game_2048::judgeSlide()
    {
        vector< vector<int> >     copyBoard;                                //棋盘
        vector<int>  copyRow;
        for (int i = 0; i < n; i++) {
            copyRow.push_back(0);
        }
        for (int i = 0; i < m; i++) {
            copyBoard.push_back(copyRow);
        }
        copyBoard = board;
        upSlide();
        downSlide();
        leftSlide();
        rightSlide();
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
            {
                if (board[i][j] == 0) {
                    board = copyBoard;
                    return true;
                }  
            }
        return false;
    }
     
    void Game_2048::copyBoard(vector< vector<int> >& newBoard, vector< vector<int> >&     board)
    {
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                newBoard[i][j] = board[i][j];
    }
     
    bool Game_2048::judgeInsert(int x,int y)
    {
        if (board[x][y] == 0)
            return true;
        else
            return false;
    }
    void Game_2048::getRand()
    {
        srand(time(0));
        int x, y,val;
        do
        {
            x = rand() % m;
            y = rand() % n;
        } while (!judgeInsert(x,y));
        val = (rand() % 2 + 1)*2;
        board[x][y] = val;
     
    }
     
    void Game_2048::inputOp()
    {
        cin >> op;
    }
    void Game_2048::reSize()
    {
        cout << "请输入棋盘大小m*n\n";
        cin >> m >> n;
        Game_2048();
    }
     
    Game_2048::~Game_2048()
    {
    }
     
    Game_2048::Game_2048()
    {
        for (int i = 0; i < n; i++){
            row.push_back(0);
        }
        for (int i = 0; i < m; i++){
            board.push_back(row);
        }
    }
    void Game_2048::printBoard()
    {
    	system("cls");
        cout << "\n--------------\n";
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                cout << board[i][j];
                if (j < n-1)
                {
                    cout << "—";
                }
                if (j == n-1 && i < m-1)
                {
                    cout << endl;
                    int count = 0;
                    while (count++ < n-1)
                    {
                        cout << "|  ";
                    }
                    cout << "|" << endl;
                }
            }
        }
     
        cout << "\n--------------\n" ;
    }
    

    俄罗斯方块

    #include <iostream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    #include <windows.h>
    #include <conio.h>
     
    using namespace std;
     
    int block00[4][4] = { { 10, 0, 0, 0 }, { 1, 1, 1, 1 }, { 0, 0, 0, 0 }, { 0, 0, 0, 0 } };
    int block01[4][4] = { { 11, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 }, { 0, 0, 1, 0 } };
    int block02[4][4] = { { 12, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 1, 0, 0 } };
    int block03[4][4] = { { 13, 0, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 } };
    int block04[4][4] = { { 14, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 1, 0 } };
    int block05[4][4] = { { 15, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 } };
    int block06[4][4] = { { 16, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 1, 0, 0, 0 } };
    int block07[4][4] = { { 17, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } };
    int block08[4][4] = { { 18, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 0, 1, 0 }, { 1, 1, 1, 0 } };
    int block09[4][4] = { { 19, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 1, 0 } };
    int block10[4][4] = { { 20, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 1, 0 }, { 0, 0, 1, 0 } };
    int block11[4][4] = { { 21, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 }, { 1, 1, 0, 0 } };
    int block12[4][4] = { { 22, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 1, 0 } };
    int block13[4][4] = { { 23, 0, 0, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 }, { 0, 1, 0, 0 } };
    int block14[4][4] = { { 24, 0, 0, 0 }, { 0, 0, 0, 0 }, { 0, 1, 1, 0 }, { 1, 1, 0, 0 } };
    int block15[4][4] = { { 25, 0, 0, 0 }, { 1, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 0, 0 } };
    int block16[4][4] = { { 26, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 0, 1, 1, 0 } };
    int block17[4][4] = { { 27, 0, 0, 0 }, { 0, 0, 1, 0 }, { 0, 1, 1, 0 }, { 0, 1, 0, 0 } };
    int block18[4][4] = { { 28, 0, 0, 0 }, { 0, 0, 0, 0 }, { 1, 1, 0, 0 }, { 1, 1, 0, 0 } };
    void initialWindow (HANDLE hOut);//初始化窗口
    void initialPrint (HANDLE hOut);//初始化界面
    void gotoXY (HANDLE hOut, int x, int y);//移动光标
    void roundBlock (HANDLE hOut, int block[4][4]);//随机生成方块并打印到下一个方块位置
    bool collisionDetection (int block[4][4], int map[21][12], int x, int y);//检测碰撞
    void printBlock (HANDLE hOut, int block[4][4], int x, int y);//打印方块
    void clearBlock (HANDLE hOut, int block[4][4], int x, int y);//消除方块
    void myLeft (HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//左移
    void myRight (HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//右移
    void myUp (HANDLE hOut, int block[4][4], int map[21][12], int x, int &y);//顺时针旋转90度
    int myDown (HANDLE hOut, int block[4][4], int map[21][12], int &x, int y);//加速下落
    void myStop (HANDLE hOut, int block[4][4]);//游戏暂停
    void gameOver (HANDLE hOut, int block[4][4], int map[21][12]);//游戏结束
    //判断是否能消行并更新分值
    void eliminateRow (HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint);
    int main () {
    	MessageBox (NULL, "欢迎来到俄罗斯方块游戏!", "温馨提示", MB_OK);
    	system ("mode coon cols=200 lines=100"); 
    	system ("mode con cols=70 lines=35");
    	int map[21][12];
    	int blockA[4][4];//候选区的方块
    	int blockB[4][4];//下落中的方块
    	int positionX, positionY;//方块左上角的坐标
    	bool check;//检查方块还能不能下落
    	char key;//用来存储按键
    	int val;//用来控制下落速度
    	int fraction;//用来存储得分
    	int checkpoint;//用来存储关卡
    	int times;
    	HANDLE hOut = GetStdHandle (STD_OUTPUT_HANDLE);//获取标准输出设备句柄
    	initialWindow (hOut);
    initial:
    	gotoXY (hOut, 0, 0);
    	initialPrint (hOut);
    	check = true;
    	val = 50;
    	fraction = 0;
    	checkpoint = 1;
    	times = val;
    	for (int i = 0; i < 20; i++) {
    		for (int j = 1; j < 11; j++) {
    			map[i][j] = 0;
    		}
    	}
    	for (int i = 0; i < 20; i++) {
    		map[i][0] = map[i][11] = 1;
    	}
    	for (int i = 0; i < 12; i++) {
    		map[20][i] = 1;
    	}
    	srand ((unsigned) time (NULL));
    	roundBlock (hOut, blockA);
    	while (true) {
    		if (check) {
    			eliminateRow (hOut, map, val, fraction, checkpoint);
    			check = false;
    			positionX = -3;
    			positionY = 4;
    			if (collisionDetection (blockA, map, positionX, positionY)) {
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						blockB[i][j] = blockA[i][j];
    					}
    				}
    				roundBlock (hOut, blockA);
    			} else {
    				gameOver (hOut, blockA, map);
    				goto initial;
    			}
    		}
    		printBlock (hOut, blockB, positionX, positionY);
    		if (_kbhit ()) {
    			key = _getch ();
    			switch (key) {
    				case 72:
    					myUp (hOut, blockB, map, positionX, positionY);
    					break;
    				case 75:
    					myLeft (hOut, blockB, map, positionX, positionY);
    					break;
    				case 77:
    					myRight (hOut, blockB, map, positionX, positionY);
    					break;
    				case 80:
    					switch (myDown (hOut, blockB, map, positionX, positionY)) {
    						case 0:
    							check = false;
    							break;
    						case 1:
    							check = true;
    							break;
    						case 2:
    							gameOver (hOut, blockB, map);
    							goto initial;
    						default:
    							break;
    					}
    					break;
    				case 32:
    					myStop (hOut, blockA);
    					break;
    				case 27:
    					exit (0);
    				default:
    					break;
    			}
    		}
    		Sleep (20);
    		if (--times == 0) {
    			switch (myDown (hOut, blockB, map, positionX, positionY)) {
    				case 0:
    					check = false;
    					break;
    				case 1:
    					check = true;
    					break;
    				case 2:
    					gameOver (hOut, blockB, map);
    					goto initial;
    				default:
    					break;
    			}
    			times = val;
    		}
    	}
    	cin.get ();
    	return 0;
    }
     
    void initialWindow (HANDLE hOut) {
    	SetConsoleTitle ("俄罗斯方块");
    	COORD size = { 80, 25 };
    	SetConsoleScreenBufferSize (hOut, size);
    	SMALL_RECT rc = { 0, 0, 79, 24 };
    	SetConsoleWindowInfo (hOut, true, &rc);
    	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
    	SetConsoleCursorInfo (hOut, &cursor_info);
    }
     
    void initialPrint(HANDLE hOut) {
    	SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
    	for (int i = 0; i < 20; i++) {
    		cout << "■                    ■☆                      ☆" << endl;
    	}
    	gotoXY (hOut, 26, 0);
    	cout << "☆☆☆☆☆☆☆☆☆☆☆";
    	gotoXY (hOut, 0, 20);
    	cout << "■■■■■■■■■■■■☆☆☆☆☆☆☆☆☆☆☆☆☆";
    	gotoXY (hOut, 26, 1);
    	cout << "分    数:      ";
    	gotoXY (hOut, 26, 2);
    	cout << "关    卡:      ";
    	gotoXY (hOut, 26, 4);
    	cout << "下一方块:";
    	gotoXY (hOut, 26, 9);
    	cout << "操作方法:";
    	gotoXY (hOut, 30, 11);
    	cout << "↑:旋转 ↓:速降";
    	gotoXY (hOut, 30, 12);
    	cout << "→:右移 ←:左移";
    	gotoXY (hOut, 30, 13);
    	cout << "空格键:开始/暂停";
    	gotoXY (hOut, 30, 14);
    	cout << "Esc 键:退出";
    	gotoXY (hOut, 26, 16);
    	cout << "关    于:";
    	gotoXY (hOut, 30, 18);
    	cout << "俄罗斯方块V1.0";
    	gotoXY (hOut, 35, 19);
    }
    void gotoXY (HANDLE hOut, int x, int y) {
    	COORD pos;
    	pos.X = x;
    	pos.Y = y;
    	SetConsoleCursorPosition (hOut, pos);
    }
    void roundBlock(HANDLE hOut, int block[4][4]) {
    	clearBlock (hOut, block, 5, 15);
    	switch (rand() % 19) {
    		case 0:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block00[i][j];
    				}
    			}
    			break;
    		case 1:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block01[i][j];
    				}
    			}
    			break;
    		case 2:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block02[i][j];
    				}
    			}
    			break;
    		case 3:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block03[i][j];
    				}
    			}
    			break;
    		case 4:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block04[i][j];
    				}
    			}
    			break;
    		case 5:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block05[i][j];
    				}
    			}
    			break;
    		case 6:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block06[i][j];
    				}
    			}
    			break;
    		case 7:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    				block[i][j] = block07[i][j];
    			}
    		}
    		break;
    		case 8:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block08[i][j];
    				}
    			}
    			break;
    		case 9:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++)
    				{
    					block[i][j] = block09[i][j];
    				}
    			}
    			break;
    		case 10:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block10[i][j];
    				}
    			}
    			break;
    		case 11:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block11[i][j];
    				}
    			}
    			break;
    		case 12:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block12[i][j];
    				}
    			}
    			break;
    		case 13:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block13[i][j];
    				}
    			}
    			break;
    		case 14:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block14[i][j];
    				}
    			}
    			break;
    		case 15:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block15[i][j];
    				}
    			}
    			break;
    		case 16:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block16[i][j];
    				}
    			}
    			break;
    		case 17:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block17[i][j];
    				}
    			}
    			break;
    		case 18:
    			for (int i = 0; i < 4; i++) {
    				for (int j = 0; j < 4; j++) {
    					block[i][j] = block18[i][j];
    				}
    			}
    			break;
    		default:
    			break;
    	}
    	printBlock(hOut, block, 5, 15);
    }
    bool collisionDetection (int block[4][4], int map[21][12], int x, int y) {
    	for (int i = 0; i < 4; i++) {
    		for (int j = 0; j < 4; j++) {
    			if (x + i >= 0 && y + j >= 0 && map[x + i][y + j] == 1 && block[i][j] == 1) {
    				return false;
    			}
    		}
    	}
    	return true;
    }
    void printBlock (HANDLE hOut, int block[4][4], int x, int y) {
    	switch (block[0][0]) {
    		case 10:
    		case 11:
    			SetConsoleTextAttribute (hOut, FOREGROUND_GREEN);
    			break;
    		case 12:
    		case 13:
    		case 14:
    		case 15:
    			SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    			break;
    		case 16:
    		case 17:
    		case 18:
    		case 19:
    			SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    			break;
    		case 20:
    		case 21:
    		case 22:
    		case 23:
    			SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    			break;
    		case 24:
    		case 25:
    			SetConsoleTextAttribute (hOut, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
    			break;
    		case 26:
    		case 27:
    			SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
    			break;
    		case 28:
    			SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    			break;
    		default:
    			break;
    	}
    	for (int i = 0; i < 4; i++) {
    		if (i + x >= 0) {
    			for (int j = 0; j < 4; j++) {
    				if (block[i][j] == 1) {
    					gotoXY (hOut, 2 * (y + j), x + i);
    					cout << "■";
    				}
    			}
    		}
    	}
    }
    void clearBlock (HANDLE hOut, int block[4][4], int x, int y) {
    	for (int i = 0; i < 4; i++) {
    		if (i + x >= 0) {
    			for (int j = 0; j < 4; j++) {
    				if (block[i][j] == 1) {
    					gotoXY (hOut, 2 * (y + j), x + i);
    					cout << "  ";
    				}
    			}
    		}
    	}
    }
    void gameOver (HANDLE hOut, int block[4][4], int map[21][12]) {
    	SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    	gotoXY (hOut, 9, 8);
    	string s = "GAME OVER";
    	for (int i = 0; i < s.size (); i++) {
    		Sleep (80);
    		cout << s[i];
    	}
    	gotoXY (hOut, 8, 9);
    	s = "空格键:重来";
    	for (int i = 0; i < s.size (); i++) {
    		Sleep (80);
    		cout << s[i];
    	}
    	cout << endl;
    	gotoXY (hOut, 8, 10);
    	s = "ESC键:退出";
    	MessageBox (NULL, "很遗憾,您输了!", "温馨提示", MB_OK);
    	for (int i = 0; i < s.size (); i++) {
    		Sleep (80);
    		cout << s[i];
    	}
    	char key;
    	while (true) {
    		key = _getch ();
    		if (key == 32) {
    			return;
    		} else if (key == 27) {
    			exit(0);
    		}
    	}
    }
    int myDown (HANDLE hOut, int block[4][4], int map[21][12], int &x, int y) {
    	if (collisionDetection(block, map, x + 1, y)) {
    		clearBlock (hOut, block, x, y);
    		++x;
    		return 0;
    	}
    	if (x < 0) {
    		return 2;
    	}
    	for (int i = 0; i < 4; i++) {
    		for (int j = 0; j < 4; j++) {
    			if (block[i][j] == 1) {
    				map[x + i][y + j] = 1;
    				SetConsoleTextAttribute (hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    				gotoXY (hOut, 2 * (y + j), x + i);
    				cout << "■";
    			}
    		}
    	}
    	return 1;
    }
    void myLeft (HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) {
    	if (collisionDetection (block, map, x, y - 1)) {
    		clearBlock (hOut, block, x, y);
    		--y;
    	}
    }
    void myRight (HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) {
    	if (collisionDetection (block, map, x, y + 1)) {
    		clearBlock (hOut, block, x, y);
    		++y;
    	}
    }
    void myUp (HANDLE hOut, int block[4][4], int map[21][12], int x, int &y) {
    	switch (block[0][0]) {
    		case 10:
    			if (collisionDetection (block01, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block01[i][j];
    					}
    				}
    			}
    			break;
    		case 11:
    			if (collisionDetection (block00, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block00[i][j];
    					}
    				}
    			} else if (collisionDetection (block00, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block00[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block00, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block00[i][j];
    					}
    				}
    				++y;
    			} else if (collisionDetection (block00, map, x, y - 2)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block00[i][j];
    					}
    				}
    				y -= 2;
    			} else if (collisionDetection (block00, map, x, y + 2)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block00[i][j];
    					}
    				}
    				y += 2;
    			}
    			break;
    		case 12:
    			if (collisionDetection (block03, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block03[i][j];
    					}
    				}
    			} else if (collisionDetection (block03, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block03[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block03, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block03[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 13:
    			if (collisionDetection (block04, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block04[i][j];
    					}
    				}
    			} else if (collisionDetection (block04, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block04[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block04, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block04[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 14:
    			if (collisionDetection (block05, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block05[i][j];
    					}
    				}
    			} else if (collisionDetection (block05, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block05[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block05, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block05[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 15:
    			if (collisionDetection (block02, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block02[i][j];
    					}
    				}
    			} else if (collisionDetection (block02, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block02[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block02, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block02[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 16:
    			if (collisionDetection (block07, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block07[i][j];
    					}
    				}
    			} else if (collisionDetection (block07, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block07[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block07, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block07[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 17:
    			if (collisionDetection (block08, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block08[i][j];
    					}
    				}
    			} else if (collisionDetection (block08, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block08[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block08, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block08[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 18:
    			if (collisionDetection (block09, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block09[i][j];
    					}
    				}
    			} else if (collisionDetection (block09, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block09[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block09, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block09[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 19:
    			if (collisionDetection (block06, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block06[i][j];
    					}
    				}
    			} else if (collisionDetection (block06, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block06[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection(block06, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block06[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 20:
    			if (collisionDetection (block11, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block11[i][j];
    					}
    				}
    			} else if (collisionDetection (block11, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++)	{
    					for (int j = 0; j < 4; j++)	{
    						block[i][j] = block11[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block11, map, x, y + 1))	{
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++)	{
    					for (int j = 0; j < 4; j++)	{
    						block[i][j] = block11[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 21:
    			if (collisionDetection (block12, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++)	{
    						block[i][j] = block12[i][j];
    					}
    				}
    			} else if (collisionDetection(block12, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block12[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block12, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block12[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 22:
    			if (collisionDetection (block13, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block13[i][j];
    					}
    				}
    			} else if (collisionDetection (block13, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block13[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block13, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block13[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 23:
    			if (collisionDetection (block10, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block10[i][j];
    					}
    				}
    			} else if (collisionDetection (block10, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block10[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block10, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block10[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 24:
    			if (collisionDetection (block15, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block15[i][j];
    					}
    				}
    			} else if (collisionDetection (block15, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block15[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block15, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block15[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 25:
    			if (collisionDetection (block14, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block14[i][j];
    					}
    				}
    			} else if (collisionDetection (block14, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block14[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block14, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block14[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 26:
    			if (collisionDetection (block17, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block17[i][j];
    					}
    				}
    			} else if (collisionDetection (block17, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block17[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block17, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block17[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		case 27:
    			if (collisionDetection (block16, map, x, y)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block16[i][j];
    					}
    				}
    			} else if (collisionDetection (block16, map, x, y - 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block16[i][j];
    					}
    				}
    				--y;
    			} else if (collisionDetection (block16, map, x, y + 1)) {
    				clearBlock (hOut, block, x, y);
    				for (int i = 0; i < 4; i++) {
    					for (int j = 0; j < 4; j++) {
    						block[i][j] = block16[i][j];
    					}
    				}
    				++y;
    			}
    			break;
    		default:
    			break;
    	}
    }
    void myStop (HANDLE hOut, int block[4][4]) {
    	clearBlock (hOut, block, 5, 15);
    	SetConsoleTextAttribute (hOut, FOREGROUND_RED | FOREGROUND_INTENSITY);
    	gotoXY (hOut, 30, 7);
    	cout << "游戏暂停";
    	char key;
    	while (true) {
    		key = _getch ();
    		if (key == 32) {
    			gotoXY (hOut, 30, 7);
    			cout << "        ";
    			printBlock (hOut, block, 5, 15);
    			return;
    		}
    		if (key == 27) {
    			exit (0);
    		}
    	}
    }
    void eliminateRow (HANDLE hOut, int map[21][12], int &val, int &fraction, int &checkpoint) {
    	SetConsoleTextAttribute(hOut, FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY);
    	for (int i = 19; i >= 0; i--) {
    		int x = 0;
    		for (int j = 1; j < 11; j++) {
    			x += map[i][j];
    		}
    		if (x == 10) {
    			fraction += 100;
    			if (val > 1 && fraction / 1000 + 1 != checkpoint) {
    				checkpoint = fraction / 1000 + 1;
    				val -= 5;
    			}
    			for (int m = i; m > 0; m--) {
    				for (int n = 1; n < 11; n++) {
    					map[m][n] = map[m - 1][n];
    					gotoXY (hOut, 2 * n, m);
    					if (map[m][n] == 1) {
    						cout << "■";
    					} else {
    						cout << "  ";
    					}
    				}
    			}
    			i++;
    		}
    	}
    	gotoXY (hOut, 36, 1);
    	cout << fraction;
    	gotoXY (hOut, 36, 2);
    	cout << checkpoint;
    }
    

    坦克大战

    #include <stdio.h>
     
    #include <windows.h>
     
    #include <time.h> 
     
                               //里规格:长39*2=78 (真坐标)(假坐标宽为39)  高39
     
                               //外规格:长41*2=82 (真坐标)(假坐标宽为41)  高41
     
    #define UP    1
     
    #define DOWN  2
     
    #define LEFT  3
     
    #define RIGHT 4
     
    #define MAX_LEVEL 8
     
    #define BULLET_NUM 20
     
    #define MAX_LIFE 4
     
     
     
    //程序中未写入函数参数表中且未说明的变量只有map二维数组,level_info数组和level   
     
     
     
    /*
          此程序中涉及的x,y类的坐标值,分为以下两种:                             
                                                                                                  
    假坐标:这里的坐标指的是以一个■长度为单位的坐标,而不是真正的coord坐标 (用于map数组的坐标)                         
                                                                                                  
    真坐标:头文件自带的坐标结构coord中的坐标(也可以说是控制台里的真正坐标值)                             
                                                                                                  
      区别:纵坐标y两值一致,假横坐标x值与真正coord横坐标(真坐标)关系是 x * 2 = coord 横坐标  
                                                                                                            
              coord横坐标既指GoTo函数中的x参数,因为本程序游戏界面以一个■长度为基本单位,                
                                                                                                  
              可以说涉及的coord横坐标全是偶数。既假坐标要变真坐标(变真坐标才能发挥真正作用),横坐标须乘以2                                
                                                           
    */
     
    typedef struct             //这里的出现次序指的是一个AI_tank变量中的次序,游戏共有四个AI_tank变量
     
    {                          //∵设定每个AI_tank每种特殊坦克只出现一次 ∴fast_tank & firm_tank 最多出现次数不超过1
     
        int fast_tank_order;   //fast_tank出现的次序(在第fast_tank_order次复活出现,从第0次开始),且每个AI_tank只出现一次
     
        int firm_tank_order;   //firm_tank出现的次序,同上
     
    } LevInfo;                 //关卡信息(准确说是该关出现的坦克信息)
     
    LevInfo level_info [MAX_LEVEL] = {{-1,-1},{3,-1},{-1,3},{2,3},{2,3},{2,3},{2,3},{2,3}};   //初始化,-1代表没有该类型坦克
     
     
     
     
     
    typedef struct      //子弹结构体
     
    {
     
        int x,y;        //子弹坐标,假坐标
     
        int direction;  //子弹方向变量
     
        bool exist;     //子弹存在与否的变量,1为存在,0不存在
     
        bool initial;   //子弹是否处于建立初状态的值,1为处于建立初状态,0为处于非建立初状态
     
        bool my;        //区分AI子弹与玩家子弹的标记,0为AI子弹,1为玩家(我的)子弹
     
    } Bullet;
     
    Bullet bullet [BULLET_NUM];  //考虑到地图上不太可能同时存在20颗子弹,所以数组元素设置20个
     
     
     
     
     
    typedef struct      //坦克结构体
     
    {
     
        int x,y;        //坦克中心坐标
     
        int direction;  //坦克方向
     
        int color;      //颜色参方向数,1到6分别代表不同颜色,具体在PrintTank函数定义有说明
     
        int model;      //坦克图案模型,值为1,2,3,分别代表不同的坦克图案,0为我的坦克图案,AI不能使用
     
        int stop;       //只能是AI坦克使用的参数,非0代表坦克停止走动,0为可以走动
     
        int revive;     //坦克复活次数
     
        int num;        //AI坦克编号(固定值,为常量,初始化函数中定下)0~3
     
        int CD;         //发射子弹冷却计时
     
        bool my;        //是否敌方坦克参数,我的坦克此参数为1,为常量
     
        bool alive;     //存活为1,不存活为0
     
    }  Tank;
     
    Tank AI_tank[4] , my_tank;  //my_tank为我的坦克,Ai_tank 代表AI坦克
     
     
     
    //∵所有的函数都有可能对全局变量map进行读写(改变),
     
    //∴函数中不另说明是否会对全局变量map读写
     
    //基本操作与游戏辅助函数
     
    void GoToxy(int x,int y);    //光标移动
     
    void HideCursor();           //隐藏光标
     
    void keyboard ();            //接受键盘输入
     
    void Initialize();           //初始化(含有对多个数据的读写)
     
    void Stop();                 //暂停
     
    void Getmap();               //地图数据存放与获取
     
    void Frame ();               //打印游戏主体框架
     
    void PrintMap();             //打印地图(地图既地图障碍物)(含对level的读取)
     
    void SideScreen ();          //副屏幕打印
     
    void GameCheak();            //检测游戏输赢
     
    void GameOver( bool home );  //游戏结束
     
    void ClearMainScreen();      //主屏幕清屏函数∵system("cls")后打印框架有一定几率造成框架上移一行的错误∴单独编写清屏函数
     
    void ColorChoose(int color); //颜色选择函数
     
    void NextLevel();            //下一关(含有对level全局变量的读写)
     
     
     
    //子弹部分
     
    void BuildAIBullet(Tank *tank);                //AI坦克发射子弹(含有对my_tank的读取,只读取了my_tank坐标)
     
    void BuildBullet  (Tank tank);                 //子弹发射(建立)(人机共用)(含全局变量bullet的修改)我的坦克发射子弹直接调用该函数,AI通过AIshoot间接调用
     
    void BulletFly    (Bullet bullet[BULLET_NUM]); //子弹移动和打击(人机共用),
     
    void BulletHit    (Bullet* bullet);            //子弹碰撞(人机共用)(含Tank全局变量的修改),只通过BulletFly调用,子弹间的碰撞不在本函数,子弹间碰撞已在BulletShoot中检测并处理
     
    void PrintBullet  (int x,int y,int T);         //打印子弹(人机共用)
     
    void ClearBullet  (int x,int y,int T);         //清除子弹(人机共用)
     
    int  BulletCheak  (int x,int y);               //判断子弹前方情况(人机共用)
     
     
     
    //坦克部分
     
    void BuildAITank (int* position, Tank* AI_tank); //建立AI坦克
     
    void BuildMyTank (Tank* my_tank);                //建立我的坦克
     
    void MoveAITank  (Tank* AI_tank);                //AI坦克移动
     
    void MoveMyTank  (int turn);                     //我的坦克移动,只通过keyboard函数调用,既键盘控制
     
    void ClearTank   (int x,int y);                  //清除坦克(人机共用)
     
    void PrintTank   (Tank tank);                    //打印坦克(人机共用)
     
    bool TankCheak   (Tank tank,int direction);      //检测坦克dirtection方向的障碍物,返值1阻碍,0 畅通
     
    int  AIPositionCheak (int position);           //检测AI坦克建立位置是否有障碍物AIPositionCheak
     
     
     
    //DWORD WINAPI InputX(LPVOID lpParameter); //声明线程函数,用于检查X键输入并设置X键的输入冷却时间
     
     
     
     
     
    //注意map数组应是纵坐标在前,横坐标在后,既map[y][x],(∵数组行长度在前,列长度在后)
     
    //map里的值: 个位数的值为地图方块部分,百位数的值为坦克,子弹在map上没有值(子弹仅仅是一个假坐标)
     
    //map里的值: 0为可通过陆地,1为红砖,2黄砖,5为水,100~103为敌方坦克,200为我的坦克,
     
     
     
    //全局变量
     
    int map[41][41];  //地图二维数组
     
    int key_x;        // X键是否被“读入”的变量,也是子弹是否可以发射的变,
     
    int bul_num;      //子弹编号
     
    int position;     //位置计数,对应AI坦克生成位置,-1为左位置,0为中间,1为右,2为我的坦克位置
     
    int speed=7;      //游戏速度,调整用
     
    int level=1;      //游戏关卡数
     
    int score=0;      //游戏分数
     
    int remain_enemy; //剩余敌人(未出现的敌人)
     
     
     
    char* tank_figure[4][3][4]=
     
    {
     
      {
     
        {"◢┃◣", "◢━◣", "◢┳◣", "◢┳◣"},
     
        {"┣●┫", "┣●┫", "━●┃", "┃●━"},
     
        {"◥━◤", "◥┃◤", "◥┻◤", "◥┻◤"}
     
      }, 
     
      {
     
        {"┏┃┓", "┏┳┓", "┏┳┓", "┏┳┓"},
     
        {"┣●┫", "┣●┫", "━●┫", "┣●━"},
     
        {"┗┻┛", "┗┃┛", "┗┻┛", "┗┻┛"}
     
      }, 
     
      {
     
        {"┏┃┓", "◢━◣", "┏┳◣", "◢┳┓"},
     
        {"┣●┫", "┣●┫", "━●┃", "┃●━"},
     
        {"◥━◤", "┗┃┛", "┗┻◤", "◥┻┛"}
     
      },
     
      {
     
        {"╔┃╗", "╔╦╗", "╔╦╗", "╔╦╗"},
     
        {"╠█╣", "╠█╣", "━█╣", "╠█━"},
     
        {"╚╩╝", "╚┃╝", "╚╩╝", "╚╩╝"}
     
      }
     
    };
     
     
     
     
     
     
     
    int main ()                               //主函数
     
    {
     
        int i;
     
        unsigned int interval[12]={1,1,1,1,1,1,1,1,1,1,1,1} ;  //间隔计数器数组,用于控制速度
     
        srand(time(NULL)); //设置随机数种子(若不设置种子而调用rand会使每次运行的随机数序列一致)随机数序列指:如首次调用rand得到1,第二次得2,第三次3,则此次随机数序列为1,2,3
     
        HideCursor();                         //隐藏光标
     
        system("mode con cols=112 lines=42"); //控制窗口大小
     
        Frame ();                             //打印游戏主体框架
     
        Initialize();                         //初始化,全局变量level初值便是1 
     
    //    HANDLE h1 , h2 ;                      //定义句柄变量
     
        for(;;)
     
        {
     
            if(interval[0]++%speed==0)        //速度调整用,假设interval[0]为a, 语句意为 a % 2==0,a=a+1; 
     
            {
     
                GameCheak();                  //游戏胜负检测
     
                BulletFly ( bullet );
     
                for(i=0 ; i<=3 ; i++)         //AI坦克移动循环
     
                {
     
                    if(AI_tank[i].model==2 && interval[i+1]++%2==0) //四个坦克中的快速坦克单独使用计数器1,2,3,4
     
                        MoveAITank( & AI_tank[i]);
     
                    if(AI_tank[i].model!=2 && interval[i+5]++%3==0) //四个坦克中的慢速坦克单独使用计数器5,6,7,8
     
                        MoveAITank( & AI_tank[i]);
     
                }
     
                for(i=0;i<=3;i++)                                   //建立AI坦克部分
     
                         if(AI_tank[i].alive==0 && AI_tank[i].revive<4 && interval[9]++%90==0)  //一个敌方坦克每局只有4条命
     
                    {                                               //如果坦克不存活。计时,每次建立有间隔  1750 ms
     
                           BuildAITank( &position, & AI_tank[i] );     //建立AI坦克(复活)
     
                          break;                                      //每次循环只建立一个坦克
     
                      }
     
                for(i=0;i<=3;i++)
     
                    if(AI_tank[i].alive)
     
                        BuildAIBullet(&AI_tank[i]);                 //AIshoot自带int自增计数CD,不使用main中的CD interval
     
                if(my_tank.alive && interval[10]++%2==0 )
     
                     keyboard ();
     
                if(my_tank.alive==0 && interval[11]++%30==0 && my_tank.revive < MAX_LIFE)
     
                     BuildMyTank( &my_tank );
     
            }
     
            Sleep(5);
     
        }
     
        return 0;
     
    }
     
     
     
     
     
    /*//这里的多线程暂时不用                   //x键用于子弹发射,x键的冷却时间不能和上下左右一同设置,那样就太快了
    DWORD WINAPI InputX(LPVOID lpParameter)    //如果不用多线程运行,那么在x键冷却时间内程序会因Sleep将会挂起,暂停运行
    {                                          //因为只有一个变量改变,而且变量改变先后顺序是显而易见的,所以不必设置缓冲区
        for(;;)                          
        {                                
            if(GetAsyncKeyState( 88 )& 0x8000) //88为x键键值,当摁下x并且x键处于可输入状态
            {
                key_x=1;                       // X键是否允许被“读入”的变量,也是子弹是否可以发射的变量
                Sleep(600);                    // 子线程Sleep中,x就不能被"读入",主线程每操作完一次子弹发射,key_x会归零
            }
            Sleep(10);
        }
        return 0;
    }*/
     
     
     
     
     
    void keyboard ()
     
    {               // kbhit()   getch()  用法可用但是不好用        
     
    /* 
       函数功能:该函数判断在此函数被调用时,某个键是处于UP状态还是处于DOWN状态,及前次调用GetAsyncKeyState函数后,
       是否按过此键.如果返回值的最高位被置位,那么该键处于DOWN状态;如果最低位被置位,那么在前一次调用此函数后,此键被按过,
       否则表示该键没被按过.
       这里GetAsyncKeyState比 kbhit() + getch() 好用,操作更顺畅.   GetAsyncKeyState的返回值表示两个内容,
       一个是最高位bit的值,代表这个键是否被按下。一个是最低位bit的值,代表上次调用GetAsyncKeyState后,这个键是否被按下。
       &为与操作,&0x8000就是判断这个返回值的高位字节。如果high-order bit是1,则是按下状态,否则是弹起状态,为0
    */
     
        int count=0;
     
        if (GetAsyncKeyState(VK_UP)& 0x8000)  
     
            MoveMyTank( UP );
     
        else if (GetAsyncKeyState(VK_DOWN)& 0x8000)  
     
            MoveMyTank( DOWN );
     
        else if (GetAsyncKeyState(VK_LEFT)& 0x8000)
     
            MoveMyTank( LEFT );
     
        else if (GetAsyncKeyState(VK_RIGHT)& 0x8000)  
     
            MoveMyTank( RIGHT );
     
        else if (GetAsyncKeyState( 0x1B )& 0x8000)  // Esc键
     
            exit(0);                                //退出程序函数
     
        else if (GetAsyncKeyState( 0x20 )& 0x8000)  //空格
     
            Stop();
     
        else if (count++%7==0)            //这里添加计数器是为了防止按键粘连不能达到微调效果
     
        {
     
            if (speed>1 && GetAsyncKeyState( 0x6B )& 0x8000)   // +键
     
            {
     
                speed--;
     
                GoToxy(102,11);           //在副屏幕打印出当前速度
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_RED);
     
                printf("%d ",21-speed);   //副屏幕显示的速度为1~10
     
            }
     
            else if (speed<20 && GetAsyncKeyState( 0x6D )& 0x8000)  // - 键
     
            {
     
                speed++;
     
                GoToxy(102,11);           //在副屏幕打印出当前速度
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_RED);
     
                printf("%d ",21-speed);   //副屏幕显示的速度为1~10
     
            }
     
        }
     
        if(my_tank.CD==7)
     
        {
     
            if(GetAsyncKeyState( 88 )& 0x8000)
     
            {
     
                BuildBullet(my_tank);
     
                my_tank.CD=0;
     
            }
     
        }
     
        else
     
            my_tank.CD++;
     
    }
     
     
     
     
     
     
     
    void BuildAIBullet(Tank *tank)   //AI子弹发射(建立)含有对my_tank的读取
     
    {
     
        if(tank->CD==15)
     
        {
     
            if(!(rand()%11))     //冷却结束后在随后的每个游戏周期中有10分之一的可能发射子弹
     
            {
     
                BuildBullet(*tank);
     
                tank->CD=0;
     
            }
     
        }
     
        else
     
            tank->CD++;
     
        if(tank->CD >= 14)       //AI强化部分,在冷却到达一定范围即可使用
     
        {
     
            if(tank->y==38 )     //如果坦克在底部(这个最优先)
     
            {
     
                if(tank->x < 20) //在老家左边
     
                {
     
                    if(tank->direction==RIGHT)  //坦克方向朝左
     
                    {
     
                        BuildBullet(*tank);     //发射子弹
     
                        tank->CD=0;
     
                    }
     
                }
     
                else             //在老家右边
     
                    if(tank->direction==LEFT)   //坦克方向朝右
     
                    {
     
                        BuildBullet(*tank);     //发射子弹
     
                        tank->CD=0;
     
                    }
     
            }
     
            else if(tank->x==my_tank.x+1 || tank->x==my_tank.x || tank->x==my_tank.x-1)  //AI坦克在纵向上"炮口"对准我的坦克
     
            {
     
                if(tank->direction==DOWN && my_tank.y > tank->y || tank->direction==UP && my_tank.y < tank->y)
     
                {                               //若是AI朝下并且我的坦克在AI坦克下方(数值大的在下面)或者AI朝上我的坦克在AI上方
     
                    int big=my_tank.y , smal=tank->y , i; 
     
                    if(my_tank.y < tank->y)
     
                    {
     
                        big=tank->y;
     
                        smal=my_tank.y;
     
                    }
     
                    for(i=smal+2;i<=big-2;i++)  //判断AI炮口的直线上两坦克间有无障碍
     
                        if(map[i][tank->x]!=0 || map[i][tank->x]!=5)      //若有障碍
     
                            break;
     
                    if(i==big-1)                //若i走到big-1说明无障碍
     
                    {
     
                        BuildBullet(*tank);     //则发射子弹
     
                        tank->CD=0;
     
                    }
     
                }
     
            }
     
            else if(tank->y==my_tank.y+1 || tank->y==my_tank.y || tank->y==my_tank.y-1) //AI坦克在横向上"炮口"对准我的坦克
     
            {
     
                if(tank->direction==RIGHT && my_tank.x > tank->x || tank->direction==LEFT && my_tank.x < tank->x)
     
                {                  //若是AI朝右并且我的坦克在AI坦克右方(数值大的在下面)或者AI朝左我的坦克在AI左方
     
                    int big=my_tank.y , smal=tank->y , i;
     
                    if(my_tank.x < tank->x)
     
                    {
     
                        big=tank->x;
     
                        smal=my_tank.x;
     
                    }
     
                    for(i=smal+2;i<=big-2;i++)  //判断AI炮口的直线上两坦克间有无障碍
     
                        if(map[tank->y][i]!=0 || map[tank->y][i]!=5)      //若有障碍
     
                            break;
     
                    if(i==big-1)   //若i走到big-1说明无障碍
     
                    {
     
                        BuildBullet(*tank);     //则发射子弹
     
                        tank->CD=0;
     
                    }
     
                }
     
            }
     
        }
     
    }
     
     
     
     
     
     
     
    void BuildBullet(Tank tank)  //子弹发射(建立),传入结构体Tank,这里包含改变了全局变量结构体bullet
     
    {                            //∵实现方式为顺序循环建立子弹,每次调用改变的bullet数组元素都不同
     
        switch(tank.direction)   //∴为了方便,不将bullet放入参数,bullet作为全局变量使用
     
        {
     
            case UP    :
     
                    bullet [bul_num].x = tank.x;
     
                    bullet [bul_num].y = tank.y-2;
     
                    bullet [bul_num].direction=1;
     
                    break;
     
            case DOWN  :
     
                    bullet [bul_num].x = tank.x;
     
                    bullet [bul_num].y = tank.y+2;
     
                    bullet [bul_num].direction=2;
     
                    break;
     
            case LEFT  :
     
                    bullet [bul_num].x = tank.x-2;
     
                    bullet [bul_num].y = tank.y;
     
                    bullet [bul_num].direction=3;
     
                    break;
     
            case RIGHT :
     
                    bullet [bul_num].x = tank.x+2;                                 
     
                    bullet [bul_num].y = tank.y; 
     
                    bullet [bul_num].direction=4;
     
                    break; 
     
        }   
     
        bullet [bul_num].exist = 1;    //子弹被建立,此值为1则此子弹存在
     
        bullet [bul_num].initial = 1;  //子弹处于初建立状态
     
        bullet [bul_num].my=tank.my;   //如果是我的坦克发射的子弹bullet.my=1,否则为0
     
        bul_num++;
     
        if(bul_num==BULLET_NUM)        //如果子弹编号增长到20号,那么重头开始编号
     
            bul_num=0;                 //考虑到地图上不可能同时存在20颗子弹,所以数组元素设置20个
     
    }
     
     
     
     
     
    void BulletFly(Bullet bullet[BULLET_NUM]) //子弹移动和打击
     
    {                                         //含有全局变量Bullet的改变
     
        for(int i =0; i<BULLET_NUM;i++)
     
        {
     
            if(bullet [i].exist)              //如果子弹存在
     
            {   
     
                if(bullet [i].initial==0)     //如果子弹不是初建立的
     
                {                       
     
                    if(map[bullet[i].y] [bullet[i].x]==0 || map[bullet[i].y] [bullet[i].x]==5)   //如果子弹坐标当前位置无障碍
     
                        ClearBullet( bullet[i].x , bullet[i].y , BulletCheak(bullet[i].x , bullet[i].y ));     //抹除子弹图形
     
                    switch(bullet [i].direction)                                      //然后子弹坐标变化(子弹变到下一个坐标)
     
                    {
     
                        case UP    :(bullet [i].y)--;break;
     
                        case DOWN  :(bullet [i].y)++;break;
     
                        case LEFT  :(bullet [i].x)--;break;
     
                        case RIGHT :(bullet [i].x)++;break;
     
                    }
     
                }
     
                int collide = BulletCheak ( bullet [i].x , bullet [i].y );   //判断子弹当前位置情况,判断子弹是否碰撞,是否位于水面上。
     
                if( collide )                                                //如果检测到当前子弹坐标无障碍(无碰撞)(包括在地面上与在水面上)
     
                    PrintBullet( bullet[i].x , bullet[i].y , collide);       //则打印子弹,若有碰撞则不打印
     
                else
     
                    BulletHit( & bullet [i] );     //若有碰撞则执行子弹碰撞函数              
     
                if(bullet [i].initial)             //若子弹初建立,则把初建立标记去除
     
                    bullet [i].initial = 0;
     
                for(int j=0; j< BULLET_NUM ; j++)  //子弹间的碰撞判断,若是我方子弹和敌方子弹碰撞则都删除,若为两敌方子弹则无视
     
                    if(bullet [j].exist && j!=i && (bullet[i].my || bullet[j].my) && bullet[i].x==bullet[j].x && bullet[i].y==bullet[j].y)
     
                    {                              //同样的两颗我方子弹不可能产生碰撞
     
                        bullet [j].exist=0;
     
                        bullet [i].exist=0;
     
                        ClearBullet( bullet[j].x , bullet[j].y , BulletCheak(bullet[j].x , bullet[j].y ));  //抹除j子弹图形,子弹i图形已被抹除
     
                        break;
     
                    }
     
            }
     
        }
     
    }
     
     
     
     
     
    void BulletHit(Bullet* bullet)  //含有Tank全局变量的修改,子弹间的碰撞不在本函数,子弹间碰撞已在BulletShoot中检测并处理
     
    {                               //∵每次打中的坦克都不一样,不可能把所有坦克放在参数表中
     
        int x=bullet->x;            //∴这里的Tank使用全局变量
     
        int y=bullet->y;            //这里传入的值是子弹坐标,这两个值不需要改变
     
        int i;
     
        if(map[y][x]==1 || map[y][x]==2)  //子弹碰到砖块
     
        {
     
            if(bullet->direction==UP || bullet->direction==DOWN)   //如果子弹是纵向的
     
                for(i = -1 ; i<=1 ; i++)
     
                    if(map[y][x+i]==1 || map[y][x+i]==2)  //如果子弹打中砖块两旁为砖块,则删除砖,若不是(一旁为坦克或其他地形)则忽略
     
                    {
     
                        map[y][x+i]=0;    //砖块碎
     
                         GoToxy(2*x+2*i,y);
     
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED); //背景黑色
     
                         printf("  ");
     
                    }
     
            if(bullet->direction==LEFT || bullet->direction==RIGHT)     //若子弹是横向的  (与子弹纵向实现同理)
     
                for(i = -1 ; i<=1 ; i++)
     
                    if(map[y+i][x]==1 || map[y+i][x]==2)
     
                    {
     
                        map[y+i][x]=0;
     
                         GoToxy(2*x,y+i);
     
                        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED); //背景黑色
     
                         printf("  "); 
     
                    }
     
            bullet->exist=0;           //这颗子弹已经不存在了
     
        }
     
        else if(map[y][x]==4 || map[y][x]==6 )  //子弹碰到边框或者不可摧毁方块
     
            bullet->exist=0;
     
        else if(bullet->my && map[y][x]>=100 && map[y][x]<104 )  //若我的子弹碰到了敌方坦克
     
        {
     
            int num = map[y][x]%100;   //map[y][x]%100 等同于 tank.num ,可通过map值读取该坦克信息
     
            if(AI_tank[num].model==3 && AI_tank[num].color==2)   //若为firm tank,且color==2。该坦克为绿色,表明没有受到伤害
     
                    AI_tank[num].color=3;                        //则变成黄色,color=3为黄色
     
            else if (AI_tank[num].model==3 && AI_tank[num].color==3)
     
                    AI_tank[num].color=4;                        //4为红色
     
            else                       //其他类型的坦克或者firm tank为红色的情况
     
            {
     
                AI_tank[num].alive=0;
     
                ClearTank(AI_tank[num].x , AI_tank[num].y);      //清除该坦克
     
            }
     
            bullet->exist=0;
     
            score+=100;
     
            GoToxy(102,5);             //在副屏幕上打印出分数
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
     
            printf("%d ",score);
     
        }
     
        else if(map[y][x]==200 && bullet->my==0 )   //若敌方子弹击中我的坦克
     
        {
     
            my_tank.alive=0;
     
            ClearTank(my_tank.x , my_tank.y);
     
            bullet->exist=0;
     
            my_tank.revive++;      //我的坦克复活次数+1(∵我的坦克复活次数与生命值有关∴放在这里自减)
     
            score-=100;            //分数减少
     
            GoToxy(102,5);         //在副屏幕上打印出分数
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE);
     
            printf("%d   ",score);
     
            GoToxy(102,7);         //在副屏幕打印出我的剩余生命值
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
     
            printf("%d   ", MAX_LIFE-my_tank.revive);
     
        }
     
    //    else if(bullet->my==0 && map[y][x]>=100 && map[y][x]<104) //敌方子弹击中敌方坦克,可以设置两种子弹运行方式,这种暂时不用
     
    //        bullet->exist=0;
     
        else if(map[y][x]==9)      //子弹碰到家(无论是谁的子弹)
     
        {
     
            bullet->exist=0;
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
     
            GoToxy(38,37);     printf("      ");
     
            GoToxy(38,38);     printf("◢◣  ");
     
            GoToxy(38,39);     printf("███");
     
            GameOver(1);           //游戏结束,传入1代表老家被毁
     
        }
     
    }
     
     
     
     
     
    int BulletCheak (int x,int y)  //判断子弹当前位置情况,判断子弹是否碰撞,是否位于水面上。
     
    {                              //有障碍返回0,无障碍且子弹在地面返回1,子弹在水面上返回2
     
        if(map[y][x]==0)
     
            return 1;
     
        else if(map[y][x]==5)
     
            return 2;
     
        else
     
            return 0;
     
    }
     
     
     
     
     
    void PrintBullet (int x,int y,int T)   //当前坐标BulletCheak 的值做参量 T
     
    {
     
        if(T==1)          //  T==1 表示子弹当前坐标在陆地上
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY);
     
        else if(T==2)     //  T==2 表示子弹当前坐标在水面上
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE|FOREGROUND_INTENSITY|BACKGROUND_BLUE);
     
        GoToxy(2*x,y);
     
        printf("●");
     
    }
     
     
     
     
     
    void ClearBullet(int x,int y,int T)   //当前坐标BulletCheak 的值做参量 T
     
    {
     
        GoToxy(2*x,y);
     
        if(T==2)        //  T==2 表示子弹当前坐标在水面上
     
        {
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|BACKGROUND_BLUE|FOREGROUND_BLUE|FOREGROUND_GREEN);
     
            printf("~");
     
        }
     
        else if(T==1)   //  T==1 表示子弹当前坐标在陆地上
     
        {
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
     
            printf("●");
     
        }
     
    }
     
     
     
     
     
    //position为坦克生成位置,-1为左位置,0为中间,1为右,2为我的坦克位置
     
    void BuildAITank(int* position, Tank* AI_tank)   //执行一次该函数只建立一个坦克
     
    {                                         //rand函数公式:0<=rand()%(a+1)<=a  0+m<=rand()%(n-m+1)+m<=n  
     
                                              //rand函数实现1到n:1<=rand()%(n)+1<=n
     
           if(AIPositionCheak(*position))        //若此位置无障碍,可生成。position参数详见AIPositionCheak函数定义
     
        {
     
            AI_tank->x= 20 + 18*(*position);  //20 + 18 * position 对应三个生成位置的x假坐标
     
            AI_tank->y=2;
     
            if(AI_tank->revive==level_info[level-1].firm_tank_order)  //坦克出现(复活)次序==关卡信息(level_info)中firm tank的出现次序
     
            {
     
                AI_tank->model = 3;           //3为firm tank的模型(外观)
     
                AI_tank->color = 2;           //颜色参数2为绿色,具体详见函数ColorChoose
     
            }
     
            else if(AI_tank->revive==level_info[level-1].fast_tank_order)  //同上if,这里是fast_tank的
     
            {
     
                AI_tank->model = 2;
     
                AI_tank->color = rand()%6+1;  //若不是firm tank则随机颜色,颜色参数为1~6,分别代表不同颜色,详见函数ColorChoose
     
            }
     
            else      //普通坦克
     
            {
     
                AI_tank->model = 1;
     
                   AI_tank->color = rand()%6+1;  //若不是firm tank则随机颜色
     
            }
     
            AI_tank->alive = 1;       //坦克变为存在
     
            AI_tank->direction = 2 ;  //方向朝下
     
            AI_tank->revive++;        //复活次数+1
     
            PrintTank(*AI_tank);
     
            (*position)++; 
     
            remain_enemy--;
     
            GoToxy(102,9);            //在副屏幕上打印剩余坦克数
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
     
            printf("%d ",remain_enemy);
     
            if(*position==2)          //position只能为0,1,-1,这里position循环重置
     
                *position = -1;
     
                 return ;                  //若生成了一辆坦克,则结束该函数
     
        }
     
    }
     
     
     
     
     
    int AIPositionCheak( int position )    //position为坦克生成位置2为我的坦克位置,其余为AI位,-1为左位,0为中间位置,1为右位
     
    {
     
        int    x,y;
     
        if(position==2)                    //2为我的坦克位置,现在暂时用不到
     
            x=15,y=38;
     
        else
     
            y=2 , x= 20 + 18 * position ;  //20 + 18 * position 对应三个生成位置的x假坐标
     
        for(int i=0;i<3;i++)
     
            for(int j=0;j<3;j++)
     
                if( map[y+j-1][x+i-1]!=0)  //如果遍历的九宫格里有障碍物
     
                    return 0;              //则返回0,表示此生成位置有阻碍
     
        return 1;                          //否则生成1,表示此生成位置无阻碍
     
    }
     
     
     
     
     
    void MoveAITank(Tank* AI_tank) //AI专用函数,该函数主要为AI加强
     
    {
     
           if(AI_tank->alive)         //如果坦克活着
     
        {
     
            if(AI_tank->stop!=0)   //坦克是否停止运动的判断,若stop参数不为0
     
            {
     
                AI_tank->stop--;   //则此坦克本回合停止运动
     
                return;
     
            }
     
            if( !(rand()%23) )     //22分之1的概率执行方向重置
     
            {
     
                AI_tank->direction = rand()%4+1;
     
                if( rand()%3 )     //在方向重置后有2分之1的概率停止走动3步的时间
     
                {
     
                    AI_tank->stop=2;
     
                    return;
     
                }
     
            }
     
            ClearTank (AI_tank->x , AI_tank->y);
     
            if(TankCheak ( *AI_tank , AI_tank->direction))   //如果前方无障碍
     
                switch ( AI_tank->direction )
     
                {
     
                       case UP   : AI_tank->y--; break;  //上前进一格
     
                    case DOWN : AI_tank->y++; break;  //下前进一格
     
                     case LEFT : AI_tank->x--; break;  //左前进一格
     
                    case RIGHT: AI_tank->x++; break;  //右前进一格
     
                }
     
            else                     //前方有障碍
     
            {
     
                if(!(rand()%4))      //3分之1的概率乱转
     
                {
     
                    AI_tank->direction=rand()%4+1;
     
                    AI_tank->stop=2; //乱转之后停止走动3步的时间
     
                    PrintTank(*AI_tank);
     
                    return;          //∵continue会跳过下面的打印函数,∴这里先打印
     
                }
     
                else                 //另外3分之2的几率选择正确的方向
     
                {
     
                    int j;
     
                    for(j=1;j<=4;j++)
     
                        if(TankCheak ( *AI_tank , j ))  //循环判断坦克四周有无障碍,此函数返值1为可通过
     
                            break;
     
                    if(j==5)         //j==5说明此坦克四周都有障碍物,无法通行
     
                    {
     
                        PrintTank(*AI_tank);
     
                        return;      //则跳过下面的while循环以防程序卡死
     
                    }
     
                    while(TankCheak ( *AI_tank , AI_tank->direction) == 0)  //如果前方仍有障碍
     
                        AI_tank->direction=(rand()%4+1);                    //则换个随机方向检测
     
                }
     
            }
     
            PrintTank(*AI_tank);     //打印AI坦克
     
        }
     
    }
     
     
     
     
     
    void BuildMyTank (Tank* my_tank) //建立我的坦克
     
    {
     
        my_tank->x=15;
     
           my_tank->y=38;
     
           my_tank->stop=NULL;
     
           my_tank->direction=1;
     
        my_tank->model=0;
     
        my_tank->color=1;
     
        my_tank->alive=1;
     
        my_tank->my=1;
     
        my_tank->CD=7;
     
        PrintTank (*my_tank) ;   //打印我的坦克
     
    }
     
     
     
     
     
    void MoveMyTank(int turn )   //玩家专用函数,turn为keyboard函数里因输入不同方向键而传入的不同的值
     
    {
     
        ClearTank(my_tank.x , my_tank.y);        //map 数组中“我的坦克”参数清除工作已在此函数中完成
     
        my_tank.direction=turn;                  //将键盘输入的方向值传入我的坦克方向值
     
        if(TankCheak ( my_tank , my_tank.direction ))  //若此时我的坦克当前方向上无障碍
     
            switch (turn)
     
            {
     
                case UP   : my_tank.y--; break;  //上前进一格
     
                case DOWN : my_tank.y++; break;  //下前进一格
     
                case LEFT : my_tank.x--; break;  //左前进一格
     
                case RIGHT: my_tank.x++; break;  //右前进一格
     
        }                                        //若坦克当前方向上有障碍则跳过坐标变化直接打印该转向的坦克
     
        PrintTank (my_tank);
     
    }
     
     
     
     
     
    bool TankCheak(Tank tank,int direction)  //检测坦克前方障碍函数,参量为假坐标。返值1为可通过,返值0为阻挡(人机共用)
     
    {
     
        switch(direction)                    //direction变量   1上,2下,3左,4右
     
        {
     
            case UP:
     
                if (map[tank.y-2][tank.x]==0 && map[tank.y-2][tank.x-1]==0 && map[tank.y-2][tank.x+1]==0)
     
                    return 1;
     
                else
     
                    return 0;
     
            case DOWN:
     
                if (map[tank.y+2][tank.x]==0 && map[tank.y+2][tank.x-1]==0 && map[tank.y+2][tank.x+1]==0)
     
                    return 1;
     
                else
     
                    return 0;
     
            case LEFT:
     
                if (map[tank.y][tank.x-2]==0 && map[tank.y-1][tank.x-2]==0 && map[tank.y+1][tank.x-2]==0)
     
                    return 1;
     
                else
     
                    return 0;
     
            case RIGHT:
     
                if (map[tank.y][tank.x+2]==0 && map[tank.y-1][tank.x+2]==0 && map[tank.y+1][tank.x+2]==0)
     
                    return 1;
     
                else
     
                    return 0;
     
            default:
     
                printf("错误!!");
     
                Sleep(5000);
     
                return 0;
     
        }
     
    }
     
     
     
     
     
    void ClearTank(int x,int y)   //清除坦克函数(人机共用)
     
    {
     
        for(int i=0;i<3;i++)
     
            for(int j=0;j<3;j++)
     
            {                     //将坦克占用的地图上的九格去掉
     
                 map[y+j-1][x+i-1]=0;
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
     
                GoToxy(2*x+2*j-2,y+i-1);
     
                printf("  ");
     
            }
     
    }
     
     
     
     
     
    void PrintTank(Tank tank)     //打印坦克(人机共用) 由于读取的Tank参数较多,故就不将参数一一传入了
     
    {                             // tank.color参数对应不同的颜色,范围 1 ~ 6
     
        ColorChoose(tank.color);  //颜色选择函数   定义一个数组里装着字符指针(既装字符串)的数组指针(指向一维数组首地址的指针)
     
        char *(*tankF)[4] = tank_figure[tank.model];  //将二维数组首址赋初值给数组指针 model==0为我的坦克,4为电脑1坦克,8为电脑2,类推
     
        for(int i = 0; i < 3; i++)   
     
        {
     
            GoToxy((tank.x-1)*2 , tank.y-1+i);        //在坦克中心坐标的左边,上中下三行打印
     
            printf("%s", tankF[i][tank.direction-1]); //打印的是地址,地址既字符串
     
             for(int j=0;j<3;j++)
     
                if(tank.my)       //若为我的坦克
     
                    map[tank.y+j-1][tank.x+i-1]=200;  //在map上把"坦克"九格填满代表敌我坦克的参数。敌方此值为100~103,我方为200
     
                else
     
                    map[tank.y+j-1][tank.x+i-1]=100+tank.num;  //这样可以通过map值读取坦克编号,读取操作在BulletHit 函数
     
        }
     
    }
     
     
     
     
     
    void HideCursor()  //隐藏光标
     
    {                  //CONSOLE_CURSOR_INFO结构体包含控制台光标的信息,DWORD dwSize光标百分比厚度(1~100)和BOOL bVisible光标是否可见
     
        CONSOLE_CURSOR_INFO cursor_info={1,0};
     
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); //SetConsoleCursorInfo用来设置指定的控制台光标的大小和可见性。
     
    }
     
     
     
     
     
    void GoToxy(int x,int y)  //光标移动函数,X表示横坐标,Y表示纵坐标。
     
    {
     
        COORD  coord;         //使用头文件自带的坐标结构
     
        coord.X=x;            //这里将int类型值传给short,不过程序中涉及的坐标值均不会超过short范围
     
        coord.Y=y;
     
        HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);  //获得标准输出句柄
     
        SetConsoleCursorPosition(a,coord);         //以标准输出的句柄为参数设置控制台光标坐标
     
    }
     
     
     
     
     
    void ColorChoose(int color)   //颜色选择函数
     
    {
     
        switch(color)
     
        {
     
               case 1:               //天蓝色(我的坦克颜色)
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
     
                break;
     
            case 2:               //绿色
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);  
     
                break;
     
            case 3:               //黄色
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
     
                break;
     
            case 4:               //红色
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
     
                break;
     
            case 5:               //紫色
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
     
                break;
     
            case 6:               //白色
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE|FOREGROUND_GREEN);
     
                break;
     
            case 7:               //深蓝色(∵颜色深难与黑色背景辨识度不高 ∴坦克颜色不选用此颜色),只用在字体颜色闪烁中
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE);
     
                break;
     
        }
     
    }
     
     
     
     
     
    void Stop()    //暂停
     
    {
     
        int color=1,timing=0;
     
        while(1)
     
        {
     
            if(timing++%30==0)
     
            {
     
                ColorChoose(color);   //颜色选择
     
                GoToxy(100,13);       //副屏幕打印
     
                printf("游戏暂停");
     
                GoToxy(88,17);
     
                printf("按回车键回到游戏");
     
                GoToxy(88,18);
     
                printf("或按 Esc键退出游戏");
     
                if(++color==8)
     
                    color=1;
     
            }
     
            if (GetAsyncKeyState( 0xD )& 0x8000)      //回车键
     
            {
     
                GoToxy(100,13);       //副屏幕打印
     
                SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
     
                printf("正在进行");   //覆盖掉原来的提示
     
                GoToxy(88,17);
     
                printf("                     ");
     
                GoToxy(88,18);
     
                printf("                     ");
     
                break;
     
            }
     
            else if(GetAsyncKeyState( 0x1B )& 0x8000) //Esc键退出  
     
                exit(0);
     
            Sleep(20);
     
        }
     
    }
     
     
     
     
     
    void ClearMainScreen()  //主屏幕清屏函数,因使用system("cls");再打印框架有一定几率造成框架上移一行的错误,所以单独编写清屏函数
     
    {
     
        for(int i=1;i<40;i++)
     
        {
     
            GoToxy(2,i);
     
            printf("                                                                              ");
     
        }
     
    }
     
     
     
     
     
    void Frame ()     //打印游戏主体框架
     
    {                 //SetConsoleTextAttribute为设置文本颜色和文本背景颜色函数
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_INTENSITY);
     
        printf("  ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁  ");
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 
     
        printf("  ▂▂▂▂▂▂▂▂▂▂▂▂▂ \n");
     
        for(int i=0;i<14;i++)
     
        {
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);
     
            printf("▕                                                                              ▏");
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 
     
            printf(" |                          |\n");
     
        }
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);
     
        printf("▕                                                                              ▏");
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 
     
        printf(" |═════════════|\n");
     
        for(int i=0;i<24;i++)
     
        {
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);
     
            printf("▕                                                                              ▏");
     
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY|FOREGROUND_BLUE); 
     
            printf(" |                          |\n");
     
        }
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN|FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_INTENSITY);
     
        printf("  ▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔  ");
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY| FOREGROUND_BLUE); 
     
        printf(" ﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊﹊\n");
     
        SideScreen ();  //打印副屏幕
     
    }
     
     
     
     
     
    void PrintMap()     // 打印地图(地图既地图障碍物)
     
    {
     
        for(int j=0;j<41;j++)
     
            for(int i=0;i<41;i++)
     
                if(map[i][j]==6)
     
                {
     
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN
     
                        |FOREGROUND_RED|FOREGROUND_BLUE|BACKGROUND_GREEN|BACKGROUND_RED|BACKGROUND_BLUE);
     
                    GoToxy(2*j,i);
     
                    printf("■");
     
                }
     
                else if(map[i][j]==2)
     
                {
     
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED|BACKGROUND_GREEN|BACKGROUND_RED);
     
                    GoToxy(2*j,i);
     
                    printf("▓");
     
                }
     
                else if(map[i][j]==1)
     
                {
     
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|BACKGROUND_GREEN|BACKGROUND_RED);
     
                    GoToxy(2*j,i);
     
                    printf("▓");
     
                }
     
                else if(map[i][j]==5)
     
                {                  
     
                    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|BACKGROUND_BLUE|FOREGROUND_BLUE|FOREGROUND_GREEN);
     
                    GoToxy(2*j,i);
     
                    printf("~");
     
                }
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE|FOREGROUND_RED|FOREGROUND_GREEN);
     
        GoToxy(38,37);     printf("◣◢");
     
        GoToxy(38,38);     printf("███");    //∵无论地图怎么变,家所在位置不变,且家的字符多种,不方便用上述方式打印
     
        GoToxy(38,39);     printf("◢█◣");    //∴直接打印(且家的map值与符号无关)
     
    }
     
     
     
     
     
    void GetMap()      //地图存放函数
     
    {                   //map里的值: 个位数的值为地图方块部分,百位数的值为坦克
     
        int i ,j;      //map里的值: 0为可通过陆地,1为红砖,2待定,5为水,100为敌方坦克,200为我的坦克,
     
        int Map[8][41][41]=
     
        {
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4}, 
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4}, 
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4}, 
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4}, 
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4}, 
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,6,6,6,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,6,6,6,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,6,6,6,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4}, 
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4}, 
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,4}, 
     
                {4,6,6,6,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4}, 
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,2,2,2,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,2,2,2,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,6,6,6,2,2,2,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,4},
     
                {4,1,1,1,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,6,6,6,0,0,0,4},
     
                {4,1,1,1,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,6,6,6,0,0,0,4},
     
                {4,1,1,1,2,2,2,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,6,6,6,6,6,6,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,6,6,6,6,6,6,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,6,6,6,6,6,6,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,6,6,6,1,1,1,2,2,2,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,6,6,6,1,1,1,2,2,2,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,6,6,6,1,1,1,2,2,2,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,6,6,6,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,6,6,6,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,6,6,6,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,6,6,6,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,6,6,6,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,6,6,6,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,6,6,6,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,6,6,6,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,2,2,2,1,1,1,6,6,6,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,6,6,6,6,6,6,6,6,6,2,2,2,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,6,6,6,6,6,6,6,6,6,2,2,2,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,6,6,6,6,6,6,6,6,6,2,2,2,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,6,6,6,6,6,6,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,6,6,6,6,6,6,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,6,6,6,6,6,6,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,1,1,1,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,1,1,1,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,1,1,1,1,1,1,0,0,0,4},
     
                {4,2,2,2,6,6,6,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,6,6,6,4},
     
                {4,2,2,2,6,6,6,6,6,6,6,6,6,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,6,6,6,6,6,6,4},
     
                {4,2,2,2,6,6,6,6,6,6,6,6,6,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,6,6,6,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,1,1,1,6,6,6,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,1,1,1,6,6,6,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,1,1,1,5,5,5,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,5,5,5,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,5,5,5,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,6,6,6,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,5,5,5,0,0,0,1,1,1,1,1,1,4},
     
                {4,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,5,5,5,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,5,5,5,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},  
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,1,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,5,5,5,0,0,0,0,1,1,1,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,5,5,5,0,0,0,0,1,1,1,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,5,5,5,0,0,0,0,1,1,1,0,0,0,6,0,0,0,0,0,6,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,1,1,1,0,0,0,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,1,1,1,0,0,0,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,1,1,1,0,0,0,5,5,5,4},
     
                {4,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,4},
     
                {4,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,4},
     
                {4,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,0,0,0,5,5,5,1,1,1,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,0,0,0,5,5,5,1,1,1,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,4},
     
                {4,5,5,5,5,5,5,0,0,0,5,5,5,5,5,5,0,0,0,5,5,5,1,1,1,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,0,0,0,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,5,5,5,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,4},
     
                {4,0,0,0,5,5,5,5,5,5,5,5,5,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,5,5,5,0,0,0,5,5,5,5,5,5,4},
     
                {4,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,5,5,5,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,1,0,0,0,0,0,0,2,2,2,2,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,4},
     
                {4,0,0,1,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,2,2,2,2,2,2,0,0,0,0,1,1,1,0,0,0,0,0,0,1,1,4},
     
                {4,0,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,2,2,2,2,2,2,2,2,0,0,0,1,1,0,0,0,0,0,0,0,1,1,4},
     
                {4,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,2,2,2,2,2,2,2,2,0,0,1,1,1,0,0,0,0,0,0,0,1,1,4},
     
                {4,1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0,0,1,1,4},
     
                {4,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0,0,1,1,4},
     
                {4,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,2,2,2,2,2,2,2,2,2,2,2,2,1,1,0,0,0,0,0,0,0,0,1,1,4},
     
                {4,1,1,0,0,0,0,0,0,0,0,0,1,1,1,2,2,2,2,6,6,6,6,6,6,2,2,2,2,1,1,1,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,6,6,6,6,6,6,2,2,2,2,1,1,1,1,0,0,0,0,1,1,1,4},
     
                {4,1,1,0,0,0,0,0,0,0,1,1,1,1,1,2,2,2,2,6,6,6,6,6,6,2,2,2,2,1,1,1,1,0,0,0,1,1,1,1,4},
     
                {4,0,1,1,0,0,0,0,0,0,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,0,0,1,1,1,1,4},
     
                {4,0,1,1,1,0,0,0,0,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,1,4},
     
                {4,0,0,1,1,1,1,1,1,1,1,1,1,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,1,1,1,1,1,1,1,1,1,4},
     
                {4,0,0,0,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,1,1,1,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,0,4},
     
                {4,0,0,0,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,1,1,1,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,0,4},
     
                {4,0,0,0,0,1,1,1,1,1,1,1,1,6,6,6,6,6,6,1,1,1,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,0,0,4},
     
                {4,0,0,0,0,0,1,1,1,1,1,1,1,6,6,6,0,0,0,1,1,1,0,0,0,6,6,6,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,6,6,6,0,0,0,1,1,1,0,0,0,6,6,6,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,6,6,6,0,0,0,1,1,1,0,0,0,6,6,6,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,1,1,1,1,1,1,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,0,1,1,1,1,1,1,1,1,6,6,6,6,6,6,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,6,6,6,6,6,6,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,6,6,6,6,6,6,4},
     
                {4,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,0,0,0,6,6,6,6,6,6,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,1,1,1,0,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,1,1,1,0,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,1,1,1,0,0,0,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,4},
     
                {4,0,0,0,6,6,6,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,6,6,6,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,6,6,6,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,4},
     
                {4,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,6,6,6,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,6,6,6,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,4},
     
                {4,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,1,6,6,6,0,0,0,6,6,6,0,0,0,0,0,0,1,1,1,4},
     
                {4,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,1,1,1,6,6,6,0,0,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
            {
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,5,5,5,5,5,5,1,1,1,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,0,0,0,5,5,5,5,5,5,1,1,1,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,0,0,0,5,5,5,5,5,5,1,1,1,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,6,6,6,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,1,1,1,0,0,0,0,0,0,4},
     
                {4,0,0,0,6,6,6,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,6,6,6,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,6,6,6,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,5,5,5,5,5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,5,5,5,5,5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,5,5,5,5,5,5,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,6,6,6,4},
     
                {4,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,1,1,1,5,5,5,5,5,5,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,6,6,6,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,4},
     
                {4,6,6,6,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,0,0,0,6,6,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,5,5,5,5,5,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,0,0,0,0,0,0,1,1,1,0,0,0,1,1,1,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,4},
     
                {4,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,9,9,9,1,1,0,0,0,0,0,0,0,1,1,1,6,6,6,0,0,0,4},
     
                {4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4}
     
            },
     
        };
     
            for(i=0;i<41;i++)
     
                for(j=0;j<41;j++)
     
                        map[i][j]=Map[level-1][i][j];
     
        PrintMap();         //打印地图
     
    }
     
     
     
     
     
    void GameOver(bool home)
     
    {
     
        int timing=0,color=1;
     
        while(1)
     
        {
     
            if(timing++%30==0)         //游戏结束原因为生命值为0
     
            {
     
                ColorChoose(color);    //颜色选择
     
                if(home)               //游戏结束原因为老家被毁,则多打印一行字以提示玩家
     
                {
     
                    GoToxy(37,19);     //主屏幕中心打印
     
                    printf("老家被毁!");
     
                }
     
                GoToxy(37,20);         //主屏幕中心打印
     
                printf("游戏结束!");
     
                GoToxy(100,13);        //副屏幕打印
     
                printf("游戏结束");
     
                GoToxy(88,17);
     
                printf("请按回车键重新开始!");
     
                GoToxy(88,18);
     
                printf("或按 Esc键退出游戏!");
     
                if(++color==8)
     
                    color=1;
     
            }
     
            if (GetAsyncKeyState( 0xD )& 0x8000)  //回车键
     
            {
     
    //            system("cls");       //清屏,这里清屏后再次打印框架有一定几率造成框架上移一行的bug,因此选用自建清屏函数
     
    //            Frame ();            //重新打印游戏框架
     
                score-=500;          //分数-500
     
                ClearMainScreen();   //主屏清屏函数,无需再次打印框架
     
                Initialize();        //从本关重新开始
     
                break;
     
            }
     
            else if(GetAsyncKeyState( 0x1B )& 0x8000)  //Esc键退出  
     
                exit(0);
     
            Sleep(20);
     
        }
     
    }
     
     
     
     
     
    void NextLevel()
     
    {
     
        int timing=0,color=1;
     
        level++;
     
        if(level<=MAX_LEVEL)
     
            while(1)
     
            {
     
                if(timing++%10==0)
     
                {
     
                    ColorChoose(color);   //颜色选择   
     
                    GoToxy(37,20);        //主屏幕中心打印
     
                    printf("恭喜过关!");
     
                    GoToxy(100,13);       //副屏幕打印
     
                    printf("等待下关");
     
                    GoToxy(87,17);
     
                    printf("请按回车键进入下一关!");
     
                    GoToxy(88,18);
     
                    printf("或按 Esc键退出游戏!");
     
                    if(++color==8)  
     
                        color=1;
     
                }
     
                if (GetAsyncKeyState( 0xD )& 0x8000)  //回车键
     
                {
     
                    GoToxy(88,17);        //抹除副屏幕中的提示
     
                    printf("                     ");
     
                    GoToxy(88,18);
     
                    printf("                     ");
     
                    ClearMainScreen();   //主屏清屏函数,无需再次打印框架
     
                    Initialize();        //初始化从下一关开始,level已++
     
                    break;
     
                }
     
                else if(GetAsyncKeyState( 0x1B )& 0x8000)  //Esc键退出  
     
                    exit(0);
     
                Sleep(20);
     
            }
     
        else   //level>8 通关
     
            while(1)
     
            {
     
                if(timing++%5==0)
     
                {
     
                    ColorChoose(color);
     
                    GoToxy(33,20);        //主屏幕中心打印
     
                    printf("恭喜通过全部关卡!");
     
                    GoToxy(100,13);       //副屏幕打印
     
                    printf("已通全关");
     
                    GoToxy(88,17);
     
                    printf("恭喜通过全部关卡!");
     
                    GoToxy(88,19);
     
                    printf("按 Esc键退出游戏!");
     
                    if(++color==8)  
     
                        color=1;
     
                }
     
                if(GetAsyncKeyState( 0x1B )& 0x8000)  //Esc键退出  
     
                    exit(0);
     
                Sleep(10);
     
            }
     
    }
     
     
     
     
     
    void GameCheak()
     
    {                           //剩余敌人为0且四坦克全部不存活
     
        if(remain_enemy<=0 && !AI_tank[0].alive && !AI_tank[1].alive && !AI_tank[2].alive && !AI_tank[3].alive )
     
            NextLevel();        //进入下一关
     
        if(my_tank.revive>=MAX_LIFE)   //我的生命值(复活次数)全部用完 MAX_LIFE
     
            GameOver(0);        //游戏结束,传入0代表我的复活次数用光(生命值为0)。游戏结束有两种判断,另一种是老家被毁
     
    }
     
     
     
     
     
    void SideScreen ()  //副屏幕 行(84起,110末,若双字符宽则在108打印最后一个字)列(11上屏末,13下屏初,39下屏末。为美观最好打在38)
     
    {                   // |         第  d  关         |   " |                          |\n"
     
        GoToxy(93,2);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
     
        printf("第     关");
     
        GoToxy(92,5);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE);
     
        printf("分  数:");
     
        GoToxy(92,7);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
     
        printf("生  命:");
     
        GoToxy(86,9);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
     
        printf("剩余敌方坦克:");
     
        GoToxy(86,11);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_BLUE);
     
        printf("当前游戏速度:  %d",21-speed);
     
        GoToxy(86,13);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE);
     
        printf("当前游戏状态:");
     
        GoToxy(94,19);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
     
        GoToxy(94,24);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED);
     
        printf("帮  助");
     
        GoToxy(86,27);
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
     
        printf("方向键  ←↑→↓  移动");
     
        GoToxy(93,29);
     
        printf("x 键 射击");
     
        GoToxy(89,31);
     
        printf("+ - 调整游戏速度");
     
        GoToxy(90,33);
     
        printf("游戏速度范围1~20");
     
        GoToxy(90,35);
     
        printf("回车键 暂停游戏");
     
        GoToxy(90,37);
     
        printf("Esc键  退出游戏");
     
    /*    printf("帮  助");     //这是第二种详细说明的样式
        GoToxy(86,21);
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
        printf("方向键  ←↑→↓  移动");
        GoToxy(93,23);
        printf("x 键 射击");
        GoToxy(89,25);
        printf("+ - 调整游戏速度");
        GoToxy(90,27);
        printf("游戏速度范围1~20");
        GoToxy(90,29);
        printf("回车键 暂停游戏");
        GoToxy(90,31);
        printf("Esc键  退出游戏");
        GoToxy(86,33);
        printf("敌方坦克全部消灭则过关");
        GoToxy(87,34);
        printf("己方坦克生命值为0 或");
        GoToxy(86,35);
        printf("正下方的老家被毁则失败");
        GoToxy(86,36);
        printf("己坦克与敌坦克子弹碰撞");
        GoToxy(87,37);
        printf("则抵消,敌坦克间子弹碰");
        GoToxy(86,38);
        printf("撞不抵消且可穿过敌坦克");*/
     
    }
     
     
     
     
     
    void Initialize()      //初始化
     
    {
     
        remain_enemy=16;
     
        my_tank.revive=0;  //我的坦克复活次数为0
     
        position=0;
     
        bul_num=0;
     
        GetMap();
     
        BuildMyTank( &my_tank );
     
        for(int i=0;i<12;i++)     //子弹初始化
     
        {
     
            bullet [i].exist=0;
     
            bullet [i].initial=0;
     
        }
     
        for(int i=0;i<=3;i++)         //AI坦克初始化
     
        {
     
            AI_tank [i].revive=0;
     
            AI_tank [i].alive=0;  //初始化坦克全是不存活的,BuildAITank()会建立重新建立不存活的坦克
     
            AI_tank [i].stop=0;
     
            AI_tank [i].num=i;
     
            AI_tank [i].my=0;
     
            AI_tank [i].CD=0;
     
        }
     
        GoToxy(97,2);                        //在副屏幕上关卡数
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN);
     
        printf("%d",level);
     
        GoToxy(102,5);                       //在副屏幕上打印分数
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE);
     
        printf("%d   ",score);
     
        GoToxy(102,7);                       //在副屏幕打印我的剩余生命值
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);
     
        printf("%d", MAX_LIFE-my_tank.revive);
     
        GoToxy(102,9);                       //在副屏幕上打印剩余坦克数
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
     
        printf("%d ",remain_enemy);
     
        GoToxy(100,13);                      //在副屏幕上打印状态
     
        SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_BLUE|FOREGROUND_GREEN);
     
        printf("正在游戏");
     
    }
    

    bilibili

    飞机大战

    #pragma once
    #include<iostream>
    #include<Windows.h>//定义控制台应用程序的入口点
     
    using namespace std;
     
    //界面颜色 
    void setcolor(char str[])
      {
      
     	 
     	if(str=="lightblue")
     		SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|1);
     	if(str=="lightred")
     		SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED);
     	if(str=="lightyellow")
     		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_BLUE);
     	if(str=="lightpink"	)
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);
     
    
    	if(str=="blue")
     		SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_BLUE);
     	if(str=="red")
     		SetConsoleTextAttribute( GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
     	if(str=="yellow")
     		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),  FOREGROUND_RED | FOREGROUND_BLUE);
     	if(str=="pink")
    		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),  FOREGROUND_GREEN | FOREGROUND_BLUE);
    	if(str=="lightgray")
    	  	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),  FOREGROUND_GREEN |8);
    	if(str=="gray")
    	  	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),  8);				  				  
    
     	else return;
     		 
     	 
      }
     
    //定义敌人结构 其中最后面Frame代表结构体类型 若不加typedef代表定义的结构体变量
    typedef struct Frame
    {
           COORD position[2];
           //   COORD 是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标。
           // 其定义为:
           // typedef struct _COORD {
           //             SHORT X;  
           //             SHORT Y;
           //          } COORD;
           int flag;
    }Frame;
     
    class Game
    {
    public:
           COORD position[10];
           COORD bullet[50];//子弹坐标
           Frame enemy[8];//敌人数量
     
           int score;
           int rank;//级别,难度
           int rankf;//等级标志
           string title;
     
           int flag_rank;//等级标志
           //构造函数
           Game();
           //初始化所有   //设定位置
           void initPlane();
           void initBullet();
           void initEnemy();
           //填充所有   --画出形状和消失的形状
           void drawPlane();
           void drawPlaneToNull();
           void drawBullet();
           void drawBulletToNull();
           void drawEnemy();
           void drawEnemyToNull();
           //执行某一个操作
           void Playing();//游戏主循环
           void planeMove(char x);//飞机移动
           void judgePlane();//判断飞机是否与障碍物重叠
           void GameOver();//游戏失败
           void Pause();// 该成员函数用来使得游戏暂停
           void Shoot();//发射子弹
           void bulletMove();//子弹移动
           void drawThisBulletToNull(COORD c);//画出失效子弹
           void judgeEnemy();//判断子弹是否击中障碍物
           void drawThisEnemyToNull(Frame f);       //击败的障碍物清空
           void enemyMove();//障碍物移动
           void printScore();//输出分数
    };
    //主菜单
    int drawMenu();
    //隐藏光标
    void HideCursor();
     
     
    void SetPos(int i, int j);//设置光标
    COORD random(COORD a, COORD b);//产生随机障碍物位置
    void drawFrame(COORD a, COORD   b, char row, char col);//画出障碍物
    //把第y行,[x1, x2) 之间的坐标填充为 ch
    void drawRow(int y, int x1, int x2, char ch);
    //把第x列,[y1, y2] 之间的坐标填充为 ch
    void drawCol(int x, int y1, int y2, char ch);
    // 绘制游戏界面
    void drawPlaying();
    void drawFrame(Frame frame, char row, char col);//画坠毁后的战机
    // 该函数用来判断战机的某一部分是否与障碍物有接触
    bool   judgeCoordInFrame(Frame frame, COORD spot);
     
    void drawRow(COORD a, COORD b, char ch);
    #include<Windows.h>
    #include<conio.h>
    #include<iostream>
    #include<ctime>
    #include<string>
    using namespace std;
    Game::Game()
    {
        // 调用类成员函数来进行初始化
        initPlane();
     
        initBullet();
     
        initEnemy();
     
        // 初始化四个int型数据成员,采用赋值的方式进行初始化
        // string类型的数据成员title没有进行初始化,因为:
        // string本身就是一个标准库类类型,它的类定义中设置了默认构造函数,
        // 这些默认构造函数会将对象初始化为合理的默认状态,
        //  string的默认构造函数会产生空字符串,相当于"" 。
        this->score = 0;
        rank = 25;
        rankf = 25;
        flag_rank = 0;
    }
    void Game::initPlane()
    {
        COORD centren;
        centren.X = 39;
        centren.Y = 22;
     
        position[0].X = position[5].X = position[7].X = position[9].X = centren.X;
        position[1].X = centren.X - 2;
        position[2].X = position[6].X = centren.X - 1;
        position[3].X = position[8].X = centren.X + 1;
        position[4].X = centren.X + 2;
        for (int i = 0; i <= 4; i++)
        {
            position[i].Y = centren.Y;
        }
        for (int i = 6; i <= 8; i++)
        {
            position[i].Y = centren.Y + 1;
        }
        position[5].Y = centren.Y - 1;
        position[9].Y = centren.Y - 2;
        
        // 这个函数体类的代码其实就是为了初始化战机的十个部分的位置,战机的组成如下所示:   
        //                   |       5 
        //                     |       9  
        //                   *****   12034
        //                    ***     678
        //   第一排5个0的坐标依次对应了position[1]position[2]position[0]position[3]position[4]
        //   第二排三个0的坐标依次对应了position[6]position[7]position[8]
        //   两排0上面的两|的坐标从上往下依次对应了position[5]position[9]
    }
    void Game::drawPlane()
    {
        for (int i = 0; i < 9; i++)
        {
            SetPos(position[i].X,position[i].Y);
            if (i != 5)
            {
            	setcolor("yellow");
                cout << "@";
            }
            else if (i == 5)
            {
            	setcolor("yellow");
                cout << "$";
            }
        }
    }
    // 这个成员函数通过将战机的每个坐标处输出" "来代替"0"和"|",
    // 来达到将战机消除的目的。
    void Game::drawPlaneToNull()
    {
        for (int i = 0; i < 9; i++)
        {
            SetPos(position[i].X, position[i].Y);
            cout << " ";
        }
    }
    // 该成员函数用来初始化子弹,
    // 即将每个子弹的Y坐标初始化为30(bullet[i].Y = 30)来表示子弹处于失效状态
    void Game::initBullet()
    {
        for (int i = 0; i < 10; i++)
        {
            bullet[i].Y = 30;
        }  
    }
    // 该成员函数用来画出子弹
    // 首先检查每颗子弹的有效性,如果子弹有效,则定位到该子弹的坐标处,输出 "^",表示该子弹,
    // 如果子弹是无效的,则不绘制
    void Game::drawBullet()
    {
        for (int i = 0; i < 10; i++)
        {
            if (bullet[i].Y != 30)
            {
                SetPos(bullet[i].X,bullet[i].Y);
                setcolor("blue");
                cout << "*";
            }
        }
    }
    //子弹失效
    void Game::drawBulletToNull()
    {
        for (int i = 0; i < 10; i++)
            if (bullet[i].Y != 30)
            {
                SetPos(bullet[i].X, bullet[i].Y + 1);
                cout << " ";
            }
    }
    // 这个函数用来初始障碍物的位置,
    // 屏幕当中只能同时存在八架障碍物,
    // 且每架障碍物用如下结构体Frame来表示,如下所示:
    //     typedef struct Frame
    //        {
    //          COORD position[2];
    //          int flag;
    //        }Frame;
    COORD random(COORD a, COORD b)
    {
        int x = rand() % (a.X - b.X) + a.X;
        int y = rand() % (a.Y - b.Y) + a.Y;
        COORD c = { x,y };
        return c;
    }
    void Game::initEnemy()
    {
        COORD a = { 1, 1 };
        COORD b = { 45, 15 };
        for (int i = 0; i < 8; i++)
        {
            enemy[i].position[0] = random(a, b);
            //  random(a, b)是调用了一个重载的函数,它表示在坐标a、b之间的矩形框
            //  内随机生成一个坐标值,并将该坐标值作为障碍物的左上角的坐标。
            // enemy[i].position[0]中是一个Frame结构体类型的变量,存放了障碍物i的左上角的坐标。
            enemy[i].position[1].X = enemy[i].position[0].X + 3;
            enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
            // enemy[i].position[1]也中是一个Frame结构体类型的变量,存放了障碍物i的右下角的坐标。
        }
    }
    // 接下来要根据障碍物的左上角坐标和右下角坐标画出障碍物,
    // 显然,障碍物的外形如下所示:
    //   --
    //  |  |
    //   --
    void Game::drawEnemy()
    {
        for (int i = 0; i < 8; i++)
        {
        	setcolor("gray");
            drawFrame(enemy[i].position[0], enemy[i].position[1], '-', '|');
        }  
    }
    // 将障碍物消除,通过输出空白的方式
    void Game::drawEnemyToNull()
    {
        for (int i = 0; i < 8; i++)
        {
            drawFrame(enemy[i].position[0], enemy[i].position[1], ' ', ' ');
        }
    }
     
    //隐藏光标
    void HideCursor()
    {
        CONSOLE_CURSOR_INFO cursor_info = { 1,0 };//第二个值0表示隐藏光标
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
    }
    void SetPos(int i, int j)//设置坐标点位(光标)
    {
        HANDLE hout;
        COORD coord;
        coord.X = i;
        coord.Y = j;
        hout = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleCursorPosition(hout, coord);
    }
     
    //左上角坐标、右下角坐标、用row填充行、用col填充列
    void drawFrame(COORD a, COORD  b, char row, char col)
    {
        drawRow(a.Y, a.X + 1, b.X - 1, row);
        drawRow(b.Y, a.X + 1, b.X - 1, row);
        drawCol(a.X, a.Y + 1, b.Y - 1, col);
        drawCol(b.X, a.Y + 1, b.Y - 1, col);
    }
     
    //把第y行,[x1, x2) 之间的坐标填充为 ch
    void drawRow(int y, int x1, int x2, char ch)
    {
        SetPos(x1, y);
        for (int i = 0; i <= (x2 - x1); i++)
        {
            cout << ch;
        }
    }
    //把第x列,[y1, y2] 之间的坐标填充为 ch
    void drawCol(int x, int y1, int y2, char ch)
    {
        int y = y1;
        while (y != y2 + 1)
        {
            SetPos(x, y);
            cout << ch;
            y++;
        }
    }
     
    //主菜单绘制
    int drawMenu()
    {
        setcolor("lightgreen");
        system("Title        飞 机 大 战");
        SetPos(30,1);
        cout << "飞 机 大 战";
        drawRow(3, 0, 79, '-');
        drawRow(5, 0, 79, '-');
        SetPos(28, 4);
        setcolor("red");
        cout << "↑和↓选择,回车确定";
        int j = 11;
        SetPos(12, j);
        cout << ">>";
        SetPos(15, 11);
        cout << "1. 简单的任务";
        SetPos(15, 13);
        cout << "2. 困难的任务";
        drawRow(20, 0, 79, '-');
        SetPos(47, 11);
        setcolor("yellow");
        cout << "简单的任务:";
        SetPos(51, 13);
        cout << "简单任务的自动飞行速度较慢,任务难度较小。                  ";
        SetPos(30, 21);
        setcolor("lightblue");
        cout << " ";
        setcolor("red");
        drawRow(22, 0, 79, '-');
     
        while (true)
        {
            if (_kbhit())
            {
                char x = _getch();
                switch (x)
                {
                case 72:
                {
                    if (j == 13)
                    {
                        SetPos(12, j);
                        cout << "  ";
                        j = 11;
                        SetPos(12, j);
                        setcolor("red");
                        cout << ">>";
                        SetPos(51, 13);
                        cout << "            ";
                        SetPos(47, 11);
                        setcolor("yellow");
                        cout << "简单的任务:";
                        SetPos(51, 13);
                        cout << "简单任务的自动飞行速度较慢,任务难度较小。                  ";
                    }
                    break;
                }
                case 80:
                {
                    if (j == 11)
     
                    {
                        SetPos(12, j);
                        cout << " ";
                        j = 13;
                        SetPos(12, j);
                        setcolor("red");
                        cout << ">>";
                        SetPos(51, 13);
                        cout << "                               ";
                        SetPos(47, 11);
                        setcolor("yellow");
                        cout << "困难的任务:";
                        SetPos(51, 13);
                        cout << "困难任务自动飞行速度较快,难操作哟!                         ";
                    }
     
                    break;
                }
                case 13://回车键:13 
                {
                
                    if (j == 11)//源代码为8?
                        return 1;
                    else
                        return 2;
                }
                }
            }
        }
     
        return 0;
    }
    void drawFrame(int x1, int y1, int x2, int y2, char row, char col)
    {
        COORD a = { x1, y1 };
        COORD b = { x2, y2 };
        drawFrame(a, b, row, col);
    }
    // 绘制游戏界面
    void drawPlaying()
    {
    	setcolor("red");
        drawFrame(0,  0, 48, 24, '=', '|');//    draw map frame主界面
        drawFrame(49, 0, 82, 4, '-', '|');//    draw output frame 状态界面
        drawFrame(49, 4, 82, 9, '-', '|');//    draw score frame 分数界面
        drawFrame(49, 9, 82, 20, '-', '|');//    draw operate frame 操作界面
        drawFrame(49,20, 82, 24, '-', '|');//    draw other message frame 提示界面
        setcolor("yellow") ;
        SetPos(61,2);
    	cout << "飞机大战" ; 
        SetPos(52, 6);
        cout << "得分:";
        SetPos(52, 7);
        cout << "称号:";
        SetPos(52, 11);
        setcolor("yellow") ;
        cout << "操作方式:";
        SetPos(52, 13);
        cout << "↑,↓,←,→可以控制战机移动。";
        SetPos(52, 15);
        cout << "P和E分别可以暂停游戏或退出游戏。";
        SetPos(52, 17);
        cout << "空格可以发射燃烧弹";
        SetPos(52, 19);
        cout << "你的任务是躲避障碍物并击毁它们!";
        SetPos(52, 22);
        setcolor("lightblue") ;
        cout << " 游戏虽好玩,不要贪多哦 ";
    }
    // 该成员函数用过响应战机的一个动作
    //  ↑,↓,←,→,来控制战机的移动
    //上:38,下:40,左:37,右:39; 
    void Game::planeMove(char x)
    {
        if (x == 75)
        {
            if (position[1].X != 1)
            {
                for (int i = 0; i <= 9; i++)
                {
                    position[i].X -= 2;
                }
            }
        }
        // 如果玩家按下 ← 键,说明玩家想让战机往左移动一个距离(2个单位),
        // 首先检测,战机的最左侧的位置坐标(即position[1].X)有没有达到左边界,
        // 如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的X值减小2。
        if (x == 80)
        {
            if (position[7].Y != 23)
            {
                for (int i = 0; i <= 9; i++)
                {
                    position[i].Y += 1;
                }
            }
        }    
        // 如果玩家按下↓ 键,说明玩家想让战机往下移动一个距离(1个单位),
        // 首先检测,战机的最底部的位置坐标(即position[6].Y或者position[7].Y或者position[8].Y)有没有达到下边界,
        //  如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的Y值增加1。
        if (x == 77 && (position[4].X != 47))
        {
            for (int i = 0; i <= 9; i++)
            {
                position[i].X += 2;
            }  
        }    
        // 如果玩家按下 → 键,说明玩家想让战机往右移动一个距离(2个单位),
        // 首先检测,战机的最右侧的位置坐标(即position[4].X)有没有达到右边界,
        //  如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的X值增加2。
        if (x == 72&&(position[5].Y != 3))
        {
            for (int i = 0; i <= 9; i++)
            {
                position[i].Y -= 1;
            }
        }
        // 如果玩家按下↑键,说明玩家想让战机往上移动一个距离(1个单位),
        // 首先检测,战机的最顶部的位置坐标(即position[5].Y)有没有达到上边界,
        //  如果到达了边界,那就不做出移动;如果没有达到边界,则将战机10个部分的Y值减少1。
    }
    // 该函数用来判断战机的某一部分是否与障碍物有接触
    // 如果与障碍物有接触在判断为坠毁
    bool  judgeCoordInFrame(Frame frame, COORD spot)
    {
        if ((spot.X >= frame.position[0].X) && (spot.X <= frame.position[1].X) && (spot.Y >= frame.position[0].Y) && (spot.Y <= frame.position[1].Y))
        {
            return true;
        }
        return false;
    }
    void drawFrame(Frame frame, char row, char col)
    {
        COORD a = frame.position[0];
        COORD b = frame.position[1];
        drawFrame(a, b, row, col);
    }
    //游戏结束
    void Game::GameOver()
    {
    	setcolor("lightgreen");
        system("cls");
        COORD p1 = { 28,9 };
        COORD p2 = { 53,15 };
        drawFrame(p1, p2, '=', '|');
        SetPos(36, 12);
        string str = "Game Over!";
        for (int i = 0; i < str.size(); i++)
        {
            Sleep(80);
            cout << str[i];
        }
        Sleep(1000);
        system("cls");
        drawFrame(p1, p2, '=', '|');
        SetPos(31, 11);
        setcolor("blue");
        cout << "击毁障碍物:" << score / 5 << "个";
        SetPos(31, 12);
        cout << "得  分:" << score;
        SetPos(31, 13);
        cout << "获得称号:" << title;
        SetPos(30, 18);
        Sleep(1000);
        setcolor("green");
        cout << "继续? 是(Y)| 否(N)";
    as://goto 语句标签 直接跳转至此
        char x = _getch();
        if (x == 'n' || x == 'N')
        {
            exit(0);
        }
        else if (x == 'y' || x =='Y')
        {
            system("cls");
            Game game;
            int a = drawMenu();       // 绘制游戏开始界面主菜单
            if (a == 2)
                game.rank = 20;
            system("cls");
            drawPlaying();           // 绘制游戏界面框架
            game.Playing();
        }
        else 
            goto as;
    }
    // 该成员函数用来判断战机是否坠毁,
    // 依次判断每架障碍物与战机的每个部分是否有接触,
    // 如果有接触,则表示战机坠毁
    void Game::judgePlane()
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 9; j++)
                // 此处的实参position[j]是指战机的10个部分的COORD坐标,
                // 类中的成员函数可以访问数据成员变量。
                // 此处也可以写成this-> position[j],因为
                // 成员函数具有一个附加的隐含形参,即指向该类对象的一个指针,
                // 这个隐含形参命名为this,与调用成员函数的对象绑定在一起。
                // 成员函数不能定义this形参,而是由编译器隐含地定义。
                // 成员函数的函数体可以显式使用this指针,但不是必须这么做。
                if (judgeCoordInFrame(enemy[i], position[j]))
                {
                    SetPos(61, 2);
                    cout << "  坠毁      ";
                    setcolor("yellow");
                    drawFrame(enemy[i], '+', '+');
                    // 将与战机相撞的障碍物的形状绘制为:
                    //    ++
                    //   +  +
                    //    ++
                    Sleep(1000);
                    GameOver();
                    break;
                }
        }
    }
    // 该成员函数用来使得游戏暂停
    void Game::Pause()
    {
        SetPos(61, 2);
        cout << "         ";
        SetPos(61, 2);
        cout << "暂停中...   ";
        // 当出现"暂停中..."的提示以后,程序不停的接收按下的按键,
        // 当按下'p'键以后,说明要退出暂停状态,此时需要清除"暂停中..."的提示
        // 通过输出空白 "         "来将其覆盖,达到效果
        char c = _getch();
        while (c != 'p')
        {
            c = _getch();
        }
        SetPos(61, 2);
        cout << "         "; 
        setcolor("green");
        SetPos(61, 2);
    	cout << "飞机大战"; 
      
    }
    // 这个成员函数用来响应一次射击操作,
    // 也就是,当游戏中的时候,玩家按下"k"键,就执行该函数。
    // 由于子弹是由COORD bullet[10]定义的,因此同一时刻,界面内只能有10颗子弹同时出现。
    // 如果界面内不够10颗子弹,按下"k"键后战机应该发射出一颗子弹,
    // 于是,依次遍历10颗子弹,当遇到第一颗失效的子弹后,
    // 立即将该子弹赋予新的坐标(战机的炮口,也就是(position[5].X,position[5].Y - 1)),
    // 让其激活。然后退出for循环,函数执行完毕。
    void Game::Shoot()
    {
        for (int i = 0; i < 10; i++)
        { 
            if (bullet[i].Y == 30)
            {
                bullet[i].X = position[5].X;
                bullet[i].Y = position[5].Y - 1;
                break;
            }
        }
    }
    void Game::drawThisBulletToNull(COORD c)
    {
        SetPos(c.X,c.Y);
        cout << " ";
    }
    // 此成员函数用来响应一次子弹的运动
    // 每次子弹运动,屏幕子弹的坐标都会出现变化,即
    // 先判断子弹是否有效(即判断语句if (bullet[i].Y != 30)),
    // 若子弹有效,将该子弹的Y坐标减少1,X坐标不变,
    // 检测子弹坐标更改之后是否达到上边界,如果达到上边界,则将该子弹从屏幕上擦除,
    // 同时,将该子弹置为失效状态,即 bullet[i].Y = 30。
    void Game::bulletMove()
    {
        for (int i = 0; i < 10; i++)
        {
            if (bullet[i].Y != 30)
            {
                bullet[i].Y -= 1;
                if (bullet[i].Y == 1)
                {
                    COORD pos = { bullet[i].X, bullet[i].Y + 1 };
                    drawThisBulletToNull(pos);
                    bullet[i].Y = 30;
                }
            }
        }
    }
    //击败的障碍物清空
    void Game::drawThisEnemyToNull(Frame f)
    {
        drawFrame(f, ' ', ' ');
    }
     
    // 该成员函数依次遍历每一架障碍物障碍物,
    // 将每一架障碍物依次与每一颗子弹进行检测,
    // 判断障碍物是否与子弹有接触,如果有接触,则表示击中障碍物,
    // 此时将障碍物和子弹擦除,然后在界面顶部的位置处随机生成一架障碍物
    void Game::judgeEnemy()
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 10; j++)
            {
                if (judgeCoordInFrame(enemy[i], bullet[j]))
                {
                    score += 5;
                    drawThisEnemyToNull(enemy[i]);
                    COORD a = { 1, 1 };
                    COORD b = { 45, 3 };
                    enemy[i].position[0] = random(a, b);
                    enemy[i].position[1].X = enemy[i].position[0].X + 3;
                    enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
                    drawThisBulletToNull(bullet[j]);
                    bullet[j].Y = 30;
                }
            }
        }
    }
     
    // 该成员函数用来响应一次障碍物的移动
    // 界面上必须同时出现八架障碍物,因此,
    // 如果有某架障碍物运动到下边界处,则重置该障碍物的坐标
    void Game::enemyMove()
    {
        for (int i = 0; i < 8; i++)
        {
            for (int j = 0; j < 2; j++)
                enemy[i].position[j].Y++;
            // 我们将每架障碍物的左上角和右下角坐标的Y值增加1,
            // 表示该障碍物向下走了一个距离
        
            // 检测向下走一个距离后的障碍物的右下角坐标的Y值是否达到24,
            // 如果达到,代表障碍物已经运动到下边界了,
            // 此时需要随机重置该障碍物的坐标
            if (enemy[i].position[1].Y==24)
            {
                COORD a = { 1, 1 };
                COORD b = { 45, 3 };
                enemy[i].position[0] = random(a, b);
                enemy[i].position[1].X = enemy[i].position[0].X + 3;
                enemy[i].position[1].Y = enemy[i].position[0].Y + 2;
            }
        }
    }
    void Game::printScore()
    {
        if (score <= 100)
        {
            flag_rank = 1;
        }
        else if (score > 100 && score <= 320)
        {
            flag_rank = 2;
        }
        else if (score > 320 && score <= 440)
        {
            flag_rank = 3;
        }
        else if (score > 440)
        {
            flag_rank = 4;
        }
        SetPos(60, 6);
        cout << score;
        SetPos(60, 7);
        if (flag_rank == 1)
        {
            title = "初级飞行员";
        }
        else if (flag_rank == 2)
        {
            title = "中级飞行员";
        }
        else if (flag_rank == 3)
        {
            title = "高级飞行员";
        }
        else if (flag_rank == 4)
        {
            title = "王牌飞行员";
        }
        cout << title;
    }
    // 这个成员函数是游戏的主循环函数,
    // 定义了整个游戏过程。
    void Game::Playing()
    {
        drawEnemy();
        drawPlane();
     
        int flag_bullet = 0;
        int flag_enemy = 0;
     
        while (true)
        {
            Sleep(20);
            // 函数名:kbhit()(VC++6.0下为_kbhit())
            // 功能及返回值: 检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
            // 用法:int kbhit(void);
            // 包含头文件: include <conio.h>
            // kbhit()在执行时,检测是否有按键按下,有按下返回非0值,没有按下则返回0,是非阻塞函数;
            // 不同于getch()的在执行时, 检测按下什么键, 如果不按键该函数不返回,也就不进行下一步操作,是阻塞函数。
            if (_kbhit())
            {
                char x = _getch();
                // getch()是编程中所用的函数,这个函数是一个不回显函数,
                // 当用户按下某个字符时,函数自动读取,无需按回车
                // getch()并非标准C中的函数,不存在C语言中。
                // 所在头文件是conio.h,而不是stdio.h。
                // 用ch = getch(); 会等待你按下任意键之后,把该键字符所对应的ASCII码赋给ch, 再执行下面的语句。
                if (75 == x || 80 == x || 77 == x || 72 == x)
                {
                    drawPlaneToNull();     // 将战机先擦除
                    planeMove(x);          // 根据所输入的操作符,对战机的坐标进行更改
                    drawPlane();           // 访问类中的数据成员——战机的坐标,在新的坐标处重新绘制战机
     
                    judgePlane();          // 判断战机是否有坠毁
                }
                //  在某一循环当中,如果检测到有'p'键按下,
                // 首先在右侧游戏界面输出"暂停中...",然后陷入while()循环一直等待'p'键再次按下,
                // 如果'p'键没有按下,就一直处在while()循环内,因此不能执行后面的程序,起到暂停的效果。
                else if ('p' == x)
                {
                    Pause();
                }
                // 如果是检测到空格键按下,则运行Shoot()函数,
                else if (32 == x)
                {
                    Shoot();
                }
                // 如果是检测到'k'键按下,则运行GameOver()函数,
                // GameOver()函数执行完毕后,执行break;语句跳出while循环(注意不是if (_kbhit()))。
                // break语句用于结束最近的while、do while、for或switch语句,并将程序的执行权传递给紧接在
                // 被终止语句之后的语句。
                else if ('e' == x)
                {
                    //CloseHandle(MFUN)
                    GameOver();
                    break;
                }
            }
            // 接下来处理子弹
            // 判断子弹状态的程序一直在运行
            if (flag_bullet == 0)
            {
                bulletMove();           // 更新界面上有效子弹的坐标
                drawBulletToNull();     // 将处于旧坐标的子弹擦除
                drawBullet();           // 绘制出新坐标上的子弹
                judgeEnemy();          // 判断障碍物是否被子弹击中
            }
            flag_bullet++;
            if (flag_bullet==1)
            {
                flag_bullet = 0;
            }
            //  接下来处理障碍物
            if (flag_enemy==0)
            {
                drawEnemyToNull();     // 将所有的障碍物都擦除
                enemyMove();           //  更新障碍物的坐标
                drawEnemy();           // 绘制出处于新坐标上的障碍物
                judgePlane();          // 判断障碍物是否与战机接触
            }
            flag_enemy++;
            if (flag_enemy >= rank)
            {
                flag_enemy = 0;
            }
            /* 输出得分 */
     
            printScore();
        }
    }
     
    int main()
    {
        cout<<"\t\t****飞机大战游戏正在准备****\n";
    	cout<<"\n已加载 0%";//7
    	for(int i=0;i<9;i++){
    		SetPos((i+1)*2-1,1); cout<<"■ ";
    		SetPos(7-1,3-1);cout<<i+1;
    		Sleep(200);
    	}
    	Sleep(200);
    	SetPos(19,1);cout<<"■ \n已加载100%";
    	Sleep(200);
    	system("cls");
        srand((unsigned int)time(NULL));//随机时间种子
        HideCursor();//隐藏光标
        Game game;
        HideCursor();
        int a=drawMenu();
        if (a == 2)
        {
            game.rank = 20;
        }
        system("cls");
        HideCursor();
        drawPlaying();
        HideCursor();
        game.Playing();
     
    }
    

    ค้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎

  • 通过的题目

  • 最近活动

题目标签

初窥门径
89
顺序结构
45
分支结构
34
循环结构
29
略有小成
25
循环嵌套
16
驾轻就熟
11
搜索
9
枚举
9
电子学会三级
7
GESP二级
7
一维数组
5
排序
4
模拟
4
其他
3
while循环
2
递推
2
字符串
2
融会贯通
2
计数排序
2