命令行之2048

命令行之2048

大家好,又见面了,我是全栈君。

命令行之2048
2048挺火的游戏,在命令行实现是什么样呢?小尝试了下,这里感谢css大神给debug,还有就是游戏空格处採用特殊字符,因此程序在linux下跑可能会出现乱码,能够手动调整

游戏截图:

命令行之2048


命令行之2048


命令行之2048


代码:

#include <iostream> #include <ctime> #include <cstdlib> #include <cstring> #include <conio.h> #include <cstdlib> #include <windows.h> #define Coord_x 15 #define Coord_y 15 #define Height 20 #define Width 16 using namespace std; class Game { public: int score; int num[5][5]; public: Game(int s = 0); bool control(char ch); void init(); void make(); }G; class Console { public: void gotoxy(HANDLE hOut, int x, int y); void enter_game(); void window(); void show(); void start_game(); void end_game(); friend class Game; }C; Game::Game(int s) { score = s; memset(num,0,sizeof(num)); } void Console::gotoxy(HANDLE hOut, int x, int y) { COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hOut, pos); } void Console::enter_game() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); system("title 2048 by Tc"); gotoxy(hOut,Coord_x+Width-1,Coord_y-12); SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); cout<<" 欢迎进入 2 0 4 8"; SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN); gotoxy(hOut,Coord_x+Width-25,Coord_y-8); cout << " * * * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-7); cout << " * * * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-6); cout << " * * * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-5); cout << " * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-4); cout << " * * * * * * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-3); cout << " * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-2); cout << " * * * * * * " << endl; gotoxy(hOut,Coord_x+Width-25,Coord_y-1); cout << " * * * * * * * * * * " << endl; gotoxy(hOut,Coord_x+Width+1,Coord_y+3); SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED); cout << "按回车键进入游戏\n"<< endl;; while(1) { char c; if(kbhit()) { c = getch(); if(c == 13) { system("CLS"); C.start_game(); } } } if(getch() == 27) { C.end_game(); } } void Console::end_game() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); system("CLS"); gotoxy(hOut,Coord_x+Width+5,Coord_y-10); SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED); cout << "游戏结束"; gotoxy(hOut,Coord_x+Width+5,Coord_y-7); cout << "终于得分 : " << G.score << endl; SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); exit(0); } void Console::window() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); system("title 2 0 4 8 by Tc"); system("color 0C"); gotoxy(hOut,Coord_x+Width-2,Coord_y-13); cout << " *******"; gotoxy(hOut,Coord_x+Width-2,Coord_y-12); cout << " 2 0 4 8"; gotoxy(hOut,Coord_x+Width-2,Coord_y-11); cout << " *******"; gotoxy(hOut,Coord_x+2*Width+3,Coord_y+6); SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN); gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 8); cout << "w键 : 向上 " << "s键 : 向下"; gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 6); cout << "a键 : 向左 " << "d键 : 向右"; gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 4); cout << "Esc :退出"; } void Console :: show() { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED); gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 10); cout << " "; gotoxy(hOut,Coord_x+2*Width+3 + 2,Coord_y - 10); cout << "分数 : " << G.score; for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { if(G.num[i][j] != 0) { cout << " "; SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_RED); gotoxy(hOut, Coord_x + 6 + j * 8,Coord_x - 8 + i * 4); cout << G.num[i][j]; } else { cout << " "; SetConsoleTextAttribute(handle,FOREGROUND_INTENSITY | FOREGROUND_GREEN); gotoxy(hOut, Coord_x + 6 + j * 8,Coord_x - 8 + i * 4); cout << "■"; } } cout << endl; } } bool Game::control(char dir) { int num2[4][4]; for(int n = 0; n < 4; n++) for(int m = 0; m < 4; m++) num2[n][m] = num[n][m]; bool IsMove = false; if(dir == 'w' || dir == 'W') { for(int j = 0; j < 4; j++) { int ii = 0, temp = 5; for(int i = 0; i < 4; i++) { if(num[i][j] == 0) continue; else { temp = i; break; } } if(temp == 5) continue; num[ii][j] = num[temp][j]; for(int i = temp + 1; i < 4; i++) { if(num[i][j] == 0) continue; else if(num[i][j] != 0 && num[i][j] == num[ii][j]) { num[ii][j] *= 2; G.score += num[ii][j]; num[i][j] = 0; } else if(num[i][j] != 0 && num[i][j] != num[ii][j]) num[++ii][j] = num[i][j]; } while(ii < 4) num[++ii][j] = 0; for(int n = 0; n < 4; n++) { for(int m = 0; m < 4; m++) { if(num2[n][m] != num[n][m]) { IsMove = true; break; } } if(IsMove) break; } } return IsMove; } else if(dir == 's' || dir == 'S') { for(int j = 0; j < 4; j++) { int ii = 3, temp = 5; for(int i = 3; i >= 0; i--) { if(num[i][j] == 0) continue; else { temp = i; break; } } if(temp == 5) continue; num[ii][j] = num[temp][j]; for(int i = temp - 1; i >= 0; i--) { if(num[i][j] == 0) continue; else if(num[i][j] != 0 && num[i][j] == num[ii][j]) { num[ii][j] *= 2; G.score += num[ii][j]; num[i][j] = 0; } else if(num[i][j] != 0 && num[i][j] != num[ii][j]) num[--ii][j] = num[i][j]; } while(ii >= 0) num[--ii][j] = 0; for(int n = 0; n < 4; n++) { for(int m = 0; m < 4; m++) { if(num2[n][m] != num[n][m]) { IsMove = true; break; } } if(IsMove) break; } } return IsMove; } else if(dir == 'a' || dir == 'A') { for(int i = 0; i < 4; i++) { int jj = 0, temp = 5; for(int j = 0; j < 4; j++) { if(num[i][j] == 0) continue; else { temp = j; break; } } if(temp == 5) continue; num[i][jj] = num[i][temp]; for(int j = temp + 1; j < 4; j++) { if(num[i][j] == 0) continue; else if(num[i][j] != 0 && num[i][j] == num[i][jj]) { num[i][jj] *= 2; G.score += num[i][jj]; num[i][j] = 0; } else if(num[i][j] != 0 && num[i][j] != num[i][jj]) { num[i][++jj] = num[i][j]; } } while(jj < 4) { num[i][++jj] = 0; } for(int n = 0; n < 4; n++) { for(int m = 0; m < 4; m++) { if(num2[n][m] != num[n][m]) { IsMove = true; break; } } if(IsMove) break; } } return IsMove; } else if(dir == 'd' || dir == 'D') { for(int i = 0; i < 4; i++) { int jj = 3, temp = 5; for(int j = 3; j >= 0; j--) { if(num[i][j] == 0) continue; else { temp = j; break; } } if(temp == 5) continue; num[i][jj] = num[i][temp]; for(int j = temp - 1; j >= 0 && jj > 0; j--) { if(num[i][j] == 0) continue; else if(num[i][j] != 0 && num[i][j] == num[i][jj]) { num[i][jj] *= 2; G.score += num[i][jj]; num[i][j] = 0; } else if(num[i][j] != 0 && num[i][j] != num[i][jj]) num[i][--jj] = num[i][j]; } while(jj > 0) num[i][--jj] = 0; for(int n = 0; n < 4; n++) { for(int m = 0; m < 4; m++) { if(num2[n][m] != num[n][m]) { IsMove = true; break; } } if(IsMove) break; } } return IsMove; } return false; } void Game :: init() { srand((unsigned int) time(NULL)); int x = rand() % 4; int y = rand() % 4; G.num[x][y] = 2; int xx = rand() % 4; int yy = rand() % 4; while(1) { if(xx != x && yy != y) { G.num[xx][yy] = 2; break; } xx = rand() % 4; yy = rand() % 4; } } void Game :: make() { int count = 0; for(int i = 0; i < 4; i++) { for(int j = 0; j < 4; j++) { if(num[i][j]) count ++; } } if(count == 16) C.end_game(); int xx = rand() % 4; int yy = rand() % 4; while(1) { if(num[xx][yy] == 0) { num[xx][yy] = 2; break; } xx = rand() % 4; yy = rand() % 4; } } void Console :: start_game() { G.init(); window(); show(); char dir; while(true) { bool flag = false; dir = getch(); if(dir == 27) end_game(); if(dir == 'w' || dir == 'W' || dir == 'a' || dir == 'A' || dir == 's' || dir == 'S' || dir == 'D' || dir == 'd') { flag = G.control(dir); window(); if(flag) G.make(); show(); } } } int main() { C.enter_game(); } 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116044.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • android怎样换背景图片,手机怎么抠图换背景 安卓和iPhone一键抠图换背景教程

    android怎样换背景图片,手机怎么抠图换背景 安卓和iPhone一键抠图换背景教程原标题:手机怎么抠图换背景安卓和iPhone一键抠图换背景教程转自:电脑百事网果粉俱乐部原创平时很多小伙伴都喜欢拍照嗮图,而很多时候如果想要照片更美,抠图换背景会起到立竿见影的效果。那么,手机怎么抠图换背景?不少小伙伴苦于不懂PS抠图技术,总在羡慕别人。但其实很多人手机上分享的抠图照片都是通过一些APP就能够实现的,小白也可以轻松上手,下面“电脑百事网”干货来啦,教你如何借助APP,在安卓和i…

  • qmap使用

    qmap使用#include<QCoreApplication>#include<QMap>//#include<QVector>#include<QDebug>typedefQMap<QString,int>CMyQMap;intmain(intargc,char*argv[]){QCoreApplica…

  • linux下杀死全部进程,linux下批量杀死进程[通俗易懂]

    linux下杀死全部进程,linux下批量杀死进程[通俗易懂]psaux|greppython|grep-vgrep|cut-c9-15|xargskill-15管道符“|”用来隔开两个命令,管道符左边命令的输出会作为管道符右边命令的输入。下面说说用管道符联接起来的几个命令:“psaux”是linux里查看所有进程的命令。这时检索出的进程将作为下一条命令“greppython”的输入。“greppython”的输出结果是,所有含有关键…

  • __cplusplus、extern “C”关键字

    __cplusplus、extern “C”关键字   我们在阅读程序时,经常会见到__cplusplus关键字,比如下面的代码:#ifdef__cplusplusextern"C"{#endifvoid*memset(void*,int,size_t);#ifdef__cplusplus}#endif  这里面,两种关键字,都是为了实现C++与C兼容的,extern“C”是用来在C++程序中声明或…

    2022年10月25日
  • 使用phpmyadmin浏览库结构很卡的问题的解决方案

    使用phpmyadmin浏览库结构很卡的问题的解决方案

  • 了解ACL—通配符掩码「建议收藏」

    了解ACL—通配符掩码「建议收藏」学习ACL,搞懂ACL就不能不搞定wildcardmask,通配符掩码。说简单点,通配符掩码就是0为绝对匹配,必须严格匹配才行,而1为任意,从某种意义上讲,如果一个8位上有一个1字符,那也只有两种方式,0或者1,但是如果进行组合,那么方式就多了。举例说明吧。一般我们在应用上都是进行地址块的匹配,怎么讲呢?就是说:1)对某个ABC类网进行匹配或者教通配符屏蔽2)对某个子网应用ACL。…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号