6、Game.java
这个类封装了九宫格游戏的主要的游戏程序逻辑。前面我们也说过,游戏程序逻辑本身并不在本例程重点讨论的范围之内,本文主要是介绍MIDP图形编程的基础知识。游戏程序逻辑的WINS数组部分来自http://java.sun.com/applets/jdk/1.0/demo/TicTacToe/TicTacToe.java 这个经典例程。
注意游戏程序逻辑是独立于游戏用户界面的(参见类GameScreen),并且可以使用其它实现方法替代。
package example.tictactoe; import java.util.Random; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; // The game logic for TicTacToe class Game { private static final int[] WINS = { // horizontals bit(0) | bit(1) | bit(2), bit(3) | bit(4) | bit(5), bit(6) | bit(7) | bit(8), // verticals bit(0) | bit(3) | bit(6), bit(1) | bit(4) | bit(7), bit(2) | bit(5) | bit(8), // diagonals bit(0) | bit(4) | bit(8), bit(2) | bit(4) | bit(6) } ; private static final int DRAWN_GAME = bit(0) | bit(1) | bit(2) | bit(3) | bit(4) | bit(5) | bit(6) | bit(7) | bit(8); private int playerState; private int computerState; private Random random; Game(Random random) { this.random = random; initialize(); } void initialize() { playerState = 0; computerState = 0; } boolean isFree(int position) { int bit = bit(position); return (((playerState & bit) == 0) && ((computerState & bit) == 0)); } // The 'Contract' is that caller will always make valid moves. // We don't check that it's the player's turn. void makePlayerMove(int position) { playerState |= bit(position); } // The 'Contract' is that we will be called only when there is still // at least one free square. int makeComputerMove() { int move = getWinningComputerMove(); if (move == -1) { // can't win move = getRequiredBlockingComputerMove(); if (move == -1) { // don't need to block move = getRandomComputerMove(); } } computerState |= bit(move); return move; }
boolean isGameOver() { return isPlayerWinner() | isComputerWinner() | isGameDrawn(); } boolean isPlayerWinner() { return isWin(playerState); } boolean isComputerWinner() { return isWin(computerState); } boolean isGameDrawn() { return (playerState | computerState) == DRAWN_GAME; } // Return a winning move if there is at least one, otherwise return -1 private int getWinningComputerMove() { int move = -1; for (int i = 0; i < 9; ++i) { if (isFree(i) && isWin(computerState | bit(i))) { move = i; break; } } return move; } // Return a required blocking move if there is at least one (more // than one and we've inevitably lost), otherwise return -1 private int getRequiredBlockingComputerMove() { int move = -1; for (int i = 0; i < 9; ++i) {
if (isFree(i) && isWin(playerState | bit(i))) { move = i; break; } } return move; } // Return a random move in a free square, // or return -1 if none are available private int getRandomComputerMove() { int move = -1; // determine how many possible moves there are int numFreeSquares = 0; for (int i = 0; i < 9; ++i) { if (isFree(i)) { numFreeSquares++; } } // if there is at least one possible move, pick randomly if (numFreeSquares > 0) { // shift twice to get rid of sign bit, then modulo numFreeSquares int pick = ((random.nextInt()<<1)>>>1) % numFreeSquares; // now find the chosen free square by counting pick down to zero for (int i = 0; i < 9; ++i) { if (isFree(i)) { if (pick == 0) { move = i; break; } pick--; } } }
return move; } private static boolean isWin(int state) { boolean isWinner = false; for (int i = 0; i < WINS.length; ++i) { if ((state & WINS[i]) == WINS[i]) { isWinner = true; break; } } return isWinner; } private static int bit(int i) { return 1 << i; } } |
7、TicTacToe.jad
下面是九宫格MIDlet的应用程序描述文件。
MIDlet-Name: TicTacToe MIDlet-Vendor: Forum Nokia MIDlet-Version: 1.1.1 MIDlet-Jar-Size: 11409 MIDlet-Jar-URL: TicTacToe.jar MIDlet-1: TicTacToe, /tictactoe.png, example.tictactoe.TicTacToeMIDlet |
<script type="text/javascript"><!--google_ad_client = "pub-3051157228350391";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";google_ad_channel ="0045736275";//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script><iframe name="google_ads_frame" allowtransparency="65535" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-3051157228350391&amp;dt=1120830418796&amp;format=728x90_as&amp;output=html&amp;channel=0045736275&amp;ad_type=text_image&amp;cc=551&amp;u_h=768&amp;u_w=1024&amp;u_ah=740&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_his=19&amp;u_java=true" marginwidth="0" height="90" frameborder="0" scrolling="no" width="728" marginheight="0"></iframe>
分享到:
相关推荐
### Java手机游戏编程之MIDP图形设计篇 在探讨Java手机游戏编程中关于MIDP(Mobile Information Device Profile)图形设计的知识点时,我们首先需要理解MIDP及其在移动设备上的应用背景。MIDP是Java ME(Micro ...
**MIDP图形技术在手机游戏中的应用** MIDP(Mobile Information Device Profile)是Java ME(Micro Edition)的一个子集,主要用于开发移动设备上的应用程序,尤其是早期的智能手机和平板电脑。在MIDP框架下,图形...
**MIDP图形编程简介** MIDP(Mobile Information Device Profile)是Java ME(Micro Edition)的一部分,用于开发在移动设备和嵌入式系统上的应用程序,特别是早期的智能手机和平板电脑。这个平台提供了一套丰富的...
Java ME(Midp)是Java平台的一个子集,设计用于资源有限的移动设备,如早期的智能手机和平板电脑。它包含了Java应用程序接口(API)和一个运行环境,使开发者能够创建跨平台的移动应用。然而,由于并非所有计算机...
6. **内存管理与优化**:由于MIDP设备的资源有限,开发者必须关注内存管理和性能优化。避免无用的对象创建,合理使用缓存,以及适时释放不再使用的资源,都是提高游戏性能的关键。 7. **数据持久化**:为了保存游戏...
6. **图形和多媒体**:尽管资源受限,但MIDP允许开发简单的图形和音频应用。书籍会涉及如何绘制图形,播放音频,以及处理图像资源。 7. **性能优化**:鉴于移动设备的硬件限制,性能优化是MIDP编程的关键。书籍会...
6. **模拟器和调试工具**:文档可能会讨论如何使用MIDP的模拟器进行应用测试,以及使用J2ME Polish等工具进行开发和调试。 7. **性能优化**:由于资源限制,优化MIDlet的性能是关键。文档可能提供了一些技巧,如...
4. **用户界面设计**:讲解如何使用MIDP的图形组件创建用户友好的界面,包括布局管理、事件处理和用户交互。 5. **数据管理**:可能包括本地数据存储,如RecordStore API,用于在设备上保存应用程序数据。 6. **...
MIDP2.0(Mobile Information Device Profile 2.0),作为Java ME(Java Micro Edition)的一部分,专为资源受限的移动设备设计,如手机、PDA等,提供了标准的Java API集,使得开发者能够构建丰富的应用和服务。...
6. MIDP用户界面的其他考虑因素 6.1 有限的内存 设计游戏界面时,必须考虑到移动设备的内存限制,避免过度消耗资源,导致性能下降或崩溃。 6.2 有限的处理器能力 高效编码是关键,尤其是在图形渲染和逻辑处理方面,...
5. **受限的多媒体支持**:虽然相比后来的版本,MIDP1.0对音频和图像的支持较为有限,但仍能实现基本的媒体播放功能。 6. **安全模型**:MIDP1.0有一套安全机制,限制了应用程序的权限,防止恶意软件。 **学习MIDP...
**MIDP 2.0 The Game API** 是一个针对移动设备的游戏开发接口,它是Java Micro Edition (JME) 的一部分,特别设计用于在功能受限的移动设备上创建丰富的游戏体验。MIDP 2.0是MIDP平台的一个重要升级,提供了更多的...
Java移动通信程序设计-J2ME MIDP是Java技术在移动设备上进行应用程序开发的一个关键领域。J2ME,全称为Java 2 Micro Edition,是Java平台的一个子集,专为资源有限的嵌入式设备,如手机、智能手表以及家用电器等设计...
以一个简单的小游戏为例子,比较全面的介绍了MIDP图形编程方法。 包括以Screen为基础的高层界面和以Canvas为基础的底层界面开发都有涉及 目 录 1 引言...................................................... 5 ...
1. 用户界面:MIDP 2.0提供了一个轻量级的用户界面框架,包括Canvas类,它是绘制图形的基础;Form类,用于显示文本和用户输入;Item类,如ChoiceGroup和TextBox,支持用户交互。 2. 网络支持:MIDP 2.0引入了对HTTP...
在Java ME(J2ME)平台上,MIDP(Mobile Information Device Profile)是为移动设备设计的一个精简版Java API。MIDP 2.0是这个平台的一个重要升级,它引入了对游戏开发的强大支持,主要体现在Game API上。这个API...
- **MIDP**: Mobile Information Device Profile 的缩写,是Java ME的一部分,专为移动设备设计的标准平台,支持创建轻量级的应用程序和服务。 - **目标**: 本指南旨在提升MIDP应用程序的效率,涵盖执行速度、JAR...
- **Java MIDP** 是Java平台的一个子集,专为资源有限的移动设备设计。它包括用户界面组件、网络功能和数据存储接口,使得开发者可以创建交互式的移动应用。 - MIDP 2.0是其一个重要的版本,提供了更丰富的图形...