一个简单的游戏源代码

  一个简单的游戏源代码

作者:陈跃峰
 
       实现一个简单的翻牌游戏,每次最多翻开两个数字,如果数字相同则消失,否则两个数字不显示,可以继续游戏。
       游戏规则如下:
       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) {}
    }
}
python游戏代码大全可复制,python简单小游戏代码 这篇文章主要介绍了python游戏编程入门游戏代码,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获,下面让小编带着大家一起了解一下。哈喽铁子们。 阅读详情

相关推荐

【C语言】简单小游戏项目:《别踩白块儿》

序 突然喜欢惊鸿一瞥这个词,一见钟情太肤浅日久生情太苍白,别人眉来眼去,我只偷偷看你一眼。 嗨!这里是狐狸~ 新的一周又开始了,时间过得还真快,不知道给大家分享点啥了,想发偏算法之类怕大家都听不懂,想发知识类的又怕大家感觉没意思,想来想去还是给大家分享些项目吧,但分享些什么项目自己又很纠结,这里就需要大家的智慧了,大家想看什么都可以评论来告诉我,每条评论我都会去看,我会用心去肝你们想看的项目的!!! 好了,进入正题,今天呢给大家分享一个简单小游戏——《别踩白块儿》,不知道大家有没有玩过,曾经也

C语言C++学习俱乐部:765860056 2万+

简单的代码小游戏,一共大家需要

自己做的一个小游戏,若有雷同纯属巧合 新手第一次发资源,若是不好请勿喷

Html网页小游戏源代码

【代码】Html网页小游戏源代码

爱编程的鱼的博客 3763

python编程游戏代码大全,python简单小游戏代码

大家好,本文将围绕python编程一个简单游戏代码展开说明,20行python代码的入门级小游戏一个很多人都想弄明白的事情,想搞清楚python游戏编程入门游戏代码需要先了解以下几个事情。

阿发狗伪原创 1万+

用python做简单小游戏,如何用python写小游戏

大家好,小编来为大家解答以下问题,初学者怎么用python写简单小游戏教程,如何用python编写一个简单小游戏,今天让我们一起来看看吧!

chatgpt002的博客 1万+

python最简单游戏源代码_[零基础学Python]做一个小游戏

在讲述有关list的时候,提到做游戏的事情,后来这个事情一直没有接续。不是忘记了,是在想在哪个阶段做最合适。经过一段时间学习,看官已经不是纯粹小白了,已经属于python初级者了。现在就是开始做那个游戏的时候了。游戏内容:猜数字游戏简单了吧。是的,游戏难度不大,不过这个游戏中蕴含的东西可是值得玩味的。游戏过程描述程序运行起来,随机在某个范围内选择一个整数。提示用户输入数字,也就是猜程序随即选的那...

weixin_39689622的博客 930

一个简单游戏修改器的源代码

#include<iostream>#include <Windows.h>#include <TlHelp32.h> using namespace std; typedef struct Node//定义一个结构体 {DWORD Add;struct Node* pNext;}node;node* pHead = NULL,*pEnd = ...

weixin_30421525的博客 1497

波导手机自带飞机游戏java_PlaneGame 一个android平台的飞机大战,很经典 简单,但是,功能齐全 Shot 射击游戏 259万源代码下载- www.pudn.com...

文件名称: PlaneGame下载 收藏√ [5 4 3 2 1]开发工具: Java文件大小: 3349 KB上传时间: 2016-06-02下载次数: 0详细说明:一个android平台的飞机大战,很经典,很简单,但是,功能齐全-A World War II aircraft android platform, very classic, very simple, but fu...

weixin_30811273的博客 1917

一个简单网格游戏,可以寻找到网格最短路径(源代码

程序界面如下: 界面很简单一个长宽360像素的PICTUREBOX,     Name=picturebox1 2个label控件,名称分别为LABEL1、LABEL3,label3显示坐标用,label1用于显示得分 2个button控件,名称分别为BUTTON2、BUTTON3,BUTTON2的TEXT设为“开始”,BUTTON3的TEXT属性设为“显示数组”   窗体代码

g12339645的专栏 2842

【C语言】用最基础的C语言知识写一个简单的多子棋小游戏源代码在文章末尾)

C语言,C语言小游戏,三子棋,多子棋,简单C语言小游戏 C语言多子棋实现 简单易懂的C语言小游戏

分享自己学习过程中的内容 1086

简单的C语言打飞机游戏源代码

这仅仅是一个简单的示例,并不包含完整的游戏功能,可以根据需要进行扩展和优化。Sleep(50);int score;

yl387113的博客 1062
上一篇: 《ASP.NET 2.0应用开发技术》随想
下一篇: ASP.NET 2.0中给DropDownList服务器控件添加项的新方法
java2000_test
博客等级 码龄19年 9粉丝 320原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值