一个简单的游戏源代码
2007-12-28 06:10
453 查看
一个简单的游戏源代码[align=center]作者:陈跃峰[/align][align=center]出自:http://blog.csdn.net/mailbomb[/align] 实现一个简单的翻牌游戏,每次最多翻开两个数字,如果数字相同则消失,否则两个数字不显示,可以继续游戏。 游戏规则如下: 1、游戏数据使用两个一维数组存储:u map存储逻辑数据u displayMap存储绘制的数据,-1代表已经翻开,0代表未翻开,大于0代表已经翻开。2、绘制规则:u 在屏幕中心绘制图形u 每个单元格宽度和高度都是20,每个单元格之间间隔43、游戏结束判别规则:u 单元格全部消失或者只有一个单元格剩余实现代码如下:package simplegame; import java.util.Random;import javax.microedition.lcdui.*; /** * 翻图游戏 * 游戏数据分别存储在两个数组, * 1、数组map存放实际的地图数据,每行显示的数据长度为关卡数字+1 * 2、已经翻开的地图数据存储在displayMap数组中,-1代表已经翻开,0代表未翻开,大于0代表已经翻开 * @author 陈跃峰 * @version 1.0 */public class SimpleGameCanvas extends Canvas implements Runnable { /**地图数据,地图数据的长度是(level + 1) * (level + 1)*/ private int[] map; /**显示的数据,0代表未显示,-1代表消失,大于0代表翻开的数据*/ private int[] displayMap; /**关卡*/ private int level = 1; /**已经翻开的数字数量*/ int num = 0; /**选择框序号,编号规则为从左到右,从上到下*/ int index = 0; /**第一个被翻开的方块*/ int firstIndex = 0; /**第二个被翻开的方块*/ int secondIndex = 0; /**屏幕宽度*/ private int width; /**屏幕高度*/ private int height; /**每个单元格宽度*/ private final int TILE_WIDTH = 20; /**每个单元格高度*/ private final int TILE_HEIGHT = 20; /**每个单元格之间的间隔*/ private final int INNER_WIDTH = 4; /** * 默认构造方法 */ public SimpleGameCanvas() { //初始化数据 width = this.getWidth(); height = this.getHeight(); init(level); //启动线程 new Thread(this).start(); } protected void paint(Graphics g) { //清屏 g.setColor(0xffffff); g.fillRect(0, 0, width, height); g.setColor(0); //绘制数字 drawNumber(g); //绘制关卡数字 g.drawString("第" + level + "关", this.getWidth() / 2, 15, Graphics.BASELINE | Graphics.HCENTER); } private void drawNumber(Graphics g) { //屏幕中心点坐标 int xCenter = width / 2; int yCenter = height / 2; //左上坐标 int x = xCenter - ((level + 1) * TILE_WIDTH + ((level + 1) - 1) * INNER_WIDTH) / 2; int y = yCenter - ((level + 1) * TILE_HEIGHT + ((level + 1) - 1) * INNER_WIDTH) / 2; //循环绘制 for (int i = 0; i < displayMap.length; i++) { //绘制边框和数字 g.setColor(0); if (displayMap[i] >= 0) { g.fillRect(x + (i % (level + 1)) * (TILE_WIDTH + INNER_WIDTH), y + (i / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH), TILE_WIDTH, TILE_HEIGHT); //绘制内部的数字 if (displayMap[i] > 0) { g.setColor(0xffffff); g.drawString(String.valueOf(displayMap[i]), x + (i % (level + 1)) * (TILE_WIDTH + INNER_WIDTH) + 7, y + (i / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH) + 2, Graphics.TOP | Graphics.LEFT ); } } } //绘制选择框 g.setColor(0xff0000); g.drawRect(x + index % (level + 1) * (TILE_WIDTH + INNER_WIDTH) - 1, y + (index / (level + 1)) * (TILE_HEIGHT + INNER_WIDTH) - 1, TILE_WIDTH + 1, TILE_HEIGHT + 1); } /** * 根据关卡初始化地图数据 * @param level 等级 */ private void init(int level) { //初始化地图数据大小 map = new int[(level + 1) * (level + 1)]; //初始化地图数据 for (int i = 0; i < map.length; i++) { map[i] = i % (map.length / 2) + 1; } //随机打乱地图数据 Random ran = new Random(); int index = 0; int temp; for (int i = 0; i < map.length; i++) { index = Math.abs(ran.nextInt() % map.length); //交换数据 temp = map[i]; map[i] = map[index]; map[index] = temp; } //初始化显示地图数据大小 displayMap = new int[(level + 1) * (level + 1)]; } public void keyPressed(int keyCode) { int action = this.getGameAction(keyCode); switch (action) { case UP: if (index - level - 1 >= 0) { index = index - level - 1; } break; case DOWN: if (index + level + 1 <= (level + 1) * (level + 1) - 1) { index = index + level + 1; } break; case LEFT: if (index > 0) { index--; } break; case RIGHT: if (index < (level + 1) * (level + 1) - 1) { index++; } break; case FIRE: //确定 if (num < 2 && displayMap[index] >= 0) { //翻开的数量小于2 num++; //翻开的数量增加1 //记录索引值 if (num == 1) { firstIndex = index; } else if (num == 2 && index != firstIndex) { secondIndex = index; } //显示该数字 displayMap[index] = map[index]; } } repaint(); } /** * 是否升级 * 剩余1个或者是全部消失则升级 * @return true代表升级 */ private boolean isLevelUp() { int n = 0; //存储没有翻开的方块数量 for (int i = 0; i < displayMap.length; i++) { if (displayMap[i] != -1) { n++; } } if (n > 1) { return false; } else { return true; } } public void run() { try { while (true) { //暂停 Thread.sleep(100); //逻辑处理 //处理逻辑 if (num == 2) { try { Thread.sleep(500); } catch (Exception e) {} if (map[firstIndex] == map[secondIndex]) { //内容相同 displayMap[firstIndex] = -1; displayMap[secondIndex] = -1; } else { displayMap[firstIndex] = 0; displayMap[secondIndex] = 0; } num = 0; } //升级 if (isLevelUp()) { level++; //等级+1 init(level); //初始化地图数据 num = 0; //翻开的数量归零 index = 0; //默认选择第一个方块 } //重新绘制 repaint(); } } catch (Exception e) {} }}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1194998
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1194998
相关文章推荐
- 一个简单的游戏源代码
- 一个简单的游戏源代码
- 一个简单网格游戏,可以寻找到网格最短路径(源代码)
- 一个简单的游戏源代码
- 一个简单的游戏源代码
- 一个俄罗斯方块游戏的简单实现
- 一个简单的游戏服务器框架
- cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详解献给刚開始学习的人们!
- cocos2d-x 3.0来做一个简单的游戏教程 win32平台 vs2012 详细解释献给初学者们!
- 一个使用监听器模式实现的J2ME网络编程框架,包括一个简单的登录功能实现(含源代码)
- 一个超级简单的HTML模板框架源代码以及使用示例
- 如何制作一个简单的游戏(2) Cocos2d-x 2.0.4
- 一个简单的跑酷游戏《萝莉快跑》的消化(附下载)
- 一个简单的猜拳游戏
- Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏
- [置顶] Android用SurfaceView写一个简单有趣的游戏--《数字组合》之一
- C实现一个比较简单的猜数游戏
- [Unity3D]手机3D游戏开发:使用UnityRemote开发一个简单的FPS案例
- WatchKit入门:创建一个简单的猜数游戏
- ajax简单手写了一个猜拳游戏