教你用c语言写俄罗斯方块
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
来如鹏挺长时间了,受益很多希望更多的朋学加入进来
做俄罗斯方块是因为无意中在杨老师的帖子看到说最少也要能做出俄罗斯方块这样的东西出来,我想这个意思能做出俄罗斯方块就说明水平到了一个层次了吧。
刚才注意到音乐播放器居然下载超过400次!我反醒我上传的代码很少解释
而且做的都是没有趣味的东西。
俄罗斯方块如鹏已经有好几个同学做出来了,但是我想还有很多同学做不出来,我抛砖引玉,其实俄罗斯方块并不复杂
今天先告诉大家第一步,
在屏幕上把方块显示出来
cfree 新建一个工程选窗口程序显示helloworld的
win32的 api 图形函数都要用到 HDC 这是一个保存窗口图形的数据的句柄
比如我要画一个正方形可以用
Rectangle (hdc,标X,左上角坐标y,右下角坐标x,右下角坐标y);
为了方便我们直接在
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);
// 这个下面添加代码
Rectangle (hdc,50,50,100,100);
然后编译运行
这是效果就是一个正方形没别的东西?别着急哈,慢慢来。
俄罗斯方块每块都是四部分的所以要画4个
这里面需要一小点数学知识
把这些复制到刚才的位置看一下效果
{
int x,y;
const int size=50;//方块大小
x=y=50;//从窗口的左上角位置开始画
//第一个方块
Rectangle (hdc,x,y,x+size,y+size);
x+=size; //向右一块位置画第二个方块
Rectangle (hdc,x,y,x+size,y+size);
x+=size; //向右一块位置画第三个方块
Rectangle (hdc,x,y,x+size,y+size);
//最后一个方块
//相对于第三个方块左下角的位置
x-=50;y-=50;
Rectangle (hdc,x,y,x+size,y+size);
}
这个画好像很麻烦我们可以自定义一个函数huafangkuai
专门负责画这个正方形以后所有的其他函数也必须经过他才能画正方形
这个类似于win32 api的封装思想
void huafangkuai(int x,int y,int color);
x y是方块的坐标color 就是color
函数原理是x y 是相对于游戏里的坐标而不是屏幕坐标
屏幕坐标要经过函数自己转换这样我们就可以把心关注在游戏的事情而不必分心了void huafangkuai(HDC hdc,int x,int y,int color)
{
const int BEGINX= 50;//游戏图形的开始位置
const int BEGINY= 50 ;
const int FSIZE= 35 ; //方块大小
int screenx=BEGINX +x*FSIZE; //方块左上角的坐标是x乘方块大小再加上起始位置
int screeny=BEGINY +y*FSIZE;
Rectangle (hdc,screenx,screeny,screenx+FSIZE,screeny+FSIZE);
}
这样我们再画就四个就容易多了 color 先不管
int x,y;
x=5;y=5;
huafangkuai(hdc,x,y,0);
huafangkuai(hdc,x+1,y,0);
huafangkuai(hdc,x+2,y,0);
huafangkuai(hdc,x+1,y+1,0);
这样就画出了一个方块形状但是怎么能画出其它的呢?请听下回分解.
弄这点东西我费了一个多小时时间 ...我终于理解为什么杨老师问最近没人反馈备课再加录视频一定花了很多心血可是没有几个同学问问题或做作业的心情...
leeco 说的是
我以前很少写注释这回一写反而乱写一通下次改进
下一步有一些麻烦了
为了省代码还是再定义一个函数
void DrawTetris(HDC hdc, int dir,int shape,int color,int x,int y)
dir 是方块的4个方向 shape 是形状比如有L 形 |形和田形 x y 游戏中的坐标我们定义一个全局数组把俄罗斯方块中7种不同的正式形状都保存在里面
调用这个函数之后能把要求的方块显示出来
void DrawTetris(HDC hdc, int dir,int shape,int color,int x,int y)
{
int nx,ny;
for(int i=0;i<4;i++)
{
nx=SQRARRAY[shape][dir].x+x;ny=SQRARRAY[shape][dir].y+y;
huafangkuai(hdc,nx,ny,color);
}
}
要求所有的方块的形状都弄好我费了不少时间
这个就是全局数组放到代码的最上面
每4行是1个形状最后一个全是一样的就是田形const POINT SQRARRAY[7][FOUR][FOUR]=
{
{0,-1,0,0,1,0,2,0,
1,0,0,0,0,1,0,2,
0,1,0,0,-1,0,-2,0,
-1,0,0,0,0,-1,0,-2},
{-1,0,0,0,0,1,0,2,
-1,0,0,0,-2,0,0,-1,
0,-1,0,0,0,-2,1,0,
0,1,0,0,1,0,2,0},
{ -1,0,0,0,0,-1,1,0,
0,-1,0,0,1,0,0,1,
-1,0,0,0,0,1,1,0,
-1,0,0,0,0,-1,0,1},
{ 0,-1,0,0,1,0,1,1,
1,0,0,0,0,1,-1,1,
0,-1,0,0,1,0,1,1,
1,0,0,0,0,1,-1,1,
},
{ 0,-1,0,0,-1,0,-1,1,
-1,0,0,0,0,1,1,1,
0,-1,0,0,-1,0,-1,1,
-1,0,0,0,0,1,1,1},
{-1,0,0,0,1,0,2,0,
0,-1,0,0,0,1,0,2,
-1,0,0,0,1,0,2,0,
0,-1,0,0,0,1,0,2},
{-1,0,0,0,-1,1,0,1,
-1,0,0,0,-1,1,0,1,
-1,0,0,0,-1,1,0,1,
-1,0,0,0,-1,1,0,1}
} ;
先调用试试效果
switch (message)
{
case WM_PAINT:
hdc = BeginPaint(hWnd, &ps);