📄 cgame.java
字号:
//////////////////////////////////////////////////////////////////////////////////// cGame.java//// Project: Minesweeper// Author(s): Gao Lei// Create: 2007-10-08////////////////////////////////////////////////////////////////////////////////import java.util.Random; //得到 随机函数import javax.microedition.lcdui.*; //写界面所需要的包////////////////////////////////////////////////////////////////////////////////class cGame extends Canvas { public static int s_width = 0; //屏幕尺寸 宽 public static int s_height= 0; //屏幕尺寸 高 public static Random rand; //随机数对象 private int UP = 1; //定义键值 上 private int DOWN = 2; //定义键值 下 private int LEFT = 3; //定义键值 左 private int RIGHT = 4; //定义键值 右 private int FILE = 5; //定义键值 中间确认键 private int map_x = 10; // 15 //雷区的 行数 private int map_y = 10; // 12 //雷区的 列数 private int map_w = 20; //一个雷区的格子的宽度 private int map_h = 20; //一个雷区的格子的高度 private int key_x = map_x / 2; //游戏初始时 光标所在雷区的格子位置 private int key_y = map_y / 2; //游戏初始时 光标所在雷区的格子位置 private int mine_num= 10; //雷区的雷数 不应该大于雷区的格子总数 private int[][] map; //雷区的地图数组 >=10 为雷, <10 为周围的雷数, 0位附近没有雷 private boolean[][] map_show; //雷区的地图数组 是否显示 该位置的雷数 private boolean isGameOver = false; //游戏是否结束 cGame() { setFullScreenMode(true); //设置游戏为全屏幕模式,该函数只能在支持midp2.0的手机上使用 s_width = getWidth(); //得到屏幕尺寸 宽 s_height= getHeight(); //得到屏幕尺寸 高 rePlay(); //游戏初始化//重新游戏 } /** * 系统自动调用该绘图函数,并传入绘图设备g,通过该设备,我们可以绘制如直线,矩形快,字符串,图片等, */ public void paint(Graphics g) { g.setClip(0, 0, s_width, s_height); //设置参数描述的区域为操作区 g.setColor(0x000000); //设置颜色为 黑色, 三个16进制数表示,RGB,如0x00ff00 为绿色 g.fillRect(0, 0, s_width, s_height); //绘制一个实心矩形区域 g.setColor(0xFFFFFF); //设置颜色为 白色 //绘制雷区 for( int i=0; i<=map_y; i++ ) // ||| //画 map_y+1条竖线 { g.drawLine(i*map_w, 0, i*map_w, map_h*map_x); } for( int i=0; i<=map_x; i++ ) // --- //画 map_x+1条横线 { g.drawLine(0, i*map_h, map_y*map_w, i*map_h); } g.setColor(0xFF0000); //设置颜色 红 g.drawRect(key_x*map_w+1, key_y*map_h+1, map_w-2, map_h-2); //绘制一个空心矩形框 for( int i=0; i<map_x; i++ ) { for( int j=0; j<map_y; j++ ) { if( map_show[i][j] ) //遍历地图数组 看该位置的雷数 是否应该显示 g.drawString(""+map[i][j], j*map_h+5, i*map_w+5, 0); //显示该位置的雷数 } } if( isGameOver ) //如果游戏 结束 g.drawString("GAME OVER", s_width/2, s_height, g.HCENTER|g.BOTTOM); //显示 GAME OVER } /** * 系统自动调用该函数,当有键盘事件发生为按下某键,参数key为按下键的键值 */ public void keyPressed(int key) { key = Math.abs(key); System.out.println("key="+key); //上下左右 为移动光标事件,只需要调整光标位置即可,但需要做边界判断 if( key == this.UP ) { key_y--; if( key_y<0 ) key_y = 0; } else if( key == this.DOWN ) { key_y++; if( key_y>=map_x-1 ) key_y =map_x-1; } else if( key == this.LEFT ) { key_x--; if( key_x<0 ) key_x = 0; } else if( key == this.RIGHT ) { key_x++; if( key_x>=map_y-1 ) key_x =map_y-1; } else if( key==FILE || key==KEY_NUM5)//按下的为确定键 { if( !isGameOver ) //如果游戏没结束 //结束了就不做确认键操作了 { showMap( key_y, key_x ); //显示该位置的雷数 if( map[key_y][key_x] >=10 )//如果雷数>=10 该位置是雷, isGameOver = true; //游戏结束 } } else if( key == this.KEY_NUM0 ) //当按下 数字键 0 { rePlay(); //重新开始游戏 } /** * 重新执行 paint() 但该函数是立刻返回,也就是说他不会等待paint()执行完毕就返回了, * 如果 需要 paint()执行完毕才返回,可以使用serviceRepaints(),也可以两个都是用,但 * repaint()应该在serviceRepaints()之前. */ this.repaint(); //本例为键盘事件驱动,刷新函数也就是每次按下键盘才作 } //该函数是一个递归函数,把当前位置设置成显示,并判断当前位置雷数是否为0个 //如果是0个雷,那么它周围的8个格子都要再作一次showMap void showMap(int x, int y) { if( map_show[x][y] ) return; else map_show[x][y] = true; if( map[x][y] == 0 ) { if( x-1 >= 0 ) { showMap( x-1, y ); if( y-1 >= 0) showMap( x-1, y-1 ); if( y+1 < map_y) showMap( x-1, y+1 ); } if( y-1 >= 0) showMap( x , y-1 ); if( y+1 < map_y) showMap( x , y+1 ); if( x+1 < map_x ) { showMap( x+1, y ); if( y-1 >= 0) showMap( x+1, y-1 ); if( y+1 < map_y) showMap( x+1, y+1 ); } } } //重新 开始 游戏 public void rePlay() { isGameOver = false; map = new int [map_x][map_y]; map_show = new boolean [map_x][map_y]; rand = new Random( System.currentTimeMillis() ); //用事件作随机数种子的随机数 //布雷 for(int i=0; i<mine_num; i++) //随机mine_num个雷的位置 { int x = rand.nextInt( map_x ); //得到 随机数 雷格子的x方向位置 int y = rand.nextInt( map_y ); //得到 随机数 雷格子的y方向位置 if( map[x][y] >= 10) //如果该位置已经是雷了,就要重新布雷 { i--; continue; } map[x][y] = 10; //否则 将该位置 设定为雷 //并在该雷的周围 的雷数都作+1操作 //以下判断为 边角判断,防止访问数组越界 if( x-1 >= 0 ) { map[x-1][y ] += 1; if( y-1 >= 0) map[x-1][y-1] += 1; if( y+1 < map_y) map[x-1][y+1] += 1; } if( y-1 >= 0) map[x ][y-1] += 1; if( y+1 < map_y) map[x ][y+1] += 1; if( x+1 < map_x ) { map[x+1][y ] += 1; if( y-1 >= 0) map[x+1][y-1] += 1; if( y+1 < map_y) map[x+1][y+1] += 1; } } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -