内容目录
完全用c++写的2048 可以用上下左右控制 有闪动效果哦 棒棒哒
#include <iostream> #include <cstdio> #include <time.h> #include <windows.h> using namespace std; /***************************/ #define LINE 4 #define FLASH 1 #define zero {0} using namespace std ; int mat[LINE + 2][LINE + 2]; int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0}; void output() { system("CLS"); printf("*********************\n"); printf("****2048 by Sky-J****\n"); printf("*********************\n"); for (int i = 1; i <= LINE; i++) { printf("%2c%c%c ", '-', '-', '-'); } printf("\n"); for (int i = 1; i <= LINE; i++) { for (int j = 1; j <= LINE; j++) { if (mat[i][j]) printf("%4d ", mat[i][j]); else printf(" "); } printf("\n"); } for (int i = 1; i <= LINE; i++) { printf("%2c%c%c ", '-', '-', '-'); } printf("\n"); printf("*********************\n"); } bool checkLose() { for (int i = 1; i <= LINE; i++) { for (int j = 1; j <= LINE; j++) { if (mat[i][j] == 0) { return false; } } } int x, y; for (int i = 1; i <= LINE; i++) { for (int j = 1; j <= LINE; j++) { for (int k = 0; k < 4; k++) { x = i + dir[k][0]; y = j + dir[k][1]; if (x < 1 || y < 1 || x > LINE || y > LINE) continue; if (mat[x][y] == mat[i][j]) return false; } } } return true; } void addnum() { int num = 0; int empty[LINE * LINE][2]; for (int i = 1; i <= LINE; i++) { for (int j = 1; j <= LINE; j++) { if (mat[i][j] == 0) { empty[num][0] = i; empty[num++][1] = j; } } } if (num != 0) { int x = rand() % num; mat[empty[x][0]][empty[x][1]] = (rand() % 10 == 0 ? 4 : 2); } return ; } void init() { srand(time(NULL) * 100); memset(mat, -1, sizeof(mat)); // int bug[10][10] = // { // {0}, // {0, 4 , 32 , 4 , 2}, // {0, 16 , 4, 64 , 16}, // {0, 2 , 8 , 16 , 4}, // {0, 2 , 4 , 128 , 8}, // }; for (int i = 1; i <= LINE; i++) { for (int j = 1; j <= LINE; j++) { mat[i][j] = 0; } } // output(); // _sleep(10000); addnum(); addnum(); } void flashmat(int i, int j) { int t = mat[i][j]; mat[i][j] = 0; output(); mat[i][j] = t; output(); mat[i][j] = 0; output(); mat[i][j] = t; } void up() { bool mark[LINE + 1][LINE + 1] = zero; bool hasmove = false; for (int j = 1; j <= LINE; j++) { for (int i = 1; i <= LINE; i++) { if (mat[i][j] != 0) { for (int k = i - 1; k >= 0; k--) { if (mat[k][j] != 0) { if (mat[k][j] == mat[i][j] && !mark[k][j]) { mat[k][j] *= 2; mark[k][j] = 1; mat[i][j] = 0; hasmove = true; if (FLASH) flashmat(k, j); } else if (k + 1 != i) { mat[k + 1][j] = mat[i][j]; mat[i][j] = 0; hasmove = true; } break; } } } } } if (hasmove) addnum(); return ; } void down() { bool mark[LINE + 1][LINE + 1] = zero; bool hasmove = false; for (int j = 1; j <= LINE; j++) { for (int i = LINE; i >= 1; i--) { if (mat[i][j] != 0) { for (int k = i + 1; k <= LINE + 1; k++) { if (mat[k][j] != 0) { if (mat[k][j] == mat[i][j] && !mark[k][j]) { mat[k][j] *= 2; mark[k][j] = 1; mat[i][j] = 0; hasmove = true; if (FLASH) flashmat(k, j); } else if (k - 1 != i) { mat[k - 1][j] = mat[i][j]; mat[i][j] = 0; hasmove = true; } break; } } } } } if (hasmove) addnum(); return ; } void left() { bool mark[LINE + 1][LINE + 1] = zero; bool hasmove = false; for (int i = 1; i <= LINE; i++) { for (int j = 1; j <= LINE; j++) { if (mat[i][j] != 0) { for (int k = j - 1; k >= 0; k--) { if (mat[i][k] != 0) { if (mat[i][k] == mat[i][j] && !mark[i][k]) { mat[i][k] *= 2; mark[i][k] = 1; mat[i][j] = 0; hasmove = true; if (FLASH) flashmat(i, k); } else if (k + 1 != j) { mat[i][k + 1] = mat[i][j]; mat[i][j] = 0; hasmove = true; } break; } } } } } if (hasmove) addnum(); return ; } void right() { bool mark[LINE + 1][LINE + 1] = zero; bool hasmove = false; for (int i = 1; i <= LINE; i++) { for (int j = LINE; j >= 1; j--) { if (mat[i][j] != 0) { for (int k = j + 1; k <= LINE + 1; k++) { if (mat[i][k] != 0) { if (mat[i][k] == mat[i][j] && !mark[i][k]) { mat[i][k] *= 2; mark[i][k] = 1; mat[i][j] = 0; hasmove = true; if (FLASH) flashmat(i, k); } else if (k - 1 != j) { mat[i][k - 1] = mat[i][j] ; mat[i][j] = 0; hasmove = true; } break; } } } } } if (hasmove) addnum(); return ; } bool move(int dir) { int sleeptime = 0; _sleep(sleeptime); if (dir == 0) { up(); output(); printf("up\n"); } else if (dir == 1) { down(); output(); printf("down\n"); } else if (dir == 2) { left(); output(); printf("left\n"); } else if (dir == 3) { right(); output(); printf("right\n"); } if (checkLose()) { printf("lose~~\n"); return false; } return true; } /****************************/ //钩子过程 LRESULT CALLBACK _HookProc(int, WPARAM, LPARAM); static HANDLE handle; //控制台句柄 //控制台信息结构 static CONSOLE_SCREEN_BUFFER_INFO info ; int main() { /*************************/ init(); output(); /*************************/ //获取输出缓冲区句柄 handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取相关信息(主要是缓冲区大小) GetConsoleScreenBufferInfo( handle, &info ); CONSOLE_CURSOR_INFO cursor; //光标结构 cursor.dwSize = 10; cursor.bVisible = 0; //0为隐藏光标 SetConsoleCursorInfo(handle, &cursor);//设置隐藏光标函数 HHOOK hook; MSG msg; //相应的钩子有相应的过程函数MSDN中可看,安装键盘钩子 hook = SetWindowsHookEx(WH_KEYBOARD_LL, _HookProc, GetModuleHandle(NULL), 0); while (1) { if ( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) ) //循环接收消息 { TranslateMessage(&msg); DispatchMessage(&msg); } } UnhookWindowsHookEx( hook ); //卸载钩子 return 0; } LRESULT CALLBACK _HookProc(int message, WPARAM wParam, LPARAM lParam) { //判断是否弹起按键消息 if ( wParam == WM_KEYUP) { bool state = true; switch (((LPKBDLLHOOKSTRUCT) lParam)->vkCode) //lParam:指向一个结构 { //按下上键 case VK_UP: move(0); break; //按下下键 case VK_DOWN: move(1); break; //按下左键 case VK_LEFT: move(2); break; //按下右键 case VK_RIGHT: move(3); break; //按下空格和回车键 case VK_SPACE: case VK_RETURN: break; } } //消息传给下个钩子 return CallNextHookEx ( NULL, message, wParam, lParam ); }
益群网:逆向网赚,坐等收钱
【会员福利】
优势一:静态分红,免费签到就有钱,每日最高一百元
优势二:十级提成,逆向网赚,什么不干,照样有钱赚
优势三:营销软件,无限下载,每日增加,且永久更新
【自动下滑】
每人限定五个下线,多推荐的自动下滑到一级下线名下
从而成为推荐者的二级下线,以此类推,直到十级
不论这个下线是谁直接推荐的,你都有提成
你直接推荐的每个你提成5元,非直接推荐的每个你提成0.5元
总之,多干多赚,什么都不干也照样赚
【注册网址】
http://www.403867.36u.win/