内容目录
完全用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/