命令行之2048

2024-03-20 14:58
文章标签 命令行 2048

本文主要是介绍命令行之2048,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

游戏截图:










代码:

#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  16using 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();
}


这篇关于命令行之2048的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/829829

相关文章

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

C++入门(05-2)从命令行执行C++编译器_GCC

文章目录 GCC编译器1. 下载MinGW-w64,安装(不推荐)2. 使用MSYS2安装MinGW-w64(推荐)2.1 安装MSYS22.2 初始化和更新2.3 安装MinGW-w64编译器2.3 在MSYS2 Shell中导航到代码目录2.4 使用 g++ 编译2.5 运行可执行文件 GCC编译器 GCC(GNU Compiler Collection)是一个开源编译器集

C++入门(05)从命令行执行C++编译器_MSVC

文章目录 1.C++ 编译器2. 常用 C++ 编译器MSVC(Microsoft Visual C++)GCC(GNU Compiler Collection)Clang 3. MSVC 编译器3.1 开发者命令提示符3.2 编译 C++ 代码 1.C++ 编译器 将C++源代码(扩展名为 .cpp )转换成计算机可以运行的可执行程序 编译器会检查代码的语法和语义,生成相应

HDU 2048 错排问题

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2048 题解: n个人抽取的总情况为n!,所有人都没抽到自己名字的情况即错排数,存放在D[n]里,可用递推的方法求错排数D[n]。 显然D1=0,D2=1。当n≥3时,不妨设n排在了第k位,其中k≠n,也就是1≤k≤n-1。那么我们现在考虑第n位的情况。 当k排在第n位时,除了n和

ffmpeg使用安装使用教程(命令行-Python)

安装教程 https://blog.csdn.net/yuanmomoya/article/details/141992114 ffmpeg转换操作视频十分的占用cpu,会把cpu打满,线上使用的话需要注意下 命令行操作 一、视频转码 将视频从一种格式转换为另一种格式: ffmpeg -i input_video.mp4 output_video.avi 这将把输入的 MP4

mac命令行启动tomcat 修改tomcat端口号

1、进入的Tomcat安装/bin 目录下 直接拖动bin文件夹到终端,前面加cd 即:cd / Library / Tomcat / bin  2、启动tomcat 输入:sudo sh ./startup.sh 3、关闭Tomcat 关闭:sudo sh ./shutdown.sh   4、修改tomcat端口号 安装目录/conf/server.xml 文件夹下

Maven的初步使用以及命令行工具

在写本文的时候先来说明一下maven依赖的各种范围的意思 compile(编译范围) compile 是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的classpath 中可用,同时它们也会被打包。 provided(已提供范围)provided 依赖只有在当JDK 或者一个容器已提供该依赖之后才使用。例如,如果你开发了一个web 应用,你可能在编译cl

rust 命令行工具rsup管理前端npm依赖

学习了一年的 rust 了,但是不知道用来做些什么,也没能赋能到工作中,现在前端基建都已经开始全面进入 rust 领域了,rust 的前端生态是越来越好。但是自己奈何水平不够,想贡献点什么,无从下手。 遂想自己捣鼓个什么东西,可以帮助到日常工作的。 记录一下在完成功能时遇到的一些问题,以及是怎么解决的。 解决的需求 公司有很多项目,都是依赖公司技术部门的一个框架,虽然说不行,但还是要用,里

递归删除某类文件(命令行实现)

有时候我们需要在某目录下,删除某一类文件,例如:所有的png图片。 Linux做法:find和rm命令 find . –name “*.png” –type f –print –exec rm –rf {} \;man find 各参数的含义可以使用man find命令从帮助文档来查看 删除效果如下: Dos/windows做法:del或者erase命令