一个简单的游戏源代码

2023-05-16

  一个简单的游戏源代码

作者:陈跃峰
出自: http://blog.csdn.net/mailbomb
 
       实现一个简单的翻牌游戏,每次最多翻开两个数字,如果数字相同则消失,否则两个数字不显示,可以继续游戏。
       游戏规则如下:
       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) {}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个简单的游戏源代码 的相关文章

  • 常见的java集合类有哪些

    常见的java集合类有 xff1a 线程安全的 xff1a Hashtable xff0c ConcurrentHashMap xff0c Vector xff0c Stack xff08 栈 xff09 线程不安全的 xff1a Hash
  • CentOS7下zabbix 6.0 LTS源码搭建部署

    zabbix基本概述 zabbix是基于web界面的分布式系统监控 与网络设备监控系统 xff0c 能监控各种网络参数 xff0c 并提供灵活的通知机制 xff0c 以便管理员快速定位故障并解决 zabbix由两个部分组成 xff1a za
  • 网络数据包详解

    通过wireshark抓取在不同链路上的数据包 xff0c 分析数据在网上传输过程 首先要有下面基础知识 1 网络数据封装过程 xff0c 数据包发送的时候从上往下封装的 xff0c 解封装反过来 从下往上看 最下面是以太网帧 xff0c
  • Royal TSX for Mac(强大的远程管理软件)

    Royal TSX mac破解版是一款帮助用户管理桌面的Mac桌面管理软件 xff0c Royal TSX for mac为你提供方便安全的访问远程系统 Royal TSX专为服务器管理员 系统工程师 开发人员和IT信息工作者开发设计 xf
  • 在x86_64平台上搭建龙芯MIPS64交叉编译环境

    在x86 64平台上搭建龙芯MIPS64交叉编译环境 下载龙芯交叉编译器 下载地址 搭建交叉编译示例环境 系统 xff1a deepin15 11 系统用户 xff1a dev 交叉编译器 xff1a gcc 4 4 7 7215 n64
  • Fragment 实现底部导航栏的简单切换

    第一个Android App xff1a 一直想入android这个坑 xff0c 但一直因为各种原因拖到了现在 xff0c 今天终于下定决心迈出了第一步 由于公司一直没有android的项目 所以也没有现成的设计和切图 xff0c 这对于
  • linux使用useradd添加用户失败,出现异常useradd: group elastic exists

    现象 Linux创建用户elastic的时候 xff0c 用命令 span class token function useradd span elastic 出现异常 xff1a useradd group elastic exists
  • [linux] linux使用dd命令制作硬盘镜像

    制作环境 系统 xff1a linux 制作 使用lsblk命令查看被制作硬盘镜像的硬盘序号 lsblk 制作硬盘镜像 span class token function sudo span span class token functio
  • [运维|系统] 在飞腾FT2000上安装CentOS7

    环境说明 平台 xff1a aarch64 CPU 型号 xff1a FT2000 43 BIOS固件 xff1a 昆仑固件 内存 xff1a 32G 5 启动盘制作 见使用dd命令制作linux启动盘 下载系统 centos 7 ARM6
  • [开发|C++] Qt编译Sqlite3数据库驱动

    系统环境 系统 xff1a Deepin 20 2 1 Qt版本 xff1a 5 15 1 qmake版本 xff1a 3 1 Gcc版本 xff1a 8 3 0 源代码下载 见Qt常用资料 中科大镜像站下载点 编译依赖安装 span cl
  • 中国移动家庭智能网关超级账号密码(广西桂林)

    原文地址中国移动家庭智能网关超级账号密码 超级帐户名是 xff1a admin 密码 xff1a Cmcc10086
  • [运维] systemd服务中配置环境变量

    参考文献如何在systemd服务中设置环境变量 xff1f etc systemd system myservice service如下所示 xff1a span class token punctuation span Unit span
  • [运维] wvp 28181安装部署全流程

    部署wvp 系统环境 系统版本 xff1a centos 7 9 安装java git yum span class token function install span java 11 openjdk span class token
  • [文档] 接口设计说明书

    1 范围 1 1 标识 本条应描述本文档所适用的系统 接口实体和接口的完整标识 xff0c 使用时 xff0c 包括其标识号 名称 缩 略名 版本号和发布号 1 2 系统概述 本条应概述本文档适用的系统和软件的用途 xff1b 描述系统和软
  • [运维] 金仓数据库使用笔记

    环境说明 系统 xff1a 银河麒麟V10 平台 xff1a amd64 数据库版本 xff1a KingbaseES V8 命令说明 sys dump 命令参数说明 见pg dump ksql 命令参数说明 见psql 操作 创建数据库
  • [linux] tar命令使用笔记(持续更新)

    打包tar gz包 span class token function tar span czvf xxx tar gz xxx
  • Maven项目管理工具学习笔记

    Maven项目管理工具学习笔记 由于本人在最近的项目中使用到了Maven xff0c 但是之前对Maven并没有深入地了解 xff0c 所以借此机会 xff0c 在网上查阅资料 xff0c 对Maven进行进一步的了解 xff0c 并做记录
  • [开发|java] java 通过多个字符串参数构造字符串数组

    可以使用Java中的可变参数 varargs 来通过多个字符串参数构造字符串数组 示例代码如下 xff1a span class token keyword public span span class token class name S

随机推荐

  • 远程连接Remote Desktop Manager Mac版 2022最新

    Remote Desktop Manager Mac中文版是目前Mac平台上最好用的一款远程桌面管理工具 xff0c Remote Desktop Manager Mac版除了可以多个远程桌面连接 多个ftp连接之外 xff0c 还可以管理
  • Android onNewIntent()需要注意的一些问题

    一 场景 最近遇到一个需求 xff1a 有A B C三个页面 xff0c A能跳到B xff0c 然后B会跳到C xff0c C还能跳到B xff0c 反正B和C两个页面能互相跳 xff0c 但是C页面点击返回的时候要回到A xff08 p
  • ffmpeg按桢截图

    ffmpeg ss 10 i input flv y f image2 vframes 1 s 352x240 b 03d jpg 参数解释 i 输入文件 y 覆盖 f 生成图片格式 ss 开始截图时间 seconds or in hh m
  • 如何检查Mac配备的显卡(GPU)?

    为了在屏幕上显示图形 xff0c Mac使用了图形卡 xff0c 通常称为图形处理单元 xff08 或GPU xff09 xff0c 该图形卡可以集成到Mac或离散卡上 GPU决定了Mac在游戏和其他应用程序中渲染图形的速度 那么该如何检查
  • Hive装载数据命令

    必须在表定义时创建partition a 单分区建表语句 xff1a create table day table id int content string partitioned by dt string 单分区表 xff0c 按天分区
  • OpenCore Gen-X :一键制作黑苹果OpenCore EFI文件

    OpenCore Gen X 是mac上一款黑苹果OC引导配置制作小工具 xff0c 可以一键制作黑苹果OpenCore EFI文件 xff0c 不过该 app 需要 macOS 环境才能运行 xff0c 没有的用户可以先使用虚拟机安装 m
  • 黑苹果OC配置工具OpenCore Configurator 2.42.0.0中文版

    OpenCore Configurator 一款黑苹果OC引导配置工具 xff0c 通过简化的图形界面帮助您为 OpenCore EFI 引导加载程序创建自定义配置文件 OC 是 OpenCore 的简称 xff0c 说起 OpenCore
  • 为什么无法在 Adobe XD 中导入或导出文件?

    Adobe Experience Design 是UI设计人员必备的图形化界面UX设计工具 xff01 在使用过程中用户会反馈无法导入或导出文件 xff1f 本文为 Adobe XD 中出现的文件导入和导出问题提供了解决方案 xff0c 并
  • 如何安装ArchLinux

    本文基于ArchLinux xff08 https www archlinux org xff09 Current Release 2013 08 01的ISO写的安装教程 xff01 ISO下载地址 xff1a http mirrors
  • 从源码分析HashMap集合之属性(一)

    注 xff1a 笔者所使用的jdk为1 8 xff0c 因本人水平有限 xff0c 难免会有错误 xff0c 请批评指正 xff0c 弥补不足 xff0c 多谢 xff0c 另转载请注明出处 我们首先来看下一下HashMap类 public
  • 审批流程设计方案-介绍(一)

    10年有幸接触了HP的一套PAAS平台 xff0c 里面有一套关于工作流 审批流的设置模块 公司现在做的这个项目也有用到审批流 这中间磕磕碰碰的遇到不少问题 xff0c 但最后也小有收获 xff0c 趁着周末闲暇时间 xff0c 把一些细节
  • 怎么解压system.img文件

    system img是官方的刷机包镜像 也就是安卓手机的系统 所有apk文件都在system img里面 包括系统app文件 有时候精简误删了app 那么如果不重新刷机就没有办法恢复了吗 xff1f 错 xff01 只有把系统文件重新放回去
  • 五、二叉搜索树的第k个结点

    一 题目描述 给定一棵二叉搜索树 xff0c 请找出其中的第k小的结点 例如 xff0c xff08 5 xff0c 3 xff0c 7 xff0c 2 xff0c 4 xff0c 6 xff0c 8 xff09 中 xff0c 按结点数值
  • Manjaro下安装和美化i3wm,以及相关软件配置

    Manjaro下安装及美化i3wm 由于本人是在vmware workstation pro15下安装的Manjaro Xfce桌面 xff0c 所以可能与部分用户配置步骤和配置软件并不完全相同 xff0c 具体情况大家可以去Arch Wi
  • ubantu中apt-get安装的依赖全部打包

    最近在适配国产化系统 xff0c 其中有arm和x86的 xff0c 虽然是国产化系统 xff0c 其实只是Ubuntu的包装罢了 xff1b 好不容易将海光型号的适配完毕 xff0c 就要进行测试 xff0c 但是这些海光环境并没有进行总
  • ubuntu linux 配置PATH JAVA PATH(解决双击不能启动eclipse的问题)

    我是下载了jdk 放在 opt下 于是我在 etc bash bashrc里添加 xff1a export JAVA HOME 61 opt jdk1 7 0 06 export PATH 61 PATH opt jdk1 7 0 06 b
  • Linux vi/vim命令大全

    参考资料 xff1a https www runoob com linux linux vim html 1 什么是vi vim 所有的 Unix Like 系统都会内建 vi 文书编辑器 xff0c 其他的文书编辑器则不一定会存在 但是目
  • Linux中动态库(共享库)的制作与使用

    0 库的基本概念 见博客 xff1a Linux中静态库的制作与使用 0 1 动态库的工作原理 首先回忆一下静态库 xff0c 使用静态库 xff0c 在GCC进行链接时 xff0c 会把静态库中代码打包到可执行程序中 但是使用动态库 xf
  • Linux中的source命令(.命令)的用法

    参考 xff1a https blog csdn net LEON1741 article details 81944879 1 使用格式 其使用格式如下 xff0c 其中filename必须是可执行的脚本文件 span class tok
  • 一个简单的游戏源代码

    一个简单的游戏源代码 作者 xff1a 陈跃峰 出自 xff1a http blog csdn net mailbomb 实现一个简单的翻牌游戏 xff0c 每次最多翻开两个数字 xff0c 如果数字相同则消失 xff0c 否则两个数字不显