c++实现拼图游戏.docx
《c++实现拼图游戏.docx》由会员分享,可在线阅读,更多相关《c++实现拼图游戏.docx(26页珍藏版)》请在冰豆网上搜索。
![c++实现拼图游戏.docx](https://file1.bdocx.com/fileroot1/2022-12/7/08e6dc4f-df63-45a0-9774-8a2e42773696/08e6dc4f-df63-45a0-9774-8a2e427736961.gif)
c++实现拼图游戏
课程设计说明书
课程名称:
面向对象程序设计与c++语言
设计题目:
c++实现拼图游戏
2015年6月26日
目录
1课程设计简介5
1.1课程设计的目的5
1.2课程设计内容5
2课程设计实现过程6
2.1系统结构框图6
2.2模块流程图6
2.3关键代码6
2.4主要数据结构6
2.5测试与评价6
3设计总结7
4参考文献8
整个写完后使用更新域(在目录上点击右键选择更新域)确定各部分的页码!
!
1课程设计简介(宋体,三号)
1.1课程设计的目的(宋体,小三)
通过c++来实现拼图游戏,用户可以使用鼠标和键盘来控制游戏
(正文字体要求为宋体,字号为小四,行间距20磅,每段前空2字符)
1.2课程设计内容(宋体小三)
数据结构,将整个所有图像块记为一个二维数组m_board[][],写了一个Board类来控制图像的移动和修改。
Flip类是用来实现这个功能的,其中定义了移动一格的帧数、速度等信息。
然后整个游戏是一个类Game。
算法及其他,基本上全是小算法,有一点就是游戏开始时必须将所有的图像块置乱,但是如果是随机打乱就不能保证这个游戏一定有可行解,这个问题的讨论可以参见8数码问题,这种问题的有解是需要条件的。
至于如何保证这个游戏有解,我用了最笨的方法,就是进行逆操作,一开始随机对原图进行操作,循环一定次数以后的图像就是置乱的图像了,但是这种方法有一个缺陷,当图像块非常多时,比如20*20,这种方法只能置乱图像的一部分,而另一部分却和原图差不多。
为了消除这个问题,对每种操作(比如向上移动)重复执行随机次,这样就基本上解决的前面的问题了。
其实这个问题可以用数学方法来解决,又快又省力,但是自己对这一部分不是很了解,只能用笨方法了。
关于平滑运动,只要在图像变换的时候插入几帧图像就好了,利用定时器来不断显示,写这个图像滑动效果很纠结,细节的问题考虑的比较多,一个好的数据结构的支持是必不可少的。
(正文字体要求为宋体,字号为小四,行间距20磅,每段前空2字符)
2课程设计实现过程(宋体,三号)
(要求写详细过程)
(正文字体要求为宋体,字号为小四,行间距20磅,每段前空2字符)
该部分必须包括:
系统结构框图、各模块流程图、关键代码、主要的数据结构、测试与评价等
2.1
2.3头文件(宋体,小三)
#include"stdh.h"
classBoard{
private:
intm_b[MAXN_BOARD][MAXN_BOARD];
//emptyblockposition:
exey
//oldemptyblockpositionoex,oey
intm_ex,m_ey;
intm_oex,m_oey;
intm_dir;//reverse-directionofemptyblock
boolm_bMove;//iftheboardmoved
intm_nx,m_ny;
intm_nBlock;
public:
Board();
intCreate();
boolCheck();//checkifthegamewin
intGetMat(int,int);
intSetMat(int,int,int);
intSetXY(int,int);
intGetEX();
intGetEY();
intGetOEX();
intGetOEY();
intGetDir();
intMove(int,int);
boolCheckMove();
intResetMove();
intUp();
intDown();
intLeft();
intRight();
intClick(int,int);//whenUserclickthepicture
intInit();
};
#include"stdh.h"
/*
ClassFlipstoredallelementsoftheflipping-block.
Itwillbeusedwhentheclickedblockmovingtothedestination.
*/
classFlip{
public:
intm_cnt;
intm_ux,m_uy;//uX,uYpixelsaremovedperm_time
intm_time;//uSeconds
intm_dir;//directionofflip
intm_cx,m_cy;//currentposofblock
intm_sx,m_sy;//sourceposofblock
intm_dx,m_dy;//destinationposofblock
intGetXY(int,int&,int&);
intGetTime();
intSetXY(int,int,int,int);
intSetTime(int);
intSetCnt(int,int,int);
intSetDir(int);
boolFinish(HWND);//checkiftheflippingover
};
#include"stdh.h"
#include"Flip.h"
#include"Board.h"
classGame{
private:
Boardm_board;
Flipm_flip;
boolm_bMove;
intm_ex,m_ey;
intm_nx,m_ny;
intm_nBlock;
intm_ux,m_uy;
intm_vFlip;
intm_xFlip,m_yFlip;
HBITMAPm_hBmp;
HBITMAPm_hMemBmp;
BITMAPm_bmp;
HDCm_mdc,m_bufdc;//doublecache
HWNDm_hWnd;
public:
Game();
intSetLevel(int,int);
intLoadBmp(HINSTANCE,int);
intInit(HWND);//Initthegame
intCreate(HWND);
intPaint(HWND);
intClick(int,int);//Userclickedthepicture
intKey(WPARAM);//Userpushdownthekeyboard
intInitFlip();//initthem_flipandthenflippingstart.
boolCheckWin();
intRelease(HWND);
};
//{{NO_DEPENDENCIES}}
//MicrosoftVisualC++generatedincludefile.
//Usedbyres.rc
//
#defineIDB_AC103
#defineIDB_BH104
//Nextdefaultvaluesfornewobjects
//
#ifdefAPSTUDIO_INVOKED
#ifndefAPSTUDIO_READONLY_SYMBOLS
#define_APS_NEXT_RESOURCE_VALUE105
#define_APS_NEXT_COMMAND_VALUE40001
#define_APS_NEXT_CONTROL_VALUE1001
#define_APS_NEXT_SYMED_VALUE101
#endif
#endif
#pragmaonce
#include
#include
#include
usingnamespacestd;
constintMAXN_BOARD=10;
constintCLIENT_X=1024;
constintCLIENT_Y=768;
constintOFFSET_LINE=1;
constintDIR_UP=0;
constintDIR_DOWN=1;
constintDIR_LEFT=2;
constintDIR_RIGHT=3;
constintFLIP_CNT=8;
constintFLIP_TIME=18;
2.2源文件(宋体,小三)
#include"Board.h"
Board:
:
Board()
{
memset(m_b,-1,sizeof(m_b));
m_nx=m_ny=m_ex=m_ey=0;
m_nBlock=0;
}
intBoard:
:
Create()
{
memset(m_b,-1,sizeof(m_b));
m_nx=m_ny=m_ex=m_ey=0;
m_nBlock=0;
return0;
}
intBoard:
:
SetXY(intnx,intny)
{
m_nx=nx;
m_ny=ny;
m_nBlock=m_nx*m_ny;
m_oex=m_ex=m_nx-1;
m_oey=m_ey=m_ny-1;
return0;
}
intBoard:
:
SetMat(intx,inty,intval)
{
m_b[y][x]=val;
returnval;
}
intBoard:
:
GetMat(intx,inty)
{
returnm_b[y][x];
}
intBoard:
:
GetEX()
{
returnm_ex;
}
intBoard:
:
GetEY()
{
returnm_ey;
}
intBoard:
:
GetOEX()
{
returnm_oex;
}
intBoard:
:
GetOEY()
{
returnm_oey;
}
intBoard:
:
GetDir()
{
returnm_dir;
}
boolBoard:
:
Check()
{
intck=0;
boolflag=true;
for(inti=0;ifor(intj=0;j{
if(ck!
=m_b[i][j])
{
flag=false;
break;
}
++ck;
}
if(flag==false&&ckreturnfalse;
returntrue;
}
intBoard:
:
Init()
{
//VARIABLE:
nStep,nLoop
//
//nStep:
//Inordertogeneratetherandomblockpositionsand
//tomakesuremusthaveasolution,we
//havetosimulateThe-Inverse-Actionoftheuser.
//ThennStepmeanwewillexecutetheInverse-Actiontimes.
//AndeachActionwillberandomgenerated.
//
//nLoop:
//Duetothereasonthatthemethodthatabove-mentionedhas
//abigDrawback:
ifthenumberofblocksishuge,thenmethodwould
//onlychangeasmallareaofall.AvoidingthisIaddanewvariable
//nloop,whichmeansasameactionsthatexecutedtimes.Itwasproved
//thatafterthisimprovedthenew-methodworkwell.
//
intnStep=(rand()&((1<<8)-1))+100;
intnLoop;
inttmp;
intid=0;
for(inti=0;ifor(intj=0;j{
m_b[i][j]=id;
++id;
}
m_b[m_ny-1][m_nx-1]=-1;
m_oey=m_ey;
m_oex=m_ex;
for(inti=0;i{
tmp=(rand()&3);
nLoop=rand()&7;//loopofaction
for(intj=0;jswitch(tmp)
{
case0:
this->Up();break;
case1:
this->Down();break;
case2:
this->Left();break;
case3:
this->Right();break;
}
}
return0;
}
intBoard:
:
Move(intnx,intny)
{
m_oex=m_ex;
m_oey=m_ey;
m_ex=nx;
m_ey=ny;
return0;
}
boolBoard:
:
CheckMove()
{
returnm_bMove;
}
intBoard:
:
ResetMove()
{
m_bMove=false;
return0;
}
intBoard:
:
Up()
{
m_bMove=false;
Move(m_ex,m_ey);
if(m_ey==0)
{
return-1;
}
m_b[m_ey][m_ex]=m_b[m_ey-1][m_ex];
m_b[m_ey-1][m_ex]=-1;
--m_ey;
m_dir=DIR_DOWN;
m_bMove=true;
return0;
}
intBoard:
:
Down()
{
m_bMove=false;
Move(m_ex,m_ey);
if(m_ey==m_ny-1)
{
return-1;
}
m_b[m_ey][m_ex]=m_b[m_ey+1][m_ex];
m_b[m_ey+1][m_ex]=-1;
++m_ey;
m_dir=DIR_UP;
m_bMove=true;
return0;
}
intBoard:
:
Left()
{
m_bMove=false;
Move(m_ex,m_ey);
if(m_ex==0)
{
return-1;
}
m_b[m_ey][m_ex]=m_b[m_ey][m_ex-1];
m_b[m_ey][m_ex-1]=-1;
--m_ex;
m_dir=DIR_RIGHT;
m_bMove=true;
return0;
}
intBoard:
:
Right()
{
m_bMove=false;
Move(m_ex,m_ey);
if(m_ex==m_nx-1)
{
return-1;
}
m_b[m_ey][m_ex]=m_b[m_ey][m_ex+1];
m_b[m_ey][m_ex+1]=-1;
++m_ex;
m_dir=DIR_LEFT;
m_bMove=true;
return0;
}
intBoard:
:
Click(intx,inty)
{
m_bMove=false;
if(x<0||x>=m_nx||y<0||y>=m_ny)
return-1;
if(abs(x-m_ex)+abs(y-m_ey)>1)
return-1;
if(x-m_ex>0)
{
this->Right();
return0;
}
if(m_ex-x>0)
{
this->Left();
return0;
}
if(y-m_ey>0)
{
this->Down();
return0;
}
if(m_ey-y>0)
{
this->Up();
return0;
}
return0;
}
#include"PingTu.h"
Game:
:
Game()
{
m_bMove=false;
m_nx=m_ny=m_ux=m_uy=0;
m_nBlock=0;
}
intGame:
:
Create(HWNDhWnd)
{
m_bMove=false;
m_nx=m_ny=m_ux=m_uy=0;
m_nBlock=0;
m_mdc=CreateCompatibleDC(GetDC(hWnd));
m_bufdc=CreateCompatibleDC(GetDC(hWnd));
srand(unsigned(time(NULL)));
m_board.Create();
return0;
}
intGame:
:
Init(HWNDhWnd)
{
m_ux=m_bmp.bmWidth/m_nx;
m_uy=m_bmp.bmHeight/m_ny;
m_hWnd=hWnd;
m_board.Init();
MoveWindow(hWnd,0,0,
m_bmp.bmWidth+m_ux+m_nx*OFFSET_LINE+20,
m_bmp.bmHeight+20,
TRUE);
//initializeflip
m_flip.SetCnt(FLIP_CNT,m_ux,m_uy);
m_flip.SetTime(FLIP_TIME);
return0;
}
intGame:
:
SetLevel(intx,inty)
{
m_nx=x;
m_ny=y;
m_board.SetXY(x,y);
m_nBlock=m_nx*m_ny;
return0;
}
intGame:
:
LoadBmp(HINSTANCEhInst,intid)
{
m_hBmp=LoadBitmap(hInst,MAKEINTRESOURCE(id));
GetObject(m_hBmp,sizeof(BITMAP),&m_bmp);
return0;
}
intGame:
:
Paint(HWNDhWnd)
{
intx,y,k,i,j;
intcur_block;
HDChdc;
hdc=GetDC(hWnd);
DeleteObject(m_hMemBmp);
m_hMemBmp=CreateCompatibleBitmap(GetDC(hWnd),CLIENT_X,CLIENT_Y);
SelectObject(m_mdc,m_hMemBmp);
SelectObject(m_bufdc,m_hBmp);
cur_block=m_board.GetMat(m_board.GetOEX(),m_board.GetOEY());
for(i=0;ifor(j=0;j{
k=m_board.GetMat(j,i);
x=k%m_nx;
y=k/m_nx;
if(-1==k)
{
//StretchBlt(m_mdc,j*m_ux+OFFSET_LINE,i*m_uy+OFFSET_LINE,
//m_ux-2*OFFSET_LINE,m_uy-2*OFFSET_LINE,
//m_bufdc,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SRCCOPY);
continue;
}
elseif(k==cur_block&&!
m_flip.Finish(hWnd))
{
m_flip.GetXY(m_board.GetDir(),x,y);
BitBlt(m_mdc,x,y,m_ux,m_uy,
m_bufdc,(k%m_nx)*m_ux,(k/m_nx)*m_uy,SRCCOPY);
}
else
{
BitBlt(m_mdc,j*(m_ux+(OFFSET_LINE<<1))+(OFFSET_LINE),
i*(m_uy+(OFFSET_LINE<<1))+OFFSET_LINE,m_ux,m_uy,
m_bufdc,x*m_ux,y*m_uy,SRCCOPY);
}
}
BitBlt(hdc,0,0,m_bmp.bmWidth,m_bmp.bmHeight,m_mdc,0,0,SRCCOPY);
StretchBlt(hdc,m_bmp.bmWidth,0,m_ux,m_uy,
m_bufdc,0,0,m_bmp.bmWidth,m_bmp.bmHeight,SRCCOPY);
return0;
}
intGame:
:
Click(intmx,intmy)
{