2019独角兽企业重金招聘Python工程师标准>>>

代码下载  -   公共邮箱(注意看邮件时间,免得被些无聊东东...)

邮箱: code_share@163.com  密码:code_share1

2011年4月15日 23:11 (星期五)

在google的sdk包里边, 有许多的实例, 稍加修改就可以运行了. 应该都还不错, 我是从snake开始入门的, 下面把代码贴上来吧, 若有不对或疑问,欢迎留贴.

1.snake.java

/** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");* you may not use this file except in compliance with the License.* You may obtain a copy of the License at**      http://www.apache.org/licenses/LICENSE-2.0** Unless required by applicable law or agreed to in writing, software* distributed under the License is distributed on an "AS IS" BASIS,* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.* See the License for the specific language governing permissions and* limitations under the License.*/package com.taln;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;public class Snake extends Activity {private SnakeView mSnakeView;     private static String ICICLE_KEY = "snake-view";/***第一次创建时调用onCreate方法* */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//layout相当于很多view的container,设置游戏的视图布局setContentView(R.layout.snake_layout);//在layout中找到自己的视图.这一个是自己写的视图,非android自带的,同样需要加进布局文件中mSnakeView = (SnakeView) findViewById(R.id.snake);       mSnakeView.setTextView((TextView) findViewById(R.id.text));//主要是为了设置暂停.暂停后需要回复到之前的状态. bundle-绑定,一个map类型的对象if (savedInstanceState == null) {// 相当于一个新的游戏的开始mSnakeView.setMode(SnakeView.READY);} else {//暂停后的恢复Bundle map = savedInstanceState.getBundle(ICICLE_KEY);if (map != null) {mSnakeView.restoreState(map);} else {mSnakeView.setMode(SnakeView.PAUSE);}}}@Overrideprotected void onPause() {super.onPause();// Pause the game along with the activitymSnakeView.setMode(SnakeView.PAUSE);}@Overridepublic void onSaveInstanceState(Bundle outState) {//保存游戏状态outState.putBundle(ICICLE_KEY, mSnakeView.saveState());}
}

2.SnakeView.java

* Copyright (C) 2007 The Android Open Source Projectpackage com.taln;import java.util.ArrayList;/***游戏中蛇的实现*/
public class SnakeView extends TileView {private static final String TAG = "SnakeView";/*** Current mode of application: READY to run, RUNNING, or you have already* lost. static final ints are used instead of an enum for performance* reasons* 定义不同的游戏状态,初始mMode为Ready*/private int mMode = READY;public static final int PAUSE = 0;public static final int READY = 1;public static final int RUNNING = 2;public static final int LOSE = 3;/*** Current direction the snake is headed.* 定义snake的方向,初始话为north.*/private int mDirection = NORTH;private int mNextDirection = NORTH;private static final int NORTH = 1;private static final int SOUTH = 2;private static final int EAST = 3;private static final int WEST = 4;/*** Labels for the drawables that will be loaded into the TileView class* 定义三种不同的tile*/private static final int RED_STAR = 1;private static final int YELLOW_STAR = 2;private static final int GREEN_STAR = 3;/*** mScore: used to track the number of apples captured mMoveDelay: number of* milliseconds between snake movements. This will decrease as apples are* captured.*/private long mScore = 0;private long mMoveDelay = 600;//初始化delay为600 , 后边还可以修改/*** mLastMove: tracks the absolute time when the snake last moved, and is used* to determine if a move should be made based on mMoveDelay.*/private long mLastMove;//上次移动的时间, 用于判断delay的时间到了没./*** mStatusText: text shows to the user in some run states* 不同状态,提示玩家不同的信息*/private TextView mStatusText;/*** mSnakeTrail: a list of Coordinates that make up the snake's body* mAppleList: the secret location of the juicy apples the snake craves.* mSnakeTrail是贪吃蛇的列表,随着游戏,慢慢增大* mAppleList是apple(蛇的食物)的列表, 有两个*/private ArrayList<Coordinate> mSnakeTrail = new ArrayList<Coordinate>();private ArrayList<Coordinate> mAppleList = new ArrayList<Coordinate>();/*** Everyone needs a little randomness in their life* 用于产生随机的apple*/private static final Random RNG = new Random();/*** Create a simple handler that we can use to cause animation to happen.  We* set ourselves as a target and we can use the sleep()* function to cause an update/invalidate to occur at a later date.*/private RefreshHandler mRedrawHandler = new RefreshHandler();class RefreshHandler extends Handler {
//当收到message时,调用update,然后调用invalidate()用于重新画画面.@Overridepublic void handleMessage(Message msg) {SnakeView.this.update();SnakeView.this.invalidate();}
//调用sleep后,在一定时间后sendmessagepublic void sleep(long delayMillis) {this.removeMessages(0);sendMessageDelayed(obtainMessage(0), delayMillis);}};/*** Constructs a SnakeView based on inflation from XML* * @param context* @param attrs*/public SnakeView(Context context, AttributeSet attrs) {super(context, attrs);initSnakeView();}public SnakeView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initSnakeView();}private void initSnakeView() {//添加焦点setFocusable(true);Resources r = this.getContext().getResources();//添加几种不同的tile, 应该是3的,不知道源码写成4有什么意思resetTiles(4);//加载图片loadTile(RED_STAR, r.getDrawable(R.drawable.redstar));loadTile(YELLOW_STAR, r.getDrawable(R.drawable.yellowstar));loadTile(GREEN_STAR, r.getDrawable(R.drawable.greenstar));       }private void initNewGame() {mSnakeTrail.clear();mAppleList.clear();// For now we're just going to load up a short default eastbound snake// that's just turned north//snake初始状态时的个数和位置,方向mSnakeTrail.add(new Coordinate(7, 7));mSnakeTrail.add(new Coordinate(6, 7));mSnakeTrail.add(new Coordinate(5, 7));mSnakeTrail.add(new Coordinate(4, 7));mSnakeTrail.add(new Coordinate(3, 7));mSnakeTrail.add(new Coordinate(2, 7));mNextDirection = NORTH;// 添加两个随机的appleaddRandomApple();addRandomApple();//设置延迟时间mMoveDelay = 600;mScore = 0;}/*** Given a ArrayList of coordinates, we need to flatten them into an array of* ints before we can stuff them into a map for flattening and storage.* * @param cvec : a ArrayList of Coordinate objects* @return : a simple array containing the x/y values of the coordinates* as [x1,y1,x2,y2,x3,y3...]*/private int[] coordArrayListToArray(ArrayList<Coordinate> cvec) {int count = cvec.size();int[] rawArray = new int[count * 2];for (int index = 0; index < count; index++) {Coordinate c = cvec.get(index);rawArray[2 * index] = c.x;rawArray[2 * index + 1] = c.y;}return rawArray;}/***将当前影响游戏的所有状态全部保存* @return a Bundle with this view's state*/public Bundle saveState() {Bundle map = new Bundle();map.putIntArray("mAppleList", coordArrayListToArray(mAppleList));map.putInt("mDirection", Integer.valueOf(mDirection));map.putInt("mNextDirection", Integer.valueOf(mNextDirection));map.putLong("mMoveDelay", Long.valueOf(mMoveDelay));map.putLong("mScore", Long.valueOf(mScore));map.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail));return map;}/*** Given a flattened array of ordinate pairs, we reconstitute them into a* ArrayList of Coordinate objects* * @param rawArray : [x1,y1,x2,y2,...]* @return a ArrayList of Coordinates*/private ArrayList<Coordinate> coordArrayToArrayList(int[] rawArray) {ArrayList<Coordinate> coordArrayList = new ArrayList<Coordinate>();int coordCount = rawArray.length;for (int index = 0; index < coordCount; index += 2) {Coordinate c = new Coordinate(rawArray[index], rawArray[index + 1]);coordArrayList.add(c);}return coordArrayList;}/*** Restore game state if our process is being relaunched* * @param icicle a Bundle containing the game state*/public void restoreState(Bundle icicle) {setMode(PAUSE);mAppleList = coordArrayToArrayList(icicle.getIntArray("mAppleList"));mDirection = icicle.getInt("mDirection");mNextDirection = icicle.getInt("mNextDirection");mMoveDelay = icicle.getLong("mMoveDelay");mScore = icicle.getLong("mScore");mSnakeTrail = coordArrayToArrayList(icicle.getIntArray("mSnakeTrail"));}/** handles key events in the game. Update the direction our snake is traveling* based on the DPAD. Ignore events that would cause the snake to immediately* turn back on itself.* * (non-Javadoc)* 键盘触发响应事件* @see android.view.View#onKeyDown(int, android.os.KeyEvent)*/@Overridepublic boolean onKeyDown(int keyCode, KeyEvent msg) {if (keyCode == KeyEvent.KEYCODE_DPAD_UP) {if (mMode == READY | mMode == LOSE) {/** At the beginning of the game, or the end of a previous one,* we should start a new game.*/initNewGame();setMode(RUNNING);update();return (true);}if (mMode == PAUSE) {/** If the game is merely paused, we should just continue where* we left off.*/setMode(RUNNING);update();return (true);}if (mDirection != SOUTH) {mNextDirection = NORTH;}return (true);}if (keyCode == KeyEvent.KEYCODE_DPAD_DOWN) {if (mDirection != NORTH) {mNextDirection = SOUTH;}return (true);}if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT) {if (mDirection != EAST) {mNextDirection = WEST;}return (true);}if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {if (mDirection != WEST) {mNextDirection = EAST;}return (true);}return super.onKeyDown(keyCode, msg);}/*** Sets the TextView that will be used to give information (such as "Game* Over" to the user.* * @param newView*/public void setTextView(TextView newView) {mStatusText = newView;}/*** Updates the current mode of the application (RUNNING or PAUSED or the like)* as well as sets the visibility of textview for notification* * @param newMode*/public void setMode(int newMode) {int oldMode = mMode;mMode = newMode;if (newMode == RUNNING & oldMode != RUNNING) {mStatusText.setVisibility(View.INVISIBLE);update();return;}Resources res = getContext().getResources();CharSequence str = "";if (newMode == PAUSE) {str = res.getText(R.string.mode_pause);}if (newMode == READY) {str = res.getText(R.string.mode_ready);}if (newMode == LOSE) {str = res.getString(R.string.mode_lose_prefix) + mScore+ res.getString(R.string.mode_lose_suffix);}mStatusText.setText(str);mStatusText.setVisibility(View.VISIBLE);}/*** Selects a random location within the garden that is not currently covered* by the snake. Currently _could_ go into an infinite loop if the snake* currently fills the garden, but we'll leave discovery of this prize to a* truly excellent snake-player.* */private void addRandomApple() {Coordinate newCoord = null;boolean found = false;while (!found) {// Choose a new location for our apple - apple生成的位置的坐标int newX = 1 + RNG.nextInt(mXTileCount - 2);int newY = 1 + RNG.nextInt(mYTileCount - 2);newCoord = new Coordinate(newX, newY);// Make sure it's not already under the snakeboolean collision = false;int snakelength = mSnakeTrail.size();//遍历snake, 看新添加的apple是否在snake里边, 如果是,重新生成for (int index = 0; index < snakelength; index++) {if (mSnakeTrail.get(index).equals(newCoord)) {collision = true;}}// if we're here and there's been no collision, then we have// a good location for an apple. Otherwise, we'll circle back// and try againfound = !collision;}if (newCoord == null) {Log.e(TAG, "Somehow ended up with a null newCoord!");}mAppleList.add(newCoord);}/*** Handles the basic update loop, checking to see if we are in the running* state, determining if a move should be made, updating the snake's location.*/public void update() {//每次update, 所有的都需要重新画if (mMode == RUNNING) {long now = System.currentTimeMillis();if (now - mLastMove > mMoveDelay) {clearTiles(); //将所有网格清0updateWalls(); //画边界updateSnake(); //画snakeupdateApples(); //画applemLastMove = now; //设置delay}mRedrawHandler.sleep(mMoveDelay); //发送消息, 等待下次update}}/*** Draws some walls.* */private void updateWalls() {for (int x = 0; x < mXTileCount; x++) {setTile(GREEN_STAR, x, 0);setTile(GREEN_STAR, x, mYTileCount - 1);}for (int y = 1; y < mYTileCount - 1; y++) {setTile(GREEN_STAR, 0, y);setTile(GREEN_STAR, mXTileCount - 1, y);}}/*** Draws some apples.* */private void updateApples() {for (Coordinate c : mAppleList) {setTile(YELLOW_STAR, c.x, c.y);}}/*** Figure out which way the snake is going, see if he's run into anything (the* walls, himself, or an apple). If he's not going to die, we then add to the* front and subtract from the rear in order to simulate motion. If we want to* grow him, we don't subtract from the rear.* */private void updateSnake() {boolean growSnake = false;// grab the snake by the headCoordinate head = mSnakeTrail.get(0);Coordinate newHead = new Coordinate(1, 1);mDirection = mNextDirection;switch (mDirection) {//根据不同的方向设置snake的头 - 向哪里走case EAST: {newHead = new Coordinate(head.x + 1, head.y);break;}case WEST: {newHead = new Coordinate(head.x - 1, head.y);break;}case NORTH: {newHead = new Coordinate(head.x, head.y - 1);break;}case SOUTH: {newHead = new Coordinate(head.x, head.y + 1);break;}}// Collision detection// For now we have a 1-square wall around the entire arena//判断何时游戏失败-要到自己或撞到wallif ((newHead.x < 1) || (newHead.y < 1) || (newHead.x > mXTileCount - 2)|| (newHead.y > mYTileCount - 2)) {setMode(LOSE);return;}// Look for collisions with itselfint snakelength = mSnakeTrail.size();for (int snakeindex = 0; snakeindex < snakelength; snakeindex++) {Coordinate c = mSnakeTrail.get(snakeindex);if (c.equals(newHead)) {setMode(LOSE);return;}}// Look for applesint applecount = mAppleList.size();for (int appleindex = 0; appleindex < applecount; appleindex++) {Coordinate c = mAppleList.get(appleindex);if (c.equals(newHead)) {mAppleList.remove(c);addRandomApple();mScore++;//随着游戏, delay会逐渐减小mMoveDelay *= 0.9;growSnake = true;}}// push a new head onto the ArrayList and pull off the tailmSnakeTrail.add(0, newHead);// except if we want the snake to growif (!growSnake) {mSnakeTrail.remove(mSnakeTrail.size() - 1);}int index = 0;for (Coordinate c : mSnakeTrail) {if (index == 0) {setTile(YELLOW_STAR, c.x, c.y);} else {setTile(RED_STAR, c.x, c.y);}index++;}}/*** Simple class containing two integer values and a comparison function.* There's probably something I should use instead, but this was quick and* easy to build.* */private class Coordinate {public int x;public int y;public Coordinate(int newX, int newY) {x = newX;y = newY;}public boolean equals(Coordinate other) {if (x == other.x && y == other.y) {return true;}return false;}@Overridepublic String toString() {return "Coordinate: [" + x + "," + y + "]";}}}

3.TileView.java

* Copyright (C) 2007 The Android Open Source Projectpackage com.taln;import android.content.Context;/*** 相当于贪吃蛇吃的那个食物, 也相当于是wall(边界)的元器件*/
public class TileView extends View {/*** Parameters controlling the size of the tiles and their range within view.* Width/Height are in pixels, and Drawables will be scaled to fit to these* dimensions. X/Y Tile Counts are the number of tiles that will be drawn.*/protected static int mTileSize;protected static int mXTileCount;protected static int mYTileCount;private static int mXOffset;private static int mYOffset;/*** A hash that maps integer handles specified by the subclasser to the* drawable that will be used for that reference*/private Bitmap[] mTileArray; /*** A two-dimensional array of integers in which the number represents the* index of the tile that should be drawn at that locations*/private int[][] mTileGrid; //把屏幕分成一格一格的二维数组private final Paint mPaint = new Paint();//下面这两个构造好像都要用到,敝人没有时间深入研究,读者有兴趣可以自己玩一下.public TileView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);//获取资源文件(attrs.xml)定义的view的对象TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);//获取资源文件(attrs.xml)定义的属性的值mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);//好像可有可无, 有点像回调, 意思是a对象过一会儿还要用a.recycle();}public TileView(Context context, AttributeSet attrs) {super(context, attrs);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);a.recycle();}/*** mTileArray是存放tile的数组,此程序一共用了三种tile,红黄绿.* @param tilecount*/public void resetTiles(int tilecount) {mTileArray = new Bitmap[tilecount];}@Override//横竖屏切换时调用protected void onSizeChanged(int w, int h, int oldw, int oldh) {mXTileCount = (int) Math.floor(w / mTileSize);mYTileCount = (int) Math.floor(h / mTileSize);
//够分成一格的分成一格, 剩下不够一格的分成两份,左边一份,右边一份mXOffset = ((w - (mTileSize * mXTileCount)) / 2);mYOffset = ((h - (mTileSize * mYTileCount)) / 2);mTileGrid = new int[mXTileCount][mYTileCount];clearTiles(); //将二维网格的值全部设定为0}/*** Function to set the specified Drawable as the tile for a particular* integer key.* 将三种tile加载到内存,提供画布-canvas . (画画要有画纸和画笔.paint相当于笔,canvas相当于纸)* @param key* @param tile*/public void loadTile(int key, Drawable tile) {Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);tile.setBounds(0, 0, mTileSize, mTileSize);tile.draw(canvas);mTileArray[key] = bitmap;}/*** Resets all tiles to 0 (empty)* 将所有网格清0*/public void clearTiles() {for (int x = 0; x < mXTileCount; x++) {for (int y = 0; y < mYTileCount; y++) {setTile(0, x, y);}}}/*** Used to indicate that a particular tile (set with loadTile and referenced* by an integer) should be drawn at the given x/y coordinates during the* next invalidate/draw cycle.* * @param tileindex* @param x* @param y*/public void setTile(int tileindex, int x, int y) {mTileGrid[x][y] = tileindex;}//自动调用.只要是调用了invalidate()方法后会再次自动调用.@Overridepublic void onDraw(Canvas canvas) {super.onDraw(canvas);for (int x = 0; x < mXTileCount; x += 1) {for (int y = 0; y < mYTileCount; y += 1) {if (mTileGrid[x][y] > 0) {canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset + x * mTileSize,mYOffset + y * mTileSize,mPaint);}}}}}

4.snake_layout.xml

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.taln.SnakeViewandroid:id="@+id/snake"android:layout_width="match_parent"android:layout_height="match_parent"tileSize="24"/><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="match_parent" ><TextViewandroid:id="@+id/text"android:text="@string/snake_layout_text_text"android:visibility="visible"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerInParent="true"android:gravity="center_horizontal"android:textColor="#ff8888ff"android:textSize="24sp"/></RelativeLayout>
</FrameLayout>

5.attrs.xml

<?xml version="1.0" encoding="utf-8"?><resources><declare-styleable name="TileView"><attr name="tileSize" format="integer" /></declare-styleable>
</resources>

6.strings.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2007 The Android Open Source ProjectLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
--><resources><string name="mode_ready">Snake\nPress Up To Play</string><string name="mode_pause">Paused\nPress Up To Resume</string><string name="mode_lose_prefix">Game Over\nScore: </string><string name="mode_lose_suffix">\nPress Up To Play</string><string name="snake_layout_text_text"></string>
</resources>

7.androidmanifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.taln"android:versionCode="1"android:versionName="1.0"><application android:icon="@drawable/icon" ><activity android:name=".Snake"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>

8. 三个tile的资源图片 - mdpi

    

下面是效果图:

 

转载于:https://my.oschina.net/u/131573/blog/15258

android google snake相关推荐

  1. CTS(8)---Android Google认证 -CTS认证问题小结

    Android Google认证 -CTS认证问题小结 0.0 前言 这段时间接手了CTS认证相关的工作,在这里整理一下相关的问题.(同时感谢同事对此总结提供的帮助及补充) 1.0 Google Wa ...

  2. uber_像Uber这样的Android Google地图样式

    uber Have you ever noticed how Uber and other few popular location-based applications have a differe ...

  3. Android Google Map –两点之间的绘图路线

    In this tutorial, we'll be creating an android application that draws a possible google map route be ...

  4. android google定位和地图

    首先在google地图这需要个 <com.google.android.maps.MapView android:id="@+id/mv"     android:click ...

  5. Android Google Map 开发指南(一)解决官方demo显示空白只展示google logo问题

    这两天一直在做google map接入前的准备工作 特此在这里将自己在加载官方demo时出现的问题以及详细的接入步骤进行记录,已免后者踩坑 注:项目实际运行时不要使用虚拟机 因为电脑ip和虚拟机ip不 ...

  6. Android Google Map实例 - 在地图和卫星图之间切换(Android mapview)

    之前讲述的例子中显示的 为地图模式,如何你想使用类似google earth的卫星图模式显示,如何操作? 在android上将变得非常简单: 增加两个Button按钮和两个对应的Button.OnCl ...

  7. Android Google Maps API教程-入门

    This is android google maps api tutorial. 这是android Google Maps API教程. In this tutorial I will teach ...

  8. android google map key,android google map api key取得?

    我有一个项目的谷歌地图apikey现在我想要另一个项目的apikey和这个项目的keystore是在一个不同的地方.我的第一个cmd:android google map api key取得? &qu ...

  9. SDK接入(2)之Android Google Play内支付(in-app Billing)接入

    SDK接入(2)之Android Google Play内支付(in-app Billing)接入 SDK接入(2)之Android Google Play内支付(in-app Billing)接入 ...

最新文章

  1. 零基础可以学好UI设计吗
  2. 老男孩的运维笔记文档-高级部分(系统架构师)列表(三)
  3. 从概念到案例,机器学习应该掌握的20个知识点
  4. 条款46:需要类型转换的时候请为模板定义非成员函数
  5. break语句与continue语句的区别
  6. 怎么禁止使用计算机的软件,电脑如何禁止程序运行 一键彻底禁止电脑软件运行方法...
  7. 没完全读懂的《人间失格》
  8. Unity打包后播放视频黑屏问题
  9. 【论文翻译】InsetGAN :基于多个stylegan2-ada生成器拼接的全身人像生成(2203.InsetGAN for Full-Body Image Generation)
  10. 2021年网络安全省赛--web隐藏信息探索解析(中职组)
  11. css打印适应纸张_使用原生css+js+html实现打印A4纸张的功能页面
  12. python华表_鹤归华表 丁令威化鹤
  13. 图片验证码不显示解决方案
  14. Python中汉字繁简体互转
  15. 广告推荐算法(group auc)评价指标及Spark实现代码
  16. 3D打印无人机等无人设备1——打印机喷头堵塞及喷头损坏更换维修
  17. 虚拟现实技术人机工程解决方案
  18. 三:使用MATLAB对有理假分式进行分式展开,并求取留数,极点和直接项。
  19. linux代码之LL/SC/LSE 及锁指令
  20. 数据结构——单循环链表的

热门文章

  1. KindleDrip:从邮件地址到信用卡盗刷的严重漏洞,值$1.8万奖金
  2. 已遭利用的微软0day CVE-2020-1464,原来是两年前的老相识
  3. 出于安全考虑,谷歌禁用三款 Linux web 浏览器登录其服务
  4. 20165318 预备作业3 Linux安装及学习
  5. sccm2012 客户端推送安装故障解决一例
  6. 这种div高度自适应确定你知道吗?
  7. L1-067 洛希极限 (10 分)-PAT 团体程序设计天梯赛 GPLT
  8. [Java] 蓝桥杯BASIC-23 基础练习 芯片测试
  9. [Python] L1-021. 重要的话说三遍-PAT团体程序设计天梯赛GPLT
  10. L2-026 小字辈-PAT团体程序设计天梯赛GPLT