导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→发表看法:[因果]扫地雷源代码Keil编写



No.50049
作者:因果
邮件:chenshiyangyi@163.com
ID:113570
登陆:7次
文章数:11篇
最后登陆IP:119.59.248.166
最后登陆:2011/10/3 17:36:40
注册:2008/6/11 14:23:51
财富:156
发帖时间:2008/6/14 16:49:20
发贴者IP:218.17.74.150
标题:因果:扫地雷源代码Keil编写
摘要:No.50049扫地雷源代码Keil编写 扫地雷的源代码分为两部分,一部分是与硬件相关的,如屏的驱动,打印图片,设置前景色,清除屏幕…..;二,扫地雷的实现,主要是计算方法。如读者需要移值,只需要第二部分的程序稍加改动。

#define _GAME_DRV_H_
#include   <DP8051XP.H>  
#include "..\public\TypeDef.h"
#include "..\public\Key.h"
#include   <..\public\uigameapi.h>  
///为了调试,其调用了字库,屏的底层驱动
void gShowHexAscii(XWORD xwX,XWORD xwY,PXBYTE pxData,XWORD xLen) large
{

    *(PXWORD)(GAME_SWAP_RAM_ADDR +0)  = xwX;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +2)  = xwY;
    *(PXDWORD)(GAME_SWAP_RAM_ADDR+4) = (XDWORD)pxData;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +8)  = (XDWORD)xLen;
    
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 0;
    Run_Game_Api();
   
}
//打印图片子程序,bx,by为屏的坐标输入,wId为资源ID号
void gResShowPic(XWORD bx,XWORD by,XWORD wId) large
{

    *(PXWORD)(GAME_SWAP_RAM_ADDR +0)  = bx;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +2)  = by;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +4)  = wId;

    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 1;
    Run_Game_Api();

}
//设置前景色
void gSetPenColor(XWORD xwPenColor)   large
{
    *(PXWORD)(GAME_SWAP_RAM_ADDR +0)  = xwPenColor;   
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 2;
    Run_Game_Api();
}
//设置背景色
void gSetBackgdColor(XWORD xwGgColor)  large
{
    *(PXWORD)(GAME_SWAP_RAM_ADDR +0)  = xwGgColor;
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 3;
    Run_Game_Api();
}
//清屏
void gClearScreen(XWORD wColStart, XWORD wRowStart, XWORD wWidth, XWORD wHeight) large
{
    *(PXWORD)(GAME_SWAP_RAM_ADDR +0)  = wColStart;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +2)  = wRowStart;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +4)  = wWidth;
    *(PXWORD)(GAME_SWAP_RAM_ADDR +6)  = wHeight;
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 4;
    Run_Game_Api();

}
//延时,等待
void gap_sleep(XWORD xwDelayTime) large
{

    *(PXWORD)(GAME_SWAP_RAM_ADDR +0)  = xwDelayTime;
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 5;
    Run_Game_Api();

}
//获取系统消息,如时间,按键消息
XBYTE gap_get_message() large
{
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 6;
    Run_Game_Api();
    return *(PXBYTE)(GAME_SWAP_RAM_ADDR +0);
}

//设置时钟频率
void gSetGameSpeed(XBYTE xbType) large
{

    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 7;
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +0) = xbType;
    Run_Game_Api();

}
//获得一个随机数
XBYTE gGetRandVar(void) large
{

    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 8;
    Run_Game_Api();
    return *(PXWORD)(GAME_SWAP_RAM_ADDR +0);

}

XDWORD gGetGameRomFileMaxSector(void) large
{

    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 9;
    Run_Game_Api();
    return *(PXDWORD)(GAME_SWAP_RAM_ADDR +0);

}

void gfsReadOnePage(XDWORD PagePos,PXBYTE pxbTarget) large
{
       
    *(PXBYTE)(GAME_SWAP_RAM_ADDR +12) = 10;
    *(PXDWORD)(GAME_SWAP_RAM_ADDR +0)  = PagePos;
    *(PXDWORD)(GAME_SWAP_RAM_ADDR+4) = (XDWORD)pxbTarget;
    Run_Game_Api();
}


下面的程序为计算方法,我所用到的硬件是三代苹果(五个按键实现);对于下面的变量我全面申明为large,xdata的主要原因是我的系统造成的。我把游戏写为两个工程;一个工程我们可以理解为主程序,主要的功能是与硬件打交道的,如按键,定时器,关机,电池检测,屏的驱动;另一个工程为游戏的具体实现,与硬件与关的。两个工程的代码区域不一样的,xdata的区域也不一样。但是由于keil的编译系统,在工程1里面已经把data,idata占用了,如果工程2里面的变量用到data,idata的话,两个工程的变量会重叠,当定时中断时,未知的因素会发生。我这样设计的的好处是,外部的游戏可以做为文件拷入内存,而工程1无须改动。

#include   <DP8051XP.H>  
#include "..\public\TypeDef.h"
#include "..\public\Key.h"
#include   <..\public\uigameapi.h>  
#include   <SokuTek.h>  

void Timer0(void) interrupt 1 using 2
{

}

#define  MINE_MAX_X           17
#define  MINE_MAX_Y           11
#define  MINE_FLAG            9

#define  MINE_START_X         3
#define  MINE_START_Y         26
#define  MINE_BMP_WIDTH       9
#define  MINE_BMP_HEIGHT      9

#define  MN_LAUGH_FACE_X      72
#define  MN_LAUGH_FACE_Y      4

#define  MN_MINE_NUM          MINE_MAX_X + MINE_MAX_Y


#define INT16U      XWORD
#define ResShowPic   gResShowPic

INT16U   MN_Mine[MINE_MAX_X*MINE_MAX_Y];
INT16U   MN_Turn[MINE_MAX_X*MINE_MAX_Y];
INT16U   MN_Mark[MINE_MAX_X*MINE_MAX_Y];
INT16U   MN_TmpSchBlackMine[MINE_MAX_Y][MINE_MAX_X];
 
INT16U  MN_MarkNum;

INT16U  MN_RandSeed;
INT16U  MN_RandOffset;
INT16U  MN_RandMaxvalue;
INT16U  MN_curx;
INT16U  MN_cury;

INT16U MN_Random() large;
void MN_IniMineMap() large;
void MN_TurnBack(INT16U xx, INT16U yy) large;
INT16U MN_Edge_Stack(INT16U xx, INT16U yy) large;
void MN_Edge(INT16U xx, INT16U yy) large;
void MN_FailGame() large;
INT16U MN_LButton(INT16U xx, INT16U yy) large;
INT16U MN_RButton(INT16U xx,INT16U yy) large;
INT16U MN_ChkSuccess() large;
void RestoreCurMine() large;
void ShowMinesMap() large;
void ShowIniGameBckMap() large;
void  iniMineGame() large;
void MarkCurMine() large;
void MN_New_Edge(INT16U xx, INT16U yy) large;
extern rand();

INT16U MN_Random()  large
{
INT16U x,y;
     MN_RandSeed = MN_RandSeed*109 + 57;
     x = MN_RandSeed + MN_RandOffset;
     y = x & MN_RandMaxvalue;
     return y;
}

void MN_IniMineMap() large
{
    INT16U x, y,i;
   for(y = 0;y  <MINE_MAX_Y;y++)
     for(x = 0;x   <MINE_MAX_X;x++)
     {
      MN_Mine[y * MINE_MAX_X + x] = 0;
      MN_Turn[y * MINE_MAX_X + x] = 0;
      MN_Mark[y * MINE_MAX_X + x] = 0;
      }

    for(i = 0;i  <MN_MINE_NUM;i++) 
    {
     x = MN_Random();
      while (MN_Mine[x] || (x >  =MINE_MAX_X*MINE_MAX_Y - 1)) 
     {
     x = MN_Random();
     }
     MN_Mine[x] = MINE_FLAG;
    }

 for (y=0;y  <MINE_MAX_Y;y++)
   for (x=0;x  <MINE_MAX_X;x++)
   {
    i=0;
    if (MN_Mine[y*MINE_MAX_X +x]!=MINE_FLAG)
    {
    if ((MN_Mine[y*MINE_MAX_X +x-1]==MINE_FLAG)&&(x>  =1)) i++;
    if ((MN_Mine[y*MINE_MAX_X +x+1]==MINE_FLAG)&&((x+1)  <MINE_MAX_X)) i++;
    if ((MN_Mine[(y-1)*MINE_MAX_X +x]==MINE_FLAG)&&(y>  =1)) i++;
    if ((MN_Mine[(y+1)*MINE_MAX_X +x]==MINE_FLAG)&&((y+1)  <MINE_MAX_Y)) i++;
    if ((MN_Mine[(y-1)*MINE_MAX_X +x-1]==MINE_FLAG)&&(x>  =1)&&(y>  =1)) i++;
    if ((MN_Mine[(y-1)*MINE_MAX_X +x+1]==MINE_FLAG)&&((x+1)  <MINE_MAX_X)&&(y>  =1)) i++;
    if ((MN_Mine[(y+1)*MINE_MAX_X +x+1]==MINE_FLAG)&&((x+1)  <MINE_MAX_X)&&((y+1)  <MINE_MAX_Y)) i++;
    if ((MN_Mine[(y+1)*MINE_MAX_X +x-1]==MINE_FLAG)&&(x>  =1)&&((y+1)  <MINE_MAX_Y)) i++;
    MN_Mine[y*MINE_MAX_X +x]=i;
    }
   }
}
void MN_TurnBack(INT16U xx, INT16U yy)  large

 if(!MN_Turn[yy*MINE_MAX_X+xx]) 
      MN_Turn[yy*MINE_MAX_X+xx] = 2 + M ......

>>返回讨论的主题



  发表回复
用户名   *您没有注册?
密码   *
验证码   * .
标题   *
心情
随便说说    我回答你    最新发现    得意的笑   
气死我了    真是没劲    坚决同意    表示反对   
大家过来    好奇怪哟    懒得理它    大家小心   
文件上传
内容


字体:      字体大小:    颜色:
粗体 斜体 下划线 居中 超级连接 Email连接 图片 Flash图片 Shockwave文件 realplay视频文件 Media Player视频文件 QuickTime视频文件 引用 飞行字 移动字 发光字 阴影字 查看更多的心情图标 背景音乐
点击加入表情
                         
选项
有回复时用短消息通知您?

   




老古网执行:27毫秒 最大:78531毫秒 查询8次