俄罗斯方块代码实现.docx
- 文档编号:4959736
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:21
- 大小:25.35KB
俄罗斯方块代码实现.docx
《俄罗斯方块代码实现.docx》由会员分享,可在线阅读,更多相关《俄罗斯方块代码实现.docx(21页珍藏版)》请在冰豆网上搜索。
俄罗斯方块代码实现
01.下面这些俄罗斯方块代码是我最近放假在家里自己写的,虽然以前有过看别人写的别人写的代码,但是那个游戏代码好像不是很全面,因为无法实现全部的方块和实现随机的产生任意方向的方块,现在也基本上是忘光了当时的代码,下面的这些代码是我最近写的,没有参考其他人的代码,真正写俄罗斯方块起来感觉真的是挺难的,关键是在于方块的旋转。
当然下面的代码仅仅是一个框架,只能够实现大致上的功能,还不全面,贴出来和大家交流学习。
编译器是code:
:
block+MinGW,感觉CB这个IDE真的是太强大太棒了,下面的代码直接复制到VC里面运行应该不会出错,有个问题一直不知道怎么解决,就是更新客户区时窗口总是闪不知道有哪位达人能指点我一下。
有的都是windowsAPI写的,对windows编程还不是很懂,望大家多多留言,指点一下本人。
下面这些俄罗斯方块代码是我最近放假在家里自己写的,虽然以前有过看别人写的别人写的代码,但是那个游戏代码好像不是很全面,因为无法实现全部的方块和实现随机的产生任意方向的方块,现在也基本上是忘光了当时的代码,下面的这些代码是我最近写的,没有参考其他人的代码,真正写俄罗斯方块起来感觉真的是挺难的,关键是在于方块的旋转。
当然下面的代码仅仅是一个框架,只能够实现大致上的功能,还不全面,贴出来和大家交流学习。
编译器是code:
:
block+MinGW,感觉CB这个IDE真的是太强大太棒了,下面的代码直接复制到VC里面运行应该不会出错,有个问题一直不知道怎么解决,就是更新客户区时窗口总是闪不知道有哪位达人能指点我一下。
有的都是windowsAPI写的,对windows编程还不是很懂,望大家多多留言,指点一下本人。
viewplaincopytoclipboardprint?
01.#include
02.#include
03.#include
04.#include
05.usingnamespacestd;
06.#defineCellWidth20
07.#defineMAP_WIDTH12
08.#defineMAP_HEIGHT18
09.#defineID_TIMER1
10.classmap_floor;
11.classBlock;
12.LRESULTCALLBACKWindowProcedure(HWND,UINT,WPARAM,LPARAM);
13./*Maketheclassnameintoaglobalvariable*/
14.charszClassName[]="CodeBlocksWindowsApp";
15.intWINAPIWinMain(HINSTANCEhThisInstance,
16.HINSTANCEhPrevInstance,
17.LPSTRlpszArgument,
18.intnCmdShow)
19.{
20.HWNDhwnd;/*Thisisthehandleforourwindow*/
21.MSGmessages;/*Heremessagestotheapplicationaresaved*/
22.WNDCLASSEXwincl;/*Datastructureforthewindowclass*/
23.
24./*TheWindowstructure*/
25.wincl.hInstance=hThisInstance;
26.wincl.lpszClassName=szClassName;
27.wincl.lpfnWndProc=WindowProcedure;/*Thisfunctioniscalledbywindows*/
28.wincl.style=CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;/*Catchdouble-clicks*/
29.wincl.cbSize=sizeof(WNDCLASSEX);
30.
31./*Usedefaulticonandmouse-pointer*/
32.wincl.hIcon=LoadIcon(NULL,IDI_APPLICATION);
33.wincl.hIconSm=LoadIcon(NULL,IDI_APPLICATION);
34.wincl.hCursor=LoadCursor(NULL,IDC_ARROW);
35.wincl.lpszMenuName=NULL;/*Nomenu*/
36.wincl.cbClsExtra=0;/*Noextrabytesafterthewindowclass*/
37.wincl.cbWndExtra=0;/*structureorthewindowinstance*/
38./*UseWindows'sdefaultcolourasthebackgroundofthewindow*/
39.wincl.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);//COLOR_BACKGROUND;
40.
41./*Registerthewindowclass,andifitfailsquittheprogram*/
42.if(!
RegisterClassEx(&wincl))
43.return0;
44.
45./*Theclassisregistered,let'screatetheprogram*/
46.hwnd=CreateWindowEx(
47.0,/*Extendedpossibilitesforvariation*/
48.szClassName,/*Classname*/
49."Code:
:
BlocksTemplateWindowsApp",/*TitleText*/
50.WS_OVERLAPPEDWINDOW,/*defaultwindow*/
51.CW_USEDEFAULT,/*Windowsdecidestheposition*/
52.CW_USEDEFAULT,/*wherethewindowendsuponthescreen*/
53.CW_USEDEFAULT,/*Theprogramswidth*/
54.CW_USEDEFAULT,/*andheightinpixels*/
55.NULL,/*Thewindowisachild-windowtodesktop*/
56.NULL,/*Nomenu*/
57.hThisInstance,/*ProgramInstancehandler*/
58.NULL/*NoWindowCreationdata*/
59.);
60.
61./*Makethewindowvisibleonthescreen*/
62.ShowWindow(hwnd,nCmdShow);
63.
64./*Runthemessageloop.ItwillrununtilGetMessage()returns0*/
65.while(GetMessage(&messages,NULL,0,0))
66.{
67./*Translatevirtual-keymessagesintocharactermessages*/
68.TranslateMessage(&messages);
69./*SendmessagetoWindowProcedure*/
70.DispatchMessage(&messages);
71.}
72.
73./*Theprogramreturn-valueis0-ThevaluethatPostQuitMessage()gave*/
74.returnmessages.wParam;
75.}
76.
77.enum{e_LINE,e_CORNER,e_STAIR,e_TANCK,e_TIAN};
78.constintTOTAL_BLOCK_STYLE=5;//方块类型有种
79.classBlock
80.{
81.public:
82.Block(intx=100,inty=100);
83.Block(constBlock&rh)//复制构造函数,可能没什么用,但是还是定义它吧
84.{
85.this->m_style=rh.m_style;
86.this->m_direct=rh.m_direct;
87.for(inti=0;i<4;i++)
88.this->m_block[i]=rh.m_block[i];
89.}
90.Block&operator=(constBlock&rh)//重载=号,实现方块的赋值
91.{
92.this->m_style=rh.m_style;
93.this->m_direct=rh.m_direct;
94.for(inti=0;i<4;i++)
95.this->m_block[i]=rh.m_block[i];
96.return*this;
97.}
98.~Block(){}
99.intcreate_block(intx=100,inty=100);
100.//显示在游戏区内移动的方块
101.intshow_block(HDChdc,constPOINT&GameLeftTop);
102.//显示将要出现的方块,即游戏区左边的方块
103.intshow_next_block(HDChdc);
104.//旋转,该函数比较难实现,代码量也比较大,以后有时间在慢慢优化,关于解析看定义处
105.introtate();
106.//产生随机方块
107.intrandom_block();
108.
109.//下面为方块移动的成员函数
110.intget_block_height(){returnm_block[1].y;}
111.intmove_down(constRECT&GameClient);
112.intmove_left(constRECT&GameClient);
113.intmove_right(constRECT&GameClient);
114.intmove_up(constRECT&GameClient);
115.intmove_to(intx,inty);
116.//检测方块是否在游戏区内
117.//intcheck_block(constmap_floor&map,constRECT&GameClent);
118.intcheck_block(constmap_floor&map,constPOINT&LeftTopScrCdnt);
119.intprint_to_map(map_floor&map,constPOINT&LeftTopScrCdnt);
120.private:
121.intm_style;//方块的风格样式,具体看定义的枚举变量
122.intm_direct;//方块的方向,是对m_style的具体数据
123.POINTm_block[4];//下标为的方块是中心坐标,旋转都是围绕着该方块进行,这样可以利于旋转和逻辑清晰
124.};
125.classmap_floor
126.{
127.public:
128.map_floor()
129.{
130.ZeroMemory(m_block_bar,sizeof(int)*12*18);
131.}
132.~map_floor(){}
133.voidshow_block_bar(HDChdc,constPOINT&LeftTopScrCdnt)
134.{
135.for(inti=0;i 136.{ 137.for(intj=0;j 138.{ 139.if(m_block_bar[i][j]) 140.{ 141.Rectangle(hdc,LeftTopScrCdnt.x+j*CellWidth,LeftTopScrCdnt.y+i*CellWidth, 142.LeftTopScrCdnt.x+(j+1)*CellWidth,LeftTopScrCdnt.y+(i+1)*CellWidth); 143.} 144.} 145.} 146. 147.} 148.friendclassBlock; 149.protected: 150. 151.private: 152. 153.intm_block_bar[MAP_HEIGHT][MAP_WIDTH];//游戏区的地板,用*12的二维数组表示 154. 155. 156.}; 157. 158.Block: : Block(intx,inty) 159.{ 160.//ZeroMemory(m_block_bar,sizeof(int)*12*18); 161.srand((unsigned)time(NULL));//初始化随机数,用于产生方块 162.//POINTpt={100,100}; 163.create_block(x,y); 164.} 165.intBlock: : random_block() 166.{ 167.m_style=rand()%TOTAL_BLOCK_STYLE; 168.//m_style=e_CORNER;//测试之用 169.//m_style=e_LINE;//测试之用 170.if(m_style==e_STAIR||m_style==e_TANCK) 171.m_direct=rand()%4; 172.elseif(m_style==e_LINE) 173.m_direct=rand()%2; 174.elseif(m_style==e_CORNER) 175.m_direct=rand()%8; 176.elseif(m_style==e_TIAN) 177.m_direct=0; 178.m_direct=1; 179. 180.} 181.intBlock: : check_block(constmap_floor&map,constPOINT&LeftTopScrCdnt) 182.{ 183.intx,y;//x,y为方块相对于地图的坐标,左上角为(,) 184.for(inti=0;i<4;i++) 185.{ 186.x=(m_block[i].x-LeftTopScrCdnt.x)/CellWidth; 187.y=(m_block[i].y-LeftTopScrCdnt.y)/CellWidth; 188.if(x<0||x>=MAP_WIDTH||y>=MAP_HEIGHT)//不用检测y<0的情况 189.return0; 190.if(y<0)continue; 191.if(map.m_block_bar[y][x]) 192.return0; 193.} 194.return1; 195.} 196.intBlock: : move_down(constRECT&GameClient)//下移,由计时器消息调用 197.{ 198.inti; 199.//for(i=0;i<4;i++) 200.//{ 201.//if(m_block[i].y==GameClient.bottom-CellWidth) 202.//return0; 203.//} 204.for(i=0;i<4;i++) 205.{ 206.m_block[i].y+=CellWidth; 207.} 208.return1; 209.} 210.intBlock: : move_up(constRECT&GameClient) 211.{ 212.move_to(m_block[1].x,m_block[1].y-CellWidth); 213.return1; 214.} 215.intBlock: : move_left(constRECT&GameClient) 216.{ 217.move_to(m_block[1].x-CellWidth,m_block[1].y); 218.return1; 219.} 220.intBlock: : move_right(constRECT&GameClient) 221.{ 222.move_to(m_block[1].x+CellWidth,m_block[1].y); 223.return1; 224.} 225.intBlock: : create_block(intx,inty) 226.{ 227.m_block[1].x=x; 228.m_block[1].y=y; 229.random_block(); 230.rotate(); 231.return1; 232.} 233.intBlock: : move_to(intx,inty) 234.{ 235.intVx=x-m_block[1].x; 236.intVy=y-m_block[1].y; 237.for(inti=0;i<4;i++) 238.{ 239.m_block[i].x+=Vx; 240.m_block[i].y+=Vy; 241.} 242.} 243.intBlock: : print_to_map(map_floor&map,constPOINT&LeftTopScrCdnt) 244.{ 245.intx,y; 246.inti,j; 247.for(i=0;i<4;i++) 248.{ 249.x=(m_block[i].x-LeftTopScrCdnt.x)/CellWidth; 250.y=(m_block[i].y-LeftTopScrCdnt.y)/CellWidth; 251.if(x<0||x>=MAP_WIDTH||y<0||y>=MAP_HEIGHT)//为保安全,测试之用,完成后将被注释掉 252.return0; 253.map.m_block_bar[y][x]=1; 254.for(j=0;j 255.{ 256.if(map.m_block_bar[y][j]! =1) 257.break; 258.} 259.if(MAP_WIDTH==j) 260.{ 261.for(j=0;j 262.{ 263.map.m_block_bar[y][j]=5;//数字代表要消掉的行 264.} 265.} 266. 267.} 268.intidx; 269.for(i=0;i 270.{ 271.for(idx=j=MAP_HEIGHT-1;j>=0;j--) 272.{ 273.if(map.m_block_bar[j][i]! =5) 274.{ 275.map.m_block_bar[idx--][i]=map.m_block_bar[j][i]; 276.} 277.} 278.while(idx>=0) 279.{ 280.map.m_block_bar[idx--][i]=0; 281.} 282.} 283.return1; 284.} 285. 286.//下面该函数功能是实现方块旋转,可以说是整个【俄罗斯方块】的难点所在,也是其核心部分 287.//方块用以数组block【】表示,其余个方格都将围绕block【】旋转,方块由于有不对称方块 288.//存在,我原本是要分种,但是后面代码量太大了,所以我将方块根据样式归为了四种,分别是: 289.// 290.//e_LINE线形就是一条线的那个,这个是对称的方块,只需分两个方向分别为横向和纵向,方向 291.//用m_direct保持,其他的方块一样 292.// 293.//e_TANCK坦克形这个是方块是对称的,分四种方向,根据m_direct对进行求余的方法可以大大缩减 294.//代码量,对于下面两种方块也是利用了求余的方式化简许多,才使得代码不会那么冗余, 295.//这是后面我才想到的方法。 296.// 297.//e_ST
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 俄罗斯方块 代码 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)