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

📄 mmisnake.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************

 $Project name:	Basic MMI                                                      
 $File:		    mmiSnake.h
 $Author:		talcon  hu                                                        
 $Date:		    2003-12-18                                                      
 $Description: implement file of Game:snake 
                
 $History: 

*******************************************************************************/
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

#include "mfw_sys.h"
//#include "typedef.h"
//#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#include "p_sim.h"
#include "cus_aci.h"
#include "mfw_mfw.h"
#include "mfw_win.h"
#include "mfw_kbd.h"
#include "mfw_edt.h"
#include "mfw_tim.h"
#include "mfw_icn.h"
#include "mfw_mnu.h"
#include "mfw_sat.h"
#include "dspl.h"
#include "MmiMmi.h"
//#include "MmiDummy.h"
#include "MmiDialogs.h"
#include "MmiSoftkeys.h"
#include "MmiIcons.h"
//#include "MmiMenu.h"
#include "gdi.h"
#include "Audio.h"
#include "MmiSounds.h"
#include "MmiBookShared.h"
//#include "bmieastapi.h"


#include "Gamedisplay.h"
#include "mmi3dframe.h"
#include "mmiblklangdb.h"
//#include "mmigameicons.h"
#include "mmigame.h"

#include "mmiSnake.h"
#include "mmidialogs.h"
#include "..\bmi\icons\GameSnakeIcn.h"
#include "..\bmi\icons\GameIcn.h"

#if (MAIN_LCD_SIZE==3)
/*2004/5/26, wy add begin*///shiheng porting
#define MAXLEN_GAMEHELP 300
char snakeHelp_Buffer[MAXLEN_GAMEHELP];	
/*2004/5/26, wy add end */
#endif

#define SNAKE_STAGE				4 
#define SNAKE_SPEED				10

/*define Snake's movement*/ 
typedef enum 
{
	MoveNone,
	MoveLeft,
	MoveRight,
	MoveUp,
	MoveDown
}Snake_Move;
typedef enum
{
	Snake_Diamond_None,//none
	Snake_Diamond_Food1,//food
	Snake_Diamond_Food2,
	Snake_Diamond_Food3,
	Snake_Diamond_Food4,
	Snake_Diamond_Food5,
	Snake_Diamond_Food6,
	Snake_Diamond_Snake,//Sanke self
	Snake_Diamond_Wall
}Snake_DiamondState;
/* define state of game*/
typedef enum 
{
	Snake_Init,
	Snake_Ready,//game ready
	Snake_Running,
	Snake_Pause,
	Snake_Over,//game over
	Snake_Exit,
	Snake_Select,//Game Select Stage
	Snake_KeyInfo,
	Snake_Help,
	Snake_Rank
}Snake_GameState;

typedef struct 
{
	U8   state;/*
	 * 0:none
	 * 1:food
	 * 2:snake

	 */
	U8   nextX;
	U8   nextY;
	U8	 previousX;
	U8	 previousY;
}Snake_DiamondData;
/*define data of snake*/ 
typedef struct
{
    T_MMI_CONTROL   mmi_control;		// common control parameter
	T_MFW_HND  win;

	T_MFW_HND  kbd;
	T_MFW_HND  kbd_long;
	T_MFW_HND  edt;
	T_MFW_HND	menu;
	T_MFW_HND 	parent_win;
	MfwEdtAttr edt_attr;
	T_MFW_HND  timer;   
	
	Snake_DiamondData	Diamonddata[GameSnake_Width][GameSnake_Height];//矩阵的数据
	//position of snake's head 
	U8    headX;
	U8    headY;
	//position of snake's tail 
	U8    tailX;
	U8    tailY;
	
	U8   uMove;
	U8	 uGameState;
	U8	 uGameStateOld;	

	U8   foodadd;//吃完food后要增加的长度
	U8	  stage;
	U8   speed;
	U32 score;
	char gameselect[5];

	//当前的选中状态,动画的类型类型,动画的索引
	U8 R_CurSlect,R_AnimType,R_AnimIndx;
} Snake_Data;

static Snake_Data snakedata;
const U16    snakeTimeout[]=
{
	600,//speed 0
	550,//speed 1
	500,//speed 2
	450,//speed 3
	400,//speed 4
	350,//speed 5
	300,//speed 6
	250,//speed 7
	200,//speed 8
	150,//speed 9
	250//animation	
};

const U16	snakeScorePerFood[SNAKE_STAGE] =
{
	10, 20, 30, 50
};

const int snakeScore[SNAKE_STAGE][SNAKE_SPEED]=
{
	{50, 100, 150, 250, 350, 600, 750, 900, 1100, 1500},
	{100, 200, 300, 500, 700, 1200, 1500, 1800, 2200, 3000},
	{150, 300, 450, 750, 1050, 1800, 2250, 2700, 3300, 4500},
	{250, 500, 750, 1250, 1750, 3000, 3750, 4500, 5500, 7500}
};
#define SIZESTAGEDATA 63
const char snakeStageData[]=
{
//size(1 byte),snake info(0xff 结尾),data
//stage 1
0x46,0x0a,0x08,0x0a,0x09,0xff,0xff, /*data*/0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//stage 2
0x46,0x0a,0x08,0x0a,0x09,0xff,0xff, /*data*/0x80,0x00,0x0c,0x00,0x00,0x60,0x00,0x03,0x00,0x00,0x18,0x00,0x00,0xc0,0x00,0x06,0x00,0x00,0x30,0x00,0x01,0x80,0x00,0x0c,0x00,0x00,0x60,0x00,0x03,0x00,0x00,0x18,0x00,0x00,0xc0,0x00,0x06,0x00,0x00,0x30,0x00,0x01,0x80,0x00,0x0c,0x00,0x00,0x60,0x00,0x03,0x00,0x00,0x18,0x00,0x00,0xc0,0x00,0x06,0x00,0x00,0x30,0x00,0x01,
//stage 3
0x46,0x0a,0x08,0x0a,0x09,0xff, 0xff,/*data*/0xcc,0xc6,0x64,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xc0,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x0c,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xc0,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x0c,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xc0,0x00,0x04,0x00,0x00,0x19,0x98,0xcc,
//stage 4
0x46,0x0a,0x08,0x0a,0x09,0xff,0xff, /*data*/0x00,0x00,0x00,0xff,0xfe,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xc0,0x00,0x06,0x00,0x00,0x30,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x00,0x42,0x00,0x02,0x10,0x00,0x16,0x80,0x00,0x84,0x00,0x04,0x20,0x00,0x21,0x00,0x01,0x00,0x00,0x08,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
};
extern ffsgamedata ffs_gamedata;
//private function
static int GameSnake_win_cb (MfwEvt e, MfwWin *w);
void GameSnakeDestroy (T_MFW_HND own_window);
static int GameSnake_kbd_cb (MfwEvt e, MfwKbd *k);
static int GameSnake_timer_cb(MfwEvt e, MfwTim *t);
//void Snake_MnuShow();
#if (MAIN_LCD_SIZE==3)
void Snake_MnuShow();
#endif
T_MFW_HND GameSnakeCreate( MfwHnd parent );
extern MfwHnd GetIncomingCallWin();

void clearDiamond(U8 posX,U8 posY);
void drawDiamond(U8 posX,U8 posY);
U8 moveSnake(Snake_Data *data);
U8 gernateFood(U8 isDraw);
//void snake_help();
/************operation function**********************************************/

void readSnakeMap()
{
	int i,j;
	int pos = 7;
	char chr = 0;

	int nStage = snakedata.stage ;
	char *pMapData = (char*)snakeStageData;
	char *pMapData1; 	

	while(nStage)
	{
		pMapData +=(int)*pMapData;
		nStage -- ;
	}
	pMapData1 = pMapData+1;
	pMapData += (int)*pMapData - SIZESTAGEDATA;
		
	for(j = 0; j< GameSnake_Height;j++)
	{
		for(i = 0;i<GameSnake_Width; i++)
		{
			chr = 0x01 <<pos;
			if(*pMapData & chr)
				snakedata.Diamonddata[i][j].state = Snake_Diamond_Wall;
			else
				snakedata.Diamonddata[i][j].state = Snake_Diamond_None;
			if(pos)
				pos --;
			else
			{
				pMapData ++;
				pos = 7;
			}
			snakedata.Diamonddata[i][j].nextX = 0xff;
			snakedata.Diamonddata[i][j].nextY = 0xff;
			snakedata.Diamonddata[i][j].previousX = 0xff;
			snakedata.Diamonddata[i][j].previousY = 0xff;
		}
	}//for(j = 0; j< GameSnake_Height;j++)
	
	//read snake self
	pMapData = pMapData1;
	while(*pMapData != (char)0xff)
	{
		i = *pMapData;
		j = *(pMapData+1);
		if(pMapData == pMapData1)
		{
			snakedata.headX = i;
			snakedata.headY=  j;
			snakedata.Diamonddata[i][j].previousX = 0xff;
			snakedata.Diamonddata[i][j].previousY = 0xff;
		}
		else
		{
			snakedata.Diamonddata[i][j].previousX = *(pMapData-2);
			snakedata.Diamonddata[i][j].previousY = *(pMapData-1);
		}
		pMapData += 2;
		snakedata.Diamonddata[i][j].nextX = *pMapData;
		snakedata.Diamonddata[i][j].nextY = *(pMapData+1);
		snakedata.Diamonddata[i][j].state = Snake_Diamond_Snake;
	}
	snakedata.tailX = i;
	snakedata.tailY=  j;

}
void setSnakeGameState(U8	 uGameState)
{
	if(snakedata.uGameState != uGameState)
	{
		snakedata.uGameStateOld =snakedata.uGameState ;
		snakedata.uGameState = uGameState;
	}
}
void domoveSnake()
{
	U8 moveflag ;
	timStop(snakedata.timer);
	moveflag =moveSnake(&snakedata);
	if(moveflag >= Snake_Diamond_Snake)//game over
	{		
		flash_Gamewrite();
		setSnakeGameState(Snake_Rank);
		winShow(snakedata.win);
		return;
	}
	if(moveflag == 1)//eat food
	{
		snakedata.score += snakeScorePerFood[snakedata.stage];
		if(snakedata.speed < 9)
		{
			if(snakedata.score >= snakeScore[snakedata.stage][snakedata.speed])
			{
				snakedata.speed ++;
				timSetTime(snakedata.timer,snakeTimeout[snakedata.speed]);
				//draw speed
				drawGameNumber(85,GameSnake_Diamond *GameSnake_Height,snakedata.speed);
			}
		}
		//draw score
		drawGameNumber(20,GameSnake_Diamond *GameSnake_Height,snakedata.score);
		gernateFood(1);
	}
	timStart(snakedata.timer);
}
/********************************************************
$argument:
	@return:
		0: success
		1: none
		2 :food
		0x10: wall
		0x20: self
******************************************************************/
U8 moveSnake(Snake_Data *data)
{	
	U8 uRet = 0;
	U8 newX = data->headX;
	U8 newY = data->headY;
	U8 oldtailX = data->tailX;
	U8 oldtailY = data->tailY;
	switch(data->uMove)
	{
	case MoveLeft:
		newX --;
		break;
	case MoveRight:
		newX ++;
		break;
	case MoveUp:
		newY --;
		break;
	case MoveDown:
		newY ++;
		break;
	default:
		return 1;//none
	}
	if(newX == 0xff)
		newX = GameSnake_Width - 1;
	else if(newX == GameSnake_Width)
		newX = 0;
	else if(newY == 0xff)
		newY = GameSnake_Height - 1;
	else if(newY == GameSnake_Height)
		newY = 0;
	uRet = data->Diamonddata[newX][newY].state;
	if(uRet >= Snake_Diamond_Snake)
		return uRet;	
	
	data->Diamonddata[newX][newY].nextX = data->headX;
	data->Diamonddata[newX][newY].nextY = data->headY;
	
	data->Diamonddata[data->headX][data->headY].previousX = newX;
	data->Diamonddata[data->headX][data->headY].previousY = newY;
	
	data->headX = newX;
	data->headY = newY;
	if(data->Diamonddata[data->headX][data->headY].state >= Snake_Diamond_Food1 &&
		data->Diamonddata[data->headX][data->headY].state <= Snake_Diamond_Food6)//food
	{
		uRet  = 1;
		/*2004/04/27,talcon add*/
		clearDiamond(data->headX,data->headY);
	}
	data->Diamonddata[data->headX][data->headY].state = Snake_Diamond_Snake;
	
	if(data->foodadd == 0)
	{
		//get new tail position
		newX = data->Diamonddata[data->tailX][data->tailY].previousX;
		newY = data->Diamonddata[data->tailX][data->tailY].previousY;
		//change previois of tail to tail
		data->Diamonddata[newX][newY].nextX = 0xff;
		data->Diamonddata[newX][newY].nextY = 0xff;
		//reomve old tail
		data->Diamonddata[data->tailX][data->tailY].state = Snake_Diamond_None;
		data->Diamonddata[data->tailX][data->tailY].previousX = 0xff;
		data->Diamonddata[data->tailX][data->tailY].previousY = 0xff;
		//set tail
		data->tailX = newX;
		data->tailY = newY;
		/*2004/04/27,talcon add*/
		clearDiamond(data->tailX,data->tailY);
		
		drawDiamond(data->tailX,data->tailY);
		drawDiamond(oldtailX,oldtailY);
	}
	else
	{
		data->foodadd = 0;
	}
	
	
	drawDiamond(data->headX,data->headY);
	/*2004/04/27,talcon add*/
	clearDiamond(data->Diamonddata[data->headX][data->headY].nextX,data->Diamonddata[data->headX][data->headY].nextY);
	

⌨️ 快捷键说明

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