`
java2000.net
  • 浏览: 655845 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

一个简单的游戏源代码

阅读更多

  一个简单的游戏源代码

作者:陈跃峰
 
       实现一个简单的翻牌游戏,每次最多翻开两个数字,如果数字相同则消失,否则两个数字不显示,可以继续游戏。
       游戏规则如下:
       1、游戏数据使用两个一维数组存储:
u       map存储逻辑数据
u       displayMap存储绘制的数据,-1代表已经翻开,0代表未翻开,大于0代表已经翻开。
2、绘制规则:
u       在屏幕中心绘制图形
u       每个单元格宽度和高度都是20,每个单元格之间间隔4
3、游戏结束判别规则:
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) {}
    }
}
分享到:
评论

相关推荐

    java小游戏 (源码)swing五子棋源代码

    java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...

    收集整理的简单易懂的60套C语言小游戏源代码(可运行,供学习设计参考).zip

    收集整理的简单易懂的60套C语言小游戏源代码(可运行,供学习设计参考): c语言24点游戏源码 c语言Turbo C下写的俄罗斯方块 c语言UDP传输系统源码 c语言万年历源码 c语言五子棋源码 c语言俄罗斯方块 c语言做的一个...

    游戏源码游戏源码游戏源码游戏源码

    游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码游戏源码...

    Python小游戏源码大全,40个小游戏源代码.7z

    Python小游戏源码大全,40个小游戏源代码.7z

    经典HTML5小游戏h5游戏源代码合集(37款).zip

    这个压缩包中的"经典HTML5小游戏h5游戏源代码合集(37款)"是针对学习者和开发者的一份宝贵资源,包含了各种类型的游戏源码,能够帮助你深入理解HTML5游戏开发的核心技术。 首先,我们来看一下标签中提及的一些具体...

    几个c++游戏源代码

    【标题】:“几个c++游戏源代码”指出这是一个关于C++编程语言的游戏源代码集合,主要包含坦克大战、打飞机、暗黑破坏神和超级马里奥等经典游戏的源码。 【描述】:“c++游戏源代码 坦克大战 打飞机 暗黑破坏神 ...

    C#简单游戏合集源代码

    简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码简单游戏合集源代码...

    c++小游戏 c++小游戏源代码

    c++小游戏 c++小游戏源代码 c++小游戏 c++小游戏c++小游戏 c++小游戏

    Android实例源码-小游戏类安卓源代码(7例).zip

    Android实例源码-小游戏类安卓源代码(7例) 安卓冒险游戏源码可直接运行类似于精灵快跑这种可做毕业设计 安卓飞机游戏 完美版的Android 拼图游戏APK和工程源码 猜拳游戏 用的libgdx引擎写的ACE 弹幕射击游戏设计与...

    Html5小游戏源代码H5小游戏源码JS开发网页小游戏开源源码大合集.zip

    维京战争,一个都不能死,捕鱼达人,植物大战僵尸,3D魔方,青蛙吃苍蝇,蜘蛛纸牌,贪吃蛇,水果削除,2048中文版,大鱼吃小鱼,飞机大战,跑酷小游戏,贪吃蛇2.0,射击鸭子,激流勇进,天天消消乐,别踩白块,线条...

    微信小程序 小游戏类 数独小游戏 (源代码+截图)

    微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小游戏类 数独小游戏 (源代码+截图)微信小程序 小...

    海外游戏源码 游戏平台源码 手机游戏源码.zip

    "海外游戏源码 游戏平台源码 手机游戏源码.zip"这个压缩包可能包含了一系列用于构建游戏及其平台的源代码,这对于游戏开发者、学生以及对游戏编程感兴趣的人来说,是一个宝贵的学习资源。 首先,我们要理解游戏源码...

    java游戏源代码:11个小游戏的源码集合

    在本资源中,我们拥有一个名为"java游戏源代码:11个小游戏的源码集合"的压缩包,其中包含了11款用Java语言编写的经典小游戏的源代码。这个集合是一个宝贵的教育资源,适合初学者和有经验的开发者用于学习、研究和...

    c语言小游戏c语言项目源码大全合集(60例).zip

    c语言坦克游戏源代码 c语言大丰收游戏源码 c语言奔跑的火柴人游戏源码 c语言学生信息系统 c语言学生成绩管理系统 c语言学生成绩管理系统源码 c语言实现图片转化为 ASCII 图 c语言实现如果cmd中的ping c语言实现数字...

    c++小游戏 c++小游戏-源代码

    c++小游戏 c++小游戏-源代码 c++小游戏 c++小游戏c++小游戏 c++小游戏

    三国志游戏源代码(C语言)-----经典游戏的源码

    【标题】:三国志游戏源代码(C语言)-----经典游戏的源码 在这个主题中,我们探讨的是一个基于C语言实现的三国志游戏的源代码。C语言是一种强大的、低级的编程语言,广泛用于系统开发、游戏编程、嵌入式系统等。通过...

    ios游戏源代码_ios源码

    "ios游戏源代码_ios源码"指的是可用于iOS平台的游戏应用程序的原始编程代码。这些源代码通常使用Objective-C或Swift编写,这两种语言是苹果生态系统内开发的主要语言。 "chipmunk SpaceManager"是iOS游戏开发中的一...

    android 手机开发游戏源代码

    这个压缩包包含了10套完整的Android游戏源代码,对于学生和开发人员来说,它们是极好的学习材料和实践平台。下面,我们将深入探讨这些源代码可能涵盖的知识点,以及它们如何帮助你提升Android游戏开发技能。 首先,...

    unity武侠游戏源码

    unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码unity武侠角色扮演游戏源码...

    Android小游戏源代码.rar

    这个压缩包包含了多个文件,包括"JavaApk源码说明.txt",可能提供了源码的一些基本说明,以及"下载更多打包源码~.url",可能是链接到更多源码资源的网址,而"Android小游戏源代码"则可能是实际的游戏源代码。...

Global site tag (gtag.js) - Google Analytics