WEB开发网      婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈功缁犻箖鏌嶈閸撴氨鎹㈠☉娆愬闁告劕寮堕幖鎰棯閸撗勫殌闁宠鍨块幃鈺冣偓鍦Т椤ユ繈姊哄Ч鍥р偓妤呭磻閹捐桅闁告洦鍨扮粻娑㈡煕椤愶絾绀冩い搴$Ч濮婅櫣绮欏▎鎯у壋闂佸摜濮甸崝娆愪繆閻㈢ǹ绀嬫い鏍ㄨ壘閸炪劑姊洪棃娴ゆ稒鎷呴幓鎺嶅闂佸湱鍎ら〃鍡涘煕閹烘鐓曢柡鍥ュ妼娴滄粍銇勮箛锝呭籍闁哄备鈧磭鏆嗛悗锝庡墰閺嗙娀鏌ф导娆戝埌闁靛棙甯掗~婵嬫偂鎼达絼鐢荤紓浣诡殕閸ㄥ灝顫忕紒妯诲缂佹稑顑呭▓顓炩攽椤旀枻鍏紒鐘虫崌閵嗕礁顫濋幇浣光枌婵犵數濮崑鎾趁归敐鍥┿€婇柡鈧禒瀣厽婵☆垱顑欓崵瀣偓瑙勬偠閸庤精鐏冮梺缁樏鍫曞疮閻愮數纾奸柛灞炬皑鏁堥悗瑙勬礃缁繘藝鐎靛摜妫柟顖嗕礁浠悗娈垮枛閻栫厧鐣烽悡搴樻婵☆垯璀﹂悗宕囩磽閸屾瑧鍔嶆い銊ユ閻f繈骞栨担姝屾憰闂佺粯妫冮ˉ鎾诲汲鐎n喗鐓熸俊銈傚亾闁绘妫楅埢鎾澄旈崨顔规嫼闁荤姴娲犻埀顒冩珪閻忊偓闂備礁鎼幊鎰叏閹绢喗鍋╅柣銈庡灛娴滃綊鏌熼悜妯肩畺闁哄懏绻堝娲濞戞艾顣哄┑鈽嗗亝閻熲晠銆佸▎鎺旂杸闁哄啫鍊婚惁鍫ユ⒑濮瑰洤鐏叉繛浣冲嫮顩烽柨鏇炲€归悡鏇㈡煏婵炲灝鍔ら柛鈺嬬稻椤ㄣ儵鎮欓弶鎴濐潚濡ょ姷鍋為敃銏ゃ€佸▎鎾村殐闁冲搫顑囬獮銏ゆ⒒閸屾瑦绁版い顐㈩槸閻e嘲螣閼测晝鐓嬪銈嗘閿熴儲绂嶈ぐ鎺撶厵闁绘垶蓱鐏忣厼霉濠婂啰绉烘慨濠呮缁辨帒螣閾忛€涙闂備焦瀵уú宥夊疾濞戞粎浜遍梻浣告啞濞诧箓宕归柆宥呯厱闁硅揪闄勯悡娆撴煠濞村娅呭ù鐘崇矊閳规垿鍨鹃悙钘変划闂佽鍠楅〃鍛村煡婢舵劕绠抽柟鎯ь嚟瑜板洨绱撻崒娆戣窗闁哥姵鐗犻、鏍川閹碱厽鏅i梺绋跨箳閸樠呮閻愮繝绻嗘い鏍ㄧ矌鐢稒绻涢崨顓熷枠婵﹦绮幏鍛存偡闁箑娈濈紓鍌欐祰椤曆囧磹閸噮鍤曠紓浣贯缚缁♀偓闂佹悶鍎崝宥呪枍閸ヮ剚鈷戠紒瀣濠€鎵磼鐎n偅宕岀€规洏鍨介幃浠嬪川婵犲嫬骞楅梺鐟板悑閻n亪宕规繝姘厐闁哄洢鍨洪悡銉︽叏濡灝鐓愰柣鎾跺枛閻擃偊宕堕妷銉ュБ缂備礁顑堝畷鐢垫閹烘梻纾兼俊顖濆亹閻h櫣绱撴担铏瑰笡缂佽鐗嗛悾宄邦潨閳ь剚淇婂宀婃Ш缂備浇椴哥换鍫濐潖缂佹ɑ濯寸紒娑橆儏濞堟劙姊洪幖鐐插闁告鍟块悾鐑筋敍閻愯尙楠囬梺鐟邦嚟婵潧鈻撴ィ鍐┾拺缂備焦蓱閳锋帡鏌嶅畡鎵ⅵ鐎殿噮鍋婂畷鎺楁倷鐎电ǹ骞堥梻浣瑰▕閺侇噣宕戦幘缁樼厸闁告侗鍠氶幊鍛繆閸欏濮囬摶锝夋偠濞戞帒澧查柡鍌楀亾闂傚倷鑳剁划顖炲礉閺囩倣鐔哥節閸パ冩優闂佺粯鏌ㄩ惃婵嬪绩閼恒儯浜滈柡鍐ㄦ处椤ュ鏌涢弬璇测偓婵嬪箺閸洘鍊烽柣鎴炨缚閸橀亶姊洪崫鍕偍闁告柨鏈弲鍫曨敍閻愬鍘卞┑鐐叉缁绘帞绮绘繝姘厸閻忕偟鏅晥閻庤娲﹂崑濠傜暦閻旂⒈鏁嗛柍褜鍓欓埢宥夋晲閸モ晝锛濇繛杈剧稻瑜板啯绂嶉悙顒傜瘈闁靛骏绲剧涵鐐亜閹存繃宸濈紒顔剧帛閵堬綁宕橀埡鍐ㄥ箥闂佽瀛╃粙鎺戠幓鐠恒劎涓嶆慨妞诲亾闁哄被鍔岄埥澶娢熸径鐧哥稻閵囧嫰濡搁敐鍛Е闂佽鍠楅悷鈺呫€侀弮鍫濈妞ゆ挻绻勭粈鍕⒒閸屾瑦绁版い鏇熺墵瀹曚即寮介銈囶槸婵犵數濮撮崐濠氬汲閿曞倹鐓欐い鏍仜娴滅増淇婇懠棰濆殭闁宠鍨块崺鍕礃閵娧呫偡婵$偑鍊ら崢楣冨礂濡警鍤曢悹鍥ㄧゴ濡插牓鏌曡箛鏇烆潔闁冲搫鎳忛悡蹇擃熆鐠鸿櫣澧曢柛鏃€鎸抽弻娑㈠棘濞嗙偓楔缂備浇椴搁幐濠氬箯閸涱垳鐭欓幖瀛樻尭娴滈箖鏌涘┑鍕姢闁活厽鎸鹃幉鎼佹偋閸繄鐟ㄩ梺鍝勵儎缁舵岸寮婚悢鐓庣鐟滃繒鏁☉銏$厸闁告侗鍠楅崐鎰版煛鐏炶濮傞柟顔哄€濆畷鎺戔槈濮楀棔绱� ---闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸婂潡鏌ㄩ弮鍫熸殰闁稿鎸剧划顓炩槈濡搫绠诲┑鐐叉▕娴滄粓鎮″☉銏$厱婵炴垵宕獮妯汇亜閺傛寧顥㈡慨濠呮閹瑰嫰濡搁妷锔惧綒闂備胶鎳撻崵鏍箯閿燂拷
开发学院WEB开发Jsp MIDP1.0游戏完整实现-双人扫雷1.0(二) 阅读

MIDP1.0游戏完整实现-双人扫雷1.0(二)

 2008-01-05 08:54:31 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣椤愯姤鎱ㄥ鍡楀幊缂傚倹姘ㄩ幉绋款吋閸澀缃曢梻鍌欑濠€閬嶆惞鎼淬劌绐楅柡宥庡亞娑撳秵銇勯弽顐沪闁绘挶鍎甸弻锝夊即閻愭祴鍋撻崷顓涘亾濮樼偓瀚�闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣捣閻棗銆掑锝呬壕濡ょ姷鍋涢ˇ鐢稿极閹剧粯鍋愰柟缁樺笧閳ь剦鍙冨鍝勑ч崶褏浠奸梺璇茬箲閼归箖鎮鹃悜钘夎摕闁靛濡囬崢鐢告⒑鐟欏嫷鍟忛柛鐘崇墵閵嗗倹绺介崨濠勫幈闁硅壈鎻槐鏇熺墡闂備線娼уú銈団偓姘嵆閻涱噣骞掑Δ鈧粻锝嗙節闂堟稑鏆欏ù婊堢畺閺岋綁濮€閳惰泛婀辨竟鏇熺節濮橆厾鍘甸梺缁樺姦閸撴岸鎮樻潏銊ょ箚闁圭粯甯炴晶娑氱磼缂佹ḿ娲寸€规洖宕灃闁告劕鍟犻崜婵堟崲濞戞ḿ鏆嗗┑鐘辫兌閺佹牜绱撴担浠嬪摵闁圭懓娲ら悾鐑藉箳閹搭厽鍍甸梺鐟板悁閻掞箓鎮楅幖浣光拻濞达絿鍎ら崵鈧梺鎼炲€栭悧鐘荤嵁韫囨稒鏅搁柨鐕傛嫹婵犵數濮烽弫鍛婃叏閻戣棄鏋侀柛娑橈攻閸欏繑銇勯幘鍗炵仼缂佺媭鍨堕弻娑㈠箛闂堟稒鐏堥悗鐟版啞缁诲啴濡甸崟顖氱閻庨潧鎽滈悾濂告⒑绾拋娼愭繛鑼枎椤繒绱掑Ο鑲╂嚌闂侀€炲苯澧畝锝堝劵椤︽煡鎮¢妶澶嬬厪闁割偅绻冮崑顏呯箾瀹割喕绨婚幆鐔兼⒑鐎圭姵銆冮柤鍐茬埣瀹曟繈鏁冮埀顒勨€旈崘顔嘉ч柛鈩冾殘閻熸劙姊洪悡搴℃毐闁绘牕銈稿畷鐑樼節閸パ冨祮闂侀潧楠忕槐鏇㈠储椤忓牊鈷戦柟鑲╁仜閸旀鏌¢崨顔锯姇缂佸倹甯熼ˇ瀵哥磼鏉堛劌绗氭繛鐓庣箻閸┾剝鎷呴柨瀣垫綗闂傚倷娴囧銊╂倿閿曞倸绠查柛銉墮閺嬩線鏌熼崜褏甯涢柡鍛倐閺屻劑鎮ら崒娑橆伓闂傚倸鍊搁崐鎼佸磹閹间礁纾瑰瀣椤愯姤鎱ㄥ鍡楀幊缂傚倹姘ㄩ幉绋款吋閸澀缃曢梻鍌欑濠€閬嶆惞鎼淬劌绐楅柡宥庡亞娑撳秵銇勯弽顐沪闁绘挶鍎甸弻锝夊即閻愭祴鍋撻崷顓涘亾濮樼偓瀚�  闂傚倸鍊搁崐鎼佸磹閹间礁纾归柣鎴eГ閸ゅ嫰鏌ら崫銉︽毄濞寸姵姘ㄧ槐鎾诲磼濞嗘帒鍘$紓渚囧櫘閸ㄥ爼濡撮崘顔煎窛闁哄鍨归崢娲倵楠炲灝鍔氭い锔诲灦瀹曪繝骞庨懞銉у帾闂婎偄娲﹀ú鏍ㄧ墡闂備浇顕х€垫帡宕滈悢濂夋綎闁惧繐婀辩壕鍏间繆椤栨碍鎯堟い顐㈢Т椤啴濡堕崱妤€顫庨梺鍛婎焼閸パ呭弨婵犮垼娉涜癌闁绘柨鍚嬮悡銉╂倵閿濆骸鍘撮柛瀣尰缁绘繂顫濋娑欏闁荤喐绮庢晶妤冩暜閹烘挾顩插ù鐓庣摠閻撴洟鏌熼幆褜鍤熼柍钘夘樀閺屽秶绱掑Ο鑽ゅ弳濡炪値鍋呯换鍫ュ箠濠婂懎鏋堟俊顖濐嚙椤忓綊姊婚崒娆戭槮闁硅绱曠划娆撳箣閿斿搫浜奸梺鍝勵槹閸ㄧ喖寮搁弮鍫熺厸闁告劧绲芥禍鍓х磽娴h櫣甯涚紒瀣尰缁傛帡鏁冮崒姘憋紲濠殿喗锕╅崜锕傛倵閹惰姤鈷掑ù锝呮憸閿涘秶绱掗鍛仸妤犵偞鍨垮畷鍫曨敆閸屾氨銈﹂梺璇插嚱缂嶅棙绂嶉弽顓炵哗濞寸姴顑嗛悡娆撴⒑椤撱劎鐣卞褜鍨遍妵鍕棘閸喒鍋撶憴鍕攳濠电姴娲﹂崐閿嬨亜韫囨挸顏ら柛瀣崌瀵€燁檨婵炲吋鐗曢埞鎴︽偐鐎圭姴顥濋梺绋胯閸斿酣骞夊宀€鐤€婵炴垶岣块悿鍛存⒑閸︻叀妾搁柛鐘愁殜瀵煡骞栨担鍦弳闂佺粯娲栭崐鍦偓姘炬嫹
核心提示:作者:yinowl2005年2月帮助界面帮助界面很简单,把需要的文字排好宽度放在一个String数组里,MIDP1.0游戏完整实现-双人扫雷1.0(二),然后绘制在屏幕上,假如一屏放不下就增加按键响应来翻屏,也就是屏幕上显示的地雷区域在整个雷区中的位置g.setColor(0x00777777);g.fillRect(

  作者:yinowl
2005年2月

帮助界面
帮助界面很简单,把需要的文字排好宽度放在一个String数组里,然后绘制在屏幕上,假如一屏放不下就增加按键响应来翻屏,其实只是重新画出数组前面或后面的几个值,源代码如下:

在MiningCanvas.java中添加如下代码
final String[] strGamehelp =new String[10];
public MiningCanvas(MiningMIDlet miningMIDlet){
  ...
  strGamehelp[0]="此游戏为双人对战游戏";
  strGamehelp[1]=",和经典的扫雷不同,这";
  strGamehelp[2]="个游戏中,我们要挖出";
  strGamehelp[3]="雷,挖错雷则交换玩家.";
  strGamehelp[4]="一共有52颗雷,256个格";
  strGamehelp[5]="子,最先挖到27颗雷者";
  strGamehelp[6]="获胜.1.上,下,左,右分";
  strGamehelp[7]="别为数字键2,8,4,6,挖";
  strGamehelp[8]="雷为5;2.屏幕外框的颜";
  strGamehelp[9]="色为当前下玩家;";
}
PRivate void paintHelpScreen(Graphics g){
  g.setColor(0x00FFFFFF);
  g.fillRect(0,0,canvasW,canvasH);
  g.setFont(lowFont);
  g.setColor(0x00000000);
  for(int i=0;i<strGamehelp.length;i++){
    g.drawString(strGamehelp[i],5,5+(lowFont.getHeight()+3)*i,Graphics.TOPGraphics.LEFT);
  }
}
在keyPressed方法中的switch结构中添加
case GAMESTATE_HELP://假如游戏现在的状态为帮助状态,那个不管玩家按哪个键都会跳转到主菜单状态
  gamestate=GAMESTATE_MENU;
  break;

游戏主界面
主界面的绘制分成几个部分,一个是雷区棋盘的绘制,根据雷区二位数组中的每一个Bomb对象中的变量值绘出整个棋盘,假如hasFound值为false,画出MIDP1.0游戏完整实现-双人扫雷1.0(二)(图一);假如hasFound值为true且isBomb值为false,那么会画出这个雷位四周的雷数MIDP1.0游戏完整实现-双人扫雷1.0(二)(图二)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图三)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图四)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图五)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图六)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图七)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图八);假如hasFound值为true且isBomb值为true,那么会画出这个雷位是哪一个玩家所挖出的,分别是MIDP1.0游戏完整实现-双人扫雷1.0(二)(图九)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图十)。第二个部分是玩家的选择框。第三个部分是游戏的信息框,也就是两个玩家目前的分值,还剩几颗雷,信息框的图片为MIDP1.0游戏完整实现-双人扫雷1.0(二)(图十)。最后一个部分是提示当前轮到哪一个玩家扫雷,在雷区的外框用玩家的颜色提示,和在信息框中画出玩家的旗帜MIDP1.0游戏完整实现-双人扫雷1.0(二)(图十二)MIDP1.0游戏完整实现-双人扫雷1.0(二)(图十三)
这里有几个注重点:
1.雷区不能全部在屏幕中画下,所以会通过卷轴滚动。整个雷区是16x16,我们的屏幕预备画出10x12,用两个变量(paintX和paintY)来控制当前要画出的雷区左上角的雷位坐标,例如这两个变量的值分别为3和4,那么会画出横轴3-10,纵轴4-13的雷位,选择框的坐标(selectedX和selectedY)不用担心,当他超出了屏幕,只需要增加或减少paintX和paintY的值即可,只要保证选择框的坐标和paintX/Y坐标值得距离不超过9(10-1)和11(12-1)即可。这里要十分小心的是,我们这里所有的坐标值和雷区的二位数组bombs中的坐标正好相反,也就是选择框(5,6)是类位bombs[6][5]。
2.在创建雷区二维Bomb数组时,二位数组的大小是18x18(new Bomb[miningMapGrid+2][miningMapGrid+2]),目的是在大小16x16的真正雷区外加一圈雷位,以避免bombOut()方法和其他需要周边搜索雷位时不会出现超越边界异常。
3.因为bombs数组中的索引1-16才是真正代表雷区中坐标(1,1)至(16,16)的雷位,所以在整个程序中,所有有关坐标和数组索引值的地方都要十分小心,不要出现位置错误
4.消息框中需要绘制的几个数值的坐标变量(Player1X/Y,Player2X/Y,bombnowX/Y)的值都是相对于整个消息框的左上角的相对坐标,我们也可以为消息框的坐标单独定义一对变量,这样就更清楚了。
源代码如下:

在MiningCanvas.java中添加如下代码
int empty;
static final int miningMapGrid=16;//雷区为16格x16格
static final int bombNum=52;//共有52颗雷
int miningMapLength,miningGridLength;//整个雷区的边长,每一个雷位格子的边长
int miningMapX,miningMapY;//雷区的左上角坐标
int selectedX,selectedY;//选择框的坐标,是在雷区里的坐标(1-16)
int player1Found,player2Found;//两个玩家的分值,即已经找到的雷数
int paintX,paintY;//要画出的区域的左上角坐标,是在雷区里的坐标(1-16)
int bombLeft;//剩下未扫出的雷数
static final int Player1X=10,Player1Y=30;//信息框中画出玩家一分数的坐标位置,相对于信息框左上角
static final int Player2X=10,Player2Y=90;//信息框中画出玩家二分数的坐标位置,相对于信息框左上角
static final int bombnowX=8,bombnowY=52;//信息框中画出剩余雷数的坐标位置,相对于信息框左上角
static final int bombMapW=10,bombMapH=12;//屏幕上能绘出的雷位的数量
Bomb[][] bombs;
boolean isPlayer1;//当前是否轮到玩家一扫雷
Alert winAlert;//显示输赢信息的Alert对象
String winString;//比出输赢后要输出的信息
boolean sbWon;//是否得出输赢
static final Font font  = Font.getFont(Font.FACE_MONOSPACE,Font.STYLE_PLAIN,Font.SIZE_SMALL);
  //消息框中使用的字体
Image infoImg,splashImage;
Image unFoundGroundImg;
Image foundGroundImg;
Image player1BombImg,player2BombImg,player1TurnImg,player2TurnImg;
Image bomb1Img,bomb2Img,bomb3Img,bomb4Img,bomb5Img,bomb6Img,bomb7Img,bomb8Img; 
  //所有要用到的图片
public MiningCanvas(MiningMIDlet miningMIDlet){
  ...
  try{//实例化游戏中需要的Image对象
    unFoundGroundImg=Image.createImage("/unfoundGroundbig.png");
    foundGroundImg=Image.createImage("/foundGroundbig.png");
    player1BombImg=Image.createImage("/player1bombbig.png");
    player2BombImg=Image.createImage("/player2bombbig.png");
    bomb1Img=Image.createImage("/bomb1big.png");
    bomb2Img=Image.createImage("/bomb2big.png");
    bomb3Img=Image.createImage("/bomb3big.png");
    bomb4Img=Image.createImage("/bomb4big.png");
    bomb5Img=Image.createImage("/bomb5big.png");
    bomb6Img=Image.createImage("/bomb6big.png");
    infoImg=Image.createImage("/info.png");
    splashImage=Image.createImage("/occo.png");
    player1TurnImg=Image.createImage("/player1turn.png");
    player2TurnImg=Image.createImage("/player2turn.png");
  }catch(IOException e){}
  isPlayer1=true;//初始化玩家先后顺序
  miningGridLength=14;//初始化每一个雷位的边长
  miningMapLength=14*12;//整个扫雷棋盘的边长
  miningMapX=(canvasW-miningMapLength)/2;//屏幕上棋盘左上角的X坐标
  miningMapY=(canvasH-miningMapLength)/2;//屏幕上棋盘左上角的Y坐标
  selectedX=selectedY=miningMapGrid/2;//初始化选择框的坐标为
  player1Found=player2Found=0;//初始化两个玩家的得分
  paintX=paintY=3;//初始化整个雷区一开始在屏幕上显示的范围
  sbWon=false;//初始化没有玩家获胜
  bombLeft=bombNum;//初始化剩余雷数为总雷数
  bombs=new Bomb[miningMapGrid+2][miningMapGrid+2];
  bombInit();//初始化雷区 
}
private void paintGameScreen(Graphics g){
  paintPlayer(g,isPlayer1);
  paintMiningMap(g);
  paintInfo(g);
  paintSelected(g);
}
protected void paintInfo(Graphics g){
  g.drawImage(infoImg,miningMapX+bombMapW*miningGridLength+1,
        miningMapY,Graphics.TOPGraphics.LEFT);
  g.setFont(font);
  g.setColor(0x00FFFFFF);
  g.drawString(String.valueOf(bombLeft),miningMapX+bombMapW*miningGridLength+bombnowX,
        miningMapY+bombnowY,Graphics.TOPGraphics.LEFT);
  g.drawString(String.valueOf(player1Found),miningMapX+bombMapW*miningGridLength+Player1X,
        miningMapY+Player1Y,Graphics.TOPGraphics.LEFT);
  g.drawString(String.valueOf(player2Found),miningMapX+bombMapW*miningGridLength+Player2X,
        miningMapY+Player2Y,Graphics.TOPGraphics.LEFT);
  //这个方法中接下来的代码是用来在信息框中画出小地图,也就是屏幕上显示的地雷区域在整个雷区
   中的位置
  g.setColor(0x00777777);
  g.fillRect(miningMapX+bombMapW*miningGridLength+1,miningMapY+8*miningGridLength+1,
        2*miningGridLength-2,2*miningGridLength-1);
  g.setColor(0x00000000);
  g.drawRect(miningMapX+bombMapW*miningGridLength+1,miningMapY+8*miningGridLength+1,
        2*miningGridLength-2,2*miningGridLength-1);
  g.setColor(0x00BBBBBB);
  g.fillRect(miningMapX+bombMapW*miningGridLength+4+2*(paintX-1),
        miningMapY+8*miningGridLength+4+2*(paintY-1),12,17);
  g.setColor(0x00FFFFFF);
  g.drawRect(miningMapX+bombMapW*miningGridLength+4+2*(paintX-1),
        miningMapY+8*miningGridLength+4+2*(paintY-1),12,17);
}
protected void paintPlayer(Graphics g,boolean isPlayer1){
  if(isPlayer1)//在棋盘外围画出玩家颜色的外框
    g.setColor(0x000000FF);
  else
    g.setColor(0x00FF0000);
  for(int i=1;i<=5;i++){
    g.drawRect(miningMapX-i,miningMapY-i,miningMapLength+2*i,miningMapLength+2*i);
  }
  if(isPlayer1)//在信息框中画出代表玩家的旗帜
    g.drawImage(player1TurnImg,miningMapX+(bombMapW+1)*miningGridLength+1,
        miningMapY+11*miningGridLength,Graphics.HCENTERGraphics.VCENTER);
  else
    g.drawImage(player2TurnImg,miningMapX+(bombMapW+1)*miningGridLength+1,
        miningMapY+11*miningGridLength,Graphics.HCENTERGraphics.VCENTER);
}
public void paintMiningMap(Graphics g){
  for(int i=0;i<bombMapH;i++){
    for(int j=0;j<bombMapW;j++){//根据每个Bomb对象中的变量值画出不同的图片
      if(!bombs[i+paintY+1][j+paintX+1].hasFound){
        g.drawImage(unFoundGroundImg,miningMapX+j*miningGridLength,
            miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
      }
      else {
        if(!bombs[i+paintY+1][j+paintX+1].isBomb){
          switch(bombs[i+paintY+1][j+paintX+1].bombaround){
            case 0:
              g.drawImage(foundGroundImg,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            case 1:
              g.drawImage(bomb1Img,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            case 2:
              g.drawImage(bomb2Img,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            case 3:
              g.drawImage(bomb3Img,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            case 4:
              g.drawImage(bomb4Img,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            case 5:
              g.drawImage(bomb5Img,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            case 6:
              g.drawImage(bomb6Img,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
              break;
            default:
              g.drawImage(foundGroundImg,miningMapX+j*miningGridLength,
                miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
            break;
          }
        }
        else {
          if(bombs[i+paintY+1][j+paintX+1].isPlayer1){
            g.drawImage(player1BombImg,miningMapX+j*miningGridLength,
              miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
          }
          else{
            g.drawImage(player2BombImg,miningMapX+j*miningGridLength,
              miningMapY+i*miningGridLength,Graphics.TOPGraphics.LEFT);
          }
        }
      }
    }
  }
}
public void paintSelected(Graphics g){
  g.setColor(0x00FF0000);//画出选择框,注重其与总雷区和能在屏幕上显示出的区域间的关系
  g.drawRoundRect(miningMapX+(selectedX-paintX)*miningGridLength-1,
        miningMapY+(selectedY-paintY)*miningGridLength-1,
        miningGridLength+1,miningGridLength+1,2,2);
}
在keyPressed方法中的switch结构中添加
case GAMESTATE_GAMEING:
{
  if(keyCode==FullCanvas.KEY_SOFTKEY1){
    gamestate=GAMESTATE_GAMEMENU;
  }
  else if (action == FullCanvas.LEFT ) {
    selectedX=(--selectedX+miningMapGrid)%(miningMapGrid);
  }
  else if (action == FullCanvas.RIGHT) {
    selectedX=(++selectedX)%(miningMapGrid);
  }
  else if (action == FullCanvas.UP) {
    selectedY=(--selectedY+miningMapGrid)%(miningMapGrid);
  }
  else if (action == FullCanvas.DOWN) {
    selectedY=(++selectedY)%(miningMapGrid);
  }
  else if (action == FullCanvas.FIRE) {
    if(!bombs[selectedY+1][selectedX+1].hasFound){
      if(bombs[selectedY+1][selectedX+1].isBomb){
        bombs[selectedY+1][selectedX+1].hasFound=true;
        bombs[selectedY+1][selectedX+1].isPlayer1=this.isPlayer1;
        if(isPlayer1)
          player1Found++;
        else
          player2Found++;
        bombLeft--;
        checkWin();//每次有玩家挖到了雷就监测其是否胜出
      }
      else{
        bombOut(selectedY+1,selectedX+1);
        //假如此雷位及四周都无雷,打开所有与其相连的相同情况的雷位及此区域周边一圈雷位
        isPlayer1=!isPlayer1;
      }
    }
  }
  //以下几行代码是调整显示在屏幕上的区域的坐标,以免选择框跑出屏幕范围
  if((selectedX-paintX)<0)
    paintX=selectedX;
  else if((selectedX-paintX)>=bombMapW)
    paintX=selectedX-bombMapW+1;
  if((selectedY-paintY)<0)
    paintY=selectedY;
  else if((selectedY-paintY)>=bombMapH)
    paintY=selectedY-bombMapH+1;
  break;
}


Tags:MIDP 游戏 完整

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接