围住神经猫 Java源码
神经猫游戏编程实现
神经猫游戏编程实现游戏是人们娱乐、放松的一种方式,而神经猫游戏则是近年来备受欢迎的一款休闲游戏。
该游戏的目标是通过点击不同方向的箭头,使“神经猫”成功通过迷宫,到达目的地。
在本文中,我们将探讨如何使用编程语言来实现这款游戏。
一、游戏设计在开始编程实现之前,我们需要先进行游戏设计。
具体而言,我们需要确定游戏的基本要素,如迷宫地图、神经猫的动作和规则等。
以下是一个简单的游戏设计示例:1. 迷宫地图:迷宫地图采用二维数组表示,其中不同的值代表不同的墙壁、通道或目的地。
我们可以使用0代表墙壁,1代表通道,2代表目的地。
2. 神经猫动作:神经猫可以朝上、下、左、右四个方向移动,并且只能在通道上移动。
当神经猫移动到目的地时,游戏获胜。
3. 规则:当玩家点击相应的箭头方向按钮时,神经猫将按照指定的方向移动一格。
若移动方向上是墙壁或超出边界,则神经猫保持原地不动。
二、选择编程语言在编程实现神经猫游戏时,我们可以选择不同的编程语言,如Python、JavaScript等。
这里,我们将以Python语言为例进行说明。
Python是一种易于学习和使用的高级编程语言,拥有丰富的库和工具,适合用于开发游戏等多种应用。
下面是关于如何使用Python编程实现神经猫游戏的示例代码:```python# 导入所需库import pygamefrom pygame.locals import *# 定义颜色常量BLACK = (0, 0, 0)WHITE = (255, 255, 255)BLUE = (0, 0, 255)# 初始化Pygamepygame.init()# 设定游戏窗口尺寸window_size = (400, 400)screen = pygame.display.set_mode(window_size)pygame.display.set_caption("神经猫游戏")# 设定游戏结束标志初始值为Falsegame_over = False# 设定游戏地图示例game_map = [[0, 0, 0, 0, 0],[0, 1, 1, 1, 0],[0, 1, 2, 1, 0],[0, 1, 1, 1, 0],[0, 0, 0, 0, 0]]# 设定神经猫初始位置cat_position = (2, 2)# 游戏主循环while not game_over:screen.fill(WHITE)# 绘制游戏地图for row in range(len(game_map)):for col in range(len(game_map[row])):if game_map[row][col] == 0: # 墙壁pygame.draw.rect(screen, BLACK, (col * 80, row * 80, 80, 80))elif game_map[row][col] == 2: # 目的地pygame.draw.rect(screen, BLUE, (col * 80, row * 80, 80, 80)) # 绘制神经猫pygame.draw.circle(screen, BLUE, (cat_position[1] * 80 + 40,cat_position[0] * 80 + 40), 30)# 刷新屏幕pygame.display.flip()# 处理事件for event in pygame.event.get():if event.type == QUIT:game_over = Trueelif event.type == KEYDOWN: # 键盘事件if event.key == K_UP:if game_map[cat_position[0]-1][cat_position[1]] != 0:cat_position = (cat_position[0]-1, cat_position[1])elif event.key == K_DOWN:if game_map[cat_position[0]+1][cat_position[1]] != 0:cat_position = (cat_position[0]+1, cat_position[1])elif event.key == K_LEFT:if game_map[cat_position[0]][cat_position[1]-1] != 0:cat_position = (cat_position[0], cat_position[1]-1)elif event.key == K_RIGHT:if game_map[cat_position[0]][cat_position[1]+1] != 0:cat_position = (cat_position[0], cat_position[1]+1)# 退出游戏pygame.quit()```以上代码通过使用Pygame库来实现神经猫游戏的基本功能。
Java游戏服务器成长之路——弱联网游戏篇(源码分析)
Java游戏服务器成长之路——弱联⽹游戏篇(源码分析)/hjcenry/article/details/50530472前段时间由于公司的⼀款弱联⽹游戏急着上线,没能及时分享,现在基本做的差不多,剩下的就是测试阶段了(本来说元旦来分享⼀下服务器技术的)。
公司的这款游戏已经上线⼀年多了,在我来之前⼀直都是单机版本,由于⼈民群众的⼒量太强⼤,各种内购破解,刷体⼒,刷⾦币,刷钻⽯版本的出现,公司才决定将这款游戏转型为弱联⽹游戏,压制百分之⼋⼗的破解⽤户(毕竟原则上还是属于单机游戏,不可能做到百分之百的防破解),招了我这⼀个服务器来进⾏后台的开发。
什么是弱联⽹游戏?在这之前我也没有做过弱联⽹游戏的服务器,但是按照我对策划对我提出的需求的理解,就是游戏的⼤部分逻辑运算都是在移动端本地完成,⽽服务器要做的就是登录、⽀付验证、游戏存档读档的⼯作,这相对于我在上家公司做的ARPG那种强联⽹游戏要简单多了,那款ARPG就是所有游戏产出,逻辑运算都是在服务器端完成,服务器要完成⼤部分的游戏运算,⽽我做的这款弱联⽹游戏,只需要简简单单的登录、验证、读取和存储。
这⼀类的游戏,做的最⽕的,就是腾讯早期⼿游中的《全民消消乐》《节奏⼤师》《天天飞车》(天天飞车后来加的实时竞赛应该还是强联⽹的实时数据)等,这类游戏中,服务器就只需要负责游戏数据存储和⼀些简单的社交功能,例如qq好友送红⼼送体⼒的等。
概括公司招聘我进来做服务器开发其实是为了两个项⽬,⼀个是这款单机转弱联⽹的游戏,另⼀款是公司准备拿来发家致富的SLG——战争策略游戏。
从⼊职到现在,我⼀直是在⽀持弱联⽹游戏的开发,到现在,基本上这款游戏也算是差不多了,这款游戏的⽬前版本仍然基本属于单机,到年后会加上竞技场功能,到时候可能就会需要实时的数据交互了,现在就先来分享⼀下⽬前这个版本开发的过程。
要开发⼀个后台系统,⾸先要考虑的就是架构了,系统的⾼效稳定性,可扩展性。
在游戏开发中,我认为后台服务器⽆⾮负责⼏个⼤得模块:1. ⽹络通信2. 逻辑处理3. 数据存储4. 游戏安全⾸先从需求分析⼊⼿,我在这款弱联⽹游戏中,后端需要做的事情就是,登录,⽀付验证,数据存储,数据读取,再加上⼀些简单的逻辑判断,第⼀眼看去,并没有任何难点,我就分别从以上⼏点⼀⼀介绍⽹络通信弱联⽹游戏,基本上来说,最简单直接的,就是使⽤http短连接来进⾏⽹络层的通信,那么我⼜⽤什么来做http服务器呢,servlet还是springmvc,还是其他框架。
JAVA小程序—贪吃蛇源代码
JAVA贪吃蛇源代码SnakeGame。
javapackage SnakeGame;import javax.swing。
*;public class SnakeGame{public static void main( String[]args ){JDialog。
setDefaultLookAndFeelDecorated( true ); GameFrame temp = new GameFrame();}}Snake.javapackage SnakeGame;import java。
awt.*;import java。
util。
*;class Snake extends LinkedList{public int snakeDirection = 2;public int snakeReDirection = 4;public Snake(){this。
add( new Point( 3, 3 ));this。
add(new Point(4, 3 ));this.add( new Point(5,3 ) );this。
add( new Point(6,3 ) );this。
add(new Point(7,3 ));this。
add( new Point( 8,3 ) );this。
add( new Point( 9, 3 ));this。
add( new Point( 10,3 ));}public void changeDirection( Point temp, int direction ) {this。
snakeDirection = direction;switch(direction ){case 1://upthis.snakeReDirection = 3;this。
add( new Point(temp.x,temp.y - 1 ));break;case 2://rightthis。
java贪吃蛇 代码
代码:一:::::::public class Cell {// 格子:食物或者蛇的节点private int x;private int y;private Color color;// 颜色public Cell() {}public Cell(int x, int y) {this.x = x;this.y = y;}public Cell(int x, int y, Color color) { this.color = color;this.x = x;this.y = y;}public Color getColor() {return color;}public int getX() {return x;}public int getY() {return y;}public String toString() {return"[" + x + "]" + "[" + y + "]";}}二::::::::::public class Worm {private int currentDirection;// 蛇包含的格子private Cell[] cells;private Color color;public static final int UP = 1;public static final int DOWN = -1;public static final int RIGHT = 2;public static final int LEFT = -2;// 创建对象创建默认的蛇:(0,0)(1,0)(2,0)······(11,0)public Worm() {// 构造器初始化对象color = Color.pink;// 蛇的颜色cells = new Cell[12];// 创建数组对象for (int x = 0, y = 0, i = 0; x < 12; x++) { // for(int y=0;;){}cells[i++] = new Cell(x, y, color);// 添加数组元素}currentDirection = DOWN;}public boolean contains(int x, int y) {// 数组迭代for (int i = 0; i < cells.length; i++) {Cell cell = cells[i];if (cell.getX() == x && cell.getY() == y) {return true;}}return false;}public String toString() {return Arrays.toString(cells);}public void creep() {for (int i = this.cells.length - 1; i >= 1; i--) {cells[i] = cells[i - 1];}cells[0] = createHead(currentDirection);}// 按照默认方法爬一步private Cell createHead(int direction) {// 根据方向,和当前(this)的头结点,创建新的头结点int x = cells[0].getX();int y = cells[0].getY();switch (direction) {case DOWN:y++;break;case UP:y--;break;case RIGHT:x++;break;case LEFT:x--;break;}return new Cell(x, y);}/*** food 食物**/public boolean creep(Cell food) {Cell head = createHead(currentDirection);boolean eat = head.getX() == food.getX() && head.getY() == food.getY();if (eat) {Cell[] ary = Arrays.copyOf(cells, cells.length + 1);cells = ary;// 丢弃原数组}for (int i = cells.length - 1; i >= 1; i--) { cells[i] = cells[i - 1];}cells[0] = head;return eat;}// 吃到东西就变长一格public boolean creep(int direction, Cell food) {if (currentDirection + direction == 0) {return false;}this.currentDirection = direction;Cell head = createHead(currentDirection);boolean eat = head.getX() == food.getX() && head.getY() == food.getY();if (eat) {Cell[] ary = Arrays.copyOf(cells, cells.length + 1);cells = ary;// 丢弃原数组}for (int i = cells.length - 1; i >= 1; i--) { cells[i] = cells[i - 1];}cells[0] = head;return eat;}// 检测在新的运动方向上是否能够碰到边界和自己(this 蛇)public boolean hit(int direction) {// 生成下个新头节点位置// 如果新头节点出界返回true,表示碰撞边界// ···············if (currentDirection + direction == 0) {return false;}Cell head = createHead(direction);if(head.getX() < 0 || head.getX() >= WormStage.COLS || head.getY() < 0|| head.getY() >= WormStage.ROWS) {return true;}for (int i = 0; i < cells.length - 1; i++) { if (cells[i].getX() == head.getX()&& cells[i].getY() == head.getY()) {return true;}}return false;}public boolean hit() {return hit(currentDirection);}// 为蛇添加会制方法// 利用来自舞台面板的画笔绘制蛇public void paint(Graphics g) {g.setColor(this.color);for (int i = 0; i < cells.length; i++) {Cell cell = cells[i];g.fill3DRect(cell.getX() * WormStage.CELL_SIZE, cell.getY()* WormStage.CELL_SIZE, WormStage.CELL_SIZE,WormStage.CELL_SIZE, true);}}}三:::::::::public class WormStage extends JPanel {/** 舞台的列数 */public static final int COLS = 35;/** 舞台的行数 */public static final int ROWS = 35;/** 舞台格子的大小 */public static final int CELL_SIZE = 10;private Worm worm;private Cell food;public WormStage() {worm = new Worm();food = createFood();}/*** 随机生成食物,要避开蛇的身体 1 生成随机数 x, y 2 检查蛇是否包含(x,y)* 3 如果包含(x,y) 返回 1 4 创建食物节点* */private Cell createFood() {Random random = new Random();int x, y;do {x = random.nextInt(COLS);// COLS列数y = random.nextInt(ROWS);// WOWS行数} while (worm.contains(x, y));return new Cell(x, y, Color.green);// 食物颜色/** 初始化的舞台单元测试 */public static void test() {WormStage stage = new WormStage();System.out.println(stage.worm);System.out.println(stage.food);}/*** 重写JPanel绘制方法paint:绘制,绘画,涂抹Graphics 绘图,* 理解为:绑定到当前面板的画笔*/public void paint(Graphics g) {// 添加自定义绘制!// 绘制背景g.setColor(Color.darkGray);// 背景色g.fillRect(0, 0, getWidth(), getHeight());g.setColor(Color.cyan);// 边框上的颜色// draw 绘制 Rect矩形g.drawRect(0, 0, this.getWidth() - 1, this.getHeight() - 1);// 绘制食物g.setColor(food.getColor());// fill 填充 3D 3维 Rect矩形突起的立体按钮形状g.fill3DRect(food.getX() * CELL_SIZE, food.getY() * CELL_SIZE,CELL_SIZE, CELL_SIZE, true);// 绘制蛇worm.paint(g);// 让蛇自己去利用画笔绘制private Timer timer;/*** 启动定时器驱动蛇的运行 1 检查碰撞是否将要发生* 2 如果发生碰撞:创建新的蛇和食物,重写开始* 3 如果没有碰撞就爬行,并检查是否能够吃到食物* 4如果吃到食物:重新创建新的食物* 5 启动重新绘制界面功能 repaint() 更新界面显示效果! repaint()* 方法会尽快调用paint(g) 更新界面!*/private void go() {if (timer == null)timer = new Timer();timer.schedule(new TimerTask() {public void run() {if (worm.hit()) {// 如果蛇碰到边界或自己worm = new Worm();// 创建新的蛇food = createFood();// 创建新食物} else {// 如果没有碰到自己boolean eat = worm.creep(food);// 蛇向前(当前方向)爬行,返回结果表示是否吃到食物if(eat) {// 如果吃到食物,就生成新食物food = createFood();}}repaint();}}, 0, 1000 / 5);this.requestFocus();this.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {int key = e.getKeyCode();switch (key) {case KeyEvent.VK_UP:creepForFood(Worm.UP);break;case KeyEvent.VK_DOWN:creepForFood(Worm.DOWN);break;case KeyEvent.VK_LEFT:creepForFood(Worm.LEFT);break;case KeyEvent.VK_RIGHT:creepForFood(Worm.RIGHT);break;}}});}private void creepForFood(int direction) { if (worm.hit(direction)) {worm = new Worm();food = createFood();} else {boolean eat = worm.creep(direction, food);if (eat) {food = createFood();}}}/** 软件启动的入口方法 */public static void main(String[] args) {// 启动软件....JFrame frame = new JFrame("贪吃蛇");// 一个画框对象frame.setSize(450, 480);// size 大小,setSize 设置大小// frame.setLocation(100,50);//Locationq位置frame.setLocationRelativeTo(null);// 居中// 设置默认的关闭操作为在关闭时候离开软件frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);// Visible可见的设置可见性frame.setLayout(null);// 关闭默认布局管理,避免面板充满窗口WormStage stage = new WormStage();// System.out.println("CELL_SIZE * COLS:"+CELL_SIZE * COLS);stage.setSize(CELL_SIZE* COLS, CELL_SIZE* ROWS);stage.setLocation(40, 50);stage.setBorder(new LineBorder(Color.BLACK));frame.add(stage);// 在窗口添加舞台stage.go();// 启动定时器驱动蛇自动运行}}。
原生js开发的抓猫游戏源码
原生js开发的抓猫游戏源码js开发的抓猫游戏源码特效源码玩法游戏目标:不让猫咪逃出六边形区域游戏操作:用鼠标点击猫咪周围的六边形,使得六边形变成黑色,因为只有黑色的六边形才可以把猫咪围住。
源码如下:<svg id="game" viewBox="0 0 530 395" preserveAspectRatio = "xMidYMid meet"><defs><g id="r0" transform="matrix(1, 0, 0, 1, 25, 15)"><path d="M15,-7.5L15 7.5L0 15L-15 7.5L-15 -7.5L0 -15L15 -7.5" /></g><g id="head1" class="head" transform="matrix(1, 0, 0, 1, 11.15, 40.2)"><path d="M7.25,-27.25Q6.95 -24 4.1 -22.8Q1.4 -20.15 -3 -20.5Q-5.55 -21.35 -7.95 -22.65Q-10.9 -24.3 -11.15 -27.85Q-11.35 -31.25 -9.15 -33.9Q-6.95 -36.6 -3.55 -37.05Q-0.15 -37.45 2.65 -35.55Q5.45 -33.6 6.7 -30.45Q7.4 -28.95 7.25 -27.25 M2.35,-40.15Q4.05 -40.6 5.85 -33.7Q6.4 -31.55 6.35 -30.85L5.1 -30.5Q2.45 -31.6 0.95 -32.6Q-1.1 -33.95 -1.9 -35.55L-1.8 -35.6L-1.7 -35.8L-0.95 -35.6L-0.6 -35.45L0.45 -37.8Q1.55 -39.95 2.35 -40.15M-10.7,-35.5L-10.25 -39.95Q-8.95 -39.25 -7.85 -38.35Q-6.05 -36.95 -5.7 -35.8Q-5.35 -34.35 -6.85 -32.8Q-8.1 -31.4 -9.8 -30.8Q-10.75 -32.55 -10.7 -35.5" /></g><g id="head2" class="head" transform="matrix(1, 0, 0, 1, 13.5, 40.55)"><path d="M1.65,-26.85L0.5 -25.5Q-0.2 -25 -1.5 -24.85L-4.2 -24.15L-6.5 -24.25Q-8.6 -23.9 -10.55 -24.95Q-13.2 -26.65 -13.5 -29.85L-12.05 -31.1Q-11.95 -33.7 -10.2 -35.5Q-9.15 -36.75 -7.75 -37.15L-7.35 -40.55Q-0.9 -35.6 1.05 -33.65Q4.2 -30.55 1.65 -26.85" /></g><g id="b1-1" class="body" transform="matrix(1, 0, 0, 1, 12.35, 33.05)"><path d="M11.4,-6.8Q12.65 -7.45 13.55 -9.3Q14.5 -11.1 14.5 -12.8Q14.5 -16.3 11.9 -20.5Q9.25 -24.75 9.25 -26.35L9.35 -28.5Q9.65 -29.65 10.9 -30.55 M10.3,-5.9Q10.3 -2.6 8.05 -0.25Q5.8 2.1 2.6 2.1Q-0.6 2.1 -2.85 -0.25Q-5.1 -2.6 -5.1 -5.9Q-5.1 -9.2 -2.85 -11.55Q-0.6 -13.9 2.6 -13.9Q5.8 -13.9 8.05 -11.55Q10.3 -9.2 10.3 -5.9 M10.3,-5.9Q10.3 -2.6 8.05 -0.25Q5.8 2.1 2.6 2.1Q-0.6 2.1 -2.85 -0.25Q-5.1 -2.6 -5.1 -5.9Q-5.1 -9.2 -2.85 -11.55Q-0.6 -13.9 2.6 -13.9Q5.8 -13.9 8.05 -11.55Q10.3 -9.2 10.3 -5.9z M3.4,-13.3Q3.4 -10.65 1.6 -8.8Q-0.25 -6.9 -2.85 -6.9Q-5.4 -6.9 -7.25 -8.8Q-9.1 -10.65 -9.1 -13.3Q-9.1 -15.95 -7.25 -17.85Q-5.4 -19.7 -2.85 -19.7Q-0.25 -19.7 1.6 -17.85Q3.4 -15.95 3.4 -13.3 M3.4,-13.3Q3.4 -10.65 1.6 -8.8Q-0.25 -6.9 -2.85 -6.9Q-5.4 -6.9 -7.25 -8.8Q-9.1 -10.65 -9.1 -13.3Q-9.1 -15.95 -7.25 -17.85Q-5.4 -19.7 -2.85 -19.7Q-0.25 -19.7 1.6 -17.85Q3.4 -15.95 3.4 -13.3z M4.95,2.6L9.6 -0.8 M-9,-12.7L-6.85 -3.5 M-6.85,-3.5L-8.6 4.75 M-8.6,4.75L-9.85 4.75 M-0.5,-11.05L1.25 -2.25 M1.25,-2.25L-1.25 5.85 M-1.15,5.6L-3.45 6" /></g><g id="b1-2" class="body" transform="matrix(1, 0, 0, 1, 13.15, 36.25)"><path d="M11.4,-11.2Q12.65 -11.8 13.55 -13.6Q14.5 -15.3 14.5 -16.9Q14.5 -20.2 11.9 -24.2Q9.25 -28.25 9.25 -29.75L9.35 -31.8Q9.65 -32.9 10.9 -33.75 M8.7,-6.95Q6.45 -4.6 3.25 -4.6Q0.05 -4.6 -2.2 -6.95Q-4.45 -9.3 -4.45 -12.6Q-4.45 -15.9 -2.2 -18.25Q0.05 -20.6 3.25 -20.6Q6.45 -20.6 8.7 -18.25Q10.95 -15.9 10.95 -12.6Q10.95 -9.3 8.7 -6.95 M8.7,-6.95Q6.45 -4.6 3.25 -4.6Q0.05 -4.6 -2.2 -6.95Q-4.45 -9.3 -4.45 -12.6Q-4.45 -15.9 -2.2 -18.25Q0.05 -20.6 3.25 -20.6Q6.45 -20.6 8.7 -18.25Q10.95 -15.9 10.95 -12.6Q10.95 -9.3 8.7 -6.95z M-0.45,-8.35Q-2.3 -6.45 -4.9 -6.45Q-7.45 -6.45 -9.3 -8.35Q-11.15 -10.2 -11.15 -12.85Q-11.15 -15.5 -9.3 -17.4Q-7.45 -19.25 -4.9 -19.25Q-2.3 -19.25 -0.45 -17.4Q1.35 -15.5 1.35 -12.85Q1.35 -10.2 -0.45 -8.35 M-0.45,-8.35Q-2.3 -6.45 -4.9 -6.45Q-7.45 -6.45 -9.3 -8.35Q-11.15 -10.2 -11.15 -12.85Q-11.15 -15.5 -9.3 -17.4Q-7.45 -19.25 -4.9 -19.25Q-2.3 -19.25 -0.45 -17.4Q1.35 -15.5 1.35 -12.85Q1.35 -10.2 -0.45 -8.35z M7.8,0.4L10.1 -4.9 M-9,-12.7L-6.85 -3.5 M-6.85,-3.5L-8.6 4.75 M-8.6,4.75L-9.85 4.75 M-0.5,-11.05L1.25 -2.25 M1.25,-2.25L-1.25 5.85 M-1.15,5.6L-3.45 6" /></g><g id="b1-3" class="body" transform="matrix(1, 0, 0, 1, 19.15, 36.25)"><path d="M13,-33.75Q10.3 -33.75 9.7 -30.65Q9.5 -29.75 9.5 -24.75Q9.5 -21.55 7.25 -20.35Q4.25 -18.75 3.5 -17.25 M4.95,-4.95Q2.7 -2.6 -0.5 -2.6Q-3.7 -2.6 -5.95 -4.95Q-8.2 -7.3 -8.2 -10.6Q-8.2 -13.9 -5.95 -16.25Q-3.7 -18.6 -0.5 -18.6Q2.7 -18.6 4.95 -16.25Q7.2 -13.9 7.2 -10.6Q7.2 -7.3 4.95 -4.95 M4.95,-4.95Q2.7 -2.6 -0.5 -2.6Q-3.7 -2.6 -5.95 -4.95Q-8.2 -7.3 -8.2 -10.6Q-8.2 -13.9 -5.95 -16.25Q-3.7 -18.6 -0.5 -18.6Q2.7 -18.6 4.95 -16.25Q7.2 -13.9 7.2 -10.6Q7.2 -7.3 4.95 -4.95z M-6.45,0.15Q-8.3 2.05 -10.9 2.05Q-13.45 2.05 -15.3 0.15Q-17.15 -1.7 -17.15 -4.35Q-17.15 -7 -15.3 -8.9Q-13.45 -10.75 -10.9 -10.75Q-8.3 -10.75 -6.45 -8.9Q-4.656.45 -8.9Q-4.65 -7 -4.65 -4.35Q-4.65 -1.7 -6.45 0.15z M8.2,0.6L7.55 -5.1 M-15.75,8.25L-16 16.1L-16.25 23 M-3.75,1Q-3.75 4.9 -6.35 6.4Q-9.9 8.45 -10.25 9Q-12 11.95 -12.55 13.6Q-13.6 16.65 -13 19.75" /></g><g id="b1-4" class="body" transform="matrix(1, 0, 0, 1, 27, 28.25)"><path d="M-5.5,-13Q-5.85 -15.55 -2.55 -16.1Q1.1 -16.7 1.25 -19.25Q1.35 -21.4 2.6 -23.25Q4.3 -25.8 7.25 -25.75 M-2.55,0.65Q-4.8 3 -8 3Q-11.2 3 -13.45 0.65Q-15.7 -1.7 -15.7 -5Q-15.7 -8.3 -13.45 -10.65Q-11.2 -13 -8 -13Q-4.8 -13 -2.55 -10.65Q-0.3 -8.3 -0.3 -5Q-0.3 -1.7 -2.55 0.65 M-2.55,0.65Q-4.8 3 -8 3Q-11.2 3 -13.45 0.65Q-15.7 -1.7 -15.7 -5Q-15.7 -8.3 -13.45 -10.65Q-11.2 -13 -8 -13Q-4.8 -13 -2.55 -10.65Q-0.3 -8.3 -0.3 -5Q-0.3 -1.7 -2.55 0.65z M-10.6,8.3Q-12.45 10.2 -15.05 10.2Q-17.6 10.2 -19.45 8.3Q-21.3 6.45 -21.3 3.8Q-21.3 1.15 -19.45 -0.75Q-17.6 -2.6 -15.05 -2.6Q-12.45 -2.6 -10.6 -0.75Q-8.8 1.15 -8.8 3.8Q-8.8 6.45 -10.6 8.3 M-10.6,8.3Q-12.45 10.2 -15.05 10.2Q-17.6 10.2 -19.45 8.3Q-21.3 6.45 -21.3 3.8Q-21.3 1.15 -19.45 -0.75Q-17.6 -2.6 -15.05 -2.6Q-12.45 -2.6 -10.6 -0.75Q-8.8 1.15 -8.8 3.8Q-8.8 6.45 -10.6 8.3z M-1.25,-3Q-0.5 -3.15 1.6 -4.55L4.25 -6.25L4.25 1.25Q4 1.25 4 1.75L3.75 1.75 M-11.5,11.25Q-10 10.4 -9.5 10.5L-9.5 13.75L-12 21.75Q-12.3 22.65 -13.2 23.3L-14.75 24.5L-16 26.3Q-16.65 27 -17.7 26.75 M-24.5,29L-22.75 29Q-19.65 23.1 -20.25 13.25" /></g><g id="b1-5" class="body" transform="matrix(1, 0, 0, 1, 28.6, 20.25)"><path d="M-9,-2Q-7.2 -3 -5.75 -5.25L-3.25 -10L-0.15 -13.55Q1.85 -15.6 2 -17.75 M-7.55,11.45Q-9.8 13.8 -13 13.8Q-16.2 13.8 -18.45 11.45Q-20.7 9.1 -20.7 5.8Q-20.7 2.5 -18.45 0.15Q-16.2 -2.2 -13 -2.2Q-9.8 -2.2 -7.55 0.15Q-5.3 2.5 -5.3 5.8Q-5.3 9.1 -7.55 11.45 M-7.55,11.45Q-9.8 13.8 -13 13.8Q-16.2 13.8 -18.45 11.45Q-20.7 9.1 -20.7 5.8Q-20.7 2.5 -18.45 0.15Q-16.2 -2.2 -13 -2.2Q-9.8 -2.2 -7.55 0.15Q-5.3 2.5 -5.3 5.8Q-5.3 9.1 -7.55 11.45z M-15.6,4.75Q-13.8 6.65 -13.8 9.3Q-13.8 11.95 -15.6 13.8Q-17.45 15.7 -20.05 15.7Q-22.6 15.7 -24.45 13.8Q-26.3 11.95 -26.3 9.3Q-26.3 6.65 -24.45 4.75Q-22.6 2.9 -20.05 2.9Q-17.45 2.9 -15.6 4.75 M-15.6,4.75Q-13.8 6.65 -13.8 9.3Q-13.8 11.95 -15.6 13.8Q-17.45 15.7 -20.05 15.7Q-22.6 15.7 -24.45 13.8Q-26.3 11.95 -26.3 9.3Q-26.3 6.65 -24.45 4.75Q-22.6 2.9 -20.05 2.9Q-17.45 2.9 -15.6 4.75z M-5,6.5L-5 6.75L-7.75 9.7Q-9.6 12 -10 13.25L-10 16L-9 16Q-8.75 15.25 -7.25 13.75L-7.25 14.1L-9.05 18.05Q-10.15 20.5 -10.75 23.5 M-15.25,11.25L-15.25 11.5L-15 18.75Q-15 21.95 -16.6 26.15Q-18.35 30.8 -20.25 30.75 M-26.1,31.4Q-24.95 30.5 -24.75 27.3L-24.75 22L-23.2 16.85Q-22.25 13.35 -22.5 11.75" /></g><g id="b2-1" class="body" transform="matrix(1, 0, 0, 1, 12.3, 30.05)"><path fill="none" d="M15.4,-3.8Q16.65 -4.45 17.55 -6.3Q18.5 -8.1 18.5 -9.8Q18.5 -13.3 15.9 -17.5Q13.25 -21.75 13.25 -23.35L13.35 -25.5Q13.65 -26.65 14.9 -27.55" /><path d="M12.5,-5.9Q12.5 -2.6 10.25 -0.25Q8 2.1 4.8 2.1Q1.6 2.1 -0.65 -0.25Q-2.9 -2.6 -2.9 -5.9Q-2.9 -9.2 -0.65 -11.55Q1.6 -13.9 4.8 -13.9Q8 -13.9 10.25 -11.55Q12.5 -9.2 12.5 -5.9" /> <path fill="none" d="M12.5,-5.9Q12.5 -2.6 10.25 -0.25Q8 2.1 4.8 2.1Q1.6 2.1 -0.65 -0.25Q-2.9 -2.6 -2.9 -5.9Q-2.9 -9.2 -0.65 -11.55Q1.6 -13.9 4.8 -13.9Q8 -13.9 10.25 -11.55Q12.5 -9.2 12.5 -5.9z" /><path d="M-4.3,-13.5Q-6.45 -14.45 -7.9 -16.4Q-9.35 -18.35 -9.3 -20.2Q-9.4 -22 -7.9 -22.6Q-6.35 -23.2 -4.25 -22.25Q-2.2 -21.3 -0.7 -19.35Q0.75 -17.4 0.75 -15.55Q0.7 -13.8 -0.85 -13.2Q-2.3 -12.6 -4.3 -13.5" /><path fill="none" d="M-4.3,-13.5Q-6.45 -14.45 -7.9 -16.4Q-9.35 -18.35 -9.3 -20.2Q-9.4 -22 -7.9 -22.6Q-6.35 -23.2 -4.25 -22.25Q-2.2 -21.3 -0.7 -19.35Q0.75 -17.4 0.75 -15.55Q0.7 -13.8 -0.85 -13.2Q-2.3 -12.6 -4.3 -13.5z M-0.65,4.25L3.95 3.45L8.65 3.25 M0,-17.35L1.1 -17.35Q1.65 -16.4 2.8 -16.05Q4 -15.7 4.65 -14.8Q5.45 -13.75 5.75 -12.55L6.05 -10.05 M-9.8,-18.65Q-8.5 -18.5 -7.75 -16.8Q-7.05 -15.2 -6 -15.25L-5.3 -9.95Q-4.6 -5.75 -4.6 -3.7Q-4.6 -0.5 -5.15 1.05Q-5.95 3.3 -8 3" /></g><g id="b2-2" class="body" transform="matrix(1, 0, 0, 1, 11, 32.15)"><path fill="none" d="M15.65,-12.65Q18 -12.65 18.75 -13.7Q19.25 -14.45 19.25 -16.55Q19.25 -18.8 18.15 -20.3Q17.05 -21.85 17.05 -22.95Q17.05 -24.2 18.65 -27L20.25 -29.65 M16,-11Q16 -8.25 13.5 -6.3Q11 -4.3 7.45 -4.3Q3.9 -4.3 1.45 -6.3Q-1.05 -8.25 -1.05 -11Q-1.05 -13.8 1.45 -15.75Q3.9 -17.7 7.45 -17.7Q11 -17.7 13.5 -15.75Q16 -13.8 16 -11z M-3.5,-8.3Q-5.65 -9.25 -7.1 -11.2Q-8.55 -13.15 -8.5 -15Q-8.6 -16.8 -7.1 -17.4Q-5.55 -18 -3.45 -17.05Q-1.4 -16.1 0.1 -14.15Q1.55 -12.2 1.55 -10.35Q1.5 -8.6 -0.05 -8Q-1.5 -7.4 -3.5 -8.3z M0,-17.35L1.1 -17.35Q1.65 -16.4 2.8 -16.05Q4 -15.7 4.65 -14.8Q5.45 -13.75 5.75 -12.55L6.05 -10.05 M3.8,4L8 4Q8.8 1.7 10.45 -0.1Q12.3 -2.1 14.45 -2.65L10.65 -7.25 M-7.8,3.6Q-6.05 3.6 -2.9 0.15Q0 -3 0 -3.85Q0 -4.8 -3.55 -8.85L-7.4 -13.05" /><path d="M16,-11Q16 -8.25 13.5 -6.3Q11 -4.3 7.45 -4.3Q3.9 -4.3 1.45 -6.3Q-1.05 -8.25 -1.05 -11Q-1.05 -13.8 1.45 -15.75Q3.9 -17.7 7.45 -17.7Q11 -17.7 13.5 -15.75Q16 -13.8 16 -11 M-3.5,-8.3Q-5.65 -9.25 -7.1 -11.2Q-8.55 -13.15 -8.5 -15Q-8.6 -16.8 -7.1 -17.4Q-5.55 -18 -3.45 -17.05Q-1.4 -16.1 0.1 -14.15Q1.55 -12.2 1.55 -10.35Q1.5 -8.6 -0.05 -8Q-1.5 -7.4 -3.5 -8.3" /><g id="b2-3" class="body" transform="matrix(1, 0, 0, 1, 37.75, 32.6)"><path d="M0.15,-15.95Q0.15 -13.2 -2.35 -11.25Q-4.85 -9.25 -8.4 -9.25Q-11.95 -9.25 -14.4 -11.25Q-16.9 -13.2 -16.9 -15.95Q-16.9 -18.75 -14.4 -20.7Q-11.95 -22.65 -8.4 -22.65Q-4.85 -22.65 -2.35 -20.7Q0.15 -18.75 0.15 -15.95 M-16.85,-14.45L-22.35 -14.85Q-24.9 -15.75 -25.85 -17.4Q-26.9 -19 -25.6 -20.5Q-24.25 -22.05 -21.45 -22.5L-16 -22.1Q-13.4 -21.2 -12.45 -19.5Q-11.55 -17.9 -12.95 -16.35Q-14.2 -14.9 -16.85 -14.45" /><path fill="none" d="M2.4,-17.65Q5.2 -17.3 5.35 -20.7L5.65 -25.85Q8.6 -31.15 13.85 -29.85 M0.15,-15.95Q0.15 -13.2 -2.35 -11.25Q-4.85 -9.25 -8.4 -9.25Q-11.95 -9.25 -14.4 -11.25Q-16.9 -13.2 -16.9 -15.95Q-16.9 -18.75 -14.4 -20.7Q-11.95 -22.65 -8.4 -22.65Q-4.85 -22.65 -2.35 -20.7Q0.15 -18.75 0.15 -15.95z M-16.85,-14.45L-22.35 -14.85Q-24.9 -15.75 -25.85 -17.4Q-26.9 -19 -25.6 -20.5Q-24.25 -22.05 -21.45 -22.5L-16 -22.1Q-13.4 -21.2 -12.45 -19.5Q-11.55 -17.9 -12.95 -16.35Q-14.2 -14.9 -16.85 -14.45z M1,-14.4Q0.7 -12.05 -0.6 -9.15L-3.05 -4.4L-2.05 -4.4L3.6 -6L5.4 -6L5.4 -1Q4.8 0.7 4.6 4.2L2.8 4.2 M-6.05,-11.6Q-5.65 -8.8 -5.65 -6.6Q-4.95 -6.85 -4.6 -6.35Q-4.35 -5.9 -4.4 -5.2L-3.85 -5L-4.45 -5L-4.4 -5.2L-5.6 -6.05Q-6.45 -6.9 -6.45 -7.7L-6.25 -8.4 M-22.8,-16.45L-22.15 -15.2Q-21.95 -14.5 -21.6 -14.45L-20.05 -14Q-19.6 -13.75 -19.6 -13.15Q-19.6 -11.9 -23 -11.9L-26.85 -12.05Q-28.8 -11.45 -29.55 -10.6Q-30.5 -9.55 -30.25 -7.45 M-35.25,-5.45Q-34.65 -8.8 -31.5 -11.8Q-28.4 -14.75 -24.85 -15.45" /></g><g id="b2-4" class="body" transform="matrix(1, 0, 0, 1, 42.6, 31.75)"><path fill="none" d="M-14.2,-18.25Q-11.15 -17.9 -9.2 -19.65Q-8 -20.65 -6.3 -23.6Q-4.6 -26.55 -3.4 -27.65Q-1.35 -29.45 1.8 -29.25 M-10.6,-17.7Q-9.9 -15.2 -11.8 -12.75Q-13.75 -10.35 -17.2 -9.4L-23.45 -9.6Q-26.35 -10.75 -27.05 -13.25Q-27.7 -15.8 -25.8 -18.2Q-23.85 -20.65 -20.45 -21.55L-14.15 -21.35Q-11.25 -20.25 -10.6 -17.7z M-32.8,-10.55Q-35.35 -11.45 -36.3 -13.1Q-37.35 -14.7 -36.05 -16.2Q-34.7 -17.75 -31.9 -18.2L-26.45 -17.8Q-23.85 -16.9 -22.9 -15.2Q-22 -13.6 -23.4 -12.05Q-24.65 -10.6 -27.3 -10.15Q-30.15 -9.65 -32.8 -10.55z M-7.1,-8.85Q-9.2 -7.8 -11.75 -5.35Q-14.05 -3.15 -15.75 -0.8 M-14.85,-8.35L-13.45 -9.05L-13.25 -9.25L-14.3 -8.85L-14.55 -8.75L-14.85 -8.35Q-15.8 -7.2 -17.1 -7.1L-20.4 -7.15L-20.2 -7.15L-17.55 -7.9L-18.65 -7.9L-18.45 -8.65Q-17.55 -8.65 -14.25 -9.65L-7.1 -9.65M-14.85,-8.35L-15.95 -7.9L-17.55 -7.9L-16.6 -8.15L-14.55 -8.75 M-39.9,3.6L-33.1 -4.6Q-29 -9.7 -29.65 -12.6 M-33.5,-9.2L-35.3 -1.15Q-36.9 3.7 -40.1 3.2" /><path d="M-10.6,-17.7Q-9.9 -15.2 -11.8 -12.75Q-13.75 -10.35 -17.2 -9.4L-23.45 -9.6Q-26.35 -10.75 -27.05 -13.25Q-27.7 -15.8 -25.8 -18.2Q-23.85 -20.65 -20.45 -21.55L-14.15 -21.35Q-11.25 -20.25 -10.6 -17.7 M-32.8,-10.55Q-35.35 -11.45 -36.3 -13.1Q-37.35 -14.7 -36.05 -16.2Q-34.7 -17.75 -31.9 -18.2L-26.45 -17.8Q-23.85 -16.9 -22.9 -15.2Q-22 -13.6 -23.4 -12.05Q-24.65 -10.6 -27.3 -10.15Q-30.15 -9.65 -32.8 -10.55" /></g><g id="b2-5" class="body" transform="matrix(1, 0, 0, 1, 44.65, 25.55)"><path fill="none" d="M-18.4,-16.8Q-15.5 -16.65 -10.1 -20Q-4.8 -23.3 -1.4 -23" /><path d="M-19.9,-11.55Q-21.85 -9.15 -25.3 -8.2L-31.55 -8.4Q-34.45 -9.55 -35.15 -12.05Q-35.8 -14.6 -33.9 -17Q-31.95 -19.45 -28.55 -20.35L-22.25 -20.15Q-19.35 -19.05 -18.7 -16.5Q-18 -14 -19.9 -11.55" /><path fill="none" d="M-19.9,-11.55Q-21.85 -9.15 -25.3 -8.2L-31.55 -8.4Q-34.45 -9.55 -35.15 -12.05Q-35.8 -14.6 -33.9 -17Q-31.95 -19.45 -28.55 -20.35L-22.25 -20.15Q-19.35 -19.05 -18.7 -16.5Q-18 -14 -19.9 -11.55z" /><path d="M-38.2,-11.4Q-40.75 -12.3 -41.7 -13.95Q-42.75 -15.55 -41.45 -17.05Q-40.1 -18.6 -37.3 -19.05L-31.85 -18.65Q-29.25 -17.75 -28.3 -16.05Q-27.4 -14.45 -28.8 -12.9Q-30.05 -11.45 -32.7 -11Q-35.55 -10.5 -38.2 -11.4" /><path fill="none" d="M-38.2,-11.4Q-40.75 -12.3 -41.7 -13.95Q-42.75 -15.55 -41.45 -17.05Q-40.1 -18.6 -37.3 -19.05L-31.85 -18.65Q-29.25 -17.75 -28.3 -16.05Q-27.4 -14.45 -28.8 -12.9Q-30.05 -11.45 -32.7 -11Q-35.55 -10.5 -38.2 -11.4z M-23,-11.6Q-25.3 -10.6 -26.65 -6.4L-22.4 -6.4L-22.4 -2.4L-24.65 1.65Q-25.9 4.3 -28.05 4.6 M-41.45,4.2Q-41.25 4 -40.15 3.75Q-39.15 3.5 -38.85 3L-37.85 0.4L-35.95 -2.15Q-34.85 -3.65 -34.85 -4.1L-35.45 -4.8L-36.05 -5.6Q-36.15 -7.05 -36.45 -7.6L-37.25 -9.75L-37.85 -11.8L-37.85 -13Q-34.95 -12.95 -34.65 -6.6Q-34.15 -6.85 -33.85 -7.8" /></g><g id="b3-1" class="body" transform="matrix(1, 0, 0, 1, 11.6, 23.65)"><path fill="none" d="M10.15,2.6Q11.4 1.95 12.3 0.1Q13.25 -1.7 13.25 -3.4Q13.25 -6.9 10.65 -11.1Q8 -15.35 8 -16.95L8.1 -19.1Q8.4 -20.25 9.65 -21.15 M9.6,-0.8Q9.6 2.5 7.354.85Q5.1 7.2 1.9 7.2Q-1.3 7.2 -3.55 4.85Q-5.8 2.5 -5.8 -0.8Q-5.8 -4.1 -3.55 -6.45Q-1.3 -8.8 1.9 -8.8Q5.1 -8.87.35 -6.45Q9.6 -4.1 9.6 -0.8z M3.4,-13.3Q3.4 -10.65 1.6 -8.8Q-0.25 -6.9 -2.85 -6.9Q-5.4 -6.9 -7.25 -8.8Q-9.1 -10.65 -9.1 -13.3Q-9.1 -15.95 -7.25 -17.85Q-5.4 -19.7 -2.85 -19.7Q-0.25 -19.7 1.6 -17.85Q3.4 -15.95 3.4 -13.3z M-7.25,2.75Q-7 4.45 -5.75 4.4Q-4.3 4.3 -4 5Q-3.45 6.1 -2.7 6.5L-0.5 6.75 M-7.25,-15L-7 -4.35L-7.1 -0.75Q-7.45 1.25 -8.75 1L-8.75 2.25L-8.5 2.25 M3,-12.25Q4.05 -12.4 4.45 -10.6Q4.9 -8.75 6.25 -8.75Q6.15 -7.85 6.55 -6.15L7 -4" /> <path d="M9.6,-0.8Q9.6 2.5 7.35 4.85Q5.1 7.2 1.9 7.2Q-1.3 7.2 -3.55 4.85Q-5.8 2.5 -5.8 -0.8Q-5.8 -4.1 -3.55 -6.45Q-1.3 -8.8 1.9 -8.8Q5.1 -8.8 7.35 -6.45Q9.6 -4.1 9.6 -0.8 M3.4,--15.95 -7.25 -17.85Q-5.4 -19.7 -2.85 -19.7Q-0.25 -19.7 1.6 -17.85Q3.4 -15.95 3.4 -13.3" /></g><g id="b3-2" class="body" transform="matrix(1, 0, 0, 1, 14.25, 35.95)"><path d="M11.15,-8.3Q11.15 -5 8.9 -2.65Q6.65 -0.3 3.45 -0.3Q0.25 -0.3 -2 -2.65Q-4.25 -5 -4.25 -8.3Q-4.25 -11.6 -2 -13.95Q0.25 -16.3 3.45 -16.3Q6.65 -16.3 8.9 -13.95Q11.15 -11.6 11.15 -8.3 M0.75,-18.9Q0.75 -16.25 -1.05 -14.4Q-2.9 -12.5 -5.5 -12.5Q-8.05 -12.5 -9.9 -14.4Q-11.75 -16.25 -11.75 -18.9Q-11.75 -21.55 -9.9 -23.45Q-8.05 -25.3 -5.5 -25.3Q-2.9 -25.3 -1.05 -23.45Q0.75 -21.55 0.75 -18.9" /><path fill="none" d="M10.15,-9.7Q11.4 -10.35 12.3 -12.2Q13.25 -14 13.25 -15.7Q13.25 -19.2 10.65 -23.4Q8 -27.65 8 -29.25L8.1 -31.4Q8.4 -32.55 9.65 -33.45 M11.15,-8.3Q11.15 -5 8.9 -2.65Q6.65 -0.3 3.45 -0.3Q0.25 -0.3 -2 -2.65Q-4.25 -5 -4.25 -8.3Q-4.25 -11.6 -2 -13.95Q0.25 -16.3 3.45 -16.3Q6.65 -16.3 8.9 -13.95Q11.15 -11.6 11.15 -8.3z M0.75,-18.9Q0.75 -16.25 -1.05 -14.4Q-2.9 -12.5 -5.5 -12.5Q-8.05 -12.5 -9.9 -14.4Q-11.75 -16.25 -11.75 -18.9Q-11.75 -21.55 -9.9 -23.45Q-8.05 -25.3 -5.5 -25.3Q-2.9 -25.3 -1.05 -23.45Q0.75 -21.55 0.75 -18.9z M-2.5,6.75Q-0.2 6.05 -0.15 1.85Q-0.05 -2.85 1 -3.75 M6.25,5.25Q6.95 5.15 9.3 1.9Q11.75 -1.4 11.75 -2.6Q11.75 -3.15 10.7 -4.3L9.25 -5.75 M-11.05,-16.9L-8.05 -6.7L-7.2 -3.15Q-7.05 -1.15 -8.35 -1.1L-8 0.1L-7.75 0.05 M3,-12.25Q4.05 -12.4 4.45 -10.6Q4.9 -8.75 6.25 -8.75Q6.15 -7.85 6.55 -6.15L7 -4 M0.35,-23L-1.25 -23L0.5 -21.45Q1.35 -20.55 2.5 -20.25Q3.2 -20.05 3.6 -19L3.9 -18L4.25 -18L4.5 -18Q3.85 -18.75 2.5 -21.4Q1.7 -23 0.35 -23M1.5,-19.5Q2.6 -19.15 3 -17.75Q3.2 -17.95 3.9 -18L4.25 -17" /></g><g id="b3-3" class="body" transform="matrix(1, 0, 0, 1, 22.5, 40.8)"><path d="M-1.25,-31.9Q-1.25 -29.25 -3.05 -27.4Q-4.9 -25.5 -7.5 -25.5Q-10.05 -25.5 -11.9 -27.4Q-13.75 -29.25 -13.75 -31.9Q-13.75 -34.55 -11.9 -36.45Q-10.05 -38.3 -7.5 -38.3Q-4.9 -38.3 -3.05 -36.45Q-1.25 -34.55 -1.25 -31.9 M6.25,-21.3Q6.25 -18 4 -15.65Q1.75 -13.3 -1.45 -13.3Q-4.65 -13.3 -6.9 -15.65Q-9.15 -18 -9.15 -21.3Q-9.15 -24.6 -6.9 -26.95Q-4.65 -29.3 -1.45 -29.3Q1.75 -29.3 4 -26.95Q6.25 -24.6 6.25 -21.3" /><path fill="none" d="M4.25,-20.5L12.3 -21.85Q15.5 -23.2 15.5 -28.15Q15.5 -29.45 15 -31.2L14.5 -33.4Q14.5 -34.25 15 -35.25 M6.25,-21.3Q6.25 -18 4 -15.65Q1.75 -13.3 -1.45 -13.3Q-4.65 -13.3 -6.9 -15.65Q-9.15 -18 -9.15 -21.3Q-9.15 -24.6 -6.9 -26.95Q-4.65 -29.3 -1.45 -29.3Q1.75 -29.3 4 -26.95Q6.25 -24.6 6.25 -21.3z M-1.25,-31.9Q-1.25 -29.25 -3.05 -27.4Q-4.9 -25.5 -7.5 -25.5Q-10.05 -25.5 -11.9 -27.4Q-13.75 -29.25 -13.75 -31.9Q-13.75 -34.55 -11.9 -36.45Q-10.05 -38.3 -7.5 -38.3Q-4.9 -38.3 -3.05 -36.45Q-1.25 -34.55 -1.25 -31.9z M-3.2,5.5Q-2.45 4.65 -2.5 0.4Q-2.6 -3.7 -1.2 -4.75Q-3.25 -7.55 -2.95 -16L-4.7 -16Q-4.7 -15.8 -5.25 -15.4Q-5.85 -15 -6.2 -15L-6.2 -12.75L-5.1 -9.65Q-4.9 -8.7 -4.25 -7.9Q-3.6 -7.1 -3.45 -6L-2.95 -6M4,3.25L4.75 3.25Q4.75 -1 5.5 -2.5L6.75 -5.25L7.5 -7.15Q7.5 -7.75 5 -9.7Q2.5 -11.7 2.5 -13L2.65 -14L2.75 -15.25L5.25 -15.5L5.25 -11.5 M-20,-30.75L-19.6 -28.35Q-19.05 -27 -17.5 -27.25L-17.5 -24.75L-15 -24.75L-14.5 -25.75L-14.75 -25.5L-14.75 -26Q-14.75 -26.8 -15.5 -30.65Q-15.5 -31.2 -15 -31.4L-14 -31.75L-15 -32L-14.85 -32.7Q-14.65 -33.1 -14.25 -33.25" /> </g><g id="b3-4" class="body" transform="matrix(1, 0, 0, 1, 22.75, 49.3)"><path d="M3.7,-32.55Q3.7 -29.25 1.45 -26.9Q-0.8 -24.55 -4 -24.55Q-7.2 -24.55 -9.45 -26.9Q-11.7 -29.25 -11.7 -32.55Q-11.7 -35.85 -9.45 -38.2Q-7.2 -40.55 -4 -40.55Q-0.8 -40.55 1.45 -38.2Q3.7 -35.85 3.7 -32.55 M-5.5,-40.4Q-5.5 -37.75 -7.3 -35.9Q-9.15 -34 -11.75 -34Q-14.3 -34 -16.15 -35.9Q-18 -37.75 -18 -40.4Q-18 -43.05 -16.15 -44.95Q-14.3 -46.8 -11.75 -46.8Q-9.15 -46.8 -7.3 -44.95Q-5.5 -43.05 -5.5 -40.4" /><path fill="none" d="M2.5,-34.25L4.15 -35Q5.35 -35.75 5.25 -36.75L7.75 -36.75Q7.4 -34.5 9.25 -34.5L9.5 -33L14 -33L14.85 -34L15.5 -34.75 M3.7,-32.55Q3.7 -29.25 1.45 -26.9Q-0.8 -24.55 -4 -24.55Q-7.2 -24.55 -9.45 -26.9Q-11.7 -29.25 -11.7 -32.55Q-11.7 -35.85 -9.45 -38.2Q-7.2 -40.55 -4 -40.55Q-0.8 -40.55 1.45 -38.2Q3.7 -35.85 3.7 -32.55z M-5.5,-40.4Q-5.5 -37.75 -7.3 -35.9Q-9.15 -34 -11.75 -34Q-14.3 -34 -16.15 -35.9Q-18 -37.75 -18 -40.4Q-18 -43.05 -16.15 -44.95Q-14.3 -46.8 -11.75 -46.8Q-9.15 -46.8 -7.3 -44.95Q-5.5 -43.05 -5.5 -40.4z M-9.5,-26.5Q-9.5 -24.25 -7.75 -19L-5.25 -19Q-4.75 -20 -4.75 -21L-4.5 -21Q-4.65 -19.7 -3.85 -15.85Q-3.1 -12.1 -3.25 -11 M4.5,-13.25Q4.5 -14.25 5 -14.75L5 -23.75L2.75 -23.5L2.5 -29.75 M-19.5,-39L-19.25 -30.75L-19.25 -30.25L-18.85 -30.75Q-17.5 -32.45 -17.5 -36Q-17 -35.5 -15.75 -35.5L-15.75 -29L-15.25 -29Q-14.85 -30.1 -13.4 -31.75Q-11.95 -33.35 -11.5 -34.75M-19.25,-30.25L-19.25 -27.75L-20 -27.75L-20.1 -27.9L-20.25 -28.4Q-20.25 -29 -19.25 -30.25" /></g><g id="b3-5" class="body" transform="matrix(1, 0, 0, 1, 25.25, 54.6)"><path d="M-0.6,-39.55Q-0.6 -36.25 -2.85 -33.9Q-5.1 -31.55 -8.3 -31.55Q-11.5 -31.55 -13.75 -33.9Q-16 -36.25 -16 -39.55Q-16 -42.85 -13.75 -45.2Q-11.5 -47.55 -8.3 -47.55Q-5.1 -47.55 -2.85 -45.2Q-0.6 -42.85 -0.6 -39.55 M-9,-45.7Q-9 -43.05 -10.8 -41.2Q-12.65 -39.3 -15.25 -39.3Q-17.8 -39.3 -19.65 -41.2Q-21.5 -43.05 -21.5 -45.7Q-21.5 -48.35 -19.65 -50.25Q-17.8 -52.1 -15.25 -52.1Q-12.65 -52.1 -10.8 -50.25Q-9 -48.35 -9 -45.7" /><path fill="none" d="M-1.5,-40.75Q1.3 -41.15 7.65 -40.75Q12.9 -40.8 14.25 -43.25 M-0.6,-39.55Q-0.6 -36.25 -2.85 -33.9Q-5.1 -31.55 -8.3 -31.55Q-11.5 -31.55 -13.75 -33.9Q-16 -36.25 -16 -39.55Q-16 -42.85 -13.75 -45.2Q-11.5 -47.55 -8.3 -47.55Q-5.1 -47.55 -2.85 -45.2Q--19.65 -41.2Q-21.5 -43.05 -21.5 -45.7Q-21.5 -48.35 -19.65 -50.25Q-17.8 -52.1 -15.25 -52.1Q-12.65 -52.1 -10.8 -50.25Q-9 -48.35 -9 -45.7z M-10.25,-37.25Q-10.95 -37 -11.85 -35.55L-13 -33.75L-13 -31.75L-6.75 -31.5L-6.75 -30.25L-10.2 -27.95Q-12.3 -26.4 -12.25 -24.25 M-1.25,-32Q-1.8 -30.8 -3.65 -28.7Q-5.35 -26.8 -5.75 -25.75L-7.75 -25.75 M-21.25,-40.75L-21 -40.75L-20.75 -35Q-20.3 -33.15 -20.35 -31.35Q-20.4 -27.85 -22.75 -27.5 M-16.5,-37L-16.45 -32.45Q-16.45 -29.75 -17 -28.5Q-16.75 -28.5 -16.25 -29" /></g><g id="f00" transform="scale(-1,1) translate(-27,0)"><use xlink:href="#b2-1"/><use x="-5" y="-2.5" xlink:href="#head2"/></g><g id="f01" transform="scale(-1,1) translate(-27,-2)"><use xlink:href="#b2-2"/><use x="-10" y="8" xlink:href="#head2"/></g><g id="f02" transform="scale(-1,1) translate(-55,-2)"><use xlink:href="#b2-3"/><use x="-2" y="1.5" xlink:href="#head2"/></g><g id="f03" transform="scale(-1,1) translate(-58,-2)"><use xlink:href="#b2-4"/><use x="-4.5" y="7" xlink:href="#head2"/></g><g id="f04" transform="scale(-1,1) translate(-60,4)"><use xlink:href="#b2-5"/><use x="-8" y="-1" xlink:href="#head2"/></g><g id="f10" transform="scale(-1,1) translate(-25,-3)"><use xlink:href = "#b1-1"/><usex="-2" y="-2" xlink:href = "#head1"/></g><g id="f11" transform="scale(-1,1) translate(-33,-2)"><use xlink:href = "#b1-2"/><usex="-10" y="11" xlink:href = "#head1"/></g><g id="f12" transform="scale(-1,1) translate(-40,-2)"><use xlink:href = "#b1-3"/><usex="-5" y="27" xlink:href = "#head1"/></g><g id="f13" transform="scale(-1,1) translate(-43,3)"><use xlink:href = "#b1-4"/><use x="-3" y="32" xlink:href = "#head1"/></g><g id="f14" transform="scale(-1,1) translate(-43,9)"><use xlink:href = "#b1-5"/><use x="-5" y="27" xlink:href = "#head1"/></g><g id="f20" transform="translate(0,-3)"><use xlink:href = "#b1-1"/><use x="-2" y="-2" xlink:href = "#head1"/></g><g id="f21" transform="translate(-6,-2)"><use xlink:href = "#b1-2"/><use x="-10" y="11" xlink:href = "#head1"/></g><g id="f22" transform="translate(-12,-2)"><use xlink:href = "#b1-3"/><use x="-5" y="27" xlink:href = "#head1"/></g><g id="f23" transform="translate(-15,3)"><use xlink:href = "#b1-4"/><use x="-3" y="32" xlink:href = "#head1"/></g><g id="f24" transform="translate(-15,9)"><use xlink:href = "#b1-5"/><use x="-5" y="27" xlink:href = "#head1"/></g><g id="f30"><use xlink:href = "#b2-1"/><use x="-5" y="-2.5" xlink:href="#head2"/></g><g id="f31" transform="translate(-3,-2)"><use xlink:href="#b2-2"/><use x="-10" y="8" xlink:href="#head2"/></g><g id="f32" transform="translate(-30,-2)"><use xlink:href="#b2-3"/><use x="-2" y="1.5" xlink:href="#head2"/></g><g id="f33" transform="translate(-30,-2)"><use xlink:href="#b2-4"/><use x="-4.5" y="7" xlink:href="#head2"/></g><g id="f34" transform="translate(-30,4)"><use xlink:href="#b2-5"/><use x="-8" y="-1" xlink:href="#head2"/></g><g id="f40" transform="translate(2,6)"><use xlink:href = "#b3-1"/><use x="-2" y="-11" xlink:href = "#head1"/></g><g id="f41" transform="translate(0,-10)"><use xlink:href = "#b3-2"/><use x="-5" y="0" xlink:href = "#head1"/></g><g id="f42" transform="translate(-6,-14)"><use xlink:href = "#b3-3"/><use x="-1" y="-12" xlink:href = "#head1"/></g><g id="f43" transform="translate(-8,-16)"><use xlink:href = "#b3-4"/><use x="-5.5" y="-8" xlink:href = "#head1"/></g><g id="f44" transform="translate(-12,-22)"><use xlink:href = "#b3-5"/><use x="-4" y="-5" xlink:href = "#head1"/></g><g id="f50" transform="scale(-1,1) translate(-27,6)"><use xlink:href = "#b3-1"/><use x="-2" y="-11" xlink:href = "#head1"/></g><g id="f51" transform="scale(-1,1) translate(-29,-8)"><use xlink:href = "#b3-2"/><usex="-5" y="0" xlink:href = "#head1"/></g><g id="f52" transform="scale(-1,1) translate(-36,-14)"><use xlink:href = "#b3-3"/><usex="-1" y="-12" xlink:href = "#head1"/></g><g id="f53" transform="scale(-1,1) translate(-38,-16)"><use xlink:href = "#b3-4"/><usex="-5.5" y="-8" xlink:href = "#head1"/></g><g id="f54" transform="scale(-1,1) translate(-42,-22)"><use xlink:href = "#b3-5"/><usex="-4" y="-5" xlink:href = "#head1"/></g></defs>。
天翼云计算产品介绍1.云主机和混合云产品介绍
成本
云主机
分钟级别 分钟级别
支持 支持,应用不中断 自助远程升级云主机配置
分钟级别 自助远程启动、关闭和重启 自助远程增加、删除块存储磁盘
提供快照、备份等功能 低
传统服务器
数天 数小时甚至更多
不支持 不支持 需到现场作业 需要重新安装操作系统 需通知IDC人员执行 需通知IDC人员执行 需要额外备份设备
转发策略、设置健康检查、在监听器中添加云主机
操作系统与镜像工具——操作系统
类型 纯净版
模板 ubuntu 12.04/64 ubuntu 12.04/32 windows 2003 sp2/32 windows 2008 R2/64 centOS 5.11/32 centOS 5.11/64
centOS 6.6/32 centOS 6.6/64 debian 7/32 debian 7/64
天翼云计算产品介绍
中国电信股份有限公司云计算分公司 2016年4月
1
“围住神经猫”与“云计算”
三天获1亿访问量:“神经猫”的社交神话
•该游戏上线24小时内表现较为一般,独立玩家数IP 仅为23.4万,但在随后一天爆发,上线48小时独立 IP数据蹿升到500万。 •这款游戏由南京泥巴怪公司开发,开发仅用了一天 半,美术一人,程序一人。 •假设您是该公司的IT规划人员,应该如何规划IT架 构?
Windows Server:
利用Windows 远程桌面连接程 序,输入云主机IP访问云主机
Linux:
使用SSH等开源软件,输入云主机IP即可通 过命令行方式访问云主机
输入帐号密码后,就可以在 本地操作云主机的界面了
云主机与传统服务器的对比
html5app案例
html5app案例html5app案例【篇一:html5app案例】html5 技术为开发者提供了一个跨平台的移动apps开发方案,并且该方案具有很好的扩展性和灵活性。
如今国内使用html5开发app应用技术尚有欠缺,因为在手机开发app上,html5应用只有两种方法,要不就是全使用html5的语法,要不就是仅使用java引擎。
java引擎的构建方法让制作手机网页游戏成为可能。
由于界面层很复杂,已预订了一个ui工具包去使用。
纯html5手机应用运行缓慢并错漏百出,但优化后的效果会好转。
尽管不是很多人愿意去做这样的优化,但依然可以去尝试。
html5手机应用的最大优势就是可以在网页上直接调试和修改。
原生应用的开发人员可能需要花费非常大的力气才能达到html5的效果,不断地重复编码、调试和运行,这是首先得解决的一个问题。
即使这样,好运互联还是很看好html5 app开发,原因有一下几点。
一:现在html5非常火的技术,主要方向在使用高端浏览器的高端移动设备,所以可以用作开发android系统的app。
二:html5对android、ios系统都支持。
三:html5可以用作离线应用的开发,离线应用就是把需要的资源先缓存到本地,下次再查看时无需联网。
四:html5开发app,能提供更快、更简便的服务,代码可高度重用,服务发布方便。
五:动画、游戏方面,地理定位方面的app应用正在崛,而html5技术优势正是这在些方面。
可以说,未来采用html5开发app的,将会大量减少代码量,应用软件也会得到更高的用户体验。
webapp的实现基础就是html5+js+css3.但是webapp还是基于浏览器的微网站开发。
正式如此,我们必须要深入的了解html5的8大特性,这样才能方便我们在开发和设计app的时候,更合理的采用原生app与webapp 的相结合。
而app里面最重要的一个分享功能,分享出去的必须是网页形式的。
cocos引擎—类神经猫三消游戏《RabbitEscape》03:让兔子动起来
cocos引擎—类神经猫三消游戏《RabbitEscape》03:让兔子动起来类神经猫三消游戏《Rabbit Escape》03:让兔子动起来一、前言经过上一讲的讲解,我们已经可以将UI响应用户的交互操作了(添加石头),但是这都只是在UI界面上的一些操作,今天我们会讲一讲如何创建逻辑层,并将UI层和游戏逻辑层进行联系,以及实现简单的让兔子动起来。
二、创建GameMap首先在我们项目中要新建一个名叫GameCtrl的类,来管理游戏的逻辑。
.h文件:1 2 3 4 5 6 #ifndef __RabbitTech__GameCtrl__ #define __RabbitTech__GameCtrl__#include#include#include7 8 9101112131415161718192022232425262728 using namespace std;const int NUM_MAPROWANDCOW = 9; //表示行列数const int VAL_MAX = 0x0FFFFFFF; //表示最大值//方向枚举enum class Dir{up,down,left,right,upLeft,upRight,downLeft,downRight,none};//地图矢量struct Vec{int hor; //横向int ver; //纵向293031323435363738394041424344454647484950 Vec(){hor = 0;ver = 0;}Vec(int _ver,int _hor){hor = _hor;ver = _ver;}bool operator == (const Vec& vec ){ return vec.hor==hor&&vec.ver==ver; } Vec operator + (const Vec& vec){ return Vec(vec.ver+ver,vec.hor+hor); } };//地图位置struct Pos{ //是否是障碍; bool isObt;51525354555657585960616263646566676869707172 //位置信息Vec vec; Pos(){ vec.ver = 0; vec.hor = 0;isObt = false;}Pos(int _ver,int _hor){ vec.ver = _ver;vec.hor = _hor;isObt = false;}};class GameCtrl{ public:GameCtrl();~GameCtrl();public://添加石头void addObtacle(int tag);7374757677787980818283848586878990 //移动兔子int rabbitMove();private://游戏地图vector<vector>m_gameMap;</vector//移动距离std::unordered_map m_moveVec; std::unordered_map m_moveDirs; //初始化地图移动矢量void initMoveVec();//初始花地图信息void initMapInfo();Vec m_rabbitPos; //兔子的位置};#endif /* defined(__RabbitT ech__GameCtrl__) */.cpp文件:1 2 #include "GameCtrl.h" GameCtrl::GameCtrl(){3 4 5 6 7 8 91011121314151617181920222324 this->initMoveVec();this->initMapInfo();}void GameCtrl::initMoveVec(){//创建移动HASHm_moveVec[(int)Dir::up] = new Vec(-1,0);m_moveVec[(int)Dir::down] = new Vec(1,0);m_moveVec[(int)Dir::left] = new Vec(0,-1);m_moveVec[(int)Dir::right] = new Vec(0,1);m_moveVec[(int)Dir::upLeft] = new Vec(-1,-1);m_moveVec[(int)Dir::upRight] = new Vec(-1,1);m_moveVec[(int)Dir::downLeft] = new Vec(1,-1);m_moveVec[(int)Dir::downRight]= new Vec(1,1);//创建映射hashm_moveDirs[m_moveVec[(int)Dir::up]]=(int)Dir::up;m_moveDirs[m_moveVec[(int)Dir::down]]=(int)Dir::down;m_moveDirs[m_moveVec[(int)Dir::left]]=(int)Dir::left;m_moveDirs[m_moveVec[(int)Dir::right]]=(int)Dir::right;m_moveDirs[m_moveVec[(int)Dir::upLeft]]=(int)Dir::upLeft;m_moveDirs[m_moveVec[(int)Dir::upRight]]=(int)Dir::upRigh t;252627282930323334353637383940414243444546m_moveDirs[m_moveVec[(int)Dir::downLeft]]=(int)Dir::downLeft;m_moveDirs[m_moveVec[(int)Dir::downRight]]=(int)Dir::dow nRight;}void GameCtrl::initMapInfo(){//初始化地图for (int i = 0; i<="">vector curRow;for (int j = 0; j<="">auto pNewPos = new Pos(i,j);curRow.push_back(pNewPos);}m_gameMap.push_back(curRow);}//初始化兔子信息m_rabbitPos.hor=m_rabbitPos.ver = NUM_MAPROWANDCOW/2;}void GameCtrl::addObtacle(int tag){m_gameMap[tag/NUM_MAPROWANDCOW][tag%NUM_M APROWANDCOW]->isObt = true;484950515253545556575859606162636465666768 int GameCtrl::rabbitMove() {//假设让兔子一直向上m_rabbitPos=(*m_moveVec[(int)Dir::up])+m_rabbitPos;returnm_rabbitPos.ver*NUM_MAPROWANDCOW+m_rabbitPos.hor; } GameCtrl::~GameCtrl(){//析构地图信息for (int i = 0; i<="">for (int j = 0; j<="">delete m_gameMap[j];}}//析构移动矢量for (auto& it:m_moveVec) {delete it.second;}PS:因为整个逻辑控制是脱离Cocos2d-x架构的,为了降低耦合,我没有使用Cocos2d-x 的头文件。
围住神经猫
6
系统设计概要
定理1:如果你在猫边上2格之内布子,除 非有很好的地形,不然猫必定从你身边跑 掉。所以在开阔场地,你的棋子至少和猫 中间隔2个空格。 设猫的目标是向右上开阔地逃跑。如 果你走1,猫向右上走2,你再走5,猫走 10……显然完全拦不住,猫直接往右上方 跑走了。 如果你在4布点,猫还是向2移动,你 走5的话和刚才一样了,走10的话猫走5, 等等,还是不行。 但是如果在7布点,就不一样了。猫1, 你8,猫5,你11,就拦在了猫前面,逼迫 它转向。如果猫2,你可以13,等等,同样 可以拦住。
PUT THE NAME OF YOUR COMPANY HERE
•定理2:当你在开阔场地布下第一子 时,封锁线会形成于你的这个子和猫 中线的靠你那一侧。你应当让盘上已 有子力和你的新子位于这条线上。 • 假设猫只能往右上逃而不能往左 下跑。 • 红色方块代表猫的起始点,绿色 六边形代表你的开局第一子。红色数 字代表猫需要那么多步才能跑过去, 绿色数字代表你的子需要那么多步才 能连过去。 • 显然,如果某个格子上红字小于 等于绿字,表明猫会比你先到,那么 朝那里布防就是没有意义的,会被突 破。想象一下你的棋子是在追猫的狗。 • 而蓝线标记的,就是刚好红字大 于绿字的那条线。 • 所以你在布子的时候不要太激进, 和猫靠的太近会被绕过去。要尽可能 在封锁线的我方一侧布子,远远地形 E OF YOUR COMPANY HERE
特色及创新
•多样性设计(即游戏性的设计)
•《围住神经猫》根据不同的开局,存在着理论 最少步数,个人玩到最好的记录是2步拿下小 猫,那是开局时拿到了一副好牌的关系,与RP 也是有一定关系。面对不同的开局,我们如何 才能尽快获胜?那就是“诱敌策略”,每一步 都要想好怎样把小猫引入瓮中,而不是把它挡 住。你会发现当有几条最优解的时候,它首先 会选择左上的线路。于是我们可判断小猫行进 路线,预先“造”一条小栈道,等小猫进入, 断其后路,堵其出口。 •当你用最后一颗棋子把小猫围住,程序找不到 最优路线,小猫就开始发骚发狂了!但此时游 戏并未结束,仍需要你继续一步一步围堵小猫, 防止它从手边漏掉(这才是游戏最大的趣味性)。
java实现贪吃蛇游戏代码(附完整源码)
java实现贪吃蛇游戏代码(附完整源码)先给⼤家分享源码,喜欢的朋友。
游戏界⾯GUI界⾯java实现贪吃蛇游戏需要创建⼀个桌⾯窗⼝出来,此时就需要使⽤java中的swing控件创建⼀个新窗⼝JFrame frame = new JFrame("贪吃蛇游戏");//设置⼤⼩frame.setBounds(10, 10, 900, 720);向窗⼝中添加控件可以直接⽤add⽅法往窗⼝中添加控件这⾥我创建GamePanel类继承⾃Panel,最后使⽤add⽅法添加GamePanel加载图⽚图⽚加载之后可以添加到窗⼝上public static URL bodyUrl = GetImage.class.getResource("/picture/body.png");public static ImageIcon body = new ImageIcon(bodyUrl);逻辑实现//每次刷新页⾯需要进⾏的操作@Overridepublic void actionPerformed(ActionEvent e) {//当游戏处于开始状态且游戏没有失败时if(gameStart && !isFail) {//蛇头所在的位置就是下⼀次蛇⾝体的位置bodyX[++bodyIndexRight] = headX;bodyY[bodyIndexRight] = headY;//bodyIndexLeft++;//长度到达数组的尾部if(bodyIndexRight==480) {for(int i=bodyIndexLeft, j=0; i<=bodyIndexRight; i++,j++) {bodyX[j]=bodyX[i];bodyY[j]=bodyY[i];}bodyIndexLeft=0;bodyIndexRight=length-1;}//更新头部位置if(fdirection==1) {//头部⽅向为上,将蛇头向上移动⼀个单位headY-=25;}else if(fdirection==2) {//头部⽅向为下,将蛇头向下移动⼀个单位headY+=25;}else if(fdirection==3) {//头部⽅向为左,将蛇头向左移动⼀个单位headX-=25;}else if(fdirection==4) {//头部⽅向为右,将蛇头向右移动⼀个单位headX+=25;}//当X坐标与Y坐标到达极限的时候,从另⼀端出来if(headX<25)headX = 850;if(headX>850)headX = 25;if(headY<75)headY = 650;if(headY>650)headY = 75;//当头部坐标和⾷物坐标重合时if(headX==foodX && headY==foodY){length++;score+=10;//重新⽣成⾷物,判断⾷物坐标和蛇⾝坐标是否重合,效率较慢while(true) {foodX = 25 + 25* random.nextInt(34);foodY = 75 + 25* random.nextInt(24);//判断⾷物是否和头部⾝体重合boolean isRepeat = false;//和头部重合if(foodX == headX && foodY == headY)isRepeat = true;//和⾝体重合for(int i=bodyIndexLeft; i<=bodyIndexRight; i++) {if(foodX == bodyX[i] && foodY == bodyY[i]){isRepeat = true;}}//当不重复的时候,⾷物⽣成成功,跳出循环if(isRepeat==false)break;}}else bodyIndexLeft++;//判断头部是否和⾝体重合for(int i=bodyIndexLeft; i<=bodyIndexRight;i++) {if(headX==bodyX[i] && headY==bodyY[i]){//游戏失败isFail = true;break;}}repaint();}timer.start();}键盘监听实现KeyListener接⼝,重写KeyPressed⽅法,在其中写当键盘按下时所对应的操作。
java疯狂练习(带源代码)
java疯狂练习(带源代码)【程序1】题⽬:古典问题:有⼀对兔⼦,从出⽣后第3个⽉起每个⽉都⽣⼀对兔⼦,⼩兔⼦长到第三个⽉后每个⽉⼜⽣⼀对兔⼦,假如兔⼦都不死,问每个⽉的兔⼦总数为多少?1.程序分析:兔⼦的规律为数列1,1,2,3,5,8,13,21....import java.util.Scanner;public class rabbit {public static void main(String[] args) {int number = 1, month;int tmp1 = 1, tmp2 = 1;Scanner sc = new Scanner(System.in);System.out.println("请输⼊第⼏个⽉:");month = sc.nextInt();for (int i = 1; i <= month; i++) {if (i <= 2)number = 1;else {number = tmp1 + tmp2;// 前两个⽉兔⼦数之和tmp2 = tmp1;// 前第⼆个⽉tmp1 = number;// 前⼀个⽉}System.out.println("第" + i + "个⽉的兔⼦数是:" + number);}}}【程序2】题⽬:判断101-200之间有多少个素数,并输出所有素数。
1.程序分析:判断素数的⽅法:⽤⼀个数分别去除2到sqrt(这个数),如果能被整除,public class timu2 {public static void main(String[] args) {int sum = 0;for (int i = 101; i <= 200; i++)for (int j = 2; j <= i; j++) {if (i % j == 0 && i == j) {} else if (i % j == 0 && i != j)break;}System.out.println("101-200之间有:"+sum+"个素数");}}则表明此数不是素数,反之是素数。
cocos引擎—类神经猫三消游戏《Rabbit Escape》02:搭建游戏界面和添加障碍
cocos引擎—类神经猫三消游戏《Rabbit Escape》02:搭建游戏界面和添加障碍物本文检索关键词:游戏引擎,游戏开发引擎,cocos引擎html5游戏开发一、前言上一节对整个游戏项目做了简单介绍。
本节就来讲讲Cocos2d-x与Cocos Studio如何练习起来,以及实现游戏中添加障碍物。
.二、Cocos2d-x和Cocos Studio是如何联系起来搭建游戏界面首先建好一个Cocos2d-x新项目,用Cocos Studio打开附件中的Rabbit资源文件s,UI界面我早已给大家设计好。
这里主要关注一下,节点树结构。
因为会和等下的程序中的调用有很大的联系。
然后将文件夹res的所有资源添加到新项目的Resources中(是Resources,而不是其中的res,这样操作主要是考虑到不用设置路径)。
然后,来撸代码!修改后的HelloWorld.h#ifndef __HELLOWORLD_SCENE_H__#define __HELLOWORLD_SCENE_H__#include "cocos2d.h"class HelloWorld : public cocos2d::Layer{public:// there's no 'id' in cpp, so we recommend returning the clas s instance pointerstatic cocos2d::Scene* createScene();// Here's a difference. Method 'init' in cocos2d-x returns bo ol, instead of returning 'id' in cocos2d-iphonevirtual bool init();// a selector callbackvoid menuCloseCallback(cocos2d::Ref* pSender);// implement the "static create()" method manuallyCREATE_FUNC(HelloWorld);public:bool onTouchBeganCallBack(cocos2d::Touch* t,cocos2d::Event* e vent);private://存放所有子节点Node* m_pNodes;//存放兔子的节点Node* m_pNode_rabbit;//存放障碍的节点的容器cocos2d::Vector<Node* > m_pNodes_obstacle;};#endif // __HELLOWORLD_SCENE_H__HelloWorld.cpp,这里我只截取了重要的init函数:// on "init" you need to initialize your instancebool HelloWorld::init(){//////////////////////////////// 1. super init firstif ( !Layer::init() ){return false;}//获取和添加场景节点auto pNode_scene = CSLoader::createNode("MainScene.csb");this->addChild(pNode_scene);//获取所有子节点m_pNodes= pNode_scene->getChildByName("Sprite_bg");//分别的到兔子和障碍节点for (auto it = m_pNodes->getChildren().begin(); it!=m_pNodes->get Children().end(); it++) {if ((*it)->getName()=="Sprite_Rabbit") {m_pNode_rabbit = (*it);}else{m_pNodes_obstacle.pushBack((*it));}}return true;}首先如果要进行Cocos Studio和Cocos2d-x的联系的话,首先要添加头文件#include "editor-support/cocostudio/CocoStudio.h"#include "ui/CocosGUI.h"然后可以使用CSLoader工具中的create方法中节点的Node* 获取.csb文件中的场景节点//获取和添加场景节点auto pNode_scene = CSLoader::createNode("MainScene.csb");this->addChild(pNode_scene);我们可以看看Cocos Studio中的节点状态树就可以理解接下来的操作,从父子关系我们可以看到:scene节点下有bg节点,而bg节点下则是其他的所有节点。
神经猫游戏使用Java开发Android应用
神经猫游戏使用Java开发Android应用神经猫(Neuro Cat)是一款受欢迎的益智游戏,它将挑战你的注意力和反应能力。
本游戏采用Java语言开发,适用于Android应用程序平台。
本文将介绍神经猫游戏以及使用Java开发Android应用的相关技术。
一、神经猫游戏简介神经猫是一款简单而有趣的游戏,玩家需要通过触摸屏幕的方式帮助猫咪躲避障碍物。
游戏的目标是尽可能多地躲避障碍物,使猫咪走得更远。
随着游戏的进行,障碍物会越来越多,速度也会逐渐加快,考验玩家的反应速度和手眼协调能力。
二、Java开发Android应用Java是一种强大且常用的编程语言,而Android应用开发通常使用Java语言作为开发工具。
以下是使用Java开发Android应用的基本步骤:1. 环境搭建:首先,开发者需要下载并安装Java开发工具包(JDK)和Android开发工具包(ADK),以便在计算机上编写和测试应用程序。
2. 创建项目:使用Android Studio(一种集成开发环境)创建一个新项目。
在项目创建过程中,用户可以选择应用程序的名称、图标等。
3. 设计界面:Android应用程序的界面通常使用XML文件进行设计。
开发者可以使用Android Studio的可视化编辑器来创建和布局界面。
4. 编写代码:使用Java语言编写应用程序的逻辑部分,包括处理用户输入、显示界面、处理游戏逻辑等。
5. 测试应用程序:使用Android模拟器或物理设备测试应用程序,确保其正常运行和响应。
6. 发布应用程序:完成开发并通过一系列的测试后,开发者可以将应用程序上传到应用市场(如Google Play)或其他渠道进行发布。
三、神经猫游戏开发过程神经猫游戏是使用Java语言开发的,下面是其主要开发过程:1. 游戏逻辑设计:首先,开发者需要设计游戏的逻辑,包括猫咪的移动方式、障碍物的生成规则等。
这些规则将在后续的代码编写中得到实现。
贪吃蛇JAVA源代码完整版
游戏贪吃蛇的JAVA源代码一.文档说明a)本代码主要功能为实现贪吃蛇游戏,GUI界面做到尽量简洁和原游戏相仿。
目前版本包含计分,统计最高分,长度自动缩短计时功能。
b)本代码受计算机系大神指点,经许可后发布如下,向Java_online网致敬c)运行时请把.java文件放入default package 即可运行。
二.运行截图a)文件位置b)进入游戏c)游戏进行中三.JAVA代码import java.awt.*;import java.awt.event.*;import static ng.String.format;import java.util.*;import java.util.List;import javax.swing.*;public class Snake extends JPanel implements Runnable { enum Dir {up(0, -1), right(1, 0), down(0, 1), left(-1, 0);Dir(int x, int y) {this.x = x; this.y = y;}final int x, y;}static final Random rand = new Random();static final int WALL = -1;static final int MAX_ENERGY = 1500;volatile boolean gameOver = true;Thread gameThread;int score, hiScore;int nRows = 44;int nCols = 64;Dir dir;int energy;int[][] grid;List<Point> snake, treats;Font smallFont;public Snake() {setPreferredSize(new Dimension(640, 440));setBackground(Color.white);setFont(new Font("SansSerif", Font.BOLD, 48));setFocusable(true);smallFont = getFont().deriveFont(Font.BOLD, 18);initGrid();addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {if (gameOver) {startNewGame();repaint();}}});addKeyListener(new KeyAdapter() {@Overridepublic void keyPressed(KeyEvent e) {switch (e.getKeyCode()) {case KeyEvent.VK_UP:if (dir != Dir.down)dir = Dir.up;break;case KeyEvent.VK_LEFT:if (dir != Dir.right)dir = Dir.left;break;case KeyEvent.VK_RIGHT:if (dir != Dir.left)dir = Dir.right;break;case KeyEvent.VK_DOWN:if (dir != Dir.up)dir = Dir.down;break;}repaint();}});}void startNewGame() {gameOver = false;stop();initGrid();treats = new LinkedList<>();dir = Dir.left;energy = MAX_ENERGY;if (score > hiScore)hiScore = score;score = 0;snake = new ArrayList<>();for (int x = 0; x < 7; x++)snake.add(new Point(nCols / 2 + x, nRows / 2));doaddTreat();while(treats.isEmpty());(gameThread = new Thread(this)).start();}void stop() {if (gameThread != null) {Thread tmp = gameThread;gameThread = null;tmp.interrupt();}}void initGrid() {grid = new int[nRows][nCols];for (int r = 0; r < nRows; r++) {for (int c = 0; c < nCols; c++) {if (c == 0 || c == nCols - 1 || r == 0 || r == nRows - 1)grid[r][c] = WALL;}}}@Overridepublic void run() {while (Thread.currentThread() == gameThread) {try {Thread.sleep(Math.max(75 - score, 25));} catch (InterruptedException e) {return;}if (energyUsed() || hitsWall() || hitsSnake()) {gameOver();} else {if (eatsTreat()) {score++;energy = MAX_ENERGY;growSnake();}moveSnake();addTreat();}repaint();}}boolean energyUsed() {energy -= 10;return energy <= 0;}boolean hitsWall() {Point head = snake.get(0);int nextCol = head.x + dir.x;int nextRow = head.y + dir.y;return grid[nextRow][nextCol] == WALL;}boolean hitsSnake() {Point head = snake.get(0);int nextCol = head.x + dir.x;int nextRow = head.y + dir.y;for (Point p : snake)if (p.x == nextCol && p.y == nextRow)return true;return false;}boolean eatsTreat() {Point head = snake.get(0);int nextCol = head.x + dir.x;int nextRow = head.y + dir.y;for (Point p : treats)if (p.x == nextCol && p.y == nextRow) {return treats.remove(p);}return false;}void gameOver() {gameOver = true;stop();}void moveSnake() {for (int i = snake.size() - 1; i > 0; i--) {Point p1 = snake.get(i - 1);Point p2 = snake.get(i);p2.x = p1.x;p2.y = p1.y;}Point head = snake.get(0);head.x += dir.x;head.y += dir.y;}void growSnake() {Point tail = snake.get(snake.size() - 1);int x = tail.x + dir.x;int y = tail.y + dir.y;snake.add(new Point(x, y));}void addTreat() {if (treats.size() < 3) {if (rand.nextInt(10) == 0) { // 1 in 10if (rand.nextInt(4) != 0) { // 3 in 4int x, y;while (true) {x = rand.nextInt(nCols);y = rand.nextInt(nRows);if (grid[y][x] != 0)continue;Point p = new Point(x, y);if (snake.contains(p) || treats.contains(p))continue;treats.add(p);break;}} else if (treats.size() > 1)treats.remove(0);}}}void drawGrid(Graphics2D g) {g.setColor(Color.lightGray);for (int r = 0; r < nRows; r++) {for (int c = 0; c < nCols; c++) {if (grid[r][c] == WALL)g.fillRect(c * 10, r * 10, 10, 10);}}}void drawSnake(Graphics2D g) {g.setColor(Color.blue);for (Point p : snake)g.fillRect(p.x * 10, p.y * 10, 10, 10);g.setColor(energy < 500 ? Color.red : Color.orange);Point head = snake.get(0);g.fillRect(head.x * 10, head.y * 10, 10, 10);}void drawTreats(Graphics2D g) {g.setColor(Color.green);for (Point p : treats)g.fillRect(p.x * 10, p.y * 10, 10, 10);}void drawStartScreen(Graphics2D g) {g.setColor(Color.blue);g.setFont(getFont());g.drawString("Snake", 240, 190);g.setColor(Color.orange);g.setFont(smallFont);g.drawString("(click to start)", 250, 240);}void drawScore(Graphics2D g) {int h = getHeight();g.setFont(smallFont);g.setColor(getForeground());String s = format("hiscore %d score %d", hiScore, score);g.drawString(s, 30, h - 30);g.drawString(format("energy %d", energy), getWidth() - 150, h - 30); }@Overridepublic void paintComponent(Graphics gg) {super.paintComponent(gg);Graphics2D g = (Graphics2D) gg;g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);drawGrid(g);if (gameOver) {drawStartScreen(g);} else {drawSnake(g);drawTreats(g);drawScore(g);}}public static void main(String[] args) {SwingUtilities.invokeLater(() -> {JFrame f = new JFrame();f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);f.setTitle("Snake");f.setResizable(false);f.add(new Snake(), BorderLayout.CENTER);f.pack();f.setLocationRelativeTo(null);f.setVisible(true);});}}。
猫咪大战争java代码
猫咪大战争java代码猫咪大战争是一款经典的回合制策略游戏,玩家需要控制自己的猫咪部队与敌方猫咪进行战斗。
下面将为你详细介绍猫咪大战争的Java代码实现。
一、游戏背景与规则猫咪大战争的背景设定在一个猫咪世界中,玩家需要扮演指挥官,带领自己的猫咪部队与敌方进行对抗。
每个玩家拥有一定数量的金币和初始单位,通过合理的策略和选择来击败对手。
1.1 游戏地图游戏地图是一个二维数组,表示游戏场景。
每个格子可以放置一个单位(包括友方和敌方),或者为空。
1.2 玩家单位玩家可以招募不同种类的猫咪作为自己的单位。
每个单位都有攻击力、生命值、移动范围等属性。
1.3 回合制机制游戏采用回合制机制,每个玩家轮流进行行动。
在每个回合中,玩家可以选择移动自己的单位或者攻击敌方单位。
1.4 胜利条件胜利条件可以是击败敌方所有单位,或者达到一定的目标点数。
二、代码实现下面是一个简化版的猫咪大战争的Java代码实现,包括游戏地图的初始化、玩家单位的创建与移动、攻击等功能。
2.1 游戏地图的初始化```javapublic class GameMap {private int[][] map;public GameMap(int width, int height) {map = new int[width][height];// 初始化地图,将所有格子设置为空for (int i = 0; i < width; i++) {for (int j = 0; j < height; j++) {map[i][j] = 0;}}}public void placeUnit(int x, int y, int playerId) { // 将指定位置的格子设置为指定玩家的单位map[x][y] = playerId;}public void removeUnit(int x, int y) {// 将指定位置的格子设置为空map[x][y] = 0;}public boolean isOccupied(int x, int y) {// 判断指定位置是否有单位return map[x][y] != 0;}}```2.2 玩家单位的创建与移动```javapublic class Unit {private String name;private int attack;private int hp;private int moveRange;public Unit(String name, int attack, int hp, int moveRange) { = name;this.attack = attack;this.hp = hp;this.moveRange = moveRange;}public void move(int x, int y) {// 移动单位到指定位置}public void attack(Unit target) {// 攻击目标单位}public boolean isAlive() {// 判断单位是否存活return hp > 0;}}```2.3 游戏逻辑与回合制机制```javapublic class Game {private GameMap map;private List<Unit> player1Units;private List<Unit> player2Units;public Game(int width, int height) {map = new GameMap(width, height);player1Units = new ArrayList<>();player2Units = new ArrayList<>();// 初始化玩家单位,将它们放置在地图上的指定位置 Unit unit1 = new Unit("Cat1", 10, 100, 2);Unit unit2 = new Unit("Cat2", 20, 200, 1);player1Units.add(unit1);player1Units.add(unit2);map.placeUnit(0, 0, 1);map.placeUnit(1, 0, 1);Unit unit3 = new Unit("EnemyCat", 15, 150, 3); player2Units.add(unit3);map.placeUnit(4, 4, -1); // -1 表示敌方单位}public void play() {int currentPlayerId = 1; // 当前玩家的IDwhile (!isGameOver()) {// 获取当前玩家的单位列表List<Unit> currentUnits = currentPlayerId == 1 ? player1Units : player2Units;for (Unit unit : currentUnits) {if (unit.isAlive()) {// 单位可以移动和攻击unit.move(1, 0); // 假设单位向右移动一格Unit target = findTarget(unit); // 查找攻击目标unit.attack(target);}}currentPlayerId = currentPlayerId == 1 ? -1 : 1; // 切换到下一个玩家}// 游戏结束,输出胜利者信息System.out.println("Game Over! Player " + (currentPlayerId == 1 ? "1" : "2") + " wins!");}private boolean isGameOver() {// 判断游戏是否结束return player1Units.isEmpty() || player2Units.isEmpty();}private Unit findTarget(Unit attacker) {// 查找攻击目标,根据游戏规则进行选择return null;}}```三、总结与展望以上是一个简单的猫咪大战争的Java代码实现,包括游戏地图的初始化、玩家单位的创建与移动、攻击等功能。
cocos引擎—类神经猫三消游戏:让兔子知道怎么走
cocos引擎—类神经猫三消游戏《Rabbit Escape》04:让兔子知道怎么走(寻路算法的实现)本文检索关键词:游戏引擎,游戏开发引擎,cocos引擎html5游戏开发CocoaChina论坛2015-02-28 11:00:591187 次阅读一、前言上一篇文章中我们创建游戏逻辑层,并且让它和UI层联系,让兔子能够实现移动。
但是实现的移动都是简单的向上方向,这次的话我们要让兔子变“聪明”起来,让它能够沿着正确的方向来进行移动。
(这次教程可能会长一点,因为涉及算法的讲解,童鞋们耐心的看下吧~~)。
二、A*算法的介绍和寻路算法的设计这里的话首先我们会用到游戏中经常用到的AI寻路算法的设计。
实现AI的自动寻路,其实方法有很多,最无脑的就是暴力的搜索,但是实际中考虑到硬件条件和时间的复杂度应用的很少。
这里使用的比较多的一种叫做A*的算法,A*算法其实一种对于经典的最短路径算法Dijkstra算法的一种改良和优化(如果不是很了解最短路径算法的童鞋可以搜索下相关资料来了解下),而对于A*算法,这里如果不了解的童鞋务必请先看下这篇文章(我觉得介绍的很通俗易懂)。
ok,如果你对A*算法有了了解,接下来我说下的这个寻路算法设计的基本思路吧,简而言之说的话就是,“兔子没被围住的时候,采用A*算法寻路;兔子被围住的时候,采用最大通路算法”。
详细介绍一下,首先我们需重新的修改一下我们Pos结构体,加入相关和A*寻路中需要的属性值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30//地图位置struct Pos{//cost代价int cost;//距离目标位置的的估计值 int hEstimate;//A*中的F值int fVal;//是否是障碍;bool isObt;//位置信息Vec vec;Pos(){vec.ver = 0;vec.hor = 0;isObt = false;cost = 0;hEstimate = 0;fVal = VAL_MAX;}Pos(int_ver,int_hor){ vec.ver = _ver;vec.hor = _hor;isObt = false;cost = 0;hEstimate = 0;fVal = VAL_MAX; }};如果你真的理解了之前那个外国基佬帖子的话,这些属性值应该都知道意思了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MainActivitypackage com.jikexueyuan.catchcrazycat;import android.app.Activity;import android.os.Bundle;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//setContentView(yout.activity_main);setContentView(new Playground(this));//Context把MainActivity的this传递进去}}Dotpackage com.jikexueyuan.catchcrazycat;public class Dot {//记录每个场景中的元素它的X,Y坐标点的状态。
并不会直接参与界面的响应和界面的绘制int x,y;//当前点的X,Y坐标int status;//记录这个点的状态//三个表征圆点状态静态常量public static final int STATUS_ON = 1;//已经开启路障的状态public static final int STATUS_OFF = 0;//代表灰色可走路径public static final int STATUS_IN = 9;//猫当前的位置//三个数字不同即可,具体用哪个数字无所谓//指定X,Y坐标public Dot(int x, int y) {super();this.x = x;this.y = y;status = STA TUS_OFF;//当前状态为STA TUS_OFF}//指定geter和sette方法public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public int getStatus() {return status;}public void setStatus(int status) {this.status = status;}//同时设置X,Y坐标的方法public void setXY(int x,int y) {this.y = y;this.x = x;}}/*每一个点都是一个抽象的对象,需要把每一个点抽象为一个类,然后让每一个圆圈继承于这个类,或者直接把它实现为这个类的实例。
每个点有三个状态:灰色-猫可走的路径;红色-路障且状态无法改变;黄色-猫当前的位置。
*/Playgroundpackage com.jikexueyuan.catchcrazycat;import java.util.HashMap;import java.util.HashSet;import java.util.Map;import java.util.Vector;import android.R.integer;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.view.MotionEvent;import android.view.SurfaceHolder;import android.view.SurfaceHolder.Callback;import android.view.SurfaceView;import android.view.View;import android.view.View.OnTouchListener;import android.widget.Toast;public class Playground extends SurfaceView implements OnTouchListener{//界面的响应和界面的绘制在SurfaceView完成,触摸事件的响应通过OnTouchListener 接口实现private static int WIDTH = 40;//元素的private static final int ROW = 10;//行高:每行储存10个元素private static final int COL = 10;//列宽:每列储存10个元素private static final int BLOCKS = 15;//默认添加的路障数量private Dot matrix[][];//声明二维数组来存放点元素private Dot cat;//声明猫这个点public Playground(Context context) {super(context);//使用Context创建当前类构造函数getHolder().addCallback(callback);//将Callback对象指定给getholdermatrix = new Dot[ROW][COL];//将行高,列宽传递进去,指定数组大小for (int i = 0; i < ROW; i++) {//循环添加数据for (int j = 0; j < COL; j++) {matrix[i][j] = new Dot(j, i);/*X,Y坐标值和行列值是相反的。
即通过查找列值获得X坐标,查找行值获得Y坐标*/}}setOnTouchListener(this);//设定为自己的触摸监听器initGame();//调用游戏初始化}//坐标反转:封装一个getDot函数实现X,Y坐标反过来传递,所有的操作通过X,Y 调用private Dot getDot(int x,int y) {return matrix[y][x];}//判断猫是否处于边界private boolean isAtEdge(Dot d) {if (d.getX()*d.getY() == 0 || d.getX()+1 == COL || d.getY()+1 == ROW) {return true;//当前点的坐标无论是x或y为0,或x或y值是定义的游戏场景最大值时都处于边界}return false;}//为每个点实现获取相邻点的方法private Dot getNeighbour(Dot one,int dir) {//每个点都有6个相邻点switch (dir) {case 1:return getDot(one.getX()-1, one.getY());//获得中心点左边相邻点case 2:if (one.getY()%2 == 0) {return getDot(one.getX()-1, one.getY()-1);//奇数行获得中心点左上相邻点:x-1,y-1}else {return getDot(one.getX(), one.getY()-1);//偶数行获得中心点左上相邻点:y-1}case 3:if (one.getY()%2 == 0) {return getDot(one.getX(), one.getY()-1);//奇数行获得中心点右上相邻点:y-1}else {return getDot(one.getX()+1, one.getY()-1);//偶数行获得中心点右上相邻点:x+1,y-1}case 4:return getDot(one.getX()+1, one.getY());//获得中心点右边相邻点case 5:if (one.getY()%2 == 0) {return getDot(one.getX(), one.getY()+1);//奇数行获得中心点右下相邻点:y+1}else {return getDot(one.getX()+1, one.getY()+1);//偶数行获得中心点右下相邻点:x+1,y+1}case 6:if (one.getY()%2 == 0) {return getDot(one.getX()-1, one.getY()+1);//奇数行获得中心点左下相邻点:x-1,y+1}else {return getDot(one.getX(), one.getY()+1);//偶数行获得中心点左下相邻点:y+1}default:break;}return null;}//中心点6个方向距离的判断与获取。
路径结束点为路障用负数表示,为场景边缘用正数表示private int getDistance(Dot one,int dir) {// System.out.println("X:"+one.getX()+" Y:"+one.getY()+" Dir:"+dir);int distance = 0;if (isAtEdge(one)) {return 1;//如果下一个点已在屏幕边缘,无需再判断}Dot ori = one,next;//定义ori和next,ori指定为当前函数传入的onewhile(true){next = getNeighbour(ori, dir);if (next.getStatus() == Dot.STATUS_ON) {return distance*-1;//下一个点为路障的话,直接返回距离0}if (isAtEdge(next)) {distance++;return distance;//下一个点为场景边缘时,距离+1并返回}distance++;ori = next;//下一个点既不是路障也不是场景边缘,距离自加并把当前的下一个点赋值成参考点ori}}//实现猫移动到下一个点private void MoveTo(Dot one) {one.setStatus(Dot.STA TUS_IN);//one的状态设置为猫所处的点getDot(cat.getX(), cat.getY()).setStatus(Dot.STATUS_OFF);;//将猫当前点的状态复位cat.setXY(one.getX(), one.getY());//将猫移动到新的点}//猫的移动private void move() {if (isAtEdge(cat)) {lose();return;//猫处于游戏边缘,失败}Vector<Dot> avaliable = new Vector<>();//avaliable容器记录可用点Vector<Dot> positive = new Vector<>();//positive容器记录这个方向上可以直接到达屏幕边缘的路径HashMap<Dot, Integer> al = new HashMap<Dot, Integer>();//pl容器记录方向for (int i = 1; i < 7; i++) {//如果当前猫被6个邻点围住Dot n = getNeighbour(cat, i);if (n.getStatus() == Dot.STA TUS_OFF) {avaliable.add(n);//如果相邻点可用,把它添加到avaliable记录器中al.put(n, i);//为pl传入方向iif (getDistance(n, i) > 0) {positive.add(n);//当它有一个路径可以直接到达屏幕边缘,把n传递进positive中}}}//移动算法的优化if (avaliable.size() == 0) {win();//周围的6个点都不可走,没有可用点,成功围住猫}else if (avaliable.size() == 1) {MoveTo(avaliable.get(0));//只有一个方向可走,可用点有一个,移动到这个可用点上}else{//有多个方向可走Dot best = null;if (positive.size() != 0 ) {//存在可以直接到达屏幕边缘的走向System.out.println("向前进");int min = 999;//999远大于场景中的所有可用步长,其他数也可for (int i = 0; i < positive.size(); i++) {int a = getDistance(positive.get(i), al.get(positive.get(i)));if (a < min) {min = a;//把最短路径长度传给minbest = positive.get(i);//选出拥有最短路径的点}}}else {//所有方向都存在路障System.out.println("躲路障");int max = 0;for (int i = 0; i < avaliable.size(); i++) {int k = getDistance(avaliable.get(i), al.get(avaliable.get(i)));if (k <= max) {//所有方向都存在路障,距离k为负数max = k;best = avaliable.get(i);//选出拥有最短路径的点}}}MoveTo(best);//移动到最短路径的下一点}}private void lose() {Toast.makeText(getContext(), "Lose", Toast.LENGTH_SHORT).show();//失败提示}private void win() {Toast.makeText(getContext(), "You Win!", Toast.LENGTH_SHORT).show();//成功提示}//实现界面绘制,在redraw方法中将所有元素以图形化显示出来,也就是将它绘制在Canvas对象上private void redraw() {Canvas c = getHolder().lockCanvas();//锁定画布c.drawColor(Color.LTGRAY);//设置颜色为浅灰色Paint paint = new Paint();//创建Paint对象paint.setFlags(Paint.ANTI_ALIAS_FLAG);//开启抗锯齿,优化视频质量//用两个For循环嵌套将所有的点显示到界面中来for (int i = 0; i < ROW; i++) {int offset = 0;//引入偏移量if (i%2 != 0) {offset = WIDTH/2;//对偶数行进行缩进}for (int j = 0; j < COL; j++) {Dot one = getDot(j, i);//将坐标赋值给内部变量one//由于每个点对应的三种状态颜色不一样,要用一个switch语句switch (one.getStatus()) {case Dot.STATUS_OFF:paint.setColor(0xFFEEEEEE);//STATUS_OFF状态时设置颜色为浅灰色break;case Dot.STATUS_ON:paint.setColor(0xFFFFAA00);//STATUS_ON状态时设置颜色为橙色break;case Dot.STATUS_IN:paint.setColor(0xFFFF0000);//STATUS_IN状态时设置颜色为红色break;default:break;}c.drawOval(new RectF(one.getX()*WIDTH+offset, one.getY()*WIDTH,(one.getX()+1)*WIDTH+offset, (one.getY()+1)*WIDTH), paint);/*在Canvas画布上画椭圆并界定它的上下左右边界宽度且有错位*/}}getHolder().unlockCanvasAndPost(c);//取消Canvas的锁定,吧绘图内容更新到界面上}//为Surfaceview添加CallbackCallback callback = new Callback() {//声明并实例化一个Callback接口@Overridepublic void surfaceDestroyed(SurfaceHolder arg0) {// TODO Auto-generated method stub}@Overridepublic void surfaceCreated(SurfaceHolder arg0) {// TODO Auto-generated method stubredraw();//执行redraw函数,在界面第一次显示时将指定的内容显示到界面上}@Override//使用surfaceChanged方法来适配不同的屏幕尺寸public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {//surfacechanged方法包含四个参数:SurfaceHolder holder,int format,int width,int height// TODO Auto-generated method stubWIDTH = arg2/(COL+1);//需要修改width,即arg2。