⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 russia.c

📁 基于C语言的俄罗斯方块游戏机程序,可以很方便的应用到各种游戏机中去.
💻 C
📖 第 1 页 / 共 2 页
字号:
	}
}
void DelRussia( RUSSIADATA * p )
{
	int i,j,f;
	char *d,*s;
	for(j=23; j>0; j--)
	{
		f = 1;
		for(i=0; i<10; i++)
		{
			if(p->map[j][i]==0){f=0;break;}
		}
		if( f )
		{
			f = j*10;
			s = p->map[j]-1;
			d = p->map[j+1]-1;
			while( f-- )*d-- = *s--;
			memset( p->map[0], 0, 10 );
			j++;
		}
	}
}
void TimeRussia( RUSSIADATA * p )
{
	int i;
	if( p->Flag != 1 )return;
	//触地判断。
	BlockOut( p );
	p->FlyY++;
	if( !BlockIn( p ) )
	{
		if( p->FlyY < 4 )//游戏结束。
		{
			p->Flag = 3;
			SSS_Timer_Out( RMSG_TIME );
			//启动动画。
			memset( p->map, 0, 24*10 );
			DrawRussia( p );
			for( i=23; i>=4; i-- )
			{
				memset( p->map[i], 1, 10 );
				DrawRussia( p );
				Sleep( 40 );
			}
		}
		else//触地。
		{
			p->FlyY--;
			if( BlockIn( p ) )StepRussia( p );
			DelRussia( p );
		}
	}
	DrawRussia( p );
}
void CircleRussia( RUSSIADATA * p )
{
	int i;
	if( p->Flag != 1 )return;
	i = p->FlyF;
	BlockOut( p );
	p->FlyF = (p->FlyF+1)%4;
	if( !BlockIn( p ) )
	{
		p->FlyF = i;
		BlockIn( p );
	}
	DrawRussia( p );
}
void RightRussia( RUSSIADATA * p )
{
	if( p->Flag != 1 )return;
	BlockOut( p );
	p->FlyX++;
	if( !BlockIn( p ) )
	{
		p->FlyX--;
		BlockIn( p );
	}
	DrawRussia( p );
}
void LeftRussia( RUSSIADATA * p )
{
	if( p->Flag != 1 )return;
	BlockOut( p );
	p->FlyX--;
	if( !BlockIn( p ) )
	{
		p->FlyX++;
		BlockIn( p );
	}
	DrawRussia( p );
}

void Run( void* pDummy )
{
	int i = 0, j = 0;
	int msg;
	int KeyDown=0,KeyLeft=0,KeyRight=0,KeyCircle=0;
	RUSSIADATA Data = {0,};

	srand( GetTickCount() );
	if( !InitRussia( &Data ) )SSS_Exit();
	else DrawRussia( &Data );

	while(1)
	{
		SSS_Cpu_Halt( 0 );
		while( GetMsg( &msg ) )
		{
			switch( msg )
			{
			case RMSG_PAINT:DrawRussia( &Data );break;
			case RKEY_SPEEDUP:
				if( Data.Speed<80 )
				{
					Data.Speed+=5;
					if( Data.Flag == 1 )
					{
						SSS_Timer_Out( RMSG_TIME );
						SSS_Timer_Init( RMSG_TIME, (100-Data.Speed)*2/3, IntTime );
					}
					else SendMsg( RMSG_PAINT );
				}
				break;
			case RKEY_SPEEDDOWN:
				if( Data.Speed>5 )
				{
					Data.Speed-=5;
					if( Data.Flag == 1 )
					{
						SSS_Timer_Out( RMSG_TIME );
						SSS_Timer_Init( RMSG_TIME, (100-Data.Speed)*2/3, IntTime );
					}
					else SendMsg( RMSG_PAINT );
				}
				break;
			case RKEY_START:
				StartRussia( &Data );
				break;
			case RKEY_PAUSE:
				PauseRussia( &Data );
				break;
			case RKEY_LEFT:
				j = -1; KeyLeft = 1;
				LeftRussia( &Data );
				break;
			case RKEY_RIGHT:
				j = -1; KeyRight = 1;
				RightRussia( &Data );
				break;
			case RKEY_DOWN:
				i = 8; KeyDown = 1;
				break;
			case RKEY_CIRCLE:
				j = -6; KeyCircle = 1;
				CircleRussia( &Data );
				break;
			case RMSG_TIME:
				if( Data.Flag == 1 )
				{
					i += (KeyDown ? 4: 1);
					if( ++j>= 5 )
					{
						if( KeyLeft && KeyRight )
						{
							j = 0;
						}
						if( KeyLeft )
						{
							i -= 4;
							j = 0;
							LeftRussia( &Data );
						}
						if( KeyRight )
						{
							i -= 4;
							j = 0;
							RightRussia( &Data );
						}
						if( KeyCircle )
						{
							i = 0;
							j = 0;
							CircleRussia( &Data );
						}
					}
					if( i>= 8 )
					{
						i = 0;
						TimeRussia( &Data );
					}
				}
				break;
			case RKEY_LEFT+10: KeyLeft = 0; break;
			case RKEY_RIGHT+10: KeyRight = 0; break;
			case RKEY_DOWN+10: KeyDown = 0; break;
			case RKEY_CIRCLE+10: KeyCircle = 0; break;
			}
		}
	}
}


void IntKey( int ID,int keystatus,int count)
{
	switch( keystatus )
	{
	case KEY_STATUS_DOWN:
		SendMsg( ID );
		SSS_Cpu_Interrupt( 0 );
		break;
	case KEY_STATUS_UP:
		SendMsg( ID+10 );
		SSS_Cpu_Interrupt( 0 );
		break;
	case KEY_STATUS_CONTINUE:
		break;
	}
}

void KeyAdd( int ID, DWORD vKey, int* p )
{
	SSS_BUTTON b,*pSssBtn;

	b.pBmpName = MAKEINTRESOURCE(IDB_BUTTON);
	b.transColorFlag = 1;
	b.transColor = RGB(0,0,0);

	if( p )
	{
		b.x = p[0];
		b.y = p[1];
		SetRect( &b.rcUp, p[4], p[5], p[4]+p[2], p[5]+p[3] );
		SetRect( &b.rcDown, p[6], p[7], p[6]+p[2], p[7]+p[3] );
		pSssBtn = &b;
	}
	else pSssBtn = NULL;
	SSS_Key_Add( ID, vKey, pSssBtn );
}

void OnCreate()
{
	int Btn[6][8]=
	{
		//{dX,dY,Width,High,sUpX,sUpY,sDownX,sDownY,},
		{131,182,37,22,0,0,37,0,},
		{171,182,37,22,0,22,37,22,},
		{211,182,37,22,0,44,37,44,},
		{171,154,37,22,0,66,37,66,},
		{173,103,33,20,0,88,33,88,},
		{173,127,33,20,0,108,33,108,},
	};
	SSS_Key_Init( 50, IntKey );
	SSS_Key_OnOff( 1 );

	KeyAdd( RKEY_LEFT, SKEY_LEFT, &Btn[0][0]);
	KeyAdd( RKEY_DOWN, SKEY_DOWN, &Btn[1][0]);
	KeyAdd( RKEY_RIGHT, SKEY_RIGHT, &Btn[2][0]);
	KeyAdd( RKEY_CIRCLE, SKEY_UP, &Btn[3][0]);
	KeyAdd( RKEY_START, SKEY_RETURN, &Btn[4][0]);
	KeyAdd( RKEY_PAUSE, SKEY_ESCAPE, &Btn[5][0]);
	KeyAdd( RKEY_SPEEDUP, SKEY_PGDN, NULL );
	KeyAdd( RKEY_SPEEDDOWN, SKEY_PGUP, NULL );

	SSS_Cpu_Init( 0, Run, 0 );
}


/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□-------DLGHelpAboutProc()--------------------------------------------
□   处理ABOUT对话框的消息回调函数。
□---2001.7.30---------------------------------------------------------
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
long FAR PASCAL DLGHelpAboutProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_INITDIALOG:
		break;
	case WM_COMMAND:
		switch(wParam)
		{
		case ID_OK:PostMessage(hWnd,WM_CLOSE,0,0);break;
		case IDC_HOMEPAGE:
			{
				HWND hWndURL = GetDlgItem(hWnd, wParam);
				char url[256];
				GetWindowText(hWndURL, url, sizeof(url));
				ShellExecute(hWnd, 
							 "open", 
							 url, 
							 NULL, 
							 NULL, 
							 SW_SHOWNORMAL);
			}
			break;
		case IDC_EMAIL:
			ShellExecute(hWnd, 
						 "open", 
						 "mailto:wwwbbbjjj@eyou.com", 
						 NULL, 
						 NULL, 
						 SW_SHOWNORMAL);
			break;
		}
		break;
	case WM_CLOSE:EndDialog(hWnd, 0);break;
	default:return(0);break;               
	}
	return(1);
}

/*≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
□-------MainProc()----------------------------------------------------
□   处理主窗口的消息回调函数。
□---------------------------------------------------------------------
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡*/
LRESULT WINAPI MainProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
	switch( message )
    {
	case WM_CREATE:
		OnCreate();
		break;
	//绘制窗口背景图。
	case WM_ERASEBKGND:
		return 1;
	case WM_PAINT:
		SendMsg( RMSG_PAINT );
		SSS_Cpu_Interrupt( 0 );
		break;
	case WM_COMMAND: 
		switch(LOWORD(wParam))
		{    
		case ID_GAME_ABOUT:
			DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT),hWnd,(DLGPROC)DLGHelpAboutProc);
			break;
		case ID_SSS:
			PostMessage( hWnd, WM_HOTKEY, 0xbfff, 0 );
			break;
		case ID_GAME_NEW:
			SendMsg( RKEY_START );
			SSS_Cpu_Interrupt( 0 );
			break;
		case ID_GAME_PAUSE:
			SendMsg( RKEY_PAUSE );
			SSS_Cpu_Interrupt( 0 );
			break;
		case ID_SPEED_ADD:
			SendMsg( RKEY_SPEEDUP );
			SSS_Cpu_Interrupt( 0 );
			break;
		case ID_SPEED_DEC:
			SendMsg( RKEY_SPEEDDOWN );
			SSS_Cpu_Interrupt( 0 );
			break;
		case ID_GAME_EXIT:SSS_Exit();break;
		} 
		break;
	}
	return 0;
}
int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{

	SSS_WINDOW sWnd;
	g_hInstance = hInstance;
	SSS_SetRegCode( "EVALUATE", "29O33P7M" );

	memset( &sWnd,0,sizeof(sWnd) );

	sWnd.IfWndFrame = FALSE;
	sWnd.Width = 260;
	sWnd.Height = 220;
	sWnd.pTitleStr = "SSS Example - RUSSIA";
	sWnd.pBmpName = MAKEINTRESOURCE(IDB_FACE);
	sWnd.transColor = RGB(0,0,0);
	sWnd.iconID = IDI_ICON;
	sWnd.menuID = IDR_MENU;
	sWnd.popmenuID = IDR_POPMENU;
	sWnd.accelID = IDR_ACCELERATOR;
	sWnd.pFuncWndProc = MainProc;

	return SSS_InitWnd( &sWnd );
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -