⼀个简单的游戏源代码
作者:陈跃峰出⾃:
实现⼀个简单的翻牌游戏,每次最多翻开两个数字,如果数字相同则消失,否则两个数字不显⽰,可以继续游戏。 游戏规则如下:
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 + \"关\ 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) {} }}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- zrrp.cn 版权所有 赣ICP备2024042808号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务