c++实现拼图游戏.docx

上传人:b****5 文档编号:4599697 上传时间:2022-12-07 格式:DOCX 页数:26 大小:93.54KB
下载 相关 举报
c++实现拼图游戏.docx_第1页
第1页 / 共26页
c++实现拼图游戏.docx_第2页
第2页 / 共26页
c++实现拼图游戏.docx_第3页
第3页 / 共26页
c++实现拼图游戏.docx_第4页
第4页 / 共26页
c++实现拼图游戏.docx_第5页
第5页 / 共26页
点击查看更多>>
下载资源
资源描述

c++实现拼图游戏.docx

《c++实现拼图游戏.docx》由会员分享,可在线阅读,更多相关《c++实现拼图游戏.docx(26页珍藏版)》请在冰豆网上搜索。

c++实现拼图游戏.docx

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

for(intj=0;j

{

if(ck!

=m_b[i][j])

{

flag=false;

break;

}

++ck;

}

if(flag==false&&ck

returnfalse;

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

for(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;j

switch(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;i

for(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)

{

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 高中教育

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1