您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > c语言编写的俄罗斯方块小游戏
#includewindows.h#includetime.h#includestdlib.h#defineW14//游戏区域宽度#defineH26//游戏区域高度#defineW16//右边状态栏宽度#defineBSIZE25//游戏方格边长#defineY16//放置照片的纵坐标#defineY212//分数显示栏顶端纵坐标#defineY315//等级显示栏顶端纵坐标#defineY421//帮助栏顶端纵坐标#defineCur_xW/2-1//游戏方块初始状态左上角横坐标#defineCur_y1//初始状态左上角纵坐标#defineBgColorRGB(0xF5,0xF5,0xDC)//米色#defineFgColorRGB(255,153,204)//粉红#defineREDRGB(255,0,0)#defineORANGERGB(250,128,10)#defineYELLOWRGB(255,255,0)#defineGREENRGB(0,255,0)#defineCYANRGB(0,255,255)#defineLIGHT_BLUERGB(0xA6,0xCA,0xF0)//天蓝色#definePURPLERGB(255,0,255)#defineMS_NEWBLOCKWM_USER+1//消息ID,产生新的【方块】intscore=0,level=0,level_step=100;//分数等级以及每等级所需分数的定义及初始化inttop=H-1;//最顶端的纵坐标intx,y;//方块当前位置的横坐标及纵坐标intcur_boxnum,next_boxnum;//cur_boxnum是当前方块编号,next_boxnum是下一个方块编号structBOARD{intvar;//状态,1代表已被占用,0代表未被占用intcolor;//颜色}board[H][W];//定义游戏主板,H行N列structBLOCK{inta[4][2];//定义方块形状的数组intcolor;//方块颜色intnext;//下一个方块的号码};structBLOCKblock[19]={//初始化各个游戏方块{1,1,1,2,1,3,2,3,RED,1},{0,2,1,2,2,2,0,3,RED,2},{0,1,1,1,1,2,1,3,RED,3},{2,1,0,2,1,2,2,2,RED,0},{1,1,1,2,0,3,1,3,ORANGE,5},{0,1,0,2,1,2,2,2,ORANGE,6},{1,1,2,1,1,2,1,3,ORANGE,7},{0,2,1,2,2,2,2,3,ORANGE,4},{1,1,0,2,1,2,2,2,YELLOW,9},{1,1,1,2,2,2,1,3,YELLOW,10},{0,2,1,2,2,2,1,3,YELLOW,11},{1,1,0,2,1,2,1,3,YELLOW,8},{1,1,1,2,2,2,2,3,GREEN,13},{1,2,2,2,0,3,1,3,GREEN,12},{2,1,1,2,2,2,1,3,CYAN,15},{0,2,1,2,1,3,2,3,CYAN,14},{1,0,1,1,1,2,1,3,LIGHT_BLUE,17},{0,2,1,2,2,2,3,2,LIGHT_BLUE,16},{1,1,2,1,1,2,2,2,PURPLE,18},};voidPaint(HDChdc,HPENhpen)//此函数用于初始化界面{inti,j;HPENhpen1;//定义画笔,用于绘制分隔线HBRUSHhbrush=CreateSolidBrush(BgColor);//定义画刷并赋初值,画刷颜色采用背景色hpen1=CreatePen(PS_DASHDOTDOT,3,FgColor);//给画笔赋初值,颜色为前景色,线宽为3,双点划线SelectObject(hdc,hpen1);//选择画笔MoveToEx(hdc,W*BSIZE,0,NULL);//将光标移动到(W*BSIZE,0)处LineTo(hdc,W*BSIZE,H*BSIZE);//从光标所在位置画线到(W*BSIZE,H*BSIZE)处DeleteObject(hpen1);//删除之前所选用的画笔SelectObject(hdc,hpen);//重新选择画笔SelectObject(hdc,hbrush);//选择画刷for(i=1;iH-1;i++)//绘制游戏区域方格线for(j=1;jW-1;j++)Rectangle(hdc,j*BSIZE,i*BSIZE,(j+1)*BSIZE,(i+1)*BSIZE);for(i=1;i5;i++)//绘制右边状态栏游戏预览区域方格线for(j=W+1;jW+W1-1;j++)Rectangle(hdc,j*BSIZE,i*BSIZE,(j+1)*BSIZE,(i+1)*BSIZE);Rectangle(hdc,(W+1)*BSIZE,Y2*BSIZE,(W+W1-1)*BSIZE,(Y2+2)*BSIZE);//绘制分数栏方格线Rectangle(hdc,(W+1)*BSIZE,Y3*BSIZE,(W+W1-1)*BSIZE,(Y3+2)*BSIZE);//绘制等级栏方格线Rectangle(hdc,(W+1)*BSIZE,Y4*BSIZE,(W+W1-1)*BSIZE,(Y4+4)*BSIZE);//绘制帮助栏方格线TextOut(hdc,(W+2)*BSIZE,(Y2+0.2)*BSIZE,分数,8);//输出文字TextOut(hdc,(W+2)*BSIZE,(Y3+0.2)*BSIZE,等级,8);//同上DeleteObject(hpen);//删除画笔DeleteObject(hbrush);//删除画刷}voidShowScore(HDChdc)//显示分数的函数{charscore_str[4];//定义字符串用于保存分数值wsprintf(score_str,%3d,score);//将数字score转换成字符串后保存到score_str之中TextOut(hdc,(W+2.5)*BSIZE,(Y2+1.2)*BSIZE,score_str,3);//在游戏板上显示分数}voidShowLevel(HDChdc)//显示等级的,具体同上{charlevel_str[4];wsprintf(level_str,%3d,level);TextOut(hdc,(W+2.5)*BSIZE,(Y3+1.2)*BSIZE,level_str,3);}voidShowHelp(HDChdc)//显示帮助的,该函数只在初始化界面时调用{charhelp1[]=↑-旋转,help2[]=↓-下移,help3[]=←-左移,help4[]=→-右移;TextOut(hdc,(W+1.8)*BSIZE,(Y4+0.2)*BSIZE,help1,9);TextOut(hdc,(W+1.8)*BSIZE,(Y4+1.2)*BSIZE,help2,9);TextOut(hdc,(W+1.8)*BSIZE,(Y4+2.2)*BSIZE,help3,9);TextOut(hdc,(W+1.8)*BSIZE,(Y4+3.2)*BSIZE,help4,9);}voidEraseBox(HDChdc,HPENhpen,intx,inty,intnum)//清除(x,y)处编号为num,的方块{inti;HBRUSHhbrush=CreateSolidBrush(BgColor);SelectObject(hdc,hpen);SelectObject(hdc,hbrush);for(i=0;i4;i++)//用背景色填充方块所在区域,使方块隐藏Rectangle(hdc,(x+block[num].a[i][0])*BSIZE,(y+block[num].a[i][1])*BSIZE,(x+block[num].a[i][0]+1)*BSIZE,(y+block[num].a[i][1]+1)*BSIZE);DeleteObject(hpen);DeleteObject(hbrush);}voidShowBox(HDChdc,HPENhpen,intx,inty,intnum)//显示(x,y)处编号为num,的方块{inti;HBRUSHhbrush;hbrush=CreateSolidBrush(block[num].color);//创建画刷,颜色和方块颜色相同SelectObject(hdc,hpen);SelectObject(hdc,hbrush);for(i=0;i4;i++)//显示方块的过程Rectangle(hdc,(x+block[num].a[i][0])*BSIZE,(y+block[num].a[i][1])*BSIZE,(x+block[num].a[i][0]+1)*BSIZE,(y+block[num].a[i][1]+1)*BSIZE);DeleteObject(hpen);DeleteObject(hbrush);}voidSetFullRow(HDChdc,HPENhpen)//满行处理函数{inti,ii,j;intorg_top=top;intflag=0;HBRUSHhbrush;SelectObject(hdc,hpen);for(i=y;iy+4;i++)//从y行开始,从上到下遍历游戏区域{if(i=0||i=H-1)continue;//越界了,就跳出本次循环for(j=1;jW-1;j++)if(!board[i][j].var)break;//一旦该行有一个为空,即跳出if(j==W-1)//找到满行了{for(ii=i;ii=top;ii--)//重置游戏区域各个方格的状态,top为最顶端,i为找到的满行for(j=1;jW-1;j++)board[ii][j]=board[ii-1][j];top++;score+=10;//分数加10flag=1;//标志符}}if(flag)//如果有满行,则重绘主板{for(i=org_top;iy+4;i++)//原来的最顶端{if(i=0||i=H-1)continue;//越界了,就跳出本次循环for(j=1;jW-1;j++){//注意这里绘制主板时,每次都要选择不同的画刷,用完后一定要删除hbrush=CreateSolidBrush(board[i][j].color);SelectObject(hdc,hbrush);Rectangle(hdc,j*BSIZE,i*BSIZE,(j+1)*BSIZE,(i+1)*BSIZE);DeleteObject(hbrush);}}if(level!=score/level_step)//这里是程序优化部分,也可省略level=score/level_step;ShowScore(hdc);//更新分数ShowLevel(hdc);//更新等级}DeleteObject(hpen);}voidChangeVar(void)//改变游戏主板的状态{inti;for(i=0;i4;i++){board[y+block[cur_boxnum].a[i][1]][x+block[cur_boxnum].a[i][0]].var=1;//状态置1,表示有方块填充board[y+block[cur_boxnum].a[i][1]][x+block[cur_boxnum].a[i][0]].color=block[cur_boxnum].color;}}BOOLCanMove(void)//判断方块是否能移动{inti;for(i=0;i4;i++)if(board[y+block[cur_boxnum].a[i][1]][x+block[cur_boxnum].
本文标题:c语言编写的俄罗斯方块小游戏
链接地址:https://www.777doc.com/doc-2039111 .html