首页 > 代码库 > 手动转一下田神的2048
手动转一下田神的2048
手动转一下田神的2048 :http://blog.csdn.net/tc_to_top/article/details/38793869
命令行之2048
2048挺火的游戏,在命令行实现是什么样呢?小尝试了下,这里感谢css大神给debug,还有就是游戏空格处采用特殊字符,因此程序在linux下跑可能会出现乱码,可以手动调整
游戏截图:
代码:
1 #include <iostream> 2 #include <ctime> 3 #include <cstdlib> 4 #include <cstring> 5 #include <conio.h> 6 #include <cstdlib> 7 #include <windows.h> 8 #define Coord_x 15 9 #define Coord_y 15 10 #define Height 20 11 #define Width 16 12 13 using namespace std; 14 15 class Game 16 { 17 public: 18 int score; 19 int num[5][5]; 20 21 public: 22 Game(int s = 0); 23 bool control(char ch); 24 void init(); 25 void make(); 26 }G; 27 28 class Console 29 { 30 public: 31 void gotoxy(HANDLE hOut, int x, int y); 32 void enter_game(); 33 void window(); 34 void show(); 35 void start_game(); 36 void end_game(); 37 38 friend class Game; 39 }C; 40 41 Game::Game(int s) 42 { 43 score = s; 44 memset(num,0,sizeof(num)); 45 } 46 47 void Console::gotoxy(HANDLE hOut, int x, int y) 48 { 49 COORD pos; 50 pos.X = x; 51 pos.Y = y; 52 SetConsoleCursorPosition(hOut, pos); 53 } 54 55 void Console::enter_game() 56 { 57 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); 58 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); 59 system("title 2048 by Tc"); 60 gotoxy(hOut,Coord_x+Width-1,Coord_y-12); 61 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); 62 cout<<" 欢迎进入 2 0 4 8"; 63 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN); 64 gotoxy(hOut,Coord_x+Width-25,Coord_y-8); 65 cout << " * * * * * * * * " << endl; 66 gotoxy(hOut,Coord_x+Width-25,Coord_y-7); 67 cout << " * * * * * * * * " << endl; 68 gotoxy(hOut,Coord_x+Width-25,Coord_y-6); 69 cout << " * * * * * * * * " << endl; 70 gotoxy(hOut,Coord_x+Width-25,Coord_y-5); 71 cout << " * * * * * * " << endl; 72 gotoxy(hOut,Coord_x+Width-25,Coord_y-4); 73 cout << " * * * * * * * * * * * " << endl; 74 gotoxy(hOut,Coord_x+Width-25,Coord_y-3); 75 cout << " * * * * * * " << endl; 76 gotoxy(hOut,Coord_x+Width-25,Coord_y-2); 77 cout << " * * * * * * " << endl; 78 gotoxy(hOut,Coord_x+Width-25,Coord_y-1); 79 cout << " * * * * * * * * * * " << endl; 80 gotoxy(hOut,Coord_x+Width+1,Coord_y+3); 81 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED); 82 cout << "按回车键进入游戏\n"<< endl;; 83 while(1) 84 { 85 char c; 86 if(kbhit()) 87 { 88 c = getch(); 89 if(c == 13) 90 { 91 system("CLS"); 92 C.start_game(); 93 } 94 } 95 } 96 if(getch() == 27) 97 { 98 C.end_game(); 99 }100 }101 102 103 void Console::end_game()104 {105 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);106 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);107 system("CLS");108 gotoxy(hOut,Coord_x+Width+5,Coord_y-10);109 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED);110 cout << "游戏结束";111 gotoxy(hOut,Coord_x+Width+5,Coord_y-7);112 cout << "最终得分 : " << G.score << endl;113 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);114 exit(0);115 }116 117 void Console::window()118 {119 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);120 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);121 system("title 2 0 4 8 by Tc");122 system("color 0C");123 gotoxy(hOut,Coord_x+Width-2,Coord_y-13);124 cout << " *******";125 gotoxy(hOut,Coord_x+Width-2,Coord_y-12);126 cout << " 2 0 4 8";127 gotoxy(hOut,Coord_x+Width-2,Coord_y-11);128 cout << " *******";129 gotoxy(hOut,Coord_x+2*Width+3,Coord_y+6);130 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN);131 gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 8);132 cout << "w键 : 向上 " << "s键 : 向下";133 gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 6);134 cout << "a键 : 向左 " << "d键 : 向右";135 gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 4);136 cout << "Esc :退出";137 }138 139 void Console :: show()140 {141 HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);142 HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);143 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED);144 gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 10);145 cout << " ";146 gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 10);147 cout << "分数 : " << G.score;148 for(int i = 0; i < 4; i++)149 {150 for(int j = 0; j < 4; j++)151 {152 if(G.num[i][j] != 0)153 {154 cout << " ";155 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED);156 gotoxy(hOut, Coord_x + 6 + j * 8,Coord_x - 8 + i * 4);157 cout << G.num[i][j];158 }159 else160 {161 cout << " ";162 SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN);163 gotoxy(hOut, Coord_x + 6 + j * 8,Coord_x - 8 + i * 4);164 cout << "■";165 }166 }167 cout << endl;168 }169 170 }171 172 bool Game::control(char dir)173 {174 int num2[4][4];175 for(int n = 0; n < 4; n++)176 for(int m = 0; m < 4; m++)177 num2[n][m] = num[n][m];178 bool IsMove = false;179 if(dir == ‘w‘ || dir == ‘W‘)180 {181 for(int j = 0; j < 4; j++)182 {183 int ii = 0, temp = 5;184 for(int i = 0; i < 4; i++)185 {186 if(num[i][j] == 0)187 continue;188 else189 {190 temp = i;191 break;192 }193 }194 if(temp == 5)195 continue;196 num[ii][j] = num[temp][j];197 for(int i = temp + 1; i < 4; i++)198 {199 if(num[i][j] == 0)200 continue;201 else if(num[i][j] != 0 && num[i][j] == num[ii][j])202 {203 num[ii][j] *= 2;204 G.score += num[ii][j];205 num[i][j] = 0;206 }207 else if(num[i][j] != 0 && num[i][j] != num[ii][j])208 num[++ii][j] = num[i][j];209 }210 while(ii < 4)211 num[++ii][j] = 0;212 for(int n = 0; n < 4; n++)213 {214 for(int m = 0; m < 4; m++)215 {216 if(num2[n][m] != num[n][m])217 {218 IsMove = true;219 break;220 }221 }222 if(IsMove)223 break;224 }225 }226 return IsMove;227 }228 else if(dir == ‘s‘ || dir == ‘S‘)229 {230 for(int j = 0; j < 4; j++)231 {232 int ii = 3, temp = 5;233 for(int i = 3; i >= 0; i--)234 {235 if(num[i][j] == 0)236 continue;237 else238 {239 temp = i;240 break;241 }242 }243 if(temp == 5)244 continue;245 num[ii][j] = num[temp][j];246 for(int i = temp - 1; i >= 0; i--)247 {248 if(num[i][j] == 0)249 continue;250 else if(num[i][j] != 0 && num[i][j] == num[ii][j])251 {252 num[ii][j] *= 2;253 G.score += num[ii][j];254 num[i][j] = 0;255 }256 else if(num[i][j] != 0 && num[i][j] != num[ii][j])257 num[--ii][j] = num[i][j];258 }259 while(ii >= 0)260 num[--ii][j] = 0;261 for(int n = 0; n < 4; n++)262 {263 for(int m = 0; m < 4; m++)264 {265 if(num2[n][m] != num[n][m])266 {267 IsMove = true;268 break;269 }270 }271 if(IsMove)272 break;273 }274 }275 return IsMove;276 }277 else if(dir == ‘a‘ || dir == ‘A‘)278 {279 for(int i = 0; i < 4; i++)280 {281 int jj = 0, temp = 5;282 for(int j = 0; j < 4; j++)283 {284 if(num[i][j] == 0)285 continue;286 else287 {288 temp = j;289 break;290 }291 }292 if(temp == 5)293 continue;294 num[i][jj] = num[i][temp];295 for(int j = temp + 1; j < 4; j++)296 {297 if(num[i][j] == 0)298 continue;299 else if(num[i][j] != 0 && num[i][j] == num[i][jj])300 {301 302 num[i][jj] *= 2;303 G.score += num[i][jj];304 num[i][j] = 0;305 }306 else if(num[i][j] != 0 && num[i][j] != num[i][jj])307 {308 309 num[i][++jj] = num[i][j];310 }311 }312 while(jj < 4)313 {314 num[i][++jj] = 0;315 }316 for(int n = 0; n < 4; n++)317 {318 for(int m = 0; m < 4; m++)319 {320 if(num2[n][m] != num[n][m])321 {322 IsMove = true;323 break;324 }325 }326 if(IsMove)327 break;328 }329 }330 return IsMove;331 }332 else if(dir == ‘d‘ || dir == ‘D‘)333 {334 for(int i = 0; i < 4; i++)335 {336 int jj = 3, temp = 5;337 for(int j = 3; j >= 0; j--)338 {339 if(num[i][j] == 0)340 continue;341 else342 {343 temp = j;344 break;345 }346 }347 if(temp == 5)348 continue;349 num[i][jj] = num[i][temp];350 for(int j = temp - 1; j >= 0 && jj > 0; j--)351 {352 if(num[i][j] == 0)353 continue;354 else if(num[i][j] != 0 && num[i][j] == num[i][jj])355 {356 num[i][jj] *= 2;357 G.score += num[i][jj];358 num[i][j] = 0;359 }360 else if(num[i][j] != 0 && num[i][j] != num[i][jj])361 num[i][--jj] = num[i][j];362 }363 while(jj > 0)364 num[i][--jj] = 0;365 for(int n = 0; n < 4; n++)366 {367 for(int m = 0; m < 4; m++)368 {369 if(num2[n][m] != num[n][m])370 {371 IsMove = true;372 break;373 }374 }375 if(IsMove)376 break;377 }378 }379 return IsMove;380 }381 return false;382 }383 384 void Game :: init()385 {386 srand((unsigned int) time(NULL));387 int x = rand() % 4;388 int y = rand() % 4;389 G.num[x][y] = 2;390 int xx = rand() % 4;391 int yy = rand() % 4;392 while(1)393 {394 if(xx != x && yy != y)395 {396 G.num[xx][yy] = 2;397 break;398 }399 xx = rand() % 4;400 yy = rand() % 4;401 }402 }403 404 void Game :: make()405 {406 int count = 0;407 for(int i = 0; i < 4; i++)408 {409 for(int j = 0; j < 4; j++)410 {411 if(num[i][j])412 count ++;413 }414 }415 if(count == 16)416 C.end_game();417 int xx = rand() % 4;418 int yy = rand() % 4;419 while(1)420 {421 if(num[xx][yy] == 0)422 {423 num[xx][yy] = 2;424 break;425 }426 xx = rand() % 4;427 yy = rand() % 4;428 }429 }430 431 void Console :: start_game()432 {433 G.init();434 window();435 show();436 char dir;437 while(true)438 {439 bool flag = false;440 dir = getch();441 if(dir == 27)442 end_game();443 if(dir == ‘w‘ || dir == ‘W‘ || dir == ‘a‘ || dir == ‘A‘ || dir == ‘s‘ || dir == ‘S‘ || dir == ‘D‘ || dir == ‘d‘)444 {445 flag = G.control(dir);446 window();447 if(flag)448 G.make();449 show();450 }451 }452 }453 454 int main()455 {456 C.enter_game();457 }
手动转一下田神的2048
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。