【颓废篇】easyx--2048

整天待在机房是不是,一直保持学术的态度就比较的难啊~

所以本蒟蒻就在学术之余学了些奇技淫巧,然后就写了一些奇奇怪怪的程序啊,比如让我们小组dalao们都颓得不亦乐乎的2048~~

当然,2048的实现还是非常简单的对不对,我的写法估计更麻烦,我相信会有更方便的方式实现。。。

当然了,OI界学习的信息组dalao们写的程序多半是Console Application啊,就一个黑洞洞的窗口,画个图只能是字符画,看上去会很无聊,缺少图形的界面,于是,本蒟蒻学习了一种奇妙的东西——easyx

当然了,这种有趣的东西机房弱爆了的DEV C++是不滋磁的啊,所以本蒟蒻又引进了一个非常强大的IDE啊,Visual Studio。。

这个东西非常的强大,当然平时写写Console的我等是体会不到它的高端的,每写一个程序还要建一个项目,就显得特别蠢~~

但是,真正建个什么颓废的项目的时候,VS的强大就体现了。。。

//我是不是扯淡太多了

终于,今天下午能愉快的放假回家了,就在这里贴一贴代码啊~

开发环境:vs2015Professional  语言:C/C++

//2048  源码
#pragma once

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

const COLORREF bkcolor = 0xFFF070;
const COLORREF cmdcolor = 0xFFA080;
const COLORREF emptycolor = 0xE0F0FF;
const COLORREF scorecolor = 0xE0F0FF;

const int      wndWidth = 470;
const int      wndHeight = 640;
const int      PicWidth = 100;

const int      PicX[4] = { 20,130,240,350 };
const int      PicY[4] = { 190,300,410,520 };

const int      Point[11] = { 2,4,8,16,32,64,128,256,512,1024,2048 };

#define t_srand srand((unsigned)time(NULL))
#define my_rand ((rand()|rand()<<16)%1000000007)

IMAGE image[12];
IMAGE number[10];

int board[4][4] = { {0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0} };

BOOL play[4][4];

BOOL End = FALSE;
int total = 0;
int record = 0;

const char* FILENAME = "Image\010.bmp";

//Function.h
#pragma once

#include "Preparation.h"

void Game_Init();
void Load_Image();
int  Get_Highest();
void Load_Highest();
void New_Number();
void Msg_React();
void Move_Up();
void Move_Down();
void Move_Left();
void Move_Right();
void Put_Number(int, BOOL);

void Game_Init()
{
	Load_Image();
	record=Get_Highest();
	
	initgraph(wndWidth, wndHeight);
	setbkcolor(bkcolor);
	cleardevice();
	setfillcolor(cmdcolor);
	fillrectangle(-1, -1, wndWidth + 1, 171);
	setfillcolor(emptycolor);
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
			fillrectangle(PicX[i], PicY[j], PicX[i] + PicWidth, PicY[j] + PicWidth);
	}
	fillrectangle(wndWidth - 180, 40, wndWidth - 20, 80);
	fillrectangle(wndWidth - 180, 90, wndWidth - 20, 130);
	Put_Number(record, 1);
	Put_Number(0, 0);
	New_Number();
	New_Number();
}

void Load_Image() //A AA 
{ 
	loadimage(&image[1], _T("Image\2.bmp"), PicWidth, PicWidth);
	loadimage(&image[2], _T("Image\4.bmp"), PicWidth, PicWidth);
	loadimage(&image[3], _T("Image\8.bmp"), PicWidth, PicWidth);
	loadimage(&image[4], _T("Image\16.bmp"), PicWidth, PicWidth);
	loadimage(&image[5], _T("Image\32.bmp"), PicWidth, PicWidth);
	loadimage(&image[6], _T("Image\64.bmp"), PicWidth, PicWidth);
	loadimage(&image[7], _T("Image\128.bmp"), PicWidth, PicWidth);
	loadimage(&image[8], _T("Image\256.bmp"), PicWidth, PicWidth);
	loadimage(&image[9], _T("Image\512.bmp"), PicWidth, PicWidth);
	loadimage(&image[10], _T("Image\1024.bmp"), PicWidth, PicWidth);
	loadimage(&image[11], _T("Image\2048.bmp"), PicWidth, PicWidth);

	loadimage(&number[0], _T("Image\000.bmp"), 20, 40);
	loadimage(&number[1], _T("Image\001.bmp"), 20, 40);
	loadimage(&number[2], _T("Image\002.bmp"), 20, 40);
	loadimage(&number[3], _T("Image\003.bmp"), 20, 40);
	loadimage(&number[4], _T("Image\004.bmp"), 20, 40);
	loadimage(&number[5], _T("Image\005.bmp"), 20, 40);
	loadimage(&number[6], _T("Image\006.bmp"), 20, 40);
	loadimage(&number[7], _T("Image\007.bmp"), 20, 40);
	loadimage(&number[8], _T("Image\008.bmp"), 20, 40);
	loadimage(&number[9], _T("Image\009.bmp"), 20, 40);
}

int Get_Highest()
{
	using namespace std;
	fstream gamefile;
	int game_point;
	gamefile.open(FILENAME, ios::in);
	if (!gamefile)
	{
		gamefile.open(FILENAME, ios::out);
		gamefile << 0;
		return 0;
	}
	gamefile >> game_point;
	if (game_point > 100000000 || game_point % 4)
		return 0;
	return game_point;
}

void Load_Highest()
{
	if (total < record)
		return;
	using namespace std;
	fstream gamefile;
	gamefile.open(FILENAME, ios::out);
	gamefile << total;
	record = total;
	Put_Number(total, 1);
}

void New_Number()
{
	
	if (End) return;
	t_srand;
	int type = abs(my_rand) % 10;
	int Number = 0;
	int NumberX = 4, NumberY = 4;

	if (type < 7)
		Number = 1;
	else
		Number = 2;

	do
	{
		NumberX = abs(my_rand) % 4;
		NumberY = abs(my_rand) % 4;
		type++;
	} while (board[NumberX][NumberY]);

	board[NumberX][NumberY] = Number;

	BeginBatchDraw();
	putimage(PicX[NumberY], PicY[NumberX], &image[Number]);
	EndBatchDraw();
}

void Msg_React()
{
	if (End) return;
	int k1 = _getch();
	int k2 = 0;
	switch (k1)
	{
	case 224:
		k2 = _getch();
		switch (k2)
		{
		case 72:
			Move_Up();
			break;
		case 80:
			Move_Down();
			break;
		case 75:
			Move_Left();
			break;
		case 77:
			Move_Right();
		default:
			break;
		}
		break;
	case 87:
	case 119:
		Move_Up();
		break;
	case 83:
	case 115:
		Move_Down();
		break;
	case 65:
	case 97:
		Move_Left();
		break;
	case 68:
	case 100:
		Move_Right();
		break;
	default:
		break;
	}
	Load_Highest();
}

void Move_Up()
{
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
			play[i][j] = FALSE;
	BOOL flag = FALSE;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (!board[i][j]) continue;
			int find = i - 1;
			int data = board[i][j];
			while (find >= 0)
			{
				if (!board[find][j])
				{
					board[find][j] = board[find + 1][j];
					board[find + 1][j] = 0;
					flag = TRUE;
					find--;
				}
				else if (board[find][j] == data && !play[find][j])
				{
					board[find][j] = data + 1;
					total += Point[data];
					board[find + 1][j] = 0;
					play[find][j] = true;
					flag = TRUE;
					find--;
				}
				else find = -1;
			}
		}
	}
	BeginBatchDraw();
	int Empty_Count = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (board[i][j])
			{
				putimage(PicX[j], PicY[i], &image[board[i][j]]);
			}
			else
			{
				fillrectangle(PicX[j], PicY[i], PicX[j] + PicWidth, PicY[i] + PicWidth);
				Empty_Count++;
			}
		}
	}
	Put_Number(total, 0);
	EndBatchDraw();
	if (!Empty_Count)
	{
		End = TRUE;
		return;
	}
	if (flag)
		New_Number();
}

void Move_Down()
{
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
			play[i][j] = FALSE;
	BOOL flag = FALSE;
	for (int i = 2; i >= 0; i--)
	{
		for (int j = 0; j < 4; j++)
		{
			if (!board[i][j]) continue;
			int find = i + 1;
			int data = board[i][j];
			while (find <= 3)
			{
				if (!board[find][j])
				{
					board[find][j] = board[find - 1][j];
					board[find - 1][j] = 0;
					flag = TRUE;
					find++;
				}
				else if (board[find][j] == data && !play[find][j])
				{
					board[find][j] = data + 1;
					total += Point[data];
					board[find - 1][j] = 0;
					play[find][j] = true;
					flag = TRUE;
					find++;
				}
				else find = 4;
			}
		}
	}
	BeginBatchDraw();
	int Empty_Count = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (board[i][j])
			{
				putimage(PicX[j], PicY[i], &image[board[i][j]]);
			}
			else
			{
				fillrectangle(PicX[j], PicY[i], PicX[j] + PicWidth, PicY[i] + PicWidth);
				Empty_Count++;
			}
		}
	}
	Put_Number(total, 0);
	EndBatchDraw();
	if (!Empty_Count)
	{
		End = TRUE;
		return;
	}
	if (flag)
		New_Number();
}

void Move_Left()
{
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
			play[i][j] = FALSE;
	BOOL flag = FALSE;
	for (int j = 1; j < 4; j++)
	{
		for (int i = 0; i < 4; i++)
		{
			if (!board[i][j]) continue;
			int find = j - 1;
			int data = board[i][j];
			while (find >= 0)
			{
				if (!board[i][find])
				{
					board[i][find] = board[i][find + 1];
					board[i][find + 1] = 0;
					flag = TRUE;
					find--;
				}
				else if (board[i][find] == data)
				{
					board[i][find] = data + 1;
					total += Point[data];
					board[i][find + 1] = 0;
					play[i][find] = TRUE;
					flag = TRUE;
					find--;
				}
				else find = -1;
			}
		}
	}
	BeginBatchDraw();
	int Empty_Count = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (board[i][j])
			{
				putimage(PicX[j], PicY[i], &image[board[i][j]]);
			}
			else
			{
				fillrectangle(PicX[j], PicY[i], PicX[j] + PicWidth, PicY[i] + PicWidth);
				Empty_Count++;
			}
		}
	}
	Put_Number(total, 0);
	EndBatchDraw();
	if (!Empty_Count)
	{
		End = TRUE;
		return;
	}
	if (flag)
		New_Number();
}

void Move_Right()
{
	for (int i = 0; i < 4; i++)
		for (int j = 0; j < 4; j++)
			play[i][j] = FALSE;
	BOOL flag = FALSE;
	for (int j = 2; j >= 0; j--)
	{
		for (int i = 0; i < 4; i++)
		{
			if (!board[i][j]) continue;
			int find = j + 1;
			int data = board[i][j];
			while (find <= 3)
			{
				if (!board[i][find])
				{
					board[i][find] = board[i][find - 1];
					board[i][find - 1] = 0;
					flag = TRUE;
					find++;
				}
				else if (board[i][find] == data && !play[i][find])
				{
					board[i][find] = data + 1;
					total += Point[data];
					board[i][find - 1] = 0;
					play[i][find] = TRUE;
					flag = TRUE;
					find++;
				}
				else find = 4;
			}
		}
	}
	BeginBatchDraw();
	int Empty_Count = 0;
	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			if (board[i][j])
			{
				putimage(PicX[j], PicY[i], &image[board[i][j]]);
			}
			else
			{
				fillrectangle(PicX[j], PicY[i], PicX[j] + PicWidth, PicY[i] + PicWidth);
				Empty_Count++;
			}
		}
	}
	Put_Number(total, 0);
	EndBatchDraw();
	if (!Empty_Count)
	{
		End = TRUE;
		return;
	}
	if (flag)
		New_Number();
}

void Put_Number(int NUMBER,BOOL flag)
{
	if (flag)
	{
		for (int i = 1; i <= 8; i++)
		{
			putimage(wndWidth - (20 + 20 * i), 40, &number[NUMBER % 10]);
			NUMBER /= 10;
		}
	}
	else
	{
		for (int i = 1; i <= 8; i++)
		{
			putimage(wndWidth - (20 + 20 * i), 90, &number[NUMBER % 10]);
			NUMBER /= 10;
		}
	}
}


//main.cpp
#include "Preparation.h"
#include "function.h"

void main()
{
	Game_Init();
	while (!End)
	{
		Msg_React();
	}
	Sleep(500);
	closegraph();
}

上面提到的图片??
其实你们可以自己找哦~~
上面是2048的每个数字~~下面的是显示高分的数字。。看你们的心情咯~~
原文地址:https://www.cnblogs.com/enzymii/p/8412162.html