📄 mmisnake.c
字号:
/******************************************************************************
$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 + -