简单数字拼板游戏学习

VS2010/MFC/对话框程序

MFC练习

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

  0 1 2

  3 4 5

  6 7 8

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

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


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;
};


#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;
}
}

2. 定义全局变量


struct MyPoint{
int x;
int y;
};
//端点位置
MyPoint point[9] = {0};

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

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

//填充画刷
CBrush *brush[10];

3. 初始化OnInitDialog()中


// 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));
}

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


    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","你赢了!");
}

5. 键盘消息处理

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

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


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

时间: 2024-10-25 15:07:44

简单数字拼板游戏学习的相关文章

简单的猜数字小游戏

/** 简单的猜数字小游戏 要求如下: 用户输入想猜测数字的范围,输入1000则是0~1000之内的数字,程序就会内置一个 1 到 1000 之间的数字作为猜测的结果,由用户猜测此数字,用户每猜测一次,由系统提示猜测结果:大了.小了或者猜对了:直到用户猜对结果,则提示游戏结束.用户可以提前退出游戏,即,游戏过程中,如果用户录入数字0则游戏终止.加入新功能: 记次猜测次数功能,提示游戏开始时间,计猜测总用时功能,提示游戏结束时间 思路:1.用户输入电脑生成的数值取值范围,接收并判断是否是合理数值?

Java 初学 第一弹--编译并运行书上的简单程序(猜数字小游戏)

(博主原创) 首先说明一下,博主是大一上学期结束寒假时自己看的Java,然后我看的是Head First Java的中文版,因为大一学了c,所以里面的一些基本思想还是了解的,在看这本书时就浏览了一下(就是那种光看没有自己动手去敲代码的),然后看到书上的一个猜数字小游戏,就想手动敲一下,熟悉熟悉Java的语法,但是真正去做时,发现比看起来要困难一些. 首先是Java在建立一个源码文件之前要先建一个package,然后我用的Eclipse写的Java(感觉和pycharm风格差不多),再新建一个文件

我的游戏学习日志9——数字游戏策划(4)数字游戏的特征

我的游戏学习日志9——数字游戏策划(4)数字游戏的特征 1.数字游戏的特征 基于<游戏策划概论>现将数字游戏的特征分为数据化.智能化.拟真化.黑箱性.网络化和窄带性等(有别于传统游戏的特点). ①数据化:数据化是数字技术的基础属性和特征.数据化的成功,使得数字游戏可以将大量来自外界的数据进行存储.处理和调用,所以数字游戏才能完全脱离传统游戏的束缚,完成不一样的体感.(eg·<上古卷轴>中美轮美奂的魔法与巨龙的世界,一草一木尽显真实,<帝国时代2>中18个民族的衰败与兴盛

「Linux学习」之for循环if判断猜数字小游戏

vim /root/ip.sh #! /bin/bash read -p '请输入您要测试的ip: ' ip ping -c 2 $ip &> /dev/null if [ $? -eq 0 ];then echo 可以通信 else echo 不可以通信 创建猜数字小游戏 vim /root/num.sh #! /bin/bash num1=$[$RANDOM%10] read -p ' 请您输入一个0~9之间的数字 :' if [ $num1 -eq $num2 ];then echo

数字语音信号处理学习笔记——语音信号的同态处理(2)

5.4 复倒谱和倒谱 定义       设信号x(n)的z变换为X(z) = z[x(n)],其对数为: (1) 那么的逆z变换可写成: (2) 取(1)式则有 (3) 于是式子(2)则可以写成       (4) 则式子(4)即为信号x(n)的复倒谱的定义.因为一般为复数,故称为复倒谱.如果对的绝对值取对数,得 (5) 则为实数,由此求出的倒频谱c(n)为实倒谱,简称为倒谱,即 (6) 在(3)式中,实部是可以取唯一值的,但对于虚部,会引起唯一性问题,因此要求相角为w的连续奇函数. 性质: 为

[游戏学习27] MFC 匀速运动

>_<:理解上一个时间函数的概念和用法,本节的实现也比较简单 >_<:就是简单的绘图+时间函数 >_<:TicTac.h 1 #define EX 1 //该点左鼠标 2 #define OH 2 //该点右鼠标 3 4 class CMyApp : public CWinApp 5 { 6 public: 7 virtual BOOL InitInstance (); 8 }; 9 10 class CMainWindow : public CFrameWnd //不

[游戏学习28] MFC 时钟

>_<:这是一个时钟小程序 >_<:通过调用获得系统时间然后经过计算得出当前时间,然后再以3个圆环表示时分秒. >_<:TAO_CLOCK.h 1 class CMyApp : public CWinApp 2 { 3 public: 4 virtual BOOL InitInstance (); 5 }; 6 7 class CMainWindow : public CFrameWnd 8 { 9 protected: 10 11 12 int m_nPrevSeco

数字语音信号处理学习笔记——语音信号的短时时域分析(1)

3.1 概述 语音信号是一种非平稳的时变信号,它携带着各种信息.在语音编码.语音合成.语音识别和语音增强等语音处理中都需要提取语音中包含的各种信息.一般而言语音处理的目的有两种:一种是对语音信号进行分析,提取特征参数,用于后续处理:另一种是加工语音信号,例如在语音增强中对含噪语音进行背景噪声抑制,以获得相对"干净"的语音:在语音合成方中需要对分段语音进行拼接平滑,获得主观音质较高的合成语音,这方面的应用同样是建立在分析并提取语音信号信息的基础上的.总之,语音信号分析的目的就在于方便有效

[游戏学习23] MFC 画尺子

>_<:这是个简单的MFC程序,有利于了解MFC的框架结构 >_<:Ruler.h 1 #include<afxwin.h> 2 class CMyApp:public CWinApp 3 { 4 public: 5 virtual BOOL InitInstance(); 6 }; 7 class CMainWindow:public CFrameWnd 8 { 9 public: 10 CMainWindow(); 11 protected: 12 afx_msg