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

📄 mmisnake.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
	drawDiamond(data->Diamonddata[data->headX][data->headY].nextX,data->Diamonddata[data->headX][data->headY].nextY);
	
	if(uRet == Snake_Diamond_Food1)
		data->foodadd = 1;
	return uRet;
}
/******************************************************
$Description:gernate food
$Argument:
	@isDraw: 0 don't draw food
			 1 draw food	
	@return:0 fail
			1 success	
*********************************************************/
U8 gernateFood(U8 isDraw)
{
	int i = 0;
	int size = GameSnake_Width*GameSnake_Height;
	Snake_DiamondData *pDiamondData = (Snake_DiamondData*)snakedata.Diamonddata;

	int nFood = rand()%(size);

	i  = nFood;
	while((pDiamondData+i)->state != 0)
	{
		if(i == size -1)
			i = 0;
		else
			i ++;
		if(i == nFood)
			return 0;
	}
	(pDiamondData+i)->state = Snake_Diamond_Food1 + rand() % GET_ICONATTR_NUM(ICON_SNAKE_FOOD);

	//dspl food
	if(isDraw)
	{	
		U8 foodX = i/GameSnake_Height;
		U8 foodY = i%GameSnake_Height;
		drawDiamond(foodX,foodY);	
	
	}
	return 1;
}

/*2004/04/27,talcon add*/
void clearDiamond(U8 posX,U8 posY)
{
	dspl_BitBlt_ext(GameSnake_ZonePosX+posX*GameSnake_Diamond,
			GameSnake_ZonePosY+posY*GameSnake_Diamond,
			posX%GameSnake_BkgDiamond*GameSnake_Diamond,
			posY%GameSnake_BkgDiamond*GameSnake_Diamond,
			GameSnake_Diamond,
			GameSnake_Diamond,
			GameSnake_Diamond*GameSnake_BkgDiamond,
			GameSnake_Diamond*GameSnake_BkgDiamond,
			0,
			(void *)GET_ICONATTR(ICON_SNAKE_BKG,0)->icons,//(void *)snake_BkgDiamond, 
			0);
}

void drawDiamond(U8 posX,U8 posY)
{
	Snake_DiamondData *data = (Snake_DiamondData*)&snakedata.Diamonddata[posX][posY];
	void *icon = 0;
	void *iconmask = 0;
	if(posX>=GameSnake_Width || posY>=GameSnake_Height)
	{
		return;
	}
	switch(data->state)
	{
	case Snake_Diamond_None://none
		dspl_BitBlt_ext(GameSnake_ZonePosX+posX*GameSnake_Diamond,
						GameSnake_ZonePosY+posY*GameSnake_Diamond,
						posX%GameSnake_BkgDiamond*GameSnake_Diamond,
						posY%GameSnake_BkgDiamond*GameSnake_Diamond,
						GameSnake_Diamond,
						GameSnake_Diamond,
						GameSnake_Diamond*GameSnake_BkgDiamond,
						GameSnake_Diamond*GameSnake_BkgDiamond,
						0,
						(void *)GET_ICONATTR(ICON_SNAKE_BKG,0)->icons,//(void *)snake_BkgDiamond, 
						0);
		break;
	case Snake_Diamond_Food1:
	case Snake_Diamond_Food2:
	case Snake_Diamond_Food3:
	case Snake_Diamond_Food4:
	case Snake_Diamond_Food5:
	case Snake_Diamond_Food6:
		icon = (void*) (GET_ICONATTR(ICON_SNAKE_FOOD,0)->icons + (data->state - Snake_Diamond_Food1)*GameSnake_Diamond*GameSnake_Diamond*2);
		iconmask = (void*) (GET_ICONATTR(ICON_SNAKE_FOODMASK,0)->icons + (data->state - Snake_Diamond_Food1)*GameSnake_Diamond*GameSnake_Diamond*2); 
		break;
	case Snake_Diamond_Wall:
		icon = (void*) GET_ICONATTR(ICON_SNAKE_WALL,0)->icons;
		break;
	case Snake_Diamond_Snake:
		if(data->previousX == 0xff || data->previousY == 0xff)//is head
		{
			//up
			if(posX == data->nextX && posY == data->nextY  - 1)
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,0)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,0)->icons;
			}
			else if(posX == data->nextX && posY == data->nextY + 1)//down
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,1)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,1)->icons;
			}
			else if(posX == data->nextX - 1 && posY == data->nextY )//right
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,2)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,2)->icons;
			}
			else if(posX == data->nextX + 1 && posY == data->nextY )//left
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,3)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,3)->icons;
			}
		}
		else if(data->nextX == 0xff || data->nextY == 0xff)//tail
		{
			if(posX == data->previousX && posY == data->previousY -1)//up	
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,6)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,6)->icons;
			}
			else if(posX == data->previousX && posY == data->previousY +1)//down
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,5)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,5)->icons;
			}
			else if(posX == data->previousX - 1 && posY == data->previousY )//left
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,8)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,8)->icons;
			}
			else if(posX == data->previousX + 1 && posY== data->previousY )//right
			{
				icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,7)->icons;
				iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,7)->icons;
			}
		}
		else
		{
			icon = (void*)GET_ICONATTR(ICON_SNAKE_BODY,4)->icons;
			iconmask = (void*)GET_ICONATTR(ICON_SNAKE_BODYMASK,4)->icons;
		}
	
		break;
	default:
		break;
	}
	if(icon)
	{
		posX = GameSnake_ZonePosX+posX*GameSnake_Diamond;
		posY = GameSnake_ZonePosY+posY*GameSnake_Diamond;
		if(iconmask)
		{
			dspl_BitBlt(posX,posY,
				GameSnake_Diamond,GameSnake_Diamond,
				0, (void *)icon, DSPL_BMPXOR);
			dspl_BitBlt(posX,posY,
				GameSnake_Diamond,GameSnake_Diamond,
				0, (void *)iconmask, DSPL_BMPAND);
			dspl_BitBlt(posX,posY,
				GameSnake_Diamond,GameSnake_Diamond,
				0, (void *)icon, DSPL_BMPXOR);
		}
		else
		{
			dspl_BitBlt(posX,posY,
				GameSnake_Diamond,GameSnake_Diamond,
				0, (void *)icon, 0);
		}
	}
}

void redrawAll()
{
	int i;
	int j;
	U32 oldColor;

	dspl_ClearAll();

	dspl_DrawRect(GameSnake_ZonePosX - 1,GameSnake_ZonePosY,
				GameSnake_ZonePosX - 1 + GameSnake_Width*GameSnake_Diamond+1,
				GameSnake_ZonePosY + GameSnake_Height*GameSnake_Diamond - 1);

	//draw bkg	
	for(i = 0; i< GameSnake_Height; i += GameSnake_BkgDiamond)
	{
		for(j = 0; j< GameSnake_Width;j += GameSnake_BkgDiamond )
		{
			DRAW_ICON_ATTRIBUTE(ICON_SNAKE_BKG, GameSnake_ZonePosX + j * GameSnake_Diamond, GameSnake_ZonePosY + i * GameSnake_Diamond, 0, ICON_LOCATION);			
			/*dspl_BitBlt(GameSnake_ZonePosX + j * GameSnake_Diamond,
				GameSnake_ZonePosY + i * GameSnake_Diamond,
				GameSnake_BkgDiamond*GameSnake_Diamond,
				GameSnake_BkgDiamond*GameSnake_Diamond,
				0,
				(void *)GetIconAttr(ICON_SNAKE_BKG,0)->icons,//(void *)snake_BkgDiamond, 
				0);	*/		
		}
	}
	
	for(i = 0;i<GameSnake_Width; i++)
	{
		for(j = 0; j<GameSnake_Height ;j++)
		{
			if(snakedata.Diamonddata[i][j].state != Snake_Diamond_None)
			{
				drawDiamond(i,j);
			}			
		}
	}

	//oldColor = dspl_SetBkgColor(0xBDBF9B);
	//dspl_fill_rectangle(0, GameSnake_Height * GameSnake_Diamond -1 , SCREEN_WIDTH , SCREEN_HIGH);
	//dspl_SetBkgColor(oldColor);
	//draw speed
	//2004/07/01 yhf modify
	drawGameNumber(85, GameSnake_Diamond *GameSnake_Height, snakedata.speed);
	//draw score
	drawGameNumber(20, GameSnake_Diamond *GameSnake_Height, snakedata.score);		
}

void SnakeData_Init()
{
	readSnakeMap();

	gernateFood(0);

	snakedata.speed = 0;
	snakedata.score = 0;
	snakedata.uMove = MoveUp;

	flash_Gameread();
}

/********************win function****************************/
static int GameSnake_win_cb (MfwEvt e, MfwWin *w)
{
	U8 uMode;
#if (MAIN_LCD_SIZE==3)
	Snake_Data* data = (Snake_Data *)w->user;//shiheng porting
	
#endif
    switch ( e )
    {
    case MfwWinVisible:
		uMode = dspl_Enable(0);
		switch(snakedata.uGameState)
		{
#if (MAIN_LCD_SIZE==3)
		case  Snake_Init:
			Snake_MnuShow();
			//snake_MnuItemIcnShow(&snakedata);
			//timStart(snakedata.timer);
			break;
#endif
		case Snake_Ready:
			SnakeData_Init();
			//timStart(snakedata.timer);
			redrawAll();
			break;
#if(MAIN_LCD_SIZE==3)
		case Snake_Help:
			dspl_ClearAll();
			//			snake_help();/*2004/5/26, wy modify*///shiheng porting
			game_display_help(data->edt);
			break;			
#endif
		case Snake_Running:
			redrawAll();
			break;
		case Snake_Exit:
			//dspl_ClearAll();
			//Draw_Dialog((char *)MmiRsrcGetText(TxtExitGame));
			draw_icon_require();
#if(MAIN_LCD_SIZE==3)//jhxu720
			ALIGNED_PROMPT(CENTER_RIGHT, DIALOG_HALF_FIRSTSECOND, DSPL_TXTATTR_TRANSPARENT, TxtExitGame);				
#else
			ALIGNED_PROMPT(CENTER, DIALOG_FIRST_LINE, DSPL_TXTATTR_TRANSPARENT, TxtExitGame);
#endif			
			dsplsoftkey(TxtGameGoon, TxtGameExit);
			break;
		case Snake_Rank://score 
			if(Snake_Init == snakedata.uGameStateOld)
				Game_Scoreshow(&ffs_gamedata.Snake_ffsScore,-1,0,0);
			else
				Game_Scoreshow(&ffs_gamedata.Snake_ffsScore,snakedata.score,0,1);
			break;
		case Snake_KeyInfo:
			dspl_ClearAll();
			Key_Setshow(2);
			break;
		case Snake_Select:
			dspl_ClearAll();
			Game_StageSelect(SNAKE_STAGE,snakedata.stage+1,(char *)snakedata.gameselect);
			break;
		default:
			break;
		}
		dspl_Enable(uMode);
        break;
		case MfwWinFocussed: /* input focus / selected   */
		case MfwWinDelete:   /* window will be deleted   */
		default:
			return MFW_EVENT_REJECTED;
    }
	
    return MFW_EVENT_CONSUMED;
}

void GameSnakeDestroy (T_MFW_HND own_window)
{
	flash_Gamewrite();
	win_delete (snakedata.win);
}
static int GameSnake_kbd_cb (MfwEvt e, MfwKbd *k)
{
	int len = 0;
	U8 uflags = 0;
#if (MAIN_LCD_SIZE==3)
	T_MFW_HND       win  = mfw_parent (mfw_header());//shiheng porting
	char *text;//shiheng porting
	
#endif
	Snake_Data *data = (Snake_Data*)&snakedata;

	if(!(e & KEY_MAKE))
		return MFW_EVENT_CONSUMED;
	//Game Running
	if(data->uGameState == Snake_Running)	
	{
		switch ( k->code )
		{          
		case KCD_MNUUP:
			if(data->uMove!=MoveDown)
			{
				uflags = 1;
				data->uMove = MoveUp;
			}
			break;
		case KCD_MNUDOWN: 
			if(data->uMove!=MoveUp)
			{
				uflags = 1;
				data->uMove = MoveDown;
			}
			break;
		case KCD_MNULEFT:
			if(data->uMove!=MoveRight)
			{
				uflags = 1;
				data->uMove = MoveLeft;
			}
			break;
		case KCD_MNURIGHT:
			if(data->uMove!=MoveLeft)
			{
				uflags = 1;
				data->uMove = MoveRight;
			}
			break;
		case KCD_CALL://Pause
			setSnakeGameState( Snake_Pause);
			timStop(data->timer);
			break;	
		case KCD_RIGHT:
		case KCD_HUP:
			setSnakeGameState(Snake_Exit);
			winShow(data->win);
			break;
		case KCD_LEFT:
		case KCD_OK:   
			break;
		default:
			break;
		}
		if(uflags)
			domoveSnake();
	//	return MFW_EVENT_CONSUMED;
	}
	//Game Init
	else if(data->uGameState == Snake_Init)
	{
		switch ( k->code )
		{          
		case KCD_1:
		case KCD_2:
		case KCD_3:
		case KCD_4:
			if(data->R_CurSlect+1 != k->code)
			{
				data->R_CurSlect = k->code - 1;
				uflags  = 1;
			}
			break;
		case KCD_MNUUP:
			if(data->R_CurSlect)
			{
				data->R_CurSlect --;
			}
			else
			{
				data->R_CurSlect = 3;
			}
			uflags  = 1;

⌨️ 快捷键说明

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