貪吃蛇大作戰(zhàn)代碼java 貪吃蛇大作戰(zhàn)c#

破解“貪吃蛇大作戰(zhàn)”的簽名信息服務(wù)端驗證機(jī)制

Android安全交流群:478084054

創(chuàng)新互聯(lián)是專業(yè)的錦屏網(wǎng)站建設(shè)公司,錦屏接單;提供網(wǎng)站設(shè)計、成都網(wǎng)站制作,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行錦屏網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊,希望更多企業(yè)前來合作!

第一次嘗試做一些簡單的逆向分析,內(nèi)容比較簡單,高手們莫見笑。

“貪吃蛇大作戰(zhàn)”這個游戲最近玩的人挺多,我也在玩。5分鐘限時版,最好成績也就3000多。

我分析的版本是v2.0.1:

經(jīng)過修改,玩了一把5分鐘限時賽:長度69224,擊殺1456。

將原包重新簽名,安裝到手機(jī)上,一直提示網(wǎng)絡(luò)無法連接,原包沒有問題。這里很明顯是將簽名信息上傳到了服務(wù)器端,在服務(wù)器端進(jìn)行了簽名校驗,校驗失敗則斷開與此客戶端的連接。

寫一個小程序進(jìn)行注入(利用ptrace),對一些關(guān)鍵函數(shù)進(jìn)行hook,比如libc.so的fopen函數(shù)。

在hook_entry中,對libc.so的fopen作inline hook,監(jiān)測一下程序都打開了哪些文件。

我本意是想看看,它是否會在運行時直接去讀取apk包,自己解析其中的與簽名信息相關(guān)的文件。結(jié)果是沒有,但發(fā)現(xiàn)它一直在讀cmdline文件,猜測可能是在作反調(diào)試(未去證實,因為后面的分析和修改并未借助動態(tài)調(diào)試)。

這里說一下,假設(shè)它是自己打開apk文件,從中讀取與簽名相關(guān)的文件,提取簽名信息。那么我們可以在某個位置放一個原包,然后hook關(guān)鍵函數(shù),將其讀取的文件路徑修改為原包位置,即可繞過這種簽名校驗。

舉一反三,這種方式也可以繞過大部分反調(diào)試措施。比如常見的檢測traceid是否非0的反調(diào)方式,我們可以hook fopen/open,然后在它要讀取該文件之前先讀取該文件,并將其traceid重新修改為0,并將其寫到sd卡某個目錄下,再將打開文件的位置重定向到該文件,那它就檢測不到ptrace了。

還有一些anti-hook機(jī)制,大概思路是校驗本地文件的數(shù)據(jù)和加載到內(nèi)存中的數(shù)據(jù)是否一致。通過類似方式也可以輕松繞過,一句話,因為我們可以先注入,先完成hook,先做各種Anti-anti。

因為它沒有在運行時直接fopen/open apk文件,所以考慮應(yīng)該還是通過調(diào)用系統(tǒng)api讀取的簽名信息。

將原包解壓,發(fā)現(xiàn)只有兩個so,其中l(wèi)ibweibosdkcore.so看起來是微博sdk。將另一個libJustATest.so拖到IDA中看一下,沒加殼,并且只看到xxx_getATestString這么一個有用的導(dǎo)出函數(shù),從名字上看,很可能就是獲取上傳到服務(wù)器端的校驗字符串。

跳轉(zhuǎn)到該方法,f5,進(jìn)行一些簡單的參數(shù)名和參數(shù)類型以及函數(shù)調(diào)用的修正。發(fā)現(xiàn)它里面進(jìn)行了一大通的各種字符串的拼接,最后將該字符串返回(根據(jù)之前的猜測,該字符串可能就是發(fā)送給服務(wù)端的校驗字符串)。

發(fā)現(xiàn)里面調(diào)用了java層com.wepie.snake.helper.update.QiniuEtagUtil類的getSignString函數(shù)。用AndroidKiller反編譯一下APK包(該APK沒有作任何防反編譯的措施,dex也沒加殼),找到getSignString函數(shù)。

沒錯,就是在這里調(diào)用系統(tǒng)API獲取的簽名(其實,我們可以一開始就全局搜索某些關(guān)鍵API,來定位獲取簽名的位置)。

借助xposed hook getSignString方法,將正確的簽名字符串通過日志打印出來。

正確的簽名字符串是(作了MD5計算后的結(jié)果):678a930b9829b54a44f92a840916f7d1

剩下的工作就簡單了,修改smali,將getSignString的返回結(jié)果固定為上面的這個正確的簽名字符串。

重新編譯、打包、簽名、安裝,發(fā)現(xiàn)用新簽名的APK包已經(jīng)可以正常使用了。

其實破解簽名校驗之后,基本上是想改什么改什么了,因為原包沒有做任何的加殼和混淆的工作。比如,看看下面這個類,應(yīng)該知道怎么下手了吧(修改的時候注意一下,它里面好像有一些簡單的數(shù)據(jù)合理性校驗之類的東西,我沒細(xì)看)。

最后,大家學(xué)習(xí)就好,別做什么破壞,也別釋放出什么破解版之類的東西。初次嘗試一點簡單的逆向分析,大牛們繞過吧。

附:我認(rèn)為現(xiàn)在so端最有用的加固措施是llvm混淆,因為普通加解密殼從機(jī)制上來說比較容易脫掉。dex端已經(jīng)出現(xiàn)了解釋器殼(偽vmp),純粹的類抽取的話,通過自定義rom(定制dalvik或art,遍歷class_def加載并初始化,然后dump…)也可以脫掉大部分的。

貪吃蛇大作戰(zhàn)的兌換碼

第一步:在微信中,搜索貪吃蛇的官方微信公眾號:貪吃蛇大作戰(zhàn)。

第二步:點擊進(jìn)入公眾號,就可看到一條信息,在信息的最下方就有50金幣的兌換碼獲取說明;

第三步:在公眾號中輸入“兌換碼”,就會收到一條兌換碼的資訊,注意目前關(guān)注微信公眾號得金幣的活動只限于安卓用戶,蘋果用戶沒有。

貪吃蛇大作戰(zhàn)》是武漢微派網(wǎng)絡(luò)科技有限公司研發(fā)的一款休閑競技類手游,2016年6月8日上線。在《貪吃蛇大作戰(zhàn)》的世界中,每個人在初始都化身為一條小蛇,通過不斷努力變得越來越長,最終制霸一方的。

《貪吃蛇大作戰(zhàn)》共有7個段位,分別是青銅、白銀、黃金、白金、鉆石、宗師、王者,每個賽季達(dá)到一個段位,就根據(jù)段位獎勵一定的金幣,而且還有段位專屬的皮膚。

求一段JAVA編寫的貪吃蛇小程序源代碼

用MVC方式實現(xiàn)的貪吃蛇游戲,共有4個類。運行GreedSnake運行即可。主要是觀察者模式的使用,我已經(jīng)添加了很多注釋了。

1、

/*

* 程序名稱:貪食蛇

* 原作者:BigF

* 修改者:algo

* 說明:我以前也用C寫過這個程序,現(xiàn)在看到BigF用Java寫的這個,發(fā)現(xiàn)雖然作者自稱是Java的初學(xué)者,

* 但是明顯編寫程序的素養(yǎng)不錯,程序結(jié)構(gòu)寫得很清晰,有些細(xì)微得地方也寫得很簡潔,一時興起之

* 下,我認(rèn)真解讀了這個程序,發(fā)現(xiàn)數(shù)據(jù)和表現(xiàn)分開得很好,而我近日正在學(xué)習(xí)MVC設(shè)計模式,

* 因此嘗試把程序得結(jié)構(gòu)改了一下,用MVC模式來實現(xiàn),對源程序得改動不多。

* 我同時也為程序增加了一些自己理解得注釋,希望對大家閱讀有幫助。

*/

package mvcTest;

/**

* @author WangYu

* @version 1.0

* Description:

* /pre

* Create on :Date :2005-6-13 Time:15:57:16

* LastModified:

* History:

*/

public class GreedSnake {

public static void main(String[] args) {

SnakeModel model = new SnakeModel(20,30);

SnakeControl control = new SnakeControl(model);

SnakeView view = new SnakeView(model,control);

//添加一個觀察者,讓view成為model的觀察者

model.addObserver(view);

(new Thread(model)).start();

}

}

-------------------------------------------------------------

2、

package mvcTest;

//SnakeControl.java

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

/**

* MVC中的Controler,負(fù)責(zé)接收用戶的操作,并把用戶操作通知Model

*/

public class SnakeControl implements KeyListener{

SnakeModel model;

public SnakeControl(SnakeModel model){

this.model = model;

}

public void keyPressed(KeyEvent e) {

int keyCode = e.getKeyCode();

if (model.running){ // 運行狀態(tài)下,處理的按鍵

switch (keyCode) {

case KeyEvent.VK_UP:

model.changeDirection(SnakeModel.UP);

break;

case KeyEvent.VK_DOWN:

model.changeDirection(SnakeModel.DOWN);

break;

case KeyEvent.VK_LEFT:

model.changeDirection(SnakeModel.LEFT);

break;

case KeyEvent.VK_RIGHT:

model.changeDirection(SnakeModel.RIGHT);

break;

case KeyEvent.VK_ADD:

case KeyEvent.VK_PAGE_UP:

model.speedUp();

break;

case KeyEvent.VK_SUBTRACT:

case KeyEvent.VK_PAGE_DOWN:

model.speedDown();

break;

case KeyEvent.VK_SPACE:

case KeyEvent.VK_P:

model.changePauseState();

break;

default:

}

}

// 任何情況下處理的按鍵,按鍵導(dǎo)致重新啟動游戲

if (keyCode == KeyEvent.VK_R ||

keyCode == KeyEvent.VK_S ||

keyCode == KeyEvent.VK_ENTER) {

model.reset();

}

}

public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

}

}

-------------------------------------------------------------

3、

/*

*

*/

package mvcTest;

/**

* 游戲的Model類,負(fù)責(zé)所有游戲相關(guān)數(shù)據(jù)及運行

* @author WangYu

* @version 1.0

* Description:

* /pre

* Create on :Date :2005-6-13 Time:15:58:33

* LastModified:

* History:

*/

//SnakeModel.java

import javax.swing.*;

import java.util.Arrays;

import java.util.LinkedList;

import java.util.Observable;

import java.util.Random;

/**

* 游戲的Model類,負(fù)責(zé)所有游戲相關(guān)數(shù)據(jù)及運行

*/

class SnakeModel extends Observable implements Runnable {

boolean[][] matrix; // 指示位置上有沒蛇體或食物

LinkedList nodeArray = new LinkedList(); // 蛇體

Node food;

int maxX;

int maxY;

int direction = 2; // 蛇運行的方向

boolean running = false; // 運行狀態(tài)

int timeInterval = 200; // 時間間隔,毫秒

double speedChangeRate = 0.75; // 每次得速度變化率

boolean paused = false; // 暫停標(biāo)志

int score = 0; // 得分

int countMove = 0; // 吃到食物前移動的次數(shù)

// UP and DOWN should be even

// RIGHT and LEFT should be odd

public static final int UP = 2;

public static final int DOWN = 4;

public static final int LEFT = 1;

public static final int RIGHT = 3;

public SnakeModel( int maxX, int maxY) {

this.maxX = maxX;

this.maxY = maxY;

reset();

}

public void reset(){

direction = SnakeModel.UP; // 蛇運行的方向

timeInterval = 200; // 時間間隔,毫秒

paused = false; // 暫停標(biāo)志

score = 0; // 得分

countMove = 0; // 吃到食物前移動的次數(shù)

// initial matirx, 全部清0

matrix = new boolean[maxX][];

for (int i = 0; i maxX; ++i) {

matrix[i] = new boolean[maxY];

Arrays.fill(matrix[i], false);

}

// initial the snake

// 初始化蛇體,如果橫向位置超過20個,長度為10,否則為橫向位置的一半

int initArrayLength = maxX 20 ? 10 : maxX / 2;

nodeArray.clear();

for (int i = 0; i initArrayLength; ++i) {

int x = maxX / 2 + i;//maxX被初始化為20

int y = maxY / 2; //maxY被初始化為30

//nodeArray[x,y]: [10,15]-[11,15]-[12,15]~~[20,15]

//默認(rèn)的運行方向向上,所以游戲一開始nodeArray就變?yōu)椋?/p>

// [10,14]-[10,15]-[11,15]-[12,15]~~[19,15]

nodeArray.addLast(new Node(x, y));

matrix[x][y] = true;

}

// 創(chuàng)建食物

food = createFood();

matrix[food.x][food.y] = true;

}

public void changeDirection(int newDirection) {

// 改變的方向不能與原來方向同向或反向

if (direction % 2 != newDirection % 2) {

direction = newDirection;

}

}

/**

* 運行一次

* @return

*/

public boolean moveOn() {

Node n = (Node) nodeArray.getFirst();

int x = n.x;

int y = n.y;

// 根據(jù)方向增減坐標(biāo)值

switch (direction) {

case UP:

y--;

break;

case DOWN:

y++;

break;

case LEFT:

x--;

break;

case RIGHT:

x++;

break;

}

// 如果新坐標(biāo)落在有效范圍內(nèi),則進(jìn)行處理

if ((0 = x x maxX) (0 = y y maxY)) {

if (matrix[x][y]) { // 如果新坐標(biāo)的點上有東西(蛇體或者食物)

if (x == food.x y == food.y) { // 吃到食物,成功

nodeArray.addFirst(food); // 從蛇頭贈長

// 分?jǐn)?shù)規(guī)則,與移動改變方向的次數(shù)和速度兩個元素有關(guān)

int scoreGet = (10000 - 200 * countMove) / timeInterval;

score += scoreGet 0 ? scoreGet : 10;

countMove = 0;

food = createFood(); // 創(chuàng)建新的食物

matrix[food.x][food.y] = true; // 設(shè)置食物所在位置

return true;

} else // 吃到蛇體自身,失敗

return false;

} else { // 如果新坐標(biāo)的點上沒有東西(蛇體),移動蛇體

nodeArray.addFirst(new Node(x, y));

matrix[x][y] = true;

n = (Node) nodeArray.removeLast();

matrix[n.x][n.y] = false;

countMove++;

return true;

}

}

return false; // 觸到邊線,失敗

}

public void run() {

running = true;

while (running) {

try {

Thread.sleep(timeInterval);

} catch (Exception e) {

break;

}

if (!paused) {

if (moveOn()) {

setChanged(); // Model通知View數(shù)據(jù)已經(jīng)更新

notifyObservers();

} else {

JOptionPane.showMessageDialog(null,

"you failed",

"Game Over",

JOptionPane.INFORMATION_MESSAGE);

break;

}

}

}

running = false;

}

private Node createFood() {

int x = 0;

int y = 0;

// 隨機(jī)獲取一個有效區(qū)域內(nèi)的與蛇體和食物不重疊的位置

do {

Random r = new Random();

x = r.nextInt(maxX);

y = r.nextInt(maxY);

} while (matrix[x][y]);

return new Node(x, y);

}

public void speedUp() {

timeInterval *= speedChangeRate;

}

public void speedDown() {

timeInterval /= speedChangeRate;

}

public void changePauseState() {

paused = !paused;

}

public String toString() {

String result = "";

for (int i = 0; i nodeArray.size(); ++i) {

Node n = (Node) nodeArray.get(i);

result += "[" + n.x + "," + n.y + "]";

}

return result;

}

}

class Node {

int x;

int y;

Node(int x, int y) {

this.x = x;

this.y = y;

}

}

------------------------------------------------------------

4、

package mvcTest;

//SnakeView.java

import javax.swing.*;

import java.awt.*;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.Observable;

import java.util.Observer;

/**

* MVC模式中得Viewer,只負(fù)責(zé)對數(shù)據(jù)的顯示,而不用理會游戲的控制邏輯

*/

public class SnakeView implements Observer {

SnakeControl control = null;

SnakeModel model = null;

JFrame mainFrame;

Canvas paintCanvas;

JLabel labelScore;

public static final int canvasWidth = 200;

public static final int canvasHeight = 300;

public static final int nodeWidth = 10;

public static final int nodeHeight = 10;

public SnakeView(SnakeModel model, SnakeControl control) {

this.model = model;

this.control = control;

mainFrame = new JFrame("GreedSnake");

Container cp = mainFrame.getContentPane();

// 創(chuàng)建頂部的分?jǐn)?shù)顯示

labelScore = new JLabel("Score:");

cp.add(labelScore, BorderLayout.NORTH);

// 創(chuàng)建中間的游戲顯示區(qū)域

paintCanvas = new Canvas();

paintCanvas.setSize(canvasWidth + 1, canvasHeight + 1);

paintCanvas.addKeyListener(control);

cp.add(paintCanvas, BorderLayout.CENTER);

// 創(chuàng)建底下的幫助欄

JPanel panelButtom = new JPanel();

panelButtom.setLayout(new BorderLayout());

JLabel labelHelp;

labelHelp = new JLabel("PageUp, PageDown for speed;", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.NORTH);

labelHelp = new JLabel("ENTER or R or S for start;", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.CENTER);

labelHelp = new JLabel("SPACE or P for pause", JLabel.CENTER);

panelButtom.add(labelHelp, BorderLayout.SOUTH);

cp.add(panelButtom, BorderLayout.SOUTH);

mainFrame.addKeyListener(control);

mainFrame.pack();

mainFrame.setResizable(false);

mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

mainFrame.setVisible(true);

}

void repaint() {

Graphics g = paintCanvas.getGraphics();

//draw background

g.setColor(Color.WHITE);

g.fillRect(0, 0, canvasWidth, canvasHeight);

// draw the snake

g.setColor(Color.BLACK);

LinkedList na = model.nodeArray;

Iterator it = na.iterator();

while (it.hasNext()) {

Node n = (Node) it.next();

drawNode(g, n);

}

// draw the food

g.setColor(Color.RED);

Node n = model.food;

drawNode(g, n);

updateScore();

}

private void drawNode(Graphics g, Node n) {

g.fillRect(n.x * nodeWidth,

n.y * nodeHeight,

nodeWidth - 1,

nodeHeight - 1);

}

public void updateScore() {

String s = "Score: " + model.score;

labelScore.setText(s);

}

public void update(Observable o, Object arg) {

repaint();

}

}

希望采納

java貪吃蛇代碼注釋求解

import java.awt.Color;

import java.awt.Graphics;

import java.awt.Graphics2D;

import java.awt.Rectangle;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.awt.image.BufferedImage;

import java.util.ArrayList;

import java.util.List;

import javax.swing.JFrame;

public class InterFace extends JFrame {

/**

* WIDTH:寬

* HEIGHT:高

* SLEEPTIME:可以看作蛇運動的速度

* L = 1,R = 2, U = 3, D = 4 左右上下代碼

*/

public static final int WIDTH = 800, HEIGHT = 600, SLEEPTIME = 200, L = 1,R = 2, U = 3, D = 4;

BufferedImage offersetImage= new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_3BYTE_BGR);;

Rectangle rect = new Rectangle(20, 40, 15 * 50, 15 * 35);

Snake snake;

Node node;

public InterFace() {

//創(chuàng)建"蛇"對象

snake = new Snake(this);

//創(chuàng)建"食物"對象

createNode();

this.setBounds(100, 100, WIDTH, HEIGHT);

//添加鍵盤監(jiān)聽器

this.addKeyListener(new KeyAdapter() {

public void keyPressed(KeyEvent arg0) {

System.out.println(arg0.getKeyCode());

switch (arg0.getKeyCode()) {

//映射上下左右4個鍵位

case KeyEvent.VK_LEFT:

snake.dir = L;

break;

case KeyEvent.VK_RIGHT:

snake.dir = R;

break;

case KeyEvent.VK_UP:

snake.dir = U;

break;

case KeyEvent.VK_DOWN:

snake.dir = D;

}

}

});

this.setTitle("貪吃蛇 0.1 By : Easy");

this.setDefaultCloseOperation(EXIT_ON_CLOSE);

this.setVisible(true);

//啟動線程,開始執(zhí)行

new Thread(new ThreadUpadte()).start();

}

public void paint(Graphics g) {

Graphics2D g2d = (Graphics2D) offersetImage.getGraphics();

g2d.setColor(Color.white);

g2d.fillRect(0, 0, WIDTH, HEIGHT);

g2d.setColor(Color.black);

g2d.drawRect(rect.x, rect.y, rect.width, rect.height);

//如果蛇碰撞(吃)到食物,則創(chuàng)建新食物

if (snake.hit(node)) {

createNode();

}

snake.draw(g2d);

node.draw(g2d);

g.drawImage(offersetImage, 0, 0, null);

}

class ThreadUpadte implements Runnable {

public void run() {

//無限重繪畫面

while (true) {

try {

Thread.sleep(SLEEPTIME);

repaint(); //

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

}

/**

* 創(chuàng)建食物

*/

public void createNode() {

//隨機(jī)食物的出現(xiàn)位置

int x = (int) (Math.random() * 650) + 50,y = (int) (Math.random() * 500) + 50;

Color color = Color.blue;

node = new Node(x, y, color);

}

public static void main(String args[]) {

new InterFace();

}

}

/**

* 節(jié)點類(包括食物和蛇的身軀組成節(jié)點)

*/

class Node {

int x, y, width = 15, height = 15;

Color color;

public Node(int x, int y, Color color) {

this(x, y);

this.color = color;

}

public Node(int x, int y) {

this.x = x;

this.y = y;

this.color = color.black;

}

public void draw(Graphics2D g2d) {

g2d.setColor(color);

g2d.drawRect(x, y, width, height);

}

public Rectangle getRect() {

return new Rectangle(x, y, width, height);

}

}

/**

* 蛇

*/

class Snake {

public ListNode nodes = new ArrayListNode();

InterFace interFace;

int dir=InterFace.R;

public Snake(InterFace interFace) {

this.interFace = interFace;

nodes.add(new Node(20 + 150, 40 + 150));

addNode();

}

/**

* 是否碰撞到食物

* @return true 是 false 否

*/

public boolean hit(Node node) {

//遍歷整個蛇體是否與食物碰撞

for (int i = 0; i nodes.size(); i++) {

if (nodes.get(i).getRect().intersects(node.getRect())) {

addNode();

return true;

}

}

return false;

}

public void draw(Graphics2D g2d) {

for (int i = 0; i nodes.size(); i++) {

nodes.get(i).draw(g2d);

}

move();

}

public void move() {

nodes.remove((nodes.size() - 1));

addNode();

}

public synchronized void addNode() {

Node nodeTempNode = nodes.get(0);

//如果方向

switch (dir) {

case InterFace.L:

//判斷是否會撞墻

if (nodeTempNode.x = 20) {

nodeTempNode = new Node(20 + 15 * 50, nodeTempNode.y);

}

nodes.add(0, new Node(nodeTempNode.x - nodeTempNode.width,

nodeTempNode.y));

break;

case InterFace.R:

//判斷是否會撞墻

if (nodeTempNode.x = 20 + 15 * 50 - nodeTempNode.width) {

nodeTempNode = new Node(20 - nodeTempNode.width, nodeTempNode.y);

}

nodes.add(0, new Node(nodeTempNode.x + nodeTempNode.width,

nodeTempNode.y));

break;

case InterFace.U:

//判斷是否會撞墻

if (nodeTempNode.y = 40) {

nodeTempNode = new Node(nodeTempNode.x, 40 + 15 * 35);

}

nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y - nodeTempNode.height));

break;

case InterFace.D:

//判斷是否會撞墻

if (nodeTempNode.y = 40 + 15 * 35 - nodeTempNode.height) {

nodeTempNode = new Node(nodeTempNode.x,40 - nodeTempNode.height);

}

nodes.add(0, new Node(nodeTempNode.x, nodeTempNode.y + nodeTempNode.height));

break;

}

}

}

當(dāng)前文章:貪吃蛇大作戰(zhàn)代碼java 貪吃蛇大作戰(zhàn)c#
文章源于:http://muchs.cn/article26/doecdcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計移動網(wǎng)站建設(shè)、品牌網(wǎng)站設(shè)計、營銷型網(wǎng)站建設(shè)微信公眾號、網(wǎng)站收錄

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)