找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 3353|回复: 1

MFC写的2048

[复制链接]
发表于 2014-5-22 18:22:23 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
2048.exe (212 KB, 下载次数: 19)
看到0xAA55的Dos版2048,突发奇想搞了个MFC的2048,基本上是模拟了原游戏吧,还是很容易的,只有不到500行代码。。。
这也是我的习惯,我用的代码量还是很少的
  1. // 2048Dlg.cpp : implementation file
  2. //

  3. #include "stdafx.h"
  4. #include "2048.h"
  5. #include "2048Dlg.h"
  6. #include <stdlib.h>
  7. #include <time.h>
  8. #include <vector>
  9. using namespace std;

  10. #ifdef _DEBUG
  11. #define new DEBUG_NEW
  12. #undef THIS_FILE
  13. static char THIS_FILE[] = __FILE__;
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////////
  16. // CMy2048Dlg dialog

  17. CMy2048Dlg::CMy2048Dlg(CWnd* pParent /*=NULL*/)
  18.     : CDialog(CMy2048Dlg::IDD, pParent)
  19. {
  20.     //{{AFX_DATA_INIT(CMy2048Dlg)
  21.         // NOTE: the ClassWizard will add member initialization here
  22.     //}}AFX_DATA_INIT
  23.     // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  24.     m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  25. }

  26. void CMy2048Dlg::DoDataExchange(CDataExchange* pDX)
  27. {
  28.     CDialog::DoDataExchange(pDX);
  29.     //{{AFX_DATA_MAP(CMy2048Dlg)
  30.         // NOTE: the ClassWizard will add DDX and DDV calls here
  31.     //}}AFX_DATA_MAP
  32. }

  33. BEGIN_MESSAGE_MAP(CMy2048Dlg, CDialog)
  34.     //{{AFX_MSG_MAP(CMy2048Dlg)
  35.     ON_WM_SYSCOMMAND()
  36.     ON_WM_PAINT()
  37.     ON_WM_QUERYDRAGICON()
  38.     ON_WM_KEYUP()
  39.     //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()

  41. /////////////////////////////////////////////////////////////////////////////
  42. // CMy2048Dlg message handlers

  43. BOOL CMy2048Dlg::OnInitDialog()
  44. {
  45.     CDialog::OnInitDialog();

  46.     // Set the icon for this dialog.  The framework does this automatically
  47.     //  when the application's main window is not a dialog
  48.     SetIcon(m_hIcon, TRUE);                        // Set big icon
  49.     SetIcon(m_hIcon, FALSE);                // Set small icon
  50.    
  51.     // TODO: Add extra initialization here
  52.     srand(time(NULL));
  53.     InitGame();

  54.     return TRUE;  // return TRUE  unless you set the focus to a control
  55. }

  56. // If you add a minimize button to your dialog, you will need the code below
  57. //  to draw the icon.  For MFC applications using the document/view model,
  58. //  this is automatically done for you by the framework.

  59. #define RRGB(x,y,z) (RGB(0xFF-x,0xFF-y,0xFF-z))

  60. COLORREF getColor(int val)
  61. {
  62.     switch(val)
  63.     {
  64.         case 0x0:
  65.             return RRGB(0x00,0x00,0x00);
  66.         case 0x2:
  67.             return RRGB(0x00,0x00,0x50);
  68.         case 0x4:
  69.             return RRGB(0x00,0x00,0xA0);
  70.         case 0x8:
  71.             return RRGB(0x00,0x00,0xF0);
  72.         case 0x10:
  73.             return RRGB(0x00,0x50,0x00);
  74.         case 0x20:
  75.             return RRGB(0x00,0x50,0x50);
  76.         case 0x40:
  77.             return RRGB(0x00,0x50,0xA0);
  78.         case 0x80:
  79.             return RRGB(0x00,0x50,0xF0);
  80.         case 0x100:
  81.             return RRGB(0x00,0xA0,0x00);
  82.         case 0x200:
  83.             return RRGB(0x00,0xA0,0x50);
  84.         case 0x400:
  85.             return RRGB(0x00,0xA0,0xA0);
  86.         case 0x800:
  87.             return RRGB(0x00,0xA0,0xF0);
  88.         case 0x1000:
  89.             return RRGB(0x00,0xF0,0x00);
  90.         case 0x2000:
  91.             return RRGB(0x00,0xF0,0x50);
  92.         case 0x4000:
  93.             return RRGB(0x00,0xF0,0xA0);
  94.         case 0x8000:
  95.             return RRGB(0x00,0xF0,0xF0);

  96.         default:
  97.             return RRGB(0xFF,0xFF,0xFF);
  98.     }
  99. }

  100. void CMy2048Dlg::OnPaint()
  101. {
  102.     if (IsIconic())
  103.     {
  104.         CPaintDC dc(this); // device context for painting

  105.         SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

  106.         // Center icon in client rectangle
  107.         int cxIcon = GetSystemMetrics(SM_CXICON);
  108.         int cyIcon = GetSystemMetrics(SM_CYICON);
  109.         CRect rect;
  110.         GetClientRect(&rect);
  111.         int x = (rect.Width() - cxIcon + 1) / 2;
  112.         int y = (rect.Height() - cyIcon + 1) / 2;

  113.         // Draw the icon
  114.         dc.DrawIcon(x, y, m_hIcon);
  115.     }
  116.     else
  117.     {
  118.         CPaintDC dc(this);
  119.         RECT rt;
  120.         GetClientRect(&rt);

  121.         int celllen=rt.right/SIZE;
  122.         int cellhei=rt.bottom/SIZE;
  123.         for(int i=0;i<SIZE;i++)
  124.         {
  125.             for(int j=0;j<SIZE;j++)
  126.             {
  127.                 CPen pen(PS_SOLID,1,RGB(255,0,0));
  128.                 dc.SelectObject(pen);
  129.                 CBrush brush(getColor(Data[i ][j]));
  130.                 dc.SelectObject(brush);
  131.                 RECT rts={j*celllen,i*cellhei,j*celllen+celllen,i*cellhei+cellhei};
  132.                 dc.Rectangle(&rts);

  133.                 if(Data[i ][j])
  134.                 {
  135.                     char buffer[20];
  136.                     itoa(Data[i ][j],buffer,10);
  137.                     
  138.                     CFont font;
  139.                     font.CreateFont(50,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
  140.                         DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"Arial");
  141.                     dc.SelectObject(font);
  142.                     dc.SetTextColor(RGB(255,0,0));
  143.                     dc.DrawText(buffer,&rts,DT_CENTER|DT_VCENTER|DT_SINGLELINE);
  144.                 }
  145.             }
  146.         }
  147.         
  148.     }
  149. }

  150. void CMy2048Dlg::InitGame()
  151. {
  152.     scroll=0;
  153.     int* curData=(int*)Data;
  154.     for(int i=0;i<SIZE*SIZE;i++)
  155.     {
  156.         curData[i ]=0;
  157.     }
  158.     GetLeftCellsToRandomPlace();
  159. }

  160. BOOL CMy2048Dlg::GetLeftCellsToRandomPlace()
  161. {
  162.     int* curData=(int*)Data;
  163.     vector<int> left;
  164.     for(int i=0;i<SIZE*SIZE;i++)
  165.     {
  166.         if(!curData[i ])
  167.             left.push_back(i);
  168.     }
  169.     if(left.size() == 0)
  170.         return FALSE;

  171.     int sel=rand()%left.size();
  172.     if(rand()%4)
  173.         curData[left[sel]]=2;
  174.     else
  175.         curData[left[sel]]=4;

  176.     RECT rt;
  177.     GetClientRect(&rt);
  178.     Invalidate(FALSE);

  179.     return TRUE;
  180. }

  181. BOOL CMy2048Dlg::Judge()
  182. {
  183.     int i,j;
  184.     for(i=0;i<SIZE;i++)
  185.     {
  186.         for(j=0;j<SIZE;j++)
  187.         {
  188.             if(Data[i ][j] == 0)
  189.                 return TRUE;
  190.             if(i+1<SIZE && Data[i ][j] == Data[i+1][j])
  191.                 return TRUE;
  192.             if(j+1<SIZE && Data[i ][j] == Data[i ][j+1])
  193.                 return TRUE;
  194.         }
  195.     }
  196.     for(i=0;i<SIZE;i++)
  197.     {
  198.         for(j=0;j<SIZE;j++)
  199.         {
  200.             if(Data[i ][j] == 0)
  201.                 return TRUE;
  202.         }
  203.     }
  204.     return FALSE;
  205. }

  206. BOOL CMy2048Dlg::Combine(UINT direction)
  207. {
  208.     BOOL moved=FALSE;
  209.     switch(direction)
  210.     {
  211.         case VK_LEFT:
  212.             {
  213.                 for(int l=0;l<SIZE;l++)
  214.                 {
  215.                     //两两向左合并
  216.                     int first=0,second;
  217.                     boolean over=false;
  218.                     while(first<SIZE && !over)
  219.                     {
  220.                         while(first<SIZE-1 && Data[l][first] == 0)
  221.                             first++;
  222.                         
  223.                         if(first>=SIZE-1)
  224.                         {
  225.                             over=true;
  226.                             break;
  227.                         }

  228.                         second=first+1;
  229.                         while(second<SIZE && Data[l][second] == 0)
  230.                             second++;

  231.                         if(second>=SIZE)
  232.                         {
  233.                             over=true;
  234.                             break;
  235.                         }

  236.                         if(Data[l][first] == Data[l][second])
  237.                         {
  238.                             Data[l][first] += Data[l][second];
  239.                             Data[l][second]=0;
  240.                             moved=TRUE;
  241.                             first=second+1;
  242.                         }
  243.                         else
  244.                         {
  245.                             first=second;
  246.                         }
  247.                     }
  248.                     
  249.                     //全部向左聚集
  250.                     first=0;
  251.                     while(Data[l][first])
  252.                         first++;//找到第一个空白处
  253.                     if(first<SIZE)
  254.                     {
  255.                         second=first+1;
  256.                         while(second<SIZE)
  257.                         {//找到下一个有值处        
  258.                             while(second<SIZE && Data[l][second] == 0)
  259.                             {
  260.                                 second++;
  261.                             }
  262.                             if(second<SIZE)
  263.                             {
  264.                                 Data[l][first]=Data[l][second];
  265.                                 Data[l][second]=0;
  266.                                 first++;
  267.                                 second++;
  268.                                 moved=TRUE;
  269.                             }
  270.                         }
  271.                     }
  272.                 }
  273.             }
  274.             break;

  275.         case VK_RIGHT:
  276.             {
  277.                 for(int l=0;l<SIZE;l++)
  278.                 {
  279.                     //两两向右合并
  280.                     int first=0,second;
  281.                     boolean over=false;
  282.                     while(first<SIZE && !over)
  283.                     {
  284.                         while(first<SIZE-1 && Data[l][SIZE-1-first] == 0)
  285.                             first++;
  286.                         
  287.                         if(first>=SIZE-1)
  288.                         {
  289.                             over=true;
  290.                             break;
  291.                         }
  292.                         
  293.                         second=first+1;
  294.                         while(second<SIZE && Data[l][SIZE-1-second] == 0)
  295.                             second++;
  296.                         
  297.                         if(second>=SIZE)
  298.                         {
  299.                             over=true;
  300.                             break;
  301.                         }
  302.                         
  303.                         if(Data[l][SIZE-1-first] == Data[l][SIZE-1-second])
  304.                         {
  305.                             Data[l][SIZE-1-first] += Data[l][SIZE-1-second];
  306.                             Data[l][SIZE-1-second]=0;
  307.                             moved=TRUE;
  308.                             first=second+1;
  309.                         }
  310.                         else
  311.                         {
  312.                             first=second;
  313.                         }
  314.                     }
  315.                     
  316.                     //全部向右聚集
  317.                     first=0;
  318.                     while(Data[l][SIZE-1-first])
  319.                         first++;//找到第一个空白处
  320.                     if(first<SIZE)
  321.                     {
  322.                         second=first+1;
  323.                         while(second<SIZE)
  324.                         {//找到下一个有值处        
  325.                             while(second<SIZE && Data[l][SIZE-1-second] == 0)
  326.                             {
  327.                                 second++;
  328.                             }
  329.                             if(second<SIZE)
  330.                             {
  331.                                 Data[l][SIZE-1-first]=Data[l][SIZE-1-second];
  332.                                 Data[l][SIZE-1-second]=0;
  333.                                 first++;
  334.                                 second++;
  335.                                 moved=TRUE;
  336.                             }
  337.                         }
  338.                     }
  339.                 }
  340.             }
  341.             break;

  342.         case VK_UP:
  343.             {
  344.                 for(int c=0;c<SIZE;c++)
  345.                 {
  346.                     //两两向上合并
  347.                     int first=0,second;
  348.                     boolean over=false;
  349.                     while(first<SIZE && !over)
  350.                     {
  351.                         while(first<SIZE-1 && Data[first][c] == 0)
  352.                             first++;
  353.                         
  354.                         if(first>=SIZE-1)
  355.                         {
  356.                             over=true;
  357.                             break;
  358.                         }
  359.                         
  360.                         second=first+1;
  361.                         while(second<SIZE && Data[second][c] == 0)
  362.                             second++;
  363.                         
  364.                         if(second>=SIZE)
  365.                         {
  366.                             over=true;
  367.                             break;
  368.                         }
  369.                         
  370.                         if(Data[first][c] == Data[second][c])
  371.                         {
  372.                             Data[first][c] += Data[second][c];
  373.                             Data[second][c]=0;
  374.                             moved=TRUE;
  375.                             first=second+1;
  376.                         }
  377.                         else
  378.                         {
  379.                             first=second;
  380.                         }
  381.                     }
  382.                     
  383.                     //全部向上聚集
  384.                     first=0;
  385.                     while(Data[first][c])
  386.                         first++;//找到第一个空白处
  387.                     if(first<SIZE)
  388.                     {
  389.                         second=first+1;
  390.                         while(second<SIZE)
  391.                         {//找到下一个有值处        
  392.                             while(second<SIZE && Data[second][c] == 0)
  393.                             {
  394.                                 second++;
  395.                             }
  396.                             if(second<SIZE)
  397.                             {
  398.                                 Data[first][c]=Data[second][c];
  399.                                 Data[second][c]=0;
  400.                                 first++;
  401.                                 second++;
  402.                                 moved=TRUE;
  403.                             }
  404.                         }
  405.                     }
  406.                 }
  407.             }
  408.             break;

  409.         case VK_DOWN:
  410.             {
  411.                 for(int c=0;c<SIZE;c++)
  412.                 {
  413.                     //两两向右合并
  414.                     int first=0,second;
  415.                     boolean over=false;
  416.                     while(first<SIZE && !over)
  417.                     {
  418.                         while(first<SIZE-1 && Data[SIZE-1-first][c] == 0)
  419.                             first++;
  420.                         
  421.                         if(first>=SIZE-1)
  422.                         {
  423.                             over=true;
  424.                             break;
  425.                         }
  426.                         
  427.                         second=first+1;
  428.                         while(second<SIZE && Data[SIZE-1-second][c] == 0)
  429.                             second++;
  430.                         
  431.                         if(second>=SIZE)
  432.                         {
  433.                             over=true;
  434.                             break;
  435.                         }
  436.                         
  437.                         if(Data[SIZE-1-first][c] == Data[SIZE-1-second][c])
  438.                         {
  439.                             Data[SIZE-1-first][c] += Data[SIZE-1-second][c];
  440.                             Data[SIZE-1-second][c]=0;
  441.                             moved=TRUE;
  442.                             first=second+1;
  443.                         }
  444.                         else
  445.                         {
  446.                             first=second;
  447.                         }
  448.                     }
  449.                     
  450.                     //全部向右聚集
  451.                     first=0;
  452.                     while(Data[SIZE-1-first][c])
  453.                         first++;//找到第一个空白处
  454.                     if(first<SIZE)
  455.                     {
  456.                         second=first+1;
  457.                         while(second<SIZE)
  458.                         {//找到下一个有值处        
  459.                             while(second<SIZE && Data[SIZE-1-second][c] == 0)
  460.                             {
  461.                                 second++;
  462.                             }
  463.                             if(second<SIZE)
  464.                             {
  465.                                 Data[SIZE-1-first][c]=Data[SIZE-1-second][c];
  466.                                 Data[SIZE-1-second][c]=0;
  467.                                 first++;
  468.                                 second++;
  469.                                 moved=TRUE;
  470.                             }
  471.                         }
  472.                     }
  473.                 }
  474.             }
  475.             break;
  476.     }
  477.     return moved;
  478. }

  479. void CMy2048Dlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
  480. {
  481.     if(nChar >= VK_LEFT && nChar <= VK_DOWN)
  482.     {
  483.         if(Combine(nChar))
  484.         {
  485.             GetLeftCellsToRandomPlace();
  486.             scroll+=100;
  487.             if(!Judge())
  488.             {
  489.                 CString str;
  490.                 if(scroll < 2048)
  491.                     str.Format("失败! 最终得分:%d",scroll);
  492.                 else
  493.                     str.Format("恭喜! 最终得分:%d",scroll);
  494.                 AfxMessageBox(str);
  495.                 InitGame();
  496.             }
  497.         }
  498.     }
  499. }
复制代码
QQ图片20140522182717.jpg
回复

使用道具 举报

发表于 2014-5-23 22:56:54 | 显示全部楼层
6x6的格子意味着你恐怕永远也不会输。
顺带编写一个自动玩2048的程序出来?
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-11-22 17:34 , Processed in 0.037266 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表