# 基于MFC的双人版俄罗斯方块游戏
# 1 题目要求
设计一个双人俄罗斯方块游戏。
# 2 功能需求
- 实现双人俄罗斯方块 这是老师要求的最基本功能
- 实现下一个砖块预测功能 这是附加功能,网上的俄罗斯方块小游戏都有这个功能
- 隐藏工具栏、状态栏 这主要是为了美观
- 实现难度可以选择 这是老师的代码已经实现好了的功能
- 添加游戏说明菜单 添加作者菜单 添加网址超链接
- 实现砖块三维化 为了美观
- 实现总分统计功能,和每步消除所得分数显示
- 实现背景音乐播放功能
- 暂停功能
- 增加了新的方块类
- 设置窗口大小,禁用最大化按钮,禁止鼠标拖动改变窗口大小
# 3 总体设计
- **矩形框类的设计**:设计CBin类描述Tetris游戏的矩形框,用image的二维数组来描述这个矩形框。设置不同的值显示不同颜色的矩形,若没有砖块则为0。
- **砖块的设计**:设计CBrick抽象类来设计砖块,应用多态性的原理,其他不同类型的砖块类继承CBrick,来设计不同的砖块
- **砖块在面板中的显示设计**:在视图类中设计并显示砖块
## 3.1 系统模块
绘制系统功能模块图。
## 3.2 系统业务处理流程
![](http://www.writebug.com/myres/static/uploads/2021/10/19/954ddafa76a3ea43b332b971eee59064.writebug)
# 4 详细设计
**CBin类**
| 函数名称 | 函数说明 |
| ---------------------------------------- | ---------------------------------------- |
| CBin(unsigned int w, unsigned int h) | 构造函数,用来初始化数据成员 width 和 height ,并为image 分配空间并初始化。 |
| ~CBin() | 析构函数,删除在构造函数中为 image分配的空间。 |
| void getImage(unsigned char** destImage) | 将image 的数据拷贝到 destImage. 你可以假设destImage 指向的空间足够容纳image |
| void setImage(unsigned char** srcImage) | 把srcImage 中的数据拷贝到image. 你可以假设srcImage 是一个合法的指针 |
| unsigned int removeFullLines() | 检查image ,如果任何一行完全填 满,则删除这一行,并让上面行的 数据下移一行,返回删除的总行数。 |
**CBrick类**
设计CBrick抽象类来设计砖块。
CBrick类的成员函数:
```c++
virtual int shiftLeft(CBin* bin)=0; //将砖块在游戏的矩形框内左移一位
virtual int shiftRight(CBin* bin)=0; //将砖块在游戏的矩形框内右移一位
virtual int shiftDown(CBin* bin)=0; //将砖块在游戏的矩形框内下移
virtual int rotateClockwise(CBin* bin)=0; //将砖块在游戏的矩形框内顺时针旋转
virtual int checkCollision(CBin* bin)=0; //检查砖块是否冲突
virtual void operator>>(unsigned char** binImage)=0; //重载运算符>>,通过设置映射到游戏矩形的二维数组binImage,设置砖块的颜色,这里假设binimage是一个合适的二维数组
virtual void putAtTop(int newOrient, int newPosX)=0; //置顶
```
应用多态性的原理,其他不同类型的砖块类继承CBrick,来设计不同的砖块。
老师的代码只给出了三种不同的砖块,而我进行了完善,共设计了七种不同类型的砖块。
可视化设计:
在视图类中设计并显示砖块。
定义相关的变量并在构造函数中初始化。
部分代码如下:
```c++
public:
CNewTetrisDoc* GetDocument();
COLORREF GetLightColor(COLORREF m_crBody);
COLORREF GetDarkColor(COLORREF m_crBody);
//////////////// 面板 1 ///////////////
CBin*bin; //定义游戏矩形框指针
CBrick*activeBrick; //定义指向当前下落砖块的指针
int gameOver; //判断游戏是否结束
int brickInFlight; //判断砖块是否处于下落状态
int brickType; //砖块类别
unsigned int initOrientation; //初始状态
int notCollide; //冲突否
unsigned int numLines; //消的行数
unsigned char**outputImage;
int difficulty; //定义难度
void DrawImage(CBin *bin,CBin *bin2,unsigned char** image,unsigned char** image2,unsigned char **imageY1, unsigned char **imageY2,CDC *pDC);
```
添加DrawImage(CBin *bin,CBin *bin2,unsigned char** image,unsigned char** image2,unsigned char **imageY1,unsigned char **imageY2,CDC *pDC)函数,用来绘制游戏砖块。
部分代码如下:
```c++
unsigned int width,i,j; unsigned int height; width=bin->getWidth(); height=bin->getHeight();
int nSize = 20; //砖块大小
CRect rect;
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP3); //加载位图
CBrush brush;
brush.CreatePatternBrush(&bitmap);
GetClientRect(&rect);
pDC->FillRect(rect,&brush);
/* pDC->FillSolidRect(rect,RGB(255,255,255)); //绘制背景色*/
/* pDC->Rectangle(100,0,300,400); */
char buf[100];
sprintf(buf,"玩家一:分数:%d",numLines*10);
pDC->TextOut(300,20,buf);
/* pDC->Rectangle(450,0,650,400); */
char buf2[100];
sprintf(buf2,"玩家二:分数:%d",numLines2*10);
pDC->TextOut(850,20,buf2);
CRect rc,rc2;
CRect rcY1;
CRect rcY2; //定义矩形区
COLORREF BrickColor[8]={0xFFFFFF,0xFF0000,0x00FF00,0x0000FF, 0x00FFFF,0xFFFF00,0x800000,0x800080};
/////////游戏界面显示
for (i=0; i<height; i++) //一行一行的画砖块
{
for(j=0;j<width;j++)
{
rc=CRect(j*nSize+100,i*nSize+100,(j+1)*nSize+100,(i+1)*nSize+100);
rc2=CRect(j*nSize+750,i*nSize+100,(j+1)*nSize+750,(i+1)*nSize+100);
//绘制面板1
if (image[i][j]!=0)
{
pDC->FillRect(rc, &CBrush(BrickColor[image[i][j]])); //画临时砖块(运动中)
pDC->Draw3dRect(rc,GetLightColor(BrickColor[image[i][j]]),GetDarkColor(BrickColor[image[i][j]]));
}
```
在菜单中添加:
- ID_Game_Start 开始(&S)
难度(&D)属性选择pop-up,子菜单为:
- ID_DIFF_EASY 容易
- ID_DIFF_MID中等
- ID_DIFF_SUP高级
暂停(&P)属性选择pop-up,子菜单为:
- IDD_Pause 暂停
- IDD_Restart 开始
为其分别添加消息响应函数:
```c++
void CNewTetrisView::OnGameStart()
{
// TODO: Add your command handler code here
gameOver=0; brickInFlight=0; numLines=0;
for (unsigned int i = 0; i<20; i++)
{
for (unsigned int j = 0; j<10; j++)
{
outputImage[i][j]=0;
}
}
bin->setImage(outputImage);
SetTimer(0,difficulty,NULL); //设置定时器
}
void CNewTetrisView::OnDiffEasy()
{
// TODO: Add your command handler code here
difficulty=500;
OnGameStart();
}
void CNewTetrisView::OnDiffMid()
{
// TODO: Add your command handler code here
difficulty=350;
OnGameStart();
}
void CNewTetrisView::OnDiffSup()
{
// TODO: Add your command handler code here
difficulty=150;
OnGameStart();
}
```
暂停功能的实现:
按下暂停键的时候停止定时器,按下重新开始键开启定时器就行了。
```c++
void CNewTetrisView::OnPause()
{
// TODO: Add your command handler code here
KillTimer(0);
}
void CNewTetrisView::OnRestart()
{
// TODO: Add your command handler code here
SetTimer(0,difficulty,NULL);
}
```
为视图类添加WM_TIMER的消息响应函数。初始化面板,并设置定时器。(这里省略代码,最终版代码在下面)
在OnDraw()函数中调用DrawImage函数,显示面板。(这里省略代码,最终版代码在下面)
添加WM_KEYDOWON的消息响应函数,以响应用户按键。
```c++
void CNewTetrisView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
//控制面板1
if (nChar == VK_RIGHT) activeBrick->shiftRight(bin);
else if (nChar == VK_LEFT) activeBrick->shiftLeft(bin);
else if (nChar == VK_UP) activeBrick->rotateClockwise(bin);
else if (nChar == VK_DOWN) activeBrick->shiftDown(bin);
Invalidate();
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
```
这样一个基本的单人版�
没有合适的资源?快使用搜索试试~ 我知道了~
精选_基于MFC的双人版俄罗斯方块游戏_源码打包
共75个文件
h:9个
sbr:8个
obj:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 94 浏览量
2022-03-09
09:34:31
上传
评论
收藏 45.97MB ZIP 举报
温馨提示
基于MFC的双人版俄罗斯方块游戏
资源推荐
资源详情
资源评论
收起资源包目录
5929575971592856.zip (75个子文件)
tetris-game
src
NewTetrisv2.0.7z 3.08MB
实验报告.doc 606KB
NewTetris
NewTetris.rc 12KB
NewTetris.VC.db 60.05MB
NewTetris.plg 236B
resource.h 1KB
NewTetris.ncb 177KB
NewTetris.dsw 512B
MainFrm.cpp 3KB
bin.h 620B
NewTetris.vcxproj.filters 4KB
res
Thumbs.db 16KB
WINMM.LIB 43KB
NewTetris.ico 1KB
1757.wav 2.44MB
agan_qishi-007.bmp 370KB
NewTetris.rc2 388B
Toolbar.bmp 1KB
Tetris.ico 13KB
cursor1.cur 326B
NewTetrisDoc.ico 1KB
游戏图片.bmp 2MB
bg.bmp 1.19MB
.vs
NewTetris
v14
.suo 14KB
NewTetris.h 1KB
NewTetrisView.h 4KB
NewTetrisView.cpp 18KB
NewTetris.dsp 5KB
brick.cpp 27KB
NewTetris.opt 51KB
MainFrm.h 1KB
HelpDialog.h 1KB
NewTetrisDoc.h 1KB
HelpDialog.cpp 3KB
ReadMe.txt 4KB
NewTetrisDoc.cpp 2KB
bin.cpp 2KB
NewTetris.cpp 4KB
StdAfx.cpp 203B
brick.h 4KB
NewTetris.vcxproj 8KB
NewTetris.clw 2KB
NewTetris.sln 923B
NewTetris.aps 6.03MB
Debug
NewTetris.bsc 3.14MB
NewTetris.res 6.02MB
NewTetris.obj 22KB
NewTetris.ilk 2.46MB
NewTetrisDoc.obj 14KB
NewTetrisView.obj 74KB
NewTetrisDoc.sbr 0B
vc60.pdb 372KB
brick.sbr 0B
brick.obj 56KB
HelpDialog.sbr 0B
StdAfx.obj 103KB
NewTetris.tlog
unsuccessfulbuild 0B
CL.command.1.tlog 858B
NewTetris.lastbuildstate 238B
CL.read.1.tlog 308B
NewTetrisView.sbr 0B
NewTetris.exe 9.38MB
NewTetris.sbr 0B
StdAfx.sbr 1.29MB
bin.sbr 0B
HelpDialog.obj 12KB
MainFrm.sbr 0B
bin.obj 6KB
NewTetris.log 78B
MainFrm.obj 19KB
vc60.idb 209KB
NewTetris.pdb 4.02MB
StdAfx.h 1KB
LICENSE 1KB
README.md 16KB
共 75 条
- 1
资源评论
工具盒子
- 粉丝: 58
- 资源: 1313
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功