gdi写的2048

时间:2022-12-22 09:54:45
//-------------------------------------------【头文件及引用】----------------------------------------------------//
#include <Windows.h>
#include <time.h>
#include <stdlib.h>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#pragma comment(lib,"winmm.lib")
#pragma comment(lib,"Msimg32.lib")
using namespace std; //-------------------------------------------【宏定义】----------------------------------------------------------//
#define WINDOW_WIDTH 800
#define WINDOW_HEIGHT 600
#define WINDOW_TITLE L"窗口" //-------------------------------------------【全局变量声明部分】------------------------------------------------//
HDC g_hdc = NULL, g_mdc = NULL, g_bufdc = NULL; //全局设备环境句柄
HBITMAP g_hBitMap = NULL, g_hNumber[7] = {NULL}; //位图句柄
HFONT g_hFont;//文字句柄 int Map[4][4];
int score;
const int WinFlag = 2048;
int IsOver; struct node
{
int ChangeMap[4][4];//操作后的数组
int GetScore;//得分
int flag;//操作是否成功
node(int CM[][4], int scr, int f)
{
memcpy(ChangeMap, CM, sizeof ChangeMap);
GetScore = scr;
flag = f;
}
node() {}
}; //-------------------------------------------【全局函数声明部分】------------------------------------------------//
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
BOOL Game_Init(HWND hwnd);
VOID Game_Paint(HWND hwnd);
BOOL Game_CleanUp(HWND hwnd); VOID Map_Init();
//四种操作(主要对数组进行旋转)
node up();
node down();
node left();
node right();
//统一转成左移后操作
node change(int a[4][4]); void InsertNumber();//随机插入数字
int judge();//判断矩阵情况,0为无法继续移动,1为可以继续移动但未达到胜利标准,2为达到胜利标准 //-------------------------------------------【 main函数 】------------------------------------------------//
int main() {
HINSTANCE hInstance = GetModuleHandle(NULL);
int nShowCmd = true;
WNDCLASSEX wndClass = {
sizeof(WNDCLASSEX),
CS_HREDRAW | CS_VREDRAW,
WndProc,
0L,
0L,
hInstance,
(HICON)::LoadImage(NULL,L"icon.ico", IMAGE_ICON, 0, 0, LR_DEFAULTSIZE | LR_LOADFROMFILE),
LoadCursor(NULL, IDC_ARROW),
(HBRUSH)GetStockObject(GRAY_BRUSH),
NULL,
L"ForTheDream",//窗口类的名称
NULL
};
if( !RegisterClassEx(&wndClass)) return -1;
HWND hWnd = CreateWindow( L"ForTheDream", WINDOW_TITLE, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT, WINDOW_WIDTH, WINDOW_HEIGHT, NULL, NULL, hInstance, NULL);
MoveWindow(hWnd, 250, 80, WINDOW_WIDTH, WINDOW_HEIGHT, true);
ShowWindow(hWnd, nShowCmd);
UpdateWindow(hWnd); if(!Game_Init(hWnd)) return -1; //消息循环过程
MSG msg = {0};
while(msg.message != WM_QUIT) {
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
TranslateMessage(&msg); //虚拟键消息转换成字符消息
DispatchMessage(&msg); //分发一个消息给窗口程序
}
else
{
Game_Paint(hWnd);
}
}
UnregisterClass(L"ForTheDream", wndClass.hInstance );//注销 return 0;
} //---------------------------------------【窗口过程函数WndProc( )部分】------------------------------------------//
//描述:窗口过程函数,对窗口消息进行处理
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {
//定义一个PAINTSTRUCT结构体来记录一些绘制信息
PAINTSTRUCT paintStruct;
switch(message) {
case WM_KEYDOWN:
{
if(wParam == VK_ESCAPE)
{
if(MessageBox(hwnd, L"确认退出吗?", L"退出", MB_YESNO) == IDYES)
DestroyWindow(hwnd);
}
else if((wParam == VK_UP || wParam == VK_DOWN ||wParam == VK_LEFT ||wParam == VK_RIGHT) && !IsOver)
{
node res;
switch(wParam)
{
case VK_UP:
res = up();
break;
case VK_DOWN:
res = down();
break;
case VK_LEFT:
res = left();
break;
case VK_RIGHT:
res = right();
break;
}
memcpy(Map, res.ChangeMap, sizeof Map);
score += res.GetScore;
if(res.flag)
InsertNumber();
int JudgeRes = judge();
if(JudgeRes == 2)
{
IsOver = true;
Game_Paint(hwnd);
if(MessageBox(hwnd, L"恭喜你胜利了!是否重新开始游戏?", L"恭喜!", MB_YESNO) == IDYES)
Map_Init();
}
else if(JudgeRes == 0)
{
IsOver = true;
Game_Paint(hwnd);
if(MessageBox(hwnd, L"哈哈哈输了吧你个菜逼!是否重新开始游戏?", L"失败", MB_YESNO) == IDYES)
Map_Init();
}
//MessageBox(hwnd,L"键盘",L"Mouse",MB_OK);
}
}
break;
case WM_DESTROY:
Game_CleanUp(hwnd);
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN://鼠标消息
//MessageBox(hwnd,L"鼠标左键已按下",L"Mouse",MB_OK);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
} //---------------------------------------【游戏初始化部分】------------------------------------------//
//描述:贴背景贴图
BOOL Game_Init(HWND hwnd)
{
HBITMAP bmp;
Map_Init();
g_hdc = GetDC(hwnd);//获取设备环境句柄k
g_hBitMap = (HBITMAP)LoadImage(NULL, L"back.bmp", IMAGE_BITMAP, 800, 600, LR_LOADFROMFILE);//加载位图
wchar_t filename[20];
for(int i = 0; i < 11; i++)
{
memset(filename, 0, sizeof(filename));
swprintf_s(filename, L"color%d.bmp", i);
g_hNumber[i] = (HBITMAP)LoadImage(NULL, filename, IMAGE_BITMAP, 80, 80, LR_LOADFROMFILE);
}
g_mdc = CreateCompatibleDC(g_hdc);//建立兼容设备环境的内存DC
g_bufdc = CreateCompatibleDC(g_hdc);
bmp = CreateCompatibleBitmap(g_hdc, WINDOW_WIDTH, WINDOW_HEIGHT);//建立一个与窗口兼容的空的位图对象
SelectObject(g_mdc, bmp);
Game_Paint(hwnd);
return TRUE;
} VOID Game_Paint(HWND hwnd)
{
SelectObject(g_bufdc, g_hBitMap);//将位图对象选入到g_mdc内存DC中
BitBlt(g_mdc, 0, 0, WINDOW_WIDTH, WINDOW_HEIGHT, g_bufdc, 0, 0, SRCCOPY);//采用BitBlt函数贴图,参数设置为窗口大小 g_hFont = CreateFont(40, 0, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, L"微软雅黑");
SelectObject(g_mdc, g_hFont);
SetBkMode(g_mdc, TRANSPARENT);
wchar_t TextScore[20];
swprintf_s(TextScore, L"%d", score);
TextOut(g_mdc, 580, 225, TextScore, wcslen(TextScore));
DeleteObject(g_hFont);
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
if(Map[i][j])
{
int NO = 0;
int tmp = Map[i][j];
while(tmp != 2)
{
NO++;
tmp /= 2;
}
SelectObject(g_bufdc, g_hNumber[NO]);
BitBlt(g_mdc, 110 + j * 100, 110 + i * 100, 80, 80, g_bufdc, 0, 0, SRCCOPY);
}
}
}
BitBlt(g_hdc,0,0,WINDOW_WIDTH,WINDOW_HEIGHT,g_mdc,0,0,SRCCOPY);
} //---------------------------------------【Game_CleanUp()函数】------------------------------------------//
//描述:资源清理函数
BOOL Game_CleanUp(HWND hwnd)
{
DeleteObject(g_hBitMap);
for(int i = 0; i < 7; i++) {
DeleteObject(g_hNumber[i]);
}
DeleteDC(g_mdc);
DeleteDC(g_bufdc);
ReleaseDC(hwnd, g_hdc);//释放设备环境
return TRUE;
} //---------------------------------------【游戏算法部分】------------------------------------------//
VOID Map_Init()
{
score = 0;
memset(Map, 0, sizeof Map);
InsertNumber();
InsertNumber();
//Map[0][0] = 1024, Map[0][1] = 1024;
IsOver = false;
} void InsertNumber()
{
srand((unsigned int)time(NULL));
int x, y;
x = rand() % 4;
y = rand() % 4;
while(Map[x][y])
{
x = rand() % 4;
y = rand() % 4;
}
int number = rand() % 10;
if(number)
Map[x][y] = 2;
else
Map[x][y] = 4;
}
node change(int a[4][4])
{
vector <int> v[4];
vector <int> tmp[4];
int ans[4][4] = {0};
int GetScore = 0;
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
{
if(a[i][j])
v[i].push_back(a[i][j]);
}//去0
while(v[i].size() > 1)
{
if(v[i][0] == v[i][1])
{
tmp[i].push_back(v[i][0] * 2);
GetScore += v[i][0] * 2;
v[i].erase(v[i].begin(), v[i].begin() + 2);
}//比较是否可以合并,如果可以合并到新容器中并删除已合并的两个数
else
{
tmp[i].push_back(v[i][0]);
v[i].erase(v[i].begin(), v[i].begin() + 1);
}//如果不可以合并把第一个放入容器中,删掉第一个数
}
if(v[i].size())
tmp[i].push_back(v[i][0]);//如果有剩余的数也放进去
int j = 0;
for(; j < tmp[i].size(); j++)
ans[i][j] = tmp[i][j];//存进数组
for(; j < 4; j++)
ans[i][j] = 0;//补零
}
int flag = 0;
for(int i = 0; i < 4; i++)
{
for(int j = 0; j < 4; j++)
if(ans[i][j] != a[i][j])
flag = 1;//检查是否和原数组相同,如果相同说明不可以移动
}
return node(ans, GetScore, flag);
}
node up()
{
int a[4][4];
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
a[i][j] = Map[j][3 - i];
}
node res = change(a);
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
a[i][j] = res.ChangeMap[3 - j][i];
}
return node(a, res.GetScore, res.flag);
}
node down()
{
int a[4][4];
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
a[i][j] = Map[3 - j][i];
}
node res = change(a);
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
a[i][j] = res.ChangeMap[j][3 - i];
}
return node(a, res.GetScore, res.flag);
}
node left()
{
return change(Map);
}
node right()
{
int a[4][4];
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
a[i][j] = Map[i][3 - j];
}
node res = change(a);
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
a[i][j] = res.ChangeMap[i][3 - j];
return node(a, res.GetScore, res.flag);
}
int judge()
{
for(int i = 0; i < 4; i++)
for(int j = 0; j < 4; j++)
{
if(Map[i][j] == WinFlag)
return 2;
}
int flag = 0;
flag = max(flag, up().flag);
flag = max(flag, down().flag);
flag = max(flag, left().flag);
flag = max(flag, right().flag);
return flag;
}

只是一只大作业……嗯哼  

github不知道为啥安不上了……先把代码存一下……万一又异常了咋整【擦泪

gdi写的2048的更多相关文章

  1. 280行代码:Javascript 写的2048游戏

    2048 原作者就是用Js写的,一直想尝试,但久久未动手. 昨天教学生学习JS代码.最好还是就做个有趣的游戏好了.2048这么火,是一个不错的选择. 思路: 1. 数组 ,2维数组4x4 2. 移动算 ...

  2. C语言写的2048小游戏

    基于"基于C_语言的2048算法设计_颜冠鹏.pdf" 这一篇文献提供的思路 在中国知网上能找到 就不贴具体内容了 [摘 要] 针对2048的游戏规则,分析了该游戏的算法特点,对其 ...

  3. 纯JS写的2048游戏,分享之

    这几天玩儿着2048这个游戏,突然心血来潮想练习下敲代码的思路.于是乎就模仿做了一个,到眼下位置还没有实现动态移动,不是非常好看,只是玩儿着自己模仿的小游戏还是蛮爽的,哈哈 假设没有玩儿过这个游戏,最 ...

  4. 学习js与css 写个2048

    学习阶段,还是写点小东西练练手学的有意思一点,今天用栅格布局做了一个2048,但是移动动画和合并特效没有做,只简单的实现了一下功能. 记录一下学习的过程. 1.入口函数,初始化界面,我这里是直接是一个 ...

  5. 一起来写2048&lpar;160行python代码&rpar;

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家,而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  6. 一起写2048&lpar;160行python代码&rpar;

    前言: Life is short ,you need python. --Bruce Eckel 我与2048的缘,不是缘于一个玩家.而是一次,一次,重新的ACM比赛.四月份校赛初赛,第一次碰到20 ...

  7. 使用 &period;NET WinForm 开发所见即所得的 IDE 开发环境,实现不写代码直接生成应用程序

    直接切入正题,这是我09年到11年左右业余时间编写的项目,最初的想法很简单,做一个能拖拖拽拽就直接生成应用程序的工具,不用写代码,把能想到的业务操作全部封装起来,通过配置的方式把这些业务操作组织起来运 ...

  8. 用javascript实现一个2048游戏

    早就想自己写一个2048游戏了,昨晚闲着没事,终于写了一个 如下图,按方向键开始玩吧. 如果觉得操作不方便,请直接打开链接玩吧: http://gujianbo.1kapp.com/2048/2048 ...

  9. JavaScript写一个拼图游戏

    拼图游戏的代码400行, 有点多了, 在线DEMO的地址是:打开: 因为使用canvas,所以某些浏览器是不支持的: you know: 为什么要用canvas(⊙o⊙)?  因为图片是一整张jpg或 ...

随机推荐

  1. 项目修改有感&lowbar;主要是以js、Gridview为主

    1.弹出提示:confirm--弹出的窗口有确认.取消按钮 alert--弹出的窗口只有确认按钮 例:若需要在点击确认后执行其他操作(confirm) var toAlert = confirm(&q ...

  2. Runtime 交换方法

    创建UIImage分类UIImage+Image.h #import<UIKit/UIKit.h> @interfaceUIImage (Image) + (__kindof UIImag ...

  3. Linux中的安装神器--yum源安装

    linux配置yum源 一.修改yum的配置文件     /etc/yum.repos.d/xxx.repo          1.进入yum配置文件目录        # cd /etc/yum.r ...

  4. SKCropNode类

    继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode) NSCopying(SKNode) NSObject(NSObject) 框架 /System/ ...

  5. Spring中ref local与ref bean区别

    今天在做SSH框架Demo实例时,在ApplicationResources.properties文件时对<ref bean>与<ref local>感到不解,经查找资料才弄明 ...

  6. 算法练习LeetCode初级算法之设计问题

    打乱数组 不断的让第一个与后面随机选择的数交换 class Solution { private int[] nums; private int[] initnums; public Solution ...

  7. node&lpar;基础&rpar;&lowbar;node&period;js中的http服务以及模板引擎的渲染

    一.前言 本节的内容主要涉及: 1.node.js中http服务 2.node.js中fs服务 3.node.js中模板引擎的渲染 4.利用上面几点模拟apache服务器 二.知识 1.node.js ...

  8. python学习笔记(五)- 文件操作

    1.读文件f = open('word.txt',encoding='utf8')  #默认打开当前目录下的文件,打开其它目录用绝对路径#f = open('word.txt',encoding='u ...

  9. &lbrack;Python设计模式&rsqb; 第10章 怎么出试卷&quest;——模版方法模式

    github地址:https://github.com/cheesezh/python_design_patterns 题目 小时候数学老师的随堂测验,都是老师在黑板上写题目,学生在下边抄,然后再做题 ...

  10. TSL协议升级导致的问题:caught when processing request&colon; Received fatal alert&colon; protocol&lowbar;version

    近日,公司升级TSL协议,禁用TSL1.0,导致原本好好的https接口,报以下错误: 2019-03-05 15:43:29 [org.apache.commons.httpclient.HttpM ...