码迷,mamicode.com
首页 > 其他好文 > 详细

简单数字拼板游戏学习

时间:2014-05-04 19:04:34      阅读:332      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   java   ext   

 

 

VS2010/MFC/对话框程序

MFC练习

bubuko.com,布布扣

 

1.新建一个矩形类。 MoveDown(),MoveUp(),MoveLeft(),MoveRight()是移动的动作。int position是表示该矩形当前的实际位置,按如下布局:

  0 1 2

  3 4 5

  6 7 8

。MoveXXX()函数一是要判断是否可以响应,而是响应后要修改position的值与当前位置匹配。

如MoveUp()函数中,如果该矩形position为0,1,2,则应该不动(此判断也可省,在键盘响应处理中会根据空格所在位置指定唯一的矩形移动)。

bubuko.com,布布扣
class MyRect
{
public:
    MyRect();
    ~MyRect();
//返回CRect对象 CRect getRect();
//初始化矩形
void setRect(int x1, int y1, int x2, int y2); void MoveDown(); void MoveUp(); void MoveLeft(); void MoveRight(); public: int position; private: int x1; int y1; int x2; int y2; };
bubuko.com,布布扣
bubuko.com,布布扣
#include "stdafx.h"
#include "MyRect.h"

MyRect::MyRect()
{
    x1 = y1= x2= y2 = position = 0;
}

MyRect::~MyRect()
{

}

CRect MyRect::getRect()
{
    CRect *rect = new CRect(x1, y1, x2, y2);
    return *rect;
}

void MyRect::setRect(int x1,int y1, int x2, int y2)
{
    this->x1 = x1;
    this->y1 = y1;
    this->x2 = x2;
    this->y2 = y2;
}

void MyRect::MoveUp()
{
    if (position == 0 || position == 1 || position ==2)
    {
        return;
    }
    else
    {
        y1 -= 100;
        y2 -= 100;
        position -= 3;
    }
}

void MyRect::MoveDown()
{
    if (position == 6 || position == 7 || position == 8)
    {
        return;
    }
    else
    {
        y1 += 100;
        y2 += 100;
        position += 3;
    }
}

void MyRect::MoveLeft()
{
    if (position == 0 || position == 3 || position == 6)
    {
        return;
    }
    else
    {
        x1 -= 100;
        x2 -= 100;
        position -= 1;
    }
}

void MyRect::MoveRight()
{
    if (position == 2 || position == 5 || position == 8)
    {
        return;
    }
    else
    {
        x1 += 100;
        x2 += 100;
        position += 1;
    }
}
bubuko.com,布布扣

 2. 定义全局变量

bubuko.com,布布扣
struct MyPoint{
    int x;
    int y;
};
//端点位置
MyPoint point[9] = {0};

//空格位置
static int BlankPos = 8;

//矩形数组
MyRect *myrect[10];

//填充画刷
CBrush *brush[10];
bubuko.com,布布扣

3. 初始化OnInitDialog()中

bubuko.com,布布扣
// TODO: 在此添加额外的初始化代码
    //设置窗口大小,设置窗口居中
    ::SetWindowPos(this->m_hWnd,HWND_BOTTOM, 0, 0, 315, 338,SWP_NOZORDER);
    CenterWindow();

    //初始化每个矩形的左上角点的坐标
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j <3; j++)
        {
            point[3*i+j].x = j * 100;
            point[3*i+j].y = i * 100;
        }
    }
    //初始化矩形和填充画刷
    for (int i = 0; i < 8; i++)
    {
        myrect[i] = new MyRect();
        myrect[i]->setRect(point[i].x, point[i].y, point[i].x+100, point[i].y+100);
        myrect[i]->position = i;
        brush[i] = new CBrush(RGB(rand()%255, rand()%255, rand()%255));
    }
bubuko.com,布布扣

4. OnPaint()// TODO: 在此添加额外的初始化代码    //创建自定义字体

bubuko.com,布布扣
    CFont font;
    font.CreateFont(20,20,0,0,FW_THIN,true,false,false,
        CHINESEBIG5_CHARSET,OUT_CHARACTER_PRECIS,
        CLIP_CHARACTER_PRECIS,DEFAULT_QUALITY,
        FF_MODERN,"宋体");

    //客户区设备环境
    CClientDC dc(this);
    //新建画笔
    CPen pen;
    pen.CreatePen(PS_SOLID, 1, RGB(255, 0, 0));
    //选中字体
    dc.SelectObject(pen);
    
    for (int i = 0; i < 8; i++)
    {
        //画矩形
        dc.Rectangle(myrect[i]->getRect());
        //填充矩形
        dc.FillRect(myrect[i]->getRect(), brush[i]);
        char num[10] = {0};
        itoa(i+1, num, 10);
        //设置文字背景透明
        dc.SetBkMode(TRANSPARENT);
        //选中字体
        dc.SelectObject(font);
        //写数字
        dc.DrawText(num, -1, &myrect[i]->getRect(), DT_VCENTER|DT_CENTER|DT_SINGLELINE);
    }
    
    //判断胜利
    bool win = true;
for (int i = 0 ; i < 8; i++) { if (myrect[i]->position != i) win = false; } if (win) { CString string; string.Format("%s","你赢了!"); }
bubuko.com,布布扣

 

5. 键盘消息处理

    添加KeyUp响应。根据空格所在位置BlankPos来对相应的矩形做处理。

    对话框程序的KeyDown响应方向键无响应,需要做特殊处理。

bubuko.com,布布扣
void CRect9x9Dlg::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    switch(nChar)
    {
    case VK_LEFT:
        if (BlankPos == 2 || BlankPos == 5 || BlankPos == 8)
        {
            break;
        }
        else
        {
            for (int i = 0 ; i < 8; i++)
                if (myrect[i]->position == BlankPos+1)
                {
                    myrect[i]->MoveLeft();
                }
                BlankPos += 1;
        }
        break;
    case VK_UP:
        if (BlankPos == 6 || BlankPos == 7 || BlankPos == 8)
        {
            break;
        }
        else
        {
            for (int i = 0 ; i < 8; i++)
                if (myrect[i]->position == BlankPos + 3)
                {
                    myrect[i]->MoveUp();
                }
                BlankPos += 3;
        }
        break;
    case VK_RIGHT:
        if (BlankPos == 0 || BlankPos == 3 || BlankPos == 6)
        {
            break;
        }
        else
        {
            for (int i = 0 ; i < 8; i++)
                if (myrect[i]->position == BlankPos-1)
                {
                    myrect[i]->MoveRight();
                }
                BlankPos -= 1;
        }
        break;
    case VK_DOWN:
        if (BlankPos == 0 || BlankPos == 1 || BlankPos == 2)
        {
            break;
        }
        else
        {
            for (int i = 0 ; i < 8; i++)
                if (myrect[i]->position == BlankPos - 3)
                {
                    myrect[i]->MoveDown();
                }
                BlankPos -= 3;
        }
        break;
    default:
        break;
    }
    Invalidate(TRUE);

    CDialogEx::OnKeyUp(nChar, nRepCnt, nFlags);
}
bubuko.com,布布扣

 

简单数字拼板游戏学习,布布扣,bubuko.com

简单数字拼板游戏学习

标签:style   blog   class   code   java   ext   

原文地址:http://www.cnblogs.com/fwst/p/3706483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!