*************************************************** * Function Name : main * Description : Main program * Input : None * Output : None * Return : None *******************************************************************************/ int main(void) { //画出游戏界面 initgraph(WINDOW_WIDTH, WINDOW_HIGH) ; //初始化图形窗口 cleardevice() ; DrawGameGUI() ; //使用 API 函数修改窗口名称 HWND hWnd = GetHWnd(); SetWindowText(hWnd, 俄罗斯方块); //初始化参数 InitProcParameters() ; //游戏过程 PlayGame() ; closegraph() ; return 0 ; }
下面是源文件init.cpp---游戏运行前 初始化的一些方法
/************************ (C) COPYRIGHT 2013 yang_yulei ************************
* File Name : init.cpp
* Author : yang_yulei
* Date First Issued : 12/18/2013
* Description :
*
********************************************************************************
*
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include head.h
/* Variables -----------------------------------------------------------------*/
extern char g_gameBoard[][X_ROCK_SQUARE_NUM+2] ;
extern int g_rockTypeNum ;
extern RockType rockArray[] ;
/* Function prototypes -------------------------------------------------------*/
static int ReadRockShape(void) ;
static unsigned int ShapeStr2uInt(char* const);
/*******************************************************************************
* Function Name : InitProcParameters
* Description : 在正式开始运行游戏前,初始化一些参数:g_gameBoard
从配置文件中读取系统中俄罗斯方块的形状
* Be called : main
* Input : None
* Output : g_gameBoard rockArray
* Return : None
*******************************************************************************/
//初始化程序参数
int
InitProcParameters(void)
{
int i ;
//初始化游戏板(把这个二维数组的四周置1,当作围墙,用于判断边界)
for (i = 0; i < X_ROCK_SQUARE_NUM+2; i++)
{
g_gameBoard[0][i] = 1 ;
g_gameBoard[Y_ROCK_SQUARE_NUM+1][i]= 1 ;
}
for (i = 0; i < Y_ROCK_SQUARE_NUM+2; i++)
{
g_gameBoard[i][0] = 1 ;
g_gameBoard[i][X_ROCK_SQUARE_NUM+1]= 1 ;
}
//从配置文件中读取游戏中所有方块的形状点阵
ReadRockShape() ;
return 0 ;
}
/*******************************************************************************
* Function Name : ReadRockShape
* Description : 从配置文件中读取系统中俄罗斯方块的形状 把它记录在rockArray中
* Be called : InitProcParameters
* Input : rockshape.ini
* Output : rockArray
* Return : 成功返回0 失败返回1
*******************************************************************************/
int
ReadRockShape(void)
{
FILE* fp ;
int i = 0 ;
int len = 0 ;
int rockArrayIdx = 0 ;
int shapeNumPerRock = 0 ; //一种方块的形态数目(用于计算方块的nextRockIndex)
char rdBuf[128] ;
char rockShapeBitsStr[128] = {0};
unsigned int shapeBits = 0 ;
g_rockTypeNum = 0 ;
//打开配置文件 从中读取方块的形状
fp = fopen(.\rockshape.ini, r) ;
if (fp == NULL)
{
perror(open file error!
) ;
return 1 ;
}
while (fgets(rdBuf, 128, fp) != NULL)
{
len = strlen(rdBuf) ;
rdBuf[len-1] = '' ;
switch (rdBuf[0])
{
case '@': case '#':
strcat(rockShapeBitsStr, rdBuf) ;
break ;
case 0 : //一个方块读取结束
shapeBits = ShapeStr2uInt(rockShapeBitsStr) ;
rockShapeBitsStr[0] = 0 ;
shapeNumPerRock++ ;
rockArray[rockArrayIdx].rockShapeBits = shapeBits ;
rockArray[rockArrayIdx].nextRockIndex = rockArrayIdx + 1 ;
rockArrayIdx++ ;
g_rockTypeNum++ ; //记录方块数量的全局变量+1
break ;
case '-'://一种方块读取结束(更新其nextRockIndex值)
rockArray[rockArrayIdx-1].nextRockIndex = rockArrayIdx - shapeNumPerRock ;
shapeNumPerRock = 0 ;
break ;
default :
break ;
}
}//while()
return 0 ;
}
/*******************************************************************************
* Function Name : ShapeStr2uInt
* Description : 把配置文件中的描述方块形状的字符串 转化为 unsigned int型
* Be called :
* Input : shapeStr 描述方块形状的字符串(从文件中读取的)
* Output : None
* Return : unsigned int型的方块形状点阵(用其低16位表示)
*******************************************************************************/
unsigned int
ShapeStr2uInt(char* const shapeStr)
{
unsigned int shapeBitsRet = 0 ;
char* p = shapeStr ;
for (p += 15; p >= shapeStr; p--)
{
if (*p == '@')
{
shapeBitsRet |= ((unsigned int)1 << (&shapeStr[15]-p)) ;
}
}
return shapeBitsRet ;
}
下面是源文件GUI.cpp---一些关于在界面上画出界面的一些方法
/************************ (C) COPYRIGHT 2013 yang_yulei ************************
* File Name : GUI.cpp
* Author : yang_yulei
* Date First Issued : 12/18/2013
* Description :
*
********************************************************************************
*
*******************************************************************************/
/* Includes ------------------------------------------------------------------*/
#include head.h
/* Variables -----------------------------------------------------------------*/
//预览区位置
RockLocation_t previewLocation = {GUI_WALL_SQUARE_WIDTH*GUI_xWALL_SQUARE_NUM+70, 50} ;
extern RockType rockArray[] ;
/*******************************************************************************
* Function Name : DrawRock
* Description : 在游戏区画出编号为rockIndex的方块
* Be called : PlayGame()
* Input : rockIndex :
currentLocatePtr: 此方块的位置
displayed : 此方块是否显示
* Output : None
* Return : None
*******************************************************************************/
void
DrawRock(int rockIndex, const struct LOCATE * currentLocatePtr, BOOL displayed)
{
int i ;
int mask ;
int rockX ; //俄罗斯方块的4*4模型的左上角点x轴的坐标
int rockY ; //俄罗斯方块的4*4模型的左上角点y轴的坐标
int spaceFlag ; //占位标记(用于g_gameBoard,1表示某处有方块 0表示此处无方块)
int color ; //画出的方块的颜色
//若此方块是用于显示的,则设置其颜色为白色,其占位标记设为1
//否则设置其颜色为黑色(背景色),占位标记设为0
displayed (color = WHITE,spaceFlag = 1)
: (