#include"RussiaBall.h"
static void flushQ (void)
{
UGL_MSG msg;
UGL_STATUS status;
do
{
status = uglInputMsgGet (inputServiceId, &msg, UGL_NO_WAIT);
} while (status != UGL_STATUS_Q_EMPTY);
}
/*
* cleanUp - cleans up all resources prior to termination
*/
static void cleanUp
(
int mode /* Operating mode */
)
{
UGL_FREE(colorData);
uglRegionDestroy(regionId);
UGL_FREE (randomData);
UGL_FREE (SPEED);
UGL_FREE (ScreenArray);
UGL_FREE (colorTable);
UGL_FREE (Block);
uglFontDestroy (fontFixed);
uglFontDestroy (fontDialog);
uglFontDestroy (fontSystem);
uglGcDestroy (gc);
uglDeinitialize();
}
#if defined(WINDML_NATIVE) && defined(__unix__)
/**************************************************************************
*
* main - start of demo program for unix native simulator
*
* Start the example program.
*
* RETURNS:
*
* ERRNO: N/A
*
* SEE ALSO:
*
* NOMANUAL
*
*/
int main (int argc, char *argv [])
{
int mode = 0;
if (argc > 1)
mode = atoi (argv [1]);
Russia (mode);
return 0;
}
#elif defined(WINDML_NATIVE) && defined(_WIN32)
/**************************************************************************
*
* WinMain - start of demo program for windows native simulator
*
* Start the example program.
*
* RETURNS:
*
* ERRNO: N/A
*
* SEE ALSO:
*
* NOMANUAL
*
*/
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nShowCmd)
{
uglWin32Parameters(hInstance, hPrevInstance, lpCmdLine, nShowCmd);
Russia(0);
return (0);
}
#else
void StartGame(int mode/* Operating mode */)
{
uglOSTaskCreate("tRussia", (UGL_FPTR)Russia, 110, 0, 10000,mode,0,0,0,0);
}
#endif
/**************************************************************************
*
*
*/
void Russia(int mode/* Operating mode */)
{
int numRandomPoints;
int i, index,x, y, textpage, tmp;
int textWidth, textHeight;
int x_old,y_old;
int j,temp,k,flag,nextk;/*score=0,=======*/
Init(mode);
flag=GameStart();
if(flag ==QUIT)
{
cleanUp(mode);
return;
}
k=generateBlock();/*随机生成基本图样*/
x=8;/*设置方块下落的起始横坐标为屏幕中心偏右两格*/
y=27;/*纵坐标位置*/
while(1)
{
/*======游戏设置判断有设置则为1 然后重置为0=======*/
if(russia.ResetFlag==1)
{
russia.ResetFlag=0;
russia.Speed=russia.SpeTemp;
russia.Level=russia.LevTemp;
russia.dTime = SPEED[russia.SpeTemp];
/*根据设置的不同的等级 设置不同级别初始屏幕*/
temp=rand()%7+1;
for (i = 0; i < Line; i++)
for (j=0;j < russia.Level; j ++)
if(ScreenArray[j][i] = (rand()) % 2)
ScreenArray[j][i]=temp;
}
nextk=generateBlock();/*========生成下一个图新=========*/
refreshPreview();/*========刷新预览区域,显示下一个图形=========*/
refreshCtrlPad();/*========刷新游戏设置区域=========*/
displayBlock(23,21,nextk);/*=======显示下一个预览==========*/
/*如果第一个产生的Block都不能通过check函数,说明游戏结束*/
while(check(x,y-1,k)==CAN_MOVE)
{
y--;/*图形纵坐标位置减1*/
displayBlock(x,y,k);/*重新显示 */
flag=messageHandle(&x,&y,&k); /*检测键盘输入*/
refreshScreen(0);
if(flag==RESET || flag ==QUIT)/*===========reset=================*/
break;
if(flag==GAMESET)/*=============set=================*/
{
GameSet();
break;
}
}
if(!flag)
{
add(x,y,k);
removeLine();
}
k=nextk;
x=8;/*屏幕中间*/
y=27;/*屏幕中间最上*/
refreshScreen(0);
if(flag==QUIT)
{
endingShow();
break;
}
if(check(x,y,k)==CANNOT_MOVE || flag)
{
endingShow();
ResetData();/*==========不能动了 重新初始化==========*/
}
}
cleanUp(mode);
return;
}
/*
void startingShow()
{
int i,j,k;
for(k=0;k<2;k++){
for(i=0;i<28;i++)
for(j=0;j<20;j++)
ScreenArray[i][j]=1-ScreenArray[i][j];
refreshScreen(1);
}
for(i=0;i<28;i++)
for(j=0;j<20;j++)
ScreenArray[i][j]=0;
}
*/
void endingShow()
{
int i,j,k;
k=rand()%7+1;
for(i=0;i<30;i++)
{
for(j=0;j<20;j++)
ScreenArray[i][j]=k;
}
refreshScreen(1);
for(i=30;i>=0;i--)
{
for(j=0;j<20;j++)
ScreenArray[i][j]=0;
refreshScreen(0);
uglOSTaskDelay(10);
}
}
/**
功能:在指定位置显示指定基本图样
int x 单元格横坐标 取值范围:0--19
int y 单元格纵坐标 取值范围:0--27+3
int k 基本图样类型 取值范围:0--27
*/
void displayBlock(int x,int y,int k)
{
/*left,right,top,bottom为像素坐标*/
int i,left,right,top,bottom;
int position[4][2]={0};
uglBatchStart(gc);
uglForegroundColorSet(gc, colorTable[0].uglColor);/*颜色和背景色一样*/
uglBackgroundColorSet(gc, colorTable[0].uglColor);
uglLineWidthSet(gc, 1);
uglForegroundColorSet(gc, colorTable[LINECOLOR].uglColor);/*颜色和虚线一样*/
uglBackgroundColorSet(gc, colorTable[(int)k/4+1].uglColor);
uglLineWidthSet(gc, 1);
for(i=0;i<4;i++)
{
position[i][0]=y+Block[k][i][0];
position[i][1]=x+Block[k][i][1];
/*将屏幕上单位格的数组坐标转换为像素坐标*/
left=GameLeft+20*position[i][1];
top=GameBottom-20*position[i][0]-20;
right=left+20;
bottom=top+20;
if(top>15)
uglRectangle(gc, left, top , right, bottom);
}
uglBatchEnd(gc);
}
/**
功能
int x 单元格横坐标 取值范围:0--19
int y 单元格纵坐标 取值范围:0--27+3
int k 基本图样类型 取值范围:0--27
*/
void refreshPreview()
{
int i,j,left,right,top,bottom;
uglBatchStart(gc);
uglForegroundColorSet(gc, colorTable[INBLUE].uglColor);/*颜色和背景色一样*/
uglBackgroundColorSet(gc, colorTable[INBLUE].uglColor);
uglLineWidthSet(gc, 2);
/*uglRectangle(gc, GameRight+4, GameTop+2 , displayWidth-22, displayHeight-24);*/
for(i=0 ; i<4 ; i++)
for(j=0 ; j<4 ; j++)
{
left=GameLeft+20*(j+23)-30;
top=GameBottom-20*(23+i);
right=left+20+50;
bottom=top+20+20;
if(top>15)
uglRectangle(gc, left, top , right, bottom);
}
uglBatchEnd(gc);
}
/**
功能:随机生成基本图样
*/
int generateBlock()
{
return ((rand()+russia.Score+russia.Speed) % 28);
}
/**
功能:检测基本图样是否越界或是否可以移动
Param:
int x 单元格横坐标 取值范围:0--19
int y 单元格纵坐标 取值范围:0--27+3
int k 基本图样类型 取值范围:0--27
Retval:
CAN_MOVE: 能够移动
CANNOT_MOVE:不能移动
*/
int check(int x,int y,int k)
{
int i,sum=0,Position[4][2]={0};
for(i=0;i<4;i++)
{
Position[i][0]=y+Block[k][i][0];
Position[i][1]=x+Block[k][i][1];
if( Position[i][0] < 0 || Position[i][0] >= Row+4 )/*行越界*/
return CANNOT_MOVE;
if( Position[i][1] < 0 || Position[i][1] >= Line )/*列越界*/
return CANNOT_MOVE;
/*判断非空需要排除当前正在移动的图形*/
}
/*判断当前位置是否有效*/
for(i=0;i<4;i++)
sum+=ScreenArray[Position[i][0]][Position[i][1]];
if(sum>0)
{
return CANNOT_MOVE;
}
else
return CAN_MOVE;
}
/*
功能:刷屏
Param: NULL
Retval: NULL
*/
void refreshScreen(int timeout)
{
int i,j;
int left,right,top,bottom;
uglBatchStart(gc);
/*画出已有的方格*/
for(i=0;i<Row;i++)
{
for(j=0;j<Line;j++)
{
left=GameLeft+j*CheckWidth;
top=GameBottom-(i+1)*CheckWidth;
right=GameLeft+(j+1)*CheckWidth;
bottom=GameBottom-i*CheckWidth;
if(ScreenArray[i][j]!=0)
{
uglForegroundColorSet(gc, colorTable[LINECOLOR].uglColor);
uglBackgro