基于C语言的俄罗斯方块程序.docx
- 文档编号:15287952
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:33
- 大小:42.28KB
基于C语言的俄罗斯方块程序.docx
《基于C语言的俄罗斯方块程序.docx》由会员分享,可在线阅读,更多相关《基于C语言的俄罗斯方块程序.docx(33页珍藏版)》请在冰点文库上搜索。
基于C语言的俄罗斯方块程序
基于C语言的俄罗斯方块程序
/**
******************************************************************************
*@fileelsfk2.c
*@authorAndy
*@versionV1.0
*@date2013-1-22
*@brief
******************************************************************************
*@attention
*
*此程序是在WinTC下编写的,VC中需要添加图形库
******************************************************************************
*/
/*Includes-------------------------------------------------------------------*/
#include
#include
#include
#include
#include
#include
/*Private_Macros-------------------------------------------------------------*/
/*系统参数设置*/
#defineSys_x160
#defineSys_y8
#defineBSIZE22
#defineVBOXS15
#defineHBOXS10
#defineMAX_BOX19
#defineBgColorBLACK
#defineFgColorCYAN
#defineImwin_xSys_x+HBOXS*BSIZE+BSIZE
#defineImwin_ySys_y
#defineTrue1
#defineFalse0
#definespeed_step100
/*命令标号*/
#defineLeft1
#defineRight2
#defineDown3
#defineRoll4
#definePause5
/*按键值(方向键)*/
#defineUP0x4800
#defineDOWN0x5000
#defineLEFT0x4b00
#defineRIGHT0x4d00
/*按键值退出及暂停*/
#defineESC0x011b
#definePAUSE0x1950
#defineTIMER0x1c
/*Private_TypesDefinitions---------------------------------------------------*/
structBOARD
{
intstatus;
intcolor;
}Board[VBOXS][HBOXS];
structShape
{
intbox[4];
intcolor;
intnext;
};
/*Private_Variables----------------------------------------------------------*/
/*游戏参数*/
intspeed=0;
intscore=0;
intGameOver=0;
intTimerCounter=0;
intCurrent_box_numb;
inthighscore;
/*定时器中断函数指针*/
voidinterrupt(*oldtimer)(void);
/*方块形状、颜色、对应编号*/
structShapeshapes[19]=
{
{8,8,12,0,LIGHTBLUE,1},
{14,8,0,0,LIGHTBLUE,2},
{12,4,4,0,LIGHTBLUE,3},
{2,14,0,0,LIGHTBLUE,0},
{4,4,12,0,RED,5},
{8,14,0,0,RED,6},
{12,8,8,0,RED,7},
{14,2,0,0,RED,4},
{8,12,4,0,MAGENTA,9},
{6,12,0,0,MAGENTA,8},
{4,12,8,0,MAGENTA,11},
{12,6,0,0,MAGENTA,10},
{4,14,0,0,YELLOW,13},
{8,12,8,0,YELLOW,14},
{14,4,0,0,YELLOW,15},
{4,12,4,0,YELLOW,12},
{8,8,8,8,BLUE,17},
{15,0,0,0,BLUE,16},
{12,12,0,0,BLUE,18}
};
/*Private_Functions----------------------------------------------------------*/
/*****************************************************************
*
*新的定时中断函数,控制方块掉落速度
*
******************************************************************/
voidinterruptNewTimer(void)
{
(*oldtimer)();
TimerCounter++;
}
/*****************************************************************
*
*新的定时中断函数,控制方块掉落速度
*
******************************************************************/
voidSetNewTimer(voidinterrupt(*IntProc)(void))
{
/*获取定时器中断的中断向量*/
oldtimer=getvect(TIMER);
/*设置新的定时器中断函数前先关闭定时器中断*/
disable();
/*设置新的定时器中断函数*/
setvect(TIMER,IntProc);
/*重新打开定时器中断*/
enable();
}
/*****************************************************************
*
*关闭定时器中断,恢复到原先的中断函数
*
******************************************************************/
voidKillTimer()
{
disable();
setvect(TIMER,oldtimer);
enable();
}
/*****************************************************************
*
*记录游戏的分数
*
******************************************************************/
voidRecode(inthscore)
{
FILE*fp;
/*打开文件*/
if((fp=fopen("Recode.txt","wt"))==NULL)
{
printf("Cannotopenfilestrikeanykeyexit!
");
getch();
exit
(1);
}
/*写入文件*/
fprintf(fp,"%d",hscore);
/*关闭文件*/
fclose(fp);
}
/*****************************************************************
*
*在游戏界面显示最高分
*
******************************************************************/
voidShowHighScore()
{
charhigh_score[5];
charhigh[10];
FILE*fp;
/*打开文件*/
if((fp=fopen("Recode.txt","rt"))==NULL)
{
printf("Cannotopenfilestrikeanykeyexit!
");
getch();
exit
(1);
}
/*读取文件*/
fscanf(fp,"%s",high);
/*将字符串转换成整数*/
highscore=atoi(high);
/*关闭文件*/
fclose(fp);
sprintf(high_score,"%3d",highscore);
setfillstyle(SOLID_FILL,BgColor);
bar(Imwin_x,Imwin_y+2*BSIZE,Imwin_x+3*BSIZE,Imwin_y+4*BSIZE);
outtextxy(Imwin_x,Imwin_y+2*BSIZE,"HighScore");
outtextxy(Imwin_x,Imwin_y+3*BSIZE,high_score);
}
/*****************************************************************
*
*显示当前速度(相当于游戏等级)
*
******************************************************************/
voidShowSpeed()
{
charspeedstr[10];
setfillstyle(SOLID_FILL,BgColor);
bar(Imwin_x,Imwin_y+6*BSIZE,Imwin_x+3*BSIZE,Imwin_y+6*BSIZE+2*BSIZE);
outtextxy(Imwin_x,Imwin_y+4*BSIZE+2*BSIZE,"Level");
sprintf(speedstr,"%3d",speed);
outtextxy(Imwin_x,Imwin_y+6*BSIZE+15,speedstr);
outtextxy(Imwin_x,Imwin_y+6*BSIZE+2*BSIZE,"Nextbox");
}
/*****************************************************************
*
*显示当前分数
*
******************************************************************/
voidShowScore()
{
charscorestr[5];
setfillstyle(SOLID_FILL,BgColor);
bar(Imwin_x,Imwin_y+2*BSIZE+2*BSIZE,Imwin_x+3*BSIZE,Imwin_y+3*BSIZE+2*BSIZE+15);
outtextxy(Imwin_x,Imwin_y+2*BSIZE+2*BSIZE,"Score");
sprintf(scorestr,"%3d",score);
outtextxy(Imwin_x,Imwin_y+2*BSIZE+2*BSIZE+15,scorestr);
}
/*****************************************************************
*
*显示帮助信息
*
******************************************************************/
voidShowHelp()
{
charhelpstr1[30],helpstr2[15];
sprintf(helpstr1+1,"TurnleftTurnright");
helpstr1[0]=27;
helpstr1[12]=26;
sprintf(helpstr2+1,"RollDownward");
helpstr2[0]=24;
helpstr2[7]=25;
setcolor(WHITE);
rectangle(Sys_x-1.5*BSIZE,Sys_y+VBOXS*BSIZE+0.5*BSIZE,Sys_x+HBOXS*BSIZE+1.5*BSIZE,Sys_y+VBOXS*BSIZE+5.5*BSIZE);
setcolor(YELLOW);
outtextxy(Sys_x+4*BSIZE,Sys_y+VBOXS*BSIZE+1*BSIZE,"Help:
");
outtextxy(Sys_x+1.5*BSIZE,Sys_y+VBOXS*BSIZE+1.6*BSIZE,helpstr2);
outtextxy(Sys_x,Sys_y+VBOXS*BSIZE+2.5*BSIZE,helpstr1);
setcolor(FgColor);
}
/*****************************************************************
*
*显示GameOver
*
******************************************************************/
voidShowGameOver()
{
chargameoverstr[30];
setcolor(YELLOW);
sprintf(gameoverstr,"Gameover!
Yourscoreis%d!
",score);
if(GameOver==1)
{
outtextxy(Sys_x,Sys_y+VBOXS*BSIZE+3.5*BSIZE,gameoverstr);
outtextxy(Sys_x,Sys_y+VBOXS*BSIZE+4.5*BSIZE,"Pressanykeytoexit!
");
}
setcolor(FgColor);
}
/*****************************************************************
*
*画游戏板(绘制一个(HBOXS*VBOXS)的网格界面)
*
******************************************************************/
voidDrawGameBoard()
{
inti;
/*rectangle(Sys_x-2*BSIZE,Sys_y-0.1*BSIZE,Sys_x+HBOXS*BSIZE+4*BSIZE,Sys_y+VBOXS*BSIZE+6.5*BSIZE);*/
setfillstyle(SOLID_FILL,BgColor);
/*画垂直线*/
for(i=0;i<=VBOXS;i++)
{
line(Sys_x,Sys_y+i*BSIZE,Sys_x+HBOXS*BSIZE,Sys_y+i*BSIZE);
}
/*画水平线*/
for(i=0;i<=HBOXS;i++)
{
line(Sys_x+i*BSIZE,Sys_y,Sys_x+i*BSIZE,Sys_y+VBOXS*BSIZE);
}
}
/*****************************************************************
*
*显示或者擦除方块
*
******************************************************************/
voidShowOrEraseBox(intx,inty,intbox_numb,intcolor)
{
intmask=8;
registeri,j;
x=Sys_x+x*BSIZE;
y=Sys_y+y*BSIZE;
setfillstyle(SOLID_FILL,color);
/*画方块*/
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if((shapes[box_numb].box[i])&mask)
{
bar(x+j*BSIZE,y+i*BSIZE,x+j*BSIZE+BSIZE,y+i*BSIZE+BSIZE);
line(x+j*BSIZE,y+i*BSIZE,x+j*BSIZE+BSIZE,y+i*BSIZE);
line(x+j*BSIZE,y+i*BSIZE,x+j*BSIZE,y+i*BSIZE+BSIZE);
line(x+j*BSIZE,y+i*BSIZE+BSIZE,x+j*BSIZE+BSIZE,y+i*BSIZE+BSIZE);
line(x+j*BSIZE+BSIZE,y+i*BSIZE,x+j*BSIZE+BSIZE,y+i*BSIZE+BSIZE);
}
mask>>=1;
}
mask=8;
}
}
/*****************************************************************
*
*判断方块能否移动
*
******************************************************************/
intMoveAble(intx,inty,intboxnumb,intaction)
{
intmask=8;
registeri,j;
/*变形*/
if(action==Roll)
boxnumb=shapes[boxnumb].next;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if((shapes[boxnumb].box[i])&mask)
{
switch(action)
{
caseLeft:
{
if(((x+j-1)<0)||(Board[y+i][x+j-1].status==1))
returnFalse;
break;
}
caseRight:
{
if(((x+j+1)>HBOXS-1)||(Board[y+i][x+j+1].status==1))
returnFalse;
break;
}
caseDown:
{
if(((y+i+1)>VBOXS-1)||(Board[y+i+1][x+j].status==1))
returnFalse;
break;
}
caseRoll:
{
if((x+j<0)||(Board[y+i][x+j-1].status==1))
returnFalse;
if((x+j>HBOXS-1)||(Board[y+i][x+j+1].status==1))
returnFalse;
if((y+i>VBOXS-1)||(Board[y+i+1][x+j].status==1))
returnFalse;
break;
}
default:
break;
}
}
mask>>=1;
if(mask==0)
mask=8;
}
}
returnTrue;
}
/*****************************************************************
*
*方块预览
*
******************************************************************/
voidShowPreBox(intnext_box)
{
ShowOrEraseBox(HBOXS+1,9,next_box,shapes[next_box].color);
}
/*****************************************************************
*
*擦除预览
*
******************************************************************/
voidErasePreBox(intcurrent_box)
{
inti=0,j=0,x,y,mask=8;
x=Imwin_x;
y=Imwin_y+9*BSIZE;
setfillstyle(SOLID_FILL,BgColor);
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if((shapes[current_box].box[i])&mask)
{
bar(x+j*BSIZE,y+i*BSIZE,x+j*BSIZE+BSIZE,y+i*BSIZE+BSIZE);
}
mask>>=1;
if(mask==0)
mask=8;
}
}
}
/*****************************************************************
*
*产生下一个方块
*
******************************************************************/
intMakeNewBox(intx,inty)
{
inti,j,mask=8;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
if((shapes[Current_box_numb].box[i])&mask)
{
Board[y+i][x+j].status=1;
Board[y+i][x+j].color=shapes[Current_box_numb].color;
}
mask>>=1;
if(mask==0)
mask=8;
}
}
retu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 语言 俄罗斯方块 程序