俄罗斯方块游戏--MFC

  • 格式:doc
  • 大小:79.50 KB
  • 文档页数:9

俄罗斯方块3.0版本
一、采用的技术方法
(1)编程方法采用的MFC;
(2)运用编程技术:Windows图形编程技术(基本的绘图CDC/HDC, GDI对象(笔、刷子、字体)、图形(线、矩形、圆形);
(2)菜单、工具条设计与使用;
(3)对话框设计与使用;
(4)系统通用对话框的使用;
(6)基本控件(按钮、静态文本框、文本编辑框、下拉框、列表框等);
(7)实现系统数据的可持久化:要求使用数据库或文件或MFC文档串行化技术实现这一点;
二、达到目标
在我的俄罗斯方块2.0版本基础上,完善游戏功能(如背景音乐和游戏音效的播放,游戏结束,排行榜等),完善游戏的运行规则(确定输赢的准则,积分的获得方式等)。

三、主要步骤
1、添加游戏背景音乐,音效资源;
2、添加两个对话框类即排行榜对话框类和打破记录者更改的对话框类;
3、添加响应排行榜对话框IDD_DIALOG_NEWRECORD和IDD_DIALOG_PH;
4、添加结束菜单ID_VIEW_END和排行榜菜单ID_VIEW_PHB;
5、主要代码说明;
mciSendString("play music\\4.mp3 repeat",NULL,0,NULL); //背景音乐是mp3格式循环播放
mciSendString("stop music\\4.mp3",NULL,0,NULL); //停止播放背景音乐
case VK_LEFT: //左移
russia.Move(1);
PlaySound("music\\btn.wav",NULL,SND_FILENAME|SND_ASYNC); //播放左移音效
break;
case VK_RIGHT: //右移
russia.Move(2);
PlaySound("music\\btn.wav",NULL,SND_FILENAME|SND_ASYNC); //播放右移音效
break;
case VK_DOWN: //下移
russia.Move(3);
PlaySound("music\\btn.wav",NULL,SND_FILENAME|SND_ASYNC); //播放下移音效
break;
case VK_UP: //变换
russia.Move(4);
PlaySound("music\\transform.wav",NULL,SND_FILENAME|SND_ASYNC);
//播放变换方块音效
PlaySound("music\\fadelayer.wav",NULL,SND_FILENAME|SND_ASYNC); //消方块时的音效
PlaySound("music\\lost.wav",NULL,SND_FILENAME|SND_ASYNC); //游戏结束时的音效
响应结束菜单函数
void CMBlockView::OnViewEnd()
{
if(AfxMessageBox("是否结束游戏?",MB_OKCANCEL)==IDOK)
{
russia.end = true; //将结束标志设为真
IfGoon = false; //将继续游戏标志为假
mciSendString("close music\\4.mp3",NULL,0,NULL); //关闭背景音乐
KillTimer(1);
//移除定时器1
}
NewRecord(); //是否破纪录函数
}
响应结束菜单流程图
排行榜功能实现函数
//...........显示排行榜对话框................
void CMBlockView::OnViewPhb()
{
LoadConfig(); //装载配置
CPaihang ph; //排行榜对话框
ph.SetBRecord(m_uPrimary); //显示冠军分数
ph.SetBHolder(m_szPrimary); //显示冠军姓名
ph.DoModal(); //为模态对话框
SaveConfig(); //保存ini信息
}
/............载入配置...............
void CMBlockView::LoadConfig()
{ //----------获取本地目录-------------*/
char
exeFullPath[MAX_PATH]; //MAX_PATH在API 中有定义,为128
CString
strPath; //存储执行程序路径
GetModuleFileName(NULL, exeFullPath, MAX_PATH); //应用程序全路径存放地址
strPath = CString(exeFullPath);
strPath = strPath.Left(strPath.ReverseFind('\\'));
//-----------------------------------*/
strPath += "\\config.ini"; //配置文件名
char strPrimary[80];
GetPrivateProfileString("HOLDER","PrimaryHolder", "匿名
",strPrimary,80,strPath); //从私有初始化文件获取冠军姓名字符串
m_szPrimary=strPrimary; //初始话冠军姓

m_uPrimary = GetPrivateProfileInt("SCORE","Primary",
0,strPath); //从私有初始化文件获取整型分数值
}
//............是否打破记录函数...............
void CMBlockView::NewRecord()
{
int uRecord = m_uPrimary;
if (uRecord < russia.m_score)
{
CDlgNewRecord dlg;
dlg.DoModal(); //显示新冠军记录的模态对话框LoadConfig(); //装载配置
CPaihang ph; //排行榜对话框
m_uPrimary = russia.m_score; //将新分数记录
m_szPrimary = dlg.m_szName; //将新的姓名记录
ph.SetBRecord(m_uPrimary); //显示冠军分数
ph.SetBHolder(m_szPrimary); //显示冠军姓名
ph.DoModal();
SaveConfig();}
}
//..............保存配置................
void CMBlockView::SaveConfig()
{ //----------获取本地目录-------------*/
char exeFullPath[MAX_PATH];
CString strPath;
GetModuleFileName(NULL, exeFullPath, MAX_PATH);
strPath = CString(exeFullPath);
strPath = strPath.Left(strPath.ReverseFind('\\'));
//-----------------------------------*/
strPath += "\\config.ini";
//记录保持分数
CString strPrimary;
//记录保持者
CString strPrimaryHolder;
//写配置文件
strPrimary.Format("%u",m_uPrimary);
strPrimaryHolder.Format("%s",m_szPrimary);
WritePrivateProfileString("SCORE","Primary", strPrimary,strPath);
WritePrivateProfileString("HOLDER","PrimaryHolder", strPrimaryHolder,strPath);
}
排行榜流程图
这个版本完成了双缓存
CDC BkDc,BlockDc,MemDc; //背景设备,方块前景设备,内存设备
CBitmap BpMem; //创建内存背景位图
MemDc.CreateCompatibleDC(pDC); //这个设备兼容当前DC
BpMem.CreateCompatibleBitmap(pDC,700,600); //创建一个位图对象,该位图对象的大小,决定了兼容设备上下文的大小
BkDc.CreateCompatibleDC(pDC); //这个设备兼容当前DC。