📄 game.c
字号:
/*===========================================================================
FILE: Game.c
/*===============================================================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================================================== */
#include "AEEModGen.h"// Module interface definitions
#include "AEEAppGen.h"// Applet interface definitions
#include "AEEShell.h"// Shell interface definitions
#include "game.bid" // Applet-specific header that contains class ID
#include "game_h.bid"
#include "AEEStdLib.h"
#include "game_res.h"
#define MAP_WIDTH 11
#define MAP_HEIGHT 20
#ifdef COLOR_DISPLAY
#define RED_COLOR MAKE_RGB(0xC0, 0x00, 0x00)
#define BLUE_COLOR MAKE_RGB(0, 0, 255)
#define GREEN_COLOR MAKE_RGB(0x00, 0x60, 0x00)
#define LIGHT_RED_COLOR MAKE_RGB(255, 0, 0)
#define LIGHT_BLUE_COLOR MAKE_RGB(128, 255, 255)
#define DARK_GREEN_COLOR MAKE_RGB(0, 128, 64)
#define ORANGE_COLOR MAKE_RGB(255, 128, 0)
#define PURPLE_COLOR MAKE_RGB(179, 21, 206)
#define YELLOW_GREEN_COLOR MAKE_RGB(158, 152, 69)
#define GREY_COLOR MAKE_RGB(80, 80, 80)
#endif
#define noblack FALSE
#define black TRUE
/*----------------------------------------------
Structrue definition
------------------------------------------------*/
typedef struct _CGametype{
AEEApplet a;
AEERect m_Rect;
unsigned char block_width;
unsigned char block_height;
RGBVAL frame_color;
int difficult_level;
int a0;
int dels;
int next_block;
int block[4][4];
int map[MAP_WIDTH][MAP_HEIGHT];
int map_line;
int map_col;
int x_size;
int y_size;
int block_x;
int block_y;
int current_block;
int gameover;
word score;
boolean pause;
RGBVAL color_table[10];
int32 r_color;
int32 g_color;
int32 b_color;
}CGametype;
/*-------------------------------------------------------------------
Static function prototypes
-------------------------------------------------------------------*/
static boolean game_HandleEvent(CGametype * pme, AEEEvent eCode,uint16 wParam, uint32 dwParam);
static boolean game_InitApp(CGametype * pMe);
void DeleteRow(CGametype * pMe);
int CanPut(CGametype * pMe);
void RotateBlock(CGametype * pMe);
void PutBlock(CGametype * pMe);
void ClearBlock(CGametype * pMe);
/*-----------------------------------------------------------------
static variable definition
----------------------------------------------------------------*/
/*translate an integer into decimal sting*/
unsigned int up_Itoa(AECHAR * buffer, int eger)
{
int len, ueger;
unsigned char minusP;
minusP = (eger < 0);
if(minusP)
{
if(buffer)
{
*(buffer++) = '-';
}
ueger = (int)(0 - eger);
}
else
{
ueger = (unsigned int)eger;
}
{
unsigned int tmp;
tmp = ueger;
len = 1;
while ( (tmp /= 10) ) len += 1;
}
{
unsigned int pt;
pt = len;
if (buffer) buffer[pt] = 0;
while(pt--)
{
if (buffer)
{
buffer[pt] = (char)('0' + (ueger % 10));
}
ueger /= 10;
}
}
return (len + 1 + minusP);
}
//=====================================================================
// the following code for Russia frame
//Function: clearblock
//Description: clear a block
//Side effect: none
//=====================================================================
void ClearBlock(CGametype * pMe) /*clear the data within the block*/
{int i,j;
for (i=0; i<4; i++) for (j=0; j<4; j++) pMe->block[i][j] = 0;
}
//====================================================================
// Function: write_video
// Description: draw a frame
// input value position(x,y)
// Side effect: play the bitmap_buf
//====================================================================
void write_video
(
CGametype * pMe,
int x,
int y,
RGBVAL color,
unsigned char full
)
{
AEERect rect;
rect.x=x;
rect.y=y;
rect.dx=pMe->block_width;
rect.dy=pMe->block_width;
if(full)
{
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
RGB_BLACK,// RGBVAL
color,// RGBVAL
IDF_RECT_FRAME | IDF_RECT_FILL);
SETAEERECT(&rect,x+1,y+1,pMe->block_width-2,1);
IDISPLAY_FillRect(pMe->a.m_pIDisplay,&rect,RGB_WHITE);
SETAEERECT(&rect,x+1,y+1,1,pMe->block_width-2);
IDISPLAY_FillRect(pMe->a.m_pIDisplay,&rect,RGB_WHITE);
}
else
{
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
RGB_WHITE,// RGBVAL
RGB_WHITE,// RGBVAL
IDF_RECT_FRAME | IDF_RECT_FILL);
}
}
/*===================================================================
Function: generateblock
Description: generate a block
input: block class
Side effect: none
====================================================================*/
void GenerateBlock(CGametype * pMe,int kind) /*generate a block*/
{
int val;
val=kind%10;
ClearBlock(pMe);
switch (kind) {
case 1: pMe->block[1][0] = pMe->block[2][0] = pMe->block[0][1] = pMe->block[1][1] = val; break;
case 11: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][1] = pMe->block[1][2] = val; break;
case 21: pMe->block[1][0] = pMe->block[2][0] = pMe->block[0][1] = pMe->block[1][1] = val; break;
case 31: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][1] = pMe->block[1][2] = val; break;
case 2: pMe->block[0][0] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[2][1] = val; break;
case 12: pMe->block[1][0] = pMe->block[1][1] = pMe->block[0][1] = pMe->block[0][2] = val; break;
case 22: pMe->block[0][0] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[2][1] = val; break;
case 32: pMe->block[1][0] = pMe->block[1][1] = pMe->block[0][1] = pMe->block[0][2] = val; break;
case 3: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = val; break;
case 13: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = val; break;
case 23: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = val; break;
case 33: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = val; break;
case 4: pMe->block[1][0] = pMe->block[0][1] = pMe->block[1][1] = pMe->block[2][1] = val; break;
case 14: pMe->block[0][0] = pMe->block[0][1] = pMe->block[0][2] = pMe->block[1][1] = val; break;
case 24: pMe->block[0][0] = pMe->block[1][0] = pMe->block[2][0] = pMe->block[1][1] = val; break;
case 34: pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = val; break;
case 5: pMe->block[2][0] = pMe->block[0][1] = pMe->block[1][1] = pMe->block[2][1] = val; break;
case 15: pMe->block[0][0] = pMe->block[0][1] = pMe->block[0][2] = pMe->block[1][2] = val; break;
case 25: pMe->block[0][0] = pMe->block[1][0] = pMe->block[2][0] = pMe->block[0][1] = val; break;
case 35: pMe->block[0][0] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = val; break;
case 6: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][1] = pMe->block[2][1] = val; break;
case 16: pMe->block[0][0] = pMe->block[1][0] = pMe->block[0][1] = pMe->block[0][2] = val; break;
case 26: pMe->block[0][0] = pMe->block[1][0] = pMe->block[2][0] = pMe->block[2][1] = val; break;
case 36: pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = pMe->block[0][2] = val; break;
case 7: pMe->block[0][0] = pMe->block[1][0] = pMe->block[2][0] = pMe->block[3][0] = val; break;
case 17: pMe->block[0][0] = pMe->block[0][1] = pMe->block[0][2] = pMe->block[0][3] = val; break;
case 27: pMe->block[0][0] = pMe->block[1][0] = pMe->block[2][0] = pMe->block[3][0] = val; break;
case 37: pMe->block[0][0] = pMe->block[0][1] = pMe->block[0][2] = pMe->block[0][3] = val; break;
case 8: pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = pMe->block[2][1] = val; break;
case 18: pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = pMe->block[2][1] = val; break;
case 28: pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = pMe->block[2][1] = val; break;
case 38: pMe->block[0][1] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = pMe->block[2][1] = val; break;
case 9: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][1] = pMe->block[2][0] = pMe->block[2][1] = val; break;
case 19: pMe->block[0][0] = pMe->block[0][2] = pMe->block[1][0] = pMe->block[1][1] = pMe->block[1][2] = val; break;
case 29: pMe->block[0][0] = pMe->block[0][1] = pMe->block[1][0] = pMe->block[2][0] = pMe->block[2][1] = val; break;
case 39: pMe->block[0][0] = pMe->block[0][1] = pMe->block[0][2] = pMe->block[1][0] = pMe->block[1][2] = val; break;
default: break;
}
if ((kind == 7) || (kind == 27)) {pMe->x_size = 4; pMe->y_size = 1; }
else if ((kind == 17) || (kind == 37)) {pMe->x_size = 1; pMe->y_size = 4;}
else if (kind % 10 == 3) {pMe->x_size = 2; pMe->y_size = 2; }
else if (kind % 10 == 8) {pMe->x_size = 3; pMe->y_size = 3; }
else if ((kind / 10 == 0) || (kind / 10 == 2)) {pMe->x_size = 3; pMe->y_size = 2;}
else if ((kind / 10 == 1) || (kind / 10 == 3)) {pMe->x_size = 2; pMe->y_size = 3;}
pMe->current_block = kind;
}
//================================================================
//Funciton initialmemory
//Description: initial memory
//Side effect: none
//================================================================
void initialmemory(CGametype * pMe)
{
int i,j;
AEERect rect;
AECHAR szText[] ={'N','e','x','t','\0','S','c','o','r','e','\0'},game_title[30]={0};
uint32 dwTime = GET_UPTIMEMS();
ISHELL_LoadResString(pMe->a.m_pIShell, GAME_RES_FILE, IDS_GAME_TITLE, game_title, sizeof(game_title));
rect.x=0;
rect.y=0;
rect.dx=pMe->m_Rect.dx; //screen width
rect.dy=pMe->block_height;
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
pMe->frame_color,// RGBVAL
pMe->frame_color,// RGBVAL
IDF_RECT_FRAME | IDF_RECT_FILL);
rect.x=0;
rect.y=MAP_HEIGHT*pMe->block_height+pMe->block_height;
rect.dx=pMe->m_Rect.dx;//screen width
rect.dy=pMe->block_height;
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
pMe->frame_color,// RGBVAL
pMe->frame_color,// RGBVAL
IDF_RECT_FRAME | IDF_RECT_FILL);
rect.x=MAP_WIDTH*pMe->block_width+pMe->block_width;
rect.y=pMe->block_height;
rect.dx=pMe->block_width;
rect.dy=MAP_HEIGHT*pMe->block_height;
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
pMe->frame_color,
pMe->frame_color,
IDF_RECT_FRAME | IDF_RECT_FILL);
rect.x=0;
rect.y=pMe->block_height;
rect.dx=pMe->block_width;
rect.dy=MAP_HEIGHT*pMe->block_height;
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
pMe->frame_color,// RGBVAL
pMe->frame_color,// RGBVAL
IDF_RECT_FRAME | IDF_RECT_FILL);
rect.x=pMe->m_Rect.dx-pMe->block_width;
rect.y=pMe->block_height;
rect.dx=pMe->block_width;
rect.dy=MAP_HEIGHT*pMe->block_height;
IDISPLAY_DrawRect(pMe->a.m_pIDisplay,
&rect,
pMe->frame_color,// RGBVAL
pMe->frame_color,// RGBVAL
IDF_RECT_FRAME | IDF_RECT_FILL);
IDISPLAY_DrawText(pMe->a.m_pIDisplay, // Display instance
AEE_FONT_BOLD, // Use BOLD font
szText, // Text - Normally comes from resource
-1, // -1 = Use full string length
MAP_WIDTH*pMe->block_width+1+pMe->block_width+pMe->block_width, // x-cordinate
pMe->block_height+8, // y-cordinate
NULL, // No clipping
0);//IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE);
IDISPLAY_DrawText(pMe->a.m_pIDisplay, // Display instance
AEE_FONT_BOLD, // Use BOLD font
szText+5, // Text - Normally comes from resource
-1, // -1 = Use full string length
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -