-
个人简介
硬币抛出之后,正逆的转换未曾停止——你或许也注意到了这件事——旅船是掩盖未来的虚影,战车正指引着我们的命运。前方是毁灭,亦是重生。——《Phigros》
《Ж》
Byd.Vgs系列 2023_Lhr 2024_Phigros 2025_█████ AC=Answer Coarse=粗劣的答案"
"WA=Wonderful Answer=好答案"
"TLE=Time Limit Enough=时间充裕"
"MLE=Memory Limit Enough=内存充裕"
"CE=Compile Easily=轻松通过编译"
"RE=Run Excellently=完美运行"
"UKE=Unbelievablly Keep Enough Score=难以置信地保持足够的分数"
"AU=All Unaccepted=全都不正确" 作弊不要慌,逮到就要装。
WxdPes' ToolBox
冲200道班级域AC
会随机发题解,只有当难度≤3时才会发完整的,否则会有填空哦~~~
给你分享一个彩色字的方法 :
<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 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("正在游戏"); }
飞机大战
#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(); }
ค้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้้๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎้้้้้้้้๎๎๎้้้้้้้้๎๎
-
通过的题目
-
最近活动
题目标签
- 初窥门径
- 98
- 循环结构
- 51
- 顺序结构
- 45
- 分支结构
- 34
- 略有小成
- 34
- 循环嵌套
- 16
- 驾轻就熟
- 14
- 搜索
- 9
- 枚举
- 9
- 电子学会三级
- 7
- GESP二级
- 7
- while循环
- 5
- 一维数组
- 5
- 排序
- 5
- 模拟
- 5
- 其他
- 4
- for循环
- 3
- 融会贯通
- 3
- 蓝桥杯
- 2
- 递推
- 2