brew(1)

Brew 安装(适用于win2k,winxp等更高版本的系统):
    1):下载brew sdk(现在很多地方都有,基本是brew sdk 2.0.0.35,brew sdk 2.0.1.5或更高级,brew3.0及后续版本目前还没有实际进行开发)
    2):安装brew sdk(路径不要有空格,根据提示设置环境;
同时将ARMMakeBREWApp.dll, BREWIntegratedHelp.dll放到vc安装目录如下:
-Microsoft Visual Studio/Common/MSDev98/AddIns下.
设置:tools->customize->add-ins and macro files,将BREWIntegratedHelp.DSAddin.1和ARMMakeBREWApp. DSAddin.1选中,关闭设置,在vc环境中将新生成的浮动工具栏拖到相应的位置)
    3):brew相关工具的安装
编译工具--- ARM Developer Suite 基本使用1.2版本
主要用于编译生成mod文件,手机使用;
其他相关使用工具:BrewToolsSuite基本使用2.1.1.3版本等,用来手机的调试及调入删除等功能)
4):arm安装后,启动一下CodeWarrior for ARM Developer Suite ,以后就可正常使用arm.
对应工具的作用:
brew sdk工具:
     BREW Compressed Image Authoring Tool: 图像压缩, bci格式-使用image接口进行播放
     BREW Device Configurator          : 模拟器文件配置设置,如果使用内存很大,选择windows内存方式
BREW MIF Editor                  :  mif 文件配置编辑器

BREW Resource Editor              :  资源编辑编译器 build菜单
Brew emulator                     :  模拟器 //(可以通过修改设备文件,切换模拟器,如有不正常现象,可以删除prefs.dat试试,重新打开模拟器)
其他基本是帮助文件.
BrewToolsSuite
     Brew apploader  ///用于手持设备上的文件导入,导出(不是所有文件都可导出的)或文件删除功能(通过com口或者usb口连接设备)
     Brew appsigner  ///签名文件的制作,一般由高通进行管理.
     Brew applogger  调试工具,在应用程序中,通过DBGPRINTF输出的内容都可通过applogger看到内容(通过com口或者usb口连接设备).
     其他不作介绍.
Arm的使用:
1).通过ARMMakeBREWApp 的浮动工具栏生成相应的mak文件
2).在命令行窗口下:进入相应目录 ,通过nmake  /f  *.mak  all 即可编译生成mod文件
brew开发的程序一般都放在其相应的examples下面,mif文件直接在examples中;其他的文件包含在于mif相同文件名的文件夹下面.
brew开发生成的文件的使用:
   模拟器:  mif,examples下;其他文件在相应目录下: dll及其他bar(可以多个)和数据文件,不可有签名文件
   手持设备: mif,examples下;其他文件在相应目录下: mod及其他bar(可以多个)和数据文件,必须有签名文件
 
   1.mif文件
1)      mif文件applet选项卡
(1)    通过BREW MIF Editor生成.
(2)    本地使用,可以暂时生成一个class id ,正式提交必须重新向高通申请class id ,每次更换id,请先删除老的id,然后生成新的id,examples目录下避免相同id的mif文件出现.
(3)其他根据实际进行填写;mif的三个图形文件: thumbnail.bmp(16*16*256),icon.bmp(32*32*256),image.bmp (65*42*256)分别用于brew管理器的显示,icon是使用大图标方式, thumbnail,image是小图标显示的两项:thumb,菜单里面,image菜单上面的大图像.
Icon图像选择:在其相应的browser,
thumbnail,image图像选择:advance里面的browser.
2)      mif文件的general选项卡
(1)    根据需要填写作者,版权,版本号
(2)    权限设置:使用了相应的功能就应该选择相应的文件,否则操作不会成功,如有文件操作,就应该将file的框选上,其他类似.
3)      mif文件的Externsions选项卡,如作为公用模块可以使用.
4)      mif文件的dependences选项卡,如果使用了公用模块就在这里添加相应的class id(不建议这种方式,升级并不方便).
5)      后面的不在介绍,基本不使用
2.bar文件的说明
  1).bar文件通过BREW Resource Editor生成,源文件为bri格式,经过编译生成bar文件
  2).可以打开bri里面的string,image,dialog加入资源,以便程序使用(string选择unicode编码,dialog很少使用).
    3)当然这里的文件可以进行压缩,作为更深的研究以后再说(gzip进行压缩,将近1/3, IUnzipAStream接口处理.)
3.dll文件
  1)模拟器的dll执行文件,用于模拟器,不用于手机
  2)执行时,dll文件,必须在examples的相应目录下-一级目录,不能在其debug或release下
4).mod文件
  1)手机的执行文件.用相应的mod文件代替dll文件
  2)通过nmake  /f  *.mak  all 即可编译生成mod文件
5) sig文件
模拟器中不需要签名文件,但是手机的目录下必须加入签名文件,有与卡相关,有与机相关.
其他的诸如:数据文件,或者多个bar文件等均可根据需要添加
手机文件的导入,请注意不要乱删除其他系统文件以及避免添加中文名字或名字不太规范的文件
brew 开发流程:
1)      启动vc在创建工程中选择brew类型,创建空工程.
2)      根据提示建立mif文件,放在examples下,建立classid文件
3)      根据需要创建头文件,及源文件,重新定义应用程序的结构体.
4)      用全部brew api替换c中的相应函数(一般大小写转换或者使用接口)
5)      字符串string资源添加时,选择unicode方式
6)      包含classid文件,及资源头文件.
7)      如下修改TetrisApp为相应的新的app结构,以后在app中定义的变量才能正常使用
if(AEEApplet_New(sizeof(GoChessApp), ClsId, pIShell,po,(IApplet**)ppObj,
         (AEEHANDLER)GoChess_HandleEvent,(PFNFREEAPPDATA)GoChess_FreeAppData)
         == TRUE)
8) 程序使用的优先级如file,net等,务必在mif文件中选择
brew开发必须处理的事件(Piece_HandleEvent中处理):
1)      EVT_APP_START:程序的启动进行处理,启动您的应用程序,调用相应的函数,初始化资源尽量一次调入,可以在程序中,加快速度
2)      EVT_APP_SUSPEND :程序的挂起,当来电或短信时,挂起,取消一切的回掉函数,包括定时器,解析,网络回掉,bci播放等.
3)      EVT_APP_RESUME:恢复,程序的关键界面请务必恢复,其他无所谓吧,根据测试协商.
4)      EVT_APP_STOP:游戏结束的调用.释放所有资源,brew管理器自动调用,上面的释放函数如:GoChess_FreeAppData,你可根据需要重新定义释放函数.
5)      EVT_KEY:游戏的设置机制了,自己处理.
6)      EVT_APP_NO_SLEEP:设备休眠问题,游戏运行中,会逐渐变慢,只要这个消息,返回true即可.
7)      其他如EVT_KEY_PRESS,EVT_KEY_RELEASE,酌情处理.
8)      这里的定时器与pc定时器概念不同,只调用一次回掉函数.
9)      其他的函数使用,请参照brew api文档说明了(务必使用brew api函数).
10)   暂时不支持浮点运算,如有需要,请先转换,然后处理.
11)   Staic控见中,以空格代替换行.
常见问题分析:
1)      死机,自动关机,一般有使用了无效指针,规范编程,实时初始化,释放先判断后置零,问题会减少很多
2)      莫名其妙的事件调用,不同手机的处理不一样,如有些手机先触发EVT_APP_SUSPEND再触发EVT_APP_STOP等,请仔细测试不同手机的触发,以便处理,这些问题也可通过规范编程避免不同调用顺序引起的不当指针使用.
3)      声音播放问题,关键看手机本身的支持性能,其次多释放,多重新创建也许可以解决问题;也可以考虑播放方式,如内存播放或直接播放;挂起也要停掉声音,释放回掉等来检查解决问题.
4)      图形问题:不能正常显示,请检测图形的颜色深度是否适合,透明的支持性能,甚或内存的大小
5)      一些接口不能正常创建,请注意创建顺序以及mif中优先级是否选择等.
6)      尽量使用c语言编程,c++中,回掉函数静态定义也许很不方便处理.
7)      对于短信和电话的处理不同手机也不完全相同
声明以下源代码:为本人业余开发,没有任何其他版权问题!
源代码:围棋,弱弱的智商,呵呵,有待进一步完善,
编译环境winxp,vc6.0,brew 2.0.1.5.arm1.2
/*===========================================================================
FILE: GoChess.c
===========================================================================
作者:牛海防
2005-02-28
请勿用于商业行为
*/
/*===============================================================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================================================== */
#include "AEEModGen.h"          // Module interface definitions
#include "AEEAppGen.h"          // Applet interface definitions
#include "AEEShell.h"           // Shell interface definitions
#include "AEEFile.h"                  // File interface definitions
#include "AEENet.h"                        // Socket interface definitions
#include "AEESound.h"                    // Sound Interface definitions
#include "AEETapi.h"                // TAPI Interface definitions
#include "AEEGraphics.h"
#include "GoChess.h"
#include "GoChess.bid"
#include "GoFuncDef.h"
#include "GoChess_res.h"
/*-------------------------------------------------------------------
Function Prototypes
-------------------------------------------------------------------*/
static boolean GoChess_HandleEvent(IApplet * pi, AEEEvent eCode,
                                      uint16 wParam, uint32 dwParam);
/*===============================================================================
FUNCTION DEFINITIONS
=============================================================================== */
/*===========================================================================
FUNCTION: AEEClsCreateInstance
DEscriptION
       This function is invoked while the app is being loaded. All Modules must provide this
       function. Ensure to retain the same name and parameters for this function.
       In here, the module must verify the ClassID and then invoke the AEEApplet_New() function
       that has been provided in AEEAppGen.c.
   After invoking AEEApplet_New(), this function can do app specific initialization. In this
   example, a generic structure is provided so that app developers need not change app specific
   initialization section every time except for a call to IDisplay_InitAppData().
   This is done as follows: InitAppData() is called to initialize AppletData
   instance. It is app developers responsibility to fill-in app data initialization
   code of InitAppData(). App developer is also responsible to release memory
   allocated for data contained in AppletData -- this can be done in
   IDisplay_FreeAppData().
PROTOTYPE:
   int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
PARAMETERS:
       clsID: [in]: Specifies the ClassID of the applet which is being loaded
       pIShell: [in]: Contains pointer to the IShell object.
       pIModule: pin]: Contains pointer to the IModule object to the current module to which
       this app belongs
       ppObj: [out]: On return, *ppObj must point to a valid IApplet structure. Allocation
       of memory for this structure and initializing the base data members is done by AEEApplet_New().
DEPENDENCIES
  none
RETURN VALUE
  AEE_SUCCESS: If the app needs to be loaded and if AEEApplet_New() invocation was
     successful
  EFAILED: If the app does not need to be loaded or if errors occurred in
     AEEApplet_New(). If this function returns FALSE, the app will not be loaded.
SIDE EFFECTS
  none
===========================================================================*/
int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po,void ** ppObj)
{
       *ppObj = NULL;
       红色的请注意处理,
       if(ClsId == AEECLSID_GOCHESS){
              if(AEEApplet_New(sizeof(GoChessApp), ClsId, pIShell,po,(IApplet**)ppObj,
                     (AEEHANDLER)GoChess_HandleEvent,Go_FreeAppRes)
                     == TRUE)//
              {
                     // Add your code here .....
                   
                     return (AEE_SUCCESS);
              }
       }
       return (EFAILED);
}
/*===========================================================================
FUNCTION GoChess_HandleEvent
DEscriptION
       This is the EventHandler for this app. All events to this app are handled in this
       function. All APPs must supply an Event Handler.
PROTOTYPE:
       boolean GoChess_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
PARAMETERS:
       pi: Pointer to the AEEApplet structure. This structure contains information specific
       to this applet. It was initialized during the AEEClsCreateInstance() function.
       ecode: Specifies the Event sent to this applet
   wParam, dwParam: Event specific data.
DEPENDENCIES
  none
RETURN VALUE
  TRUE: If the app has processed the event
  FALSE: If the app did not process the event
SIDE EFFECTS
  none
===========================================================================*/
//所有的事件触发从本函数进行处理
static boolean GoChess_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam)
{
       GoChessApp * pMe=(GoChessApp *)pi;
       switch (eCode)
       {
      case EVT_APP_START:                      
                
                  // Add your code here .....
            if(!InitAppRes(pMe))///初始化资源
                            return FALSE;
                     if(!Go_DrawAboutWin(pMe)) //显示关于信息splash信息
                            return FALSE;
                     ISHELL_SetTimer(pMe->pi.m_pIShell, DELAYTIME, (PFNNOTIFY)(Go_DrawMainWin), pMe);       //定时进入主菜单            
               return(TRUE);
      case EVT_APP_STOP:
                  // Add your code here .....
                return TRUE;
         case EVT_APP_NO_SLEEP://防止休眠
                return TRUE;
         case EVT_APP_SUSPEND://挂起释放回掉函数:定时器,socket等
                /*
                if(pMe->m_pISoundPlayer!=NULL)
                {
                       ISOUNDPLAYER_RegisterNotify(pMe->m_pISoundPlayer,NULL,(void*)pMe);
                       ISOUNDPLAYER_Stop(pMe->m_pISoundPlayer);//
                }
                */
                //ISHELL_CancelTimer(pMe->pi.m_pIShell, NULL, pMe);
                return TRUE;
         case EVT_APP_RESUME://恢复,暂时不考虑恢复了.
                return TRUE;
    
     case EVT_KEY_PRESS://需要长按键时,使用
       
         return TRUE;
         case EVT_KEY_RELEASE://需要长按键时,使用
                /*
                if(pMe->gCurWin ==WINDOWS_PLAY)
                {
                       pMe->gPlayer.subMarine.m_nDir =DIR_NONE;                   
                }
                */
                return TRUE;
         case EVT_KEY: //分解处理消息,可以根据更多的状态,进行更多的分支处理.
                {
                       switch(pMe->gCurWin)
                       {
                       case WINDOWS_MAIN:
                              return Go_SelectMenu(pMe,wParam);//主菜单处理
                       case WINDOWS_PLAY:
                              return Go_PlayChess(pMe,wParam); //游戏                    
                       default:
                              Go_DrawMainWin(pMe);  //主菜单
                              return TRUE;
                       }
                }
                return TRUE;
      default:
         break;
   }
   return FALSE;
}
///
void Go_FreeAppRes(IApplet* pi)  //释放资源,按end键或其他方式触发//EVT_APP_STOP时,系统自动调用该函数.所有释放的指针,置零是好的习惯,释放时,先判断在释放也是好习惯
{
       GoChessApp * pMe = (GoChessApp *)pi; //释放
     
//定时器释放
       ISHELL_CancelTimer(pMe->pi.m_pIShell, NULL, (void*)pMe);
   //所有图形
       if(pMe->m_pGraphic)
       {
              IGRAPHICS_Release(pMe->m_pGraphic);
              pMe->m_pGraphic=NULL;
       }
       释放所有文件管理.
       if(pMe->m_pIFileMgr != NULL)
       {
              IFILEMGR_Release(pMe->m_pIFileMgr);
              pMe->m_pIFileMgr  = NULL;
       }
     
       //if
       if(pMe->m_pISoundPlayer!=NULL)
       {
              ISOUNDPLAYER_Stop(pMe->m_pISoundPlayer);//
              ISOUNDPLAYER_RegisterNotify(pMe->m_pISoundPlayer,NULL,(void*)pMe);            
              ISOUNDPLAYER_Release(pMe->m_pISoundPlayer);
            
              pMe->m_pISoundPlayer=NULL;
       }
       return;
}
///初始化所有变量
void InitGlobalRes(GoChessApp * pMe)
{
       pMe->m_pGraphic = NULL;
       pMe->bSound = TRUE;
     
       pMe->m_pIFileMgr =NULL;
       pMe->m_pISoundPlayer = NULL;
       pMe->m_pBmpNum = NULL;
       return;
}
///调入资源,处理屏幕,创建接口等.
BOOL  InitAppRes(GoChessApp * pMe)
{
       NativeColor nc;
      
       AEEDeviceInfo  di; 
       InitGlobalRes(pMe);
      
       ISHELL_GetDeviceInfo (pMe->pi.m_pIShell, &di);
       pMe->stWorldRect.dx=di.cxScreen;
       pMe->stWorldRect.dy=di.cyScreen;
       pMe->stGameRect.x = 0;
       pMe->stGameRect.y = 0;
       pMe->stGameRect.dx =CELL_SIZE*20;
       pMe->stGameRect.dy =CELL_SIZE*20;
       if((pMe->stGameRect.dx >pMe->stWorldRect.dx)||
              (pMe->stGameRect.dy >pMe->stWorldRect.dy))
              return FALSE;
       pMe->stInfoRect.x = 0 ;
       pMe->stInfoRect.y = pMe->stGameRect.dy ;
       pMe->stInfoRect.dx = pMe->stGameRect.dx ;
       pMe->stInfoRect.dy = pMe->stWorldRect.dy - pMe->stGameRect.dy;  
       /
       /
      
       if(ISHELL_CreateInstance(pMe->pi.m_pIShell,AEECLSID_GRAPHICS,(void**)&pMe->m_pGraphic)!=SUCCESS)
              return FALSE;
      
       if((pMe->m_pBmpNum = ISHELL_LoadResBitmap(pMe->pi.m_pIShell, GOCHESS_RES_FILE, IDB_NUM))== NULL)
              return FALSE;
       else
       {
              nc = IBITMAP_RGBToNative(pMe->m_pBmpNum, MAKE_RGB(255,0,255));///修改了.
              IBITMAP_SetTransparencyColor(pMe->m_pBmpNum, nc);//去掉如何啊。     
       }
      
       if(ISHELL_CreateInstance(pMe->pi.m_pIShell, AEECLSID_FILEMGR, (void **)&pMe->m_pIFileMgr) != SUCCESS)
              return FALSE;
     
       if (ISHELL_CreateInstance(pMe->pi.m_pIShell, AEECLSID_SOUNDPLAYER, (void **)&(pMe->m_pISoundPlayer))!=SUCCESS)   
              return FALSE;
      
       return TRUE;
}
///splash界面
BOOL ShowSplash(GoChessApp * pMe)
{
       pMe->gCurWin = WINDOWS_FLASH;
       return TRUE;
}
//主菜单
BOOL Go_DrawMainWin(GoChessApp * pMe)
{
       IBitmap* pIconBmp = NULL; 
       AEEBitmapInfo  bi;
       int x=0,y=0;  
       pMe->gCurWin=WINDOWS_MAIN;
     
       ISHELL_CancelTimer(pMe->pi.m_pIShell, NULL, (void*)pMe);
       IDISPLAY_ClearScreen(pMe->pi.m_pIDisplay);
     
     
       if((pIconBmp = ISHELL_LoadResBitmap(pMe->pi.m_pIShell, GOCHESS_RES_FILE, IDB_MAINMENU)) != NULL)
       {          
              IBITMAP_GetInfo(pIconBmp, &bi, sizeof(bi));  //获得位图信息;
            
        if(pMe->stWorldRect.dx> (uint16)bi.cx)
                     x=(pMe->stWorldRect.dx-bi.cx)/2;
              else
                     x=0;
              if(pMe->stWorldRect.dy>(uint16)bi.cy)
                     y=(pMe->stWorldRect.dy-bi.cy)/2;
              else
                     y=0;                   
            
              IDISPLAY_BitBlt(pMe->pi.m_pIDisplay,
                     x,
                     y,
                     bi.cx,
                     bi.cy,
                     (void*)pIconBmp,
                     0,0,
                     AEE_RO_COPY );
            
            
              IBITMAP_Release(pIconBmp);
              pIconBmp = NULL;         
       }
       /
       if((pIconBmp = ISHELL_LoadResBitmap(pMe->pi.m_pIShell, GOCHESS_RES_FILE, IDB_MENUITEM)) != NULL)
       {                 
              IDISPLAY_BitBlt(pMe->pi.m_pIDisplay,
                     x + 10,
                     y +120,
                     55,
                     14,
                     (void*)pIconBmp,
                     0,pMe->gMenu*14 ,
                     AEE_RO_COPY );         
            
              IBITMAP_Release(pIconBmp);
              pIconBmp = NULL;         
       }
       /
       IDISPLAY_Update(pMe->pi.m_pIDisplay);
     
       ///ISHELL_SetTimer(pMe->pi.m_pIShell, DELAYTIME, (PFNNOTIFY)(Go_DrawMainWin), pMe);                
     
       return TRUE;
}
//帮助函数
BOOL Go_DrawHelpWin(GoChessApp * pMe)
{
       pMe->gCurWin = WINDOWS_HELP;
       return TRUE;
}
//关于函数
BOOL Go_DrawAboutWin(GoChessApp * pMe)
{
       IBitmap* pIconBmp = NULL; 
       AEEBitmapInfo  bi;
       int x=0,y=0;  
       pMe->gCurWin=WINDOWS_ABOUT;
     
       ISHELL_CancelTimer(pMe->pi.m_pIShell, NULL, (void*)pMe);
       IDISPLAY_ClearScreen(pMe->pi.m_pIDisplay);
     
     
       if((pIconBmp = ISHELL_LoadResBitmap(pMe->pi.m_pIShell, GOCHESS_RES_FILE, IDB_SPLASH)) != NULL)
       {          
              IBITMAP_GetInfo(pIconBmp, &bi, sizeof(bi));  //获得位图信息;
            
        if(pMe->stWorldRect.dx> (uint16)bi.cx)
                     x=(pMe->stWorldRect.dx-bi.cx)/2;
              else
                     x=0;
              if(pMe->stWorldRect.dy>(uint16)bi.cy)
                     y=(pMe->stWorldRect.dy-bi.cy)/2;
              else
                     y=0;                   
            
              IDISPLAY_BitBlt(pMe->pi.m_pIDisplay,
                     x,
                     y,
                     bi.cx,
                     bi.cy,
                     (void*)pIconBmp,
                     0,0,
                     AEE_RO_COPY );
            
            
              IBITMAP_Release(pIconBmp);
              pIconBmp = NULL;         
       }
     
       IDISPLAY_Update(pMe->pi.m_pIDisplay);
     
       ISHELL_SetTimer(pMe->pi.m_pIShell, DELAYTIME, (PFNNOTIFY)(Go_DrawMainWin), pMe);                   
     
       return TRUE;
}
//菜单处理函数
BOOL Go_SelectMenu(GoChessApp * pMe,uint16 wParam)
{
//由于不是成熟的产品,因而函数的边写只注重结构,逻辑问题请多多包涵
       switch(wParam)
       {
       case AVK_UP:
       case AVK_2:
              if(pMe->gMenu>0)
                     pMe->gMenu--;
              else
                     pMe->gMenu = MENUITEM_NUM;
              break;
       case AVK_LEFT:
       case AVK_4:
              if(pMe->gMenu>0)
                     pMe->gMenu--;
              else
                     pMe->gMenu = MENUITEM_NUM;
              break;
       case AVK_RIGHT:
       case AVK_6:
              if(pMe->gMenu                     pMe->gMenu++;
              else
                     pMe->gMenu= 0;
              break;
       case AVK_DOWN:
       case AVK_8:
              if(pMe->gMenu                     pMe->gMenu++;
              else
                     pMe->gMenu= 0;
              break;
       case AVK_SELECT:
       case AVK_5:
              {
                     switch(pMe->gMenu)
                     {
                     case 0:
                            Go_StartNewGame(pMe); //启动围棋游戏.
                            break;
                     case 1:
                            break;
                     case 2:
                            break;
                     case 3:
                            break;
                     case 4:
                            break;
                     default:
                            break;
                     }
              }
              break;
       }
       return TRUE;
}
BOOL Go_PlayChess(GoChessApp * pMe,uint16 wParam)
{
       if(!pMe->playerMe.bThink)
              return TRUE;
       switch(wParam)
       {
/*
移动鼠标,处理
*/
       case AVK_UP:
       case AVK_2:
              if(pMe->SelectPos.y >0)
                     pMe->SelectPos.y--;
              else
                     pMe->SelectPos.y = PLANE_COL-1;
              break;
       case AVK_LEFT:
       case AVK_4:
              if(pMe->SelectPos.x >0)
                     pMe->SelectPos.x--;
              else
                     pMe->SelectPos.x = PLANE_COL-1;        
              break;
       case AVK_RIGHT:
       case AVK_6:
              if(pMe->SelectPos.x                      pMe->SelectPos.x++;
              else
                     pMe->SelectPos.x = 0;
              break;
       case AVK_DOWN:
       case AVK_8:
              if(pMe->SelectPos.y                      pMe->SelectPos.y++;
              else
                     pMe->SelectPos.y = 0;
              break;
       case AVK_SELECT:
       case AVK_5:
//玩家走棋,根据选择的点
              PerSon_Go(pMe,pMe->SelectPos,pMe->playerMe.bwColor); 
              break;
       }
       DrawChessFace(pMe); //显示走后的状态了.
       return TRUE;
}
FILE: Chess.c
===========================================================================*/
作者:牛海防
2005-02-28
请勿用于商业行为
/*===========================================================
#include "AEEModGen.h"          // Module interface definitions
#include "AEEAppGen.h"          // Applet interface definitions
#include "AEEShell.h"           // Shell interface definitions
#include "AEEFile.h"                  // File interface definitions
#include "AEENet.h"                        // Socket interface definitions
#include "AEESound.h"                    // Sound Interface definitions
#include "AEETapi.h"                // TAPI Interface definitions
#include "AEEGraphics.h"
#include "GoChess.h"
#include "Chess.h"
#include "GoFuncDef.h"
/重置游戏数据。
void ResetGameData(GoChessApp* pMe)
{
       int nX = 0;
       int nY = 0;
       for(nX = 0;nX        {
              for(nY = 0;nY               {
                     pMe->WorldCell[nX][nY].nBPower  = gPowerTab[nX][nY];
                     pMe->WorldCell[nX][nY].nWPower  = gPowerTab[nX][nY];
                     pMe->WorldCell[nX][nY].bwColor = BW_NONE;
                     //pMe->WorldCell[nX][nY].bFind
                     pMe->WorldCell[nX][nY].gas = MAX_GAS;
                     if((nX ==0)||(nX ==PLANE_COL-1))
                            pMe->WorldCell[nX][nY].gas --;
                     if((nY ==0)||(nY ==PLANE_COL-1))
                            pMe->WorldCell[nX][nY].gas --;                
                     pMe->WorldCell[nX][nY].nBlack = 0;
                     pMe->WorldCell[nX][nY].nWhite = 0;
                     /
                     pMe->WorldCell[nX][nY].bDead =FALSE;
                     pMe->WorldCell[nX][nY].nBunch = 0;
              }
       }
       ///设禁手为无效值
       pMe->posForbid.x = INVALID_POS;
       pMe->posForbid.y = INVALID_POS;
       pMe->JustGo.x = INVALID_POS;
       pMe->JustGo.y = INVALID_POS;
     
       pMe->SelectPos.x = INIT_POS;  ///
       pMe->SelectPos.y = INIT_POS;  ///
    ///
       pMe->nBlackBunch = 0 ;
       pMe->nWhiteBunch = 0 ;
       ///
       pMe->nHandNum = 0 ;
       ///
       return;
}
///判断某个位置,是不是可以走棋
boolean CanGo(GoChessApp* pMe,BYTE x,BYTE y,BWCOLOR bwColor)
{
       BOOL bEatOpp =FALSE;
       if(pMe->WorldCell[x][y].bwColor !=BW_NONE) //只要有棋子,就不能走,只能//重新思考了.
              return FALSE;
       if((pMe->posForbid.x == x)&&(pMe->posForbid.y == y))//禁手也不可.
              return FALSE;
       if(pMe->WorldCell[x][y].gas ==0  ) //气为零的话,判断能不能吃掉对方,否则//判断是否是判断整块的气是否为零,否则不可
       {
              /看看能不能吃掉对方了.
              ReSetFindData(pMe); //重置查找数据
        if(IfKillTheBunCh(pMe,x,y,bwColor)) //判断能不能吃掉对方.
              {
                     /有气了.
                     return TRUE;
              }
              else
              {
                     /无气的问题了.
                     ReSetFindData(pMe);
            if(!IfKillTheBunCh(pMe,x -1,y,bwColor))
                     {
                            ///无气了.
                            return TRUE;
                     }
                     ReSetFindData(pMe);
                     if(!IfKillTheBunCh(pMe,x +1,y,bwColor))
                     {
                            ///无气了.
                            return TRUE;
                     }
                     ReSetFindData(pMe);
                     if(!IfKillTheBunCh(pMe,x,y-1,bwColor))
                     {
                            ///无气了.
                            return TRUE;
                     }
                     ReSetFindData(pMe);
                     if(!IfKillTheBunCh(pMe,x ,y+1,bwColor))
                     {
                            ///无气了.
                            return TRUE;
                     }
              }
              /
       }
       还有情况不能走,诸如以后再说吧。
       return TRUE;
}
设置绝对禁手
void SetForbid(GoChessApp* pMe,POINT point)
{
       pMe->posForbid.x = point.x;
       pMe->posForbid.y = point.y;
       return ;
}
///电脑走棋
void Computer_Go(GoChessApp* pMe,POINT point,BWCOLOR bwColor)
{
       while(1)//直到走成功为止.
       {
              ExpandTimes(pMe,EXPAND_TIMES); //扩张算法
              ErodeTimes(pMe,ERODE_TIMES); //侵蚀处理
              ValueToFiles(pMe); /// 调试使用
              GetBestPos(pMe,pMe->playerOpp.bwColor,&point);  保证没有问题了,//选择最佳点.
              if(CanGo(pMe,point.x,point.y,pMe->playerOpp.bwColor)) //能不能走?
              {
//走棋后的处理.
                     SetPointValue(pMe,point,pMe->playerOpp.bwColor);             
                     ChangeCurrentPlayer(pMe,point,pMe->playerOpp.bwColor);//
                     SetAllNeighborEffect(pMe,point.x,point.y,pMe->playerOpp.bwColor);
                     GoStep_Result(pMe,point,pMe->playerOpp.bwColor);
                     break;
              }
       }
       return;
}
人为走棋
void PerSon_Go(GoChessApp* pMe,POINT point,BWCOLOR bwColor)
{
       if(CanGo(pMe,point.x,point.y,pMe->playerMe.bwColor))
       {
//走棋后的处理.
              SetPointValue(pMe,point,pMe->playerMe.bwColor );
              ChangeCurrentPlayer(pMe,point,pMe->playerMe.bwColor);
              SetAllNeighborEffect(pMe,point.x,point.y,pMe->playerMe.bwColor);
              GoStep_Result(pMe,point,pMe->playerMe.bwColor);///
              if(pMe->playerOpp.pWho ==PLAYER_COMPUTER )
              {
                     ISHELL_SetTimer(pMe->pi.m_pIShell, THINK_TIME, (PFNNOTIFY)Computer_Go, (void*)pMe);
              }
       }
       return;
}

void GoStep_Result(GoChessApp* pMe,POINT point,BWCOLOR bwColor)
{
    BOOL bKill =FALSE;
       从这里入手了.
       /
       if(IfPointInDepend(pMe,point,bwColor))//是否独立?
       {
             
              //if()
              AddNewBunch(pMe,point.x,point.y,bwColor);  /串的概念
              ///
              if(pMe->WorldCell[point.x][point.y].gas >1 )
              {
                     //
                     //判断四周的空是不是有属于相同的区域的.
                     //
              }
              else  ///不会将一个空白变为两个空白区域了.暂时不作处理了.
              {
                    
              }
              很不明现是新串了.
       }
       else
       {
              /处理多了,哈哈.
       }
       /
       ///
    ReSetFindData(pMe);
       /判断,上方是否杀子了
       if(!IfKillTheBunCh(pMe,point.x,point.y-1,bwColor))   
       {
              杀之,其实可能,根本没的杀了.
              KillBunch(pMe);
       }
       ///判断,下方是否杀子了.
       ReSetFindData(pMe);
       if(!IfKillTheBunCh(pMe,point.x,point.y+1,bwColor))
       {
              //则杀之杀之,其实可能,根本没的杀了.
              KillBunch(pMe);
       }
       //判断,左方是否杀子了
       ReSetFindData(pMe);
       if(!IfKillTheBunCh(pMe,point.x-1,point.y,bwColor))
       {
              //则杀之杀之,其实可能,根本没的杀了.
              KillBunch(pMe);
       }
       //判断,右方是否杀子了
       ReSetFindData(pMe);
       if(!IfKillTheBunCh(pMe,point.x+1,point.y,bwColor))
       {
              //则杀之杀之,其实可能,根本没的杀了.
              KillBunch(pMe);
       }
       判断是否杀子了
       ///
       //如果没有杀子,进行处理.如果杀子的话,就完全处理吧
}
//改变玩家对象,既该谁走棋
void ChangeCurrentPlayer(GoChessApp* pMe,POINT point,BWCOLOR bwColor)
{
       pMe->playerMe.bThink =!pMe->playerMe.bThink;
       pMe->playerOpp.bThink =!pMe->playerOpp.bThink;
       pMe->bwCurColor = bwColor;
       pMe->JustGo.x = point.x ;
       pMe->JustGo.y = point.y ;
       pMe->nHandNum ++;
       //SetNeighborEffect(pMe,point.x,point.y,bwColor);
}
///设置玩家执黑还是执白。
void SetBWColor(GoChessApp* pMe,PLAYER *player,BWCOLOR bwColor)
{   
       return;
}
///返回最好的位置。
void GetBestPos(GoChessApp* pMe,BWCOLOR bwColor,POINT * point)
{
       int nX = 0 ;
       int nY = 0 ;
       int nPower = 0 ;
       int nTmpPower =0 ;
       unsigned char rand;
       /*
       point->x = pMe->SelectPos.x ;
       point->y = pMe->SelectPos.y ;
       if(bwColor ==BW_BLACK)
              nPower = pMe->WorldCell[nX][nY].nBPower;
       else
              nPower = pMe->WorldCell[nX][nY].nWPower;
       */
       for(nX = 0;nX        {
              for(nY = 0;nY               {
                     if(pMe->WorldCell[nX][nY].bwColor == BW_NONE)
                     {
                            //DBGPRINTF("黑力量%d,白力量%d",pMe->WorldCell[nX][nY].nBPower,pMe->WorldCell[nX][nY].nWPower);
                            if(bwColor==BW_BLACK)//刚刚修改了此处
                            {
                                   nTmpPower = pMe->WorldCell[nX][nY].nBPower ;//- pMe->WorldCell[nX][nY].nWPower;
                                   if((ABS(pMe->WorldCell[nX][nY].nBPower-pMe->WorldCell[nX][nY].nWPower)<2)&&(pMe->WorldCell[nX][nY].nBPower>=pMe->WorldCell[nX][nY].nWPower))
                                   {
                                          if(nTmpPower >nPower)
                                          {
                                                
                                                 point->x = nX ;
                                                 point->y = nY ;
                                                 nPower= nTmpPower;
                                          }
                                          else if(nTmpPower ==nPower)
                                          {
                                                 GETRAND(&rand,sizeof(unsigned char));
                                                 if(rand&0x01)
                                                 {
                                                        point->x = nX ;
                                                        point->y = nY ;
                                                        nPower= nTmpPower;
                                                 }
                                          }
                                   }
                            }
                            else
                            {
                                   nTmpPower = pMe->WorldCell[nX][nY].nWPower ;//- pMe->WorldCell[nX][nY].nBPower;
                                   if((ABS(pMe->WorldCell[nX][nY].nBPower-pMe->WorldCell[nX][nY].nWPower)<3)&&
                                          (pMe->WorldCell[nX][nY].nBPower<=pMe->WorldCell[nX][nY].nWPower))
                                   {
                                          if(nTmpPower >nPower)
                                          {
                                                
                                                 point->x = nX ;
                                                 point->y = nY ;
                                                 nPower= nTmpPower;
                                          }                               
                                          else if(nTmpPower ==nPower)
                                          {
                                                 GETRAND(&rand,sizeof(unsigned char));
                                                 if(rand&0x01)
                                                 {
                                                        point->x = nX ;
                                                        point->y = nY ;
                                                        nPower= nTmpPower;
                                                 }
                                          }
                                   }
                            }
                     }
              }
       }
      
      
       return;
}
//
void ReSetFindData(GoChessApp* pMe)
{
       int nX = 0;
       int nY = 0;
       //return;
       for(nX = 0;nX < PLANE_COL;nX ++)
       {
              for(nY = 0;nY               {
                     /对四周的每一个点进行判断了.
                     pMe->WorldCell[nX][nY].bFind = FALSE;
              }
       }
       return;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值