亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android中貪吃蛇游戲的學習(三)

系統 2072 0

Android中貪吃蛇游戲的學習(三)

文章分類: 移動開發

視圖VIew的類的Snake的,主要關注的學習的類。

Java代碼
  1. package com.easyway.dev.android.snake;
  2. import java.util.ArrayList;
  3. import java.util.Random;
  4. import android.content.Context;
  5. import android.content.res.Resources;
  6. import android.os.Bundle;
  7. import android.os.Handler;
  8. import android.os.Message;
  9. import android.util.AttributeSet;
  10. import android.util.Log;
  11. import android.view.KeyEvent;
  12. import android.view.View;
  13. import android.widget.TextView;
  14. /**
  15. *View類是Android的一個超類,這個類幾乎包含了所有的屏幕類型。但它們之間有一些不同。每一個view
  16. *都有一個用于繪畫的畫布。這個畫布可以用來進行任意擴展。
  17. *
  18. *一個項目的R.java文件是一個定義所有資源的索引文件。使用這個類就像使用一種速記方式來引用你項
  19. *目中包含的資源。這個有點特別的強大像對于Eclipse這類IDE的代碼編譯特性,因為它使你快速的,互動
  20. *式的定位你正在尋找的特定引用。
  21. *
  22. *到目前需要注意的重要事情是叫做”layout”的內部類和他的成員變量”main”,插件會通知你添加一個新
  23. *的XML布局文件,然后從新產生這個R.java文件,比如你添加了新的資源到你的項目,你將會看到R.java
  24. *也相應的改變了。放在你的項目目錄的res/文件夾下。“res”是”resources”的縮寫,它是存放所有非
  25. *代碼資源的文件夾,包含象圖片,本地化字符串和XML布局文件。
  26. *
  27. *
  28. *SnakeView:implementationofasimplegameofSnake
  29. *創建的view中一般要傳入一個Context的實例,Context可以控制系統的調用,它提供了諸如資源解析
  30. *,訪問數據庫等。Activty類繼承自Context類。
  31. *
  32. *視圖也可以被嵌套,但和J2ME不同,我們可以將定制的視圖和Android團隊發布的Widgets一起使用。
  33. *在J2ME中,開發人員被迫選擇GameCanvas和J2ME應用程序畫布。這就意味著如果我們想要一個定制
  34. *的效果,就必須在GameCanvas上重新設計我們所有的widget。Android還不僅僅是這些,視圖類型
  35. *也可以混合使用。Android還帶了一個widget庫,這個類庫包括了滾動條,文本實體,進度條以及其
  36. *他很多控件。這些標準的widget可以被重載或被按著我們的習慣定制。
  37. *
  38. */
  39. public class SnakeView extends TileView{
  40. private static final StringTAG= "SnakeView" ;
  41. /**
  42. *Currentmodeofapplication:READYtorun,RUNNING,oryouhavealready
  43. *lost.staticfinalintsareusedinsteadofanenumforperformance
  44. *reasons.
  45. */
  46. private int mMode=READY;
  47. public static final int PAUSE= 0 ;
  48. public static final int READY= 1 ;
  49. public static final int RUNNING= 2 ;
  50. public static final int LOSE= 3 ;
  51. /**
  52. *設置方向
  53. *Currentdirectionthesnakeisheaded.
  54. */
  55. private int mDirection=NORTH;
  56. private int mNextDirection=NORTH;
  57. private static final int NORTH= 1 ;
  58. private static final int SOUTH= 2 ;
  59. private static final int EAST= 3 ;
  60. private static final int WEST= 4 ;
  61. /**
  62. *LabelsforthedrawablesthatwillbeloadedintotheTileViewclass
  63. */
  64. private static final int RED_STAR= 1 ;
  65. private static final int YELLOW_STAR= 2 ;
  66. private static final int GREEN_STAR= 3 ;
  67. /**
  68. *mScore:usedtotrackthenumberofapplescapturedmMoveDelay:numberof
  69. *millisecondsbetweensnakemovements.Thiswilldecreaseasapplesare
  70. *captured.
  71. */
  72. private long mScore= 0 ;
  73. private long mMoveDelay= 600 ;
  74. /**
  75. *mLastMove:trackstheabsolutetimewhenthesnakelastmoved,andisused
  76. *todetermineifamoveshouldbemadebasedonmMoveDelay.
  77. */
  78. private long mLastMove;
  79. /**
  80. *mStatusText:textshowstotheuserinsomerunstates
  81. */
  82. private TextViewmStatusText;
  83. /**
  84. *用于存儲貪吃蛇中,蘋果和蛇的點陣的坐標的信息的集合
  85. *mSnakeTrail:alistofCoordinatesthatmakeupthesnake'sbody
  86. *mAppleList:thesecretlocationofthejuicyapplesthesnakecraves.
  87. */
  88. private ArrayList<Coordinate>mSnakeTrail= new ArrayList<Coordinate>();
  89. private ArrayList<Coordinate>mAppleList= new ArrayList<Coordinate>();
  90. /**
  91. *為創建蘋果坐標使用隨機對象
  92. *Everyoneneedsalittlerandomnessintheirlife
  93. */
  94. private static final RandomRNG= new Random();
  95. /**
  96. *刷新界面處理器
  97. *Createasimplehandlerthatwecanusetocauseanimationtohappen.We
  98. *setourselvesasatargetandwecanusethesleep()
  99. *functiontocauseanupdate/invalidatetooccuratalaterdate.
  100. */
  101. private RefreshHandlermRedrawHandler= new RefreshHandler();
  102. /**
  103. *實現刷新的功能:
  104. *在J2ME中,刷新都是在canvas中通過調用線程結合repaint()來刷新,他們使線程不斷去循環,
  105. *去調用canvas,筆者在android入門時也曾經想用J2ME的模式用在android中,結果報異常了,
  106. *為什么呢?很多人認為Dalvik虛擬機是一個Java虛擬機,因為Android的編程語言恰恰就是Java語言。
  107. *但是這種說法并不準確,因為Dalvik虛擬機并不是按照Java虛擬機的規范來實現的,兩者并不兼容;
  108. *同時還要兩個明顯的不同:Java虛擬機運行的是Java字節碼,而Dalvik虛擬機運行的則是其專有的
  109. *文件格式DEX(DalvikExecutable)。所以在以前JAVA里面能使用的模式,可能在android
  110. *里面用不起來。在自帶的例子里面他是通過消息的機制來刷新的。而在android的消定義比較廣泛,
  111. *比如,手機的暫停,啟動,來電話、短信,鍵盤按下,彈起都是一個消息。總的來說,事件就是消息;
  112. *只要繼承Handler類就可以對消息進行控制,或者處理,根據具體情況進行具體處理:
  113. *
  114. *@authorAdministrator
  115. *@date2010-5-24
  116. *@version1.0
  117. *@sinceJDK6.0
  118. */
  119. class RefreshHandler extends Handler{
  120. /**
  121. *響應消息
  122. */
  123. @Override
  124. public void handleMessage(Messagemsg){
  125. SnakeView. this .update();
  126. SnakeView. this .invalidate();
  127. }
  128. /**
  129. *向外提供人工的調用消息的接口
  130. *@paramdelayMillis
  131. */
  132. public void sleep( long delayMillis){
  133. //注銷消息
  134. this .removeMessages( 0 );
  135. //添加消息
  136. sendMessageDelayed(obtainMessage( 0 ),delayMillis);
  137. }
  138. };
  139. /**
  140. *ConstructsaSnakeViewbasedoninflationfromXML
  141. *
  142. *@paramcontext
  143. *@paramattrs
  144. */
  145. public SnakeView(Contextcontext,AttributeSetattrs){
  146. super (context,attrs);
  147. initSnakeView();
  148. }
  149. public SnakeView(Contextcontext,AttributeSetattrs, int defStyle){
  150. super (context,attrs,defStyle);
  151. initSnakeView();
  152. }
  153. /**
  154. *初始化界面的
  155. */
  156. private void initSnakeView(){
  157. setFocusable( true );
  158. Resourcesr= this .getContext().getResources();
  159. resetTiles( 4 );
  160. loadTile(RED_STAR,r.getDrawable(R.drawable.redstar));
  161. loadTile(YELLOW_STAR,r.getDrawable(R.drawable.yellowstar));
  162. loadTile(GREEN_STAR,r.getDrawable(R.drawable.greenstar));
  163. }
  164. /**
  165. *初始化新的游戲
  166. */
  167. private void initNewGame(){
  168. mSnakeTrail.clear();
  169. mAppleList.clear();
  170. //Fornowwe'rejustgoingtoloadupashortdefaulteastboundsnake
  171. //that'sjustturnednorth
  172. //設置初始化蛇的位置
  173. mSnakeTrail.add( new Coordinate( 7 , 7 ));
  174. mSnakeTrail.add( new Coordinate( 6 , 7 ));
  175. mSnakeTrail.add( new Coordinate( 5 , 7 ));
  176. mSnakeTrail.add( new Coordinate( 4 , 7 ));
  177. mSnakeTrail.add( new Coordinate( 3 , 7 ));
  178. mSnakeTrail.add( new Coordinate( 2 , 7 ));
  179. mNextDirection=NORTH;
  180. //Twoapplestostartwith
  181. //設置蘋果的位置
  182. addRandomApple();
  183. addRandomApple();
  184. //
  185. mMoveDelay= 600 ;
  186. //設置積分的
  187. mScore= 0 ;
  188. }
  189. /**
  190. *GivenaArrayListofcoordinates,weneedtoflattenthemintoanarrayof
  191. *intsbeforewecanstuffthemintoamapforflatteningandstorage.
  192. *
  193. *@paramcvec:aArrayListofCoordinateobjects
  194. *@return:asimplearraycontainingthex/yvaluesofthecoordinates
  195. *as[x1,y1,x2,y2,x3,y3...]
  196. */
  197. private int []coordArrayListToArray(ArrayList<Coordinate>cvec){
  198. int count=cvec.size();
  199. int []rawArray= new int [count* 2 ];
  200. for ( int index= 0 ;index<count;index++){
  201. Coordinatec=cvec.get(index);
  202. rawArray[ 2 *index]=c.x;
  203. rawArray[ 2 *index+ 1 ]=c.y;
  204. }
  205. return rawArray;
  206. }
  207. /**
  208. *Savegamestatesothattheuserdoesnotloseanything
  209. *ifthegameprocessiskilledwhileweareinthe
  210. *background.
  211. *
  212. *@returnaBundlewiththisview'sstate
  213. */
  214. public BundlesaveState(){
  215. Bundlemap= new Bundle();
  216. map.putIntArray( "mAppleList" ,coordArrayListToArray(mAppleList));
  217. map.putInt( "mDirection" ,Integer.valueOf(mDirection));
  218. map.putInt( "mNextDirection" ,Integer.valueOf(mNextDirection));
  219. map.putLong( "mMoveDelay" ,Long.valueOf(mMoveDelay));
  220. map.putLong( "mScore" ,Long.valueOf(mScore));
  221. map.putIntArray( "mSnakeTrail" ,coordArrayListToArray(mSnakeTrail));
  222. return map;
  223. }
  224. /**
  225. *Givenaflattenedarrayofordinatepairs,wereconstitutethemintoa
  226. *ArrayListofCoordinateobjects
  227. *
  228. *@paramrawArray:[x1,y1,x2,y2,...]
  229. *@returnaArrayListofCoordinates
  230. */
  231. private ArrayList<Coordinate>coordArrayToArrayList( int []rawArray){
  232. ArrayList<Coordinate>coordArrayList= new ArrayList<Coordinate>();
  233. int coordCount=rawArray.length;
  234. for ( int index= 0 ;index<coordCount;index+= 2 ){
  235. Coordinatec= new Coordinate(rawArray[index],rawArray[index+ 1 ]);
  236. coordArrayList.add(c);
  237. }
  238. return coordArrayList;
  239. }
  240. /**
  241. *Restoregamestateifourprocessisbeingrelaunched
  242. *
  243. *@paramicicleaBundlecontainingthegamestate
  244. */
  245. public void restoreState(Bundleicicle){
  246. setMode(PAUSE);
  247. //從資源中獲取ArrayList
  248. mAppleList=coordArrayToArrayList(icicle.getIntArray( "mAppleList" ));
  249. mDirection=icicle.getInt( "mDirection" );
  250. mNextDirection=icicle.getInt( "mNextDirection" );
  251. mMoveDelay=icicle.getLong( "mMoveDelay" );
  252. mScore=icicle.getLong( "mScore" );
  253. mSnakeTrail=coordArrayToArrayList(icicle.getIntArray( "mSnakeTrail" ));
  254. }
  255. /**
  256. *重點的控制代碼
  257. *
  258. *實現鍵盤事件:鍵盤主要起操作作用,在任何的手機游戲中鍵盤都是起重要的用,要本游戲中,
  259. *他就是起控制蛇的行走方向:現在我們分析他的代碼:
  260. *就是通過判斷那個鍵按下,然后再給要走的方向(mDirection)賦值。
  261. *
  262. *handleskeyeventsinthegame.Updatethedirectionoursnakeistraveling
  263. *basedontheDPAD.Ignoreeventsthatwouldcausethesnaketoimmediately
  264. *turnbackonitself.
  265. *
  266. *(non-Javadoc)
  267. *
  268. *@seeandroid.view.View#onKeyDown(int,android.os.KeyEvent)
  269. */
  270. @Override
  271. public boolean onKeyDown( int keyCode,KeyEventmsg){
  272. if (keyCode==KeyEvent.KEYCODE_DPAD_UP){
  273. if (mMode==READY|mMode==LOSE){
  274. /*
  275. *Atthebeginningofthegame,ortheendofapreviousone,
  276. *weshouldstartanewgame.
  277. */
  278. initNewGame();
  279. setMode(RUNNING);
  280. update();
  281. return ( true );
  282. }
  283. if (mMode==PAUSE){
  284. /*
  285. *Ifthegameismerelypaused,weshouldjustcontinuewhere
  286. *weleftoff.
  287. */
  288. setMode(RUNNING);
  289. update();
  290. return ( true );
  291. }
  292. if (mDirection!=SOUTH){
  293. mNextDirection=NORTH;
  294. }
  295. return ( true );
  296. }
  297. if (keyCode==KeyEvent.KEYCODE_DPAD_DOWN){
  298. if (mDirection!=NORTH){
  299. mNextDirection=SOUTH;
  300. }
  301. return ( true );
  302. }
  303. if (keyCode==KeyEvent.KEYCODE_DPAD_LEFT){
  304. if (mDirection!=EAST){
  305. mNextDirection=WEST;
  306. }
  307. return ( true );
  308. }
  309. if (keyCode==KeyEvent.KEYCODE_DPAD_RIGHT){
  310. if (mDirection!=WEST){
  311. mNextDirection=EAST;
  312. }
  313. return ( true );
  314. }
  315. return super .onKeyDown(keyCode,msg);
  316. }
  317. /**
  318. *SetstheTextViewthatwillbeusedtogiveinformation(suchas"Game
  319. *Over"totheuser.
  320. *
  321. *@paramnewView
  322. */
  323. public void setTextView(TextViewnewView){
  324. mStatusText=newView;
  325. }
  326. /**
  327. *Updatesthecurrentmodeoftheapplication(RUNNINGorPAUSEDorthelike)
  328. *aswellassetsthevisibilityoftextviewfornotification
  329. *
  330. *@paramnewMode
  331. */
  332. public void setMode( int newMode){
  333. int oldMode=mMode;
  334. mMode=newMode;
  335. if (newMode==RUNNING&oldMode!=RUNNING){
  336. mStatusText.setVisibility(View.INVISIBLE);
  337. update();
  338. return ;
  339. }
  340. Resourcesres=getContext().getResources();
  341. CharSequencestr= "" ;
  342. if (newMode==PAUSE){
  343. str=res.getText(R.string.mode_pause);
  344. }
  345. if (newMode==READY){
  346. str=res.getText(R.string.mode_ready);
  347. }
  348. if (newMode==LOSE){
  349. str=res.getString(R.string.mode_lose_prefix)+mScore
  350. +res.getString(R.string.mode_lose_suffix);
  351. }
  352. mStatusText.setText(str);
  353. mStatusText.setVisibility(View.VISIBLE);
  354. }
  355. /**
  356. *
  357. *生成蘋果位置的代碼:
  358. *蘋果的位置就是更簡單了,他是隨機生成的,而且必須在現在蛇的位置相對遠距離。
  359. *
  360. *Selectsarandomlocationwithinthegardenthatisnotcurrentlycovered
  361. *bythesnake.Currently_could_gointoaninfiniteloopifthesnake
  362. *currentlyfillsthegarden,butwe'llleavediscoveryofthisprizetoa
  363. *trulyexcellentsnake-player.
  364. *
  365. */
  366. private void addRandomApple(){
  367. CoordinatenewCoord= null ;
  368. boolean found= false ;
  369. while (!found){
  370. //隨機生成新的X,Y位置
  371. //Chooseanewlocationforourapple
  372. int newX= 1 +RNG.nextInt(mXTileCount- 2 );
  373. int newY= 1 +RNG.nextInt(mYTileCount- 2 );
  374. newCoord= new Coordinate(newX,newY);
  375. //Makesureit'snotalreadyunderthesnake
  376. boolean collision= false ;
  377. int snakelength=mSnakeTrail.size();
  378. for ( int index= 0 ;index<snakelength;index++){
  379. //檢查一下存放的位置是否合理
  380. if (mSnakeTrail.get(index).equals(newCoord)){
  381. collision= true ;
  382. }
  383. }
  384. //ifwe'rehereandthere'sbeennocollision,thenwehave
  385. //agoodlocationforanapple.Otherwise,we'llcircleback
  386. //andtryagain
  387. found=!collision;
  388. }
  389. if (newCoord== null ){
  390. Log.e(TAG, "SomehowendedupwithanullnewCoord!" );
  391. }
  392. //添加蘋果的列表中的
  393. mAppleList.add(newCoord);
  394. }
  395. /**
  396. *Handlesthebasicupdateloop,checkingtoseeifweareintherunning
  397. *state,determiningifamoveshouldbemade,updatingthesnake'slocation.
  398. */
  399. public void update(){
  400. if (mMode==RUNNING){
  401. long now=System.currentTimeMillis();
  402. if (now-mLastMove>mMoveDelay){
  403. clearTiles();
  404. updateWalls();
  405. updateSnake();
  406. updateApples();
  407. mLastMove=now;
  408. }
  409. mRedrawHandler.sleep(mMoveDelay);
  410. }
  411. }
  412. /**
  413. *調用以上的方法以循環的方式位置數組賦值以及圖片的索引。
  414. *
  415. *Drawssomewalls.
  416. *
  417. */
  418. private void updateWalls(){
  419. for ( int x= 0 ;x<mXTileCount;x++){
  420. setTile(GREEN_STAR,x, 0 ); //設置頂部的界限的位置
  421. setTile(GREEN_STAR,x,mYTileCount- 1 ); //設置底部界限的位置
  422. }
  423. for ( int y= 1 ;y<mYTileCount- 1 ;y++){
  424. setTile(GREEN_STAR, 0 ,y); //設置頂部的界限的位置
  425. setTile(GREEN_STAR,mXTileCount- 1 ,y); //設置底部界限的位置
  426. }
  427. }
  428. /**
  429. *Drawssomeapples.
  430. *
  431. */
  432. private void updateApples(){
  433. for (Coordinatec:mAppleList){
  434. setTile(YELLOW_STAR,c.x,c.y);
  435. }
  436. }
  437. /**
  438. *設置當前蛇的方向位置:
  439. *從以上的鍵盤代碼我們可以看得出,程序中是通過觸發來改變坐標(+1,-1)的方式來改蛇頭的方向,
  440. *可見坐標在游戲編程中的作用,這個也是根據手機的屏幕是點陣的方式來顯示,所以坐標就是一個
  441. *定位器。在這里大家可能還有一個疑問。就是就這個蛇什么能夠以“7”字形來移動行走,其實我們
  442. *稍微仔細觀察一下就知道了,在這里面,他們也是通過坐標的傳遞來實現的,只要把頭部的坐標點
  443. *依次賦給下一個點,后面的每一個點都走過了頭部所走過的點,而蛇的頭部就是負責去獲取坐標,整
  444. *個蛇的行走起來就很自然和連貫。坐標的方向變換又是通過判斷那個方向按鍵的按下來改變的,這
  445. *樣一來,鍵盤的作用就發揮出來了。蛇吃蘋果又是怎樣去實現?上面我所說到的坐標就起了作用。在蛇
  446. *所經過的每一個坐標,他們都要在蘋果所在的(ArrayList<Coordinate>mAppleList=new
  447. *ArrayList<Coordinate>())坐標集里面集依次判斷,若是坐標相同,那個這個蘋果就被蛇吃了。
  448. *
  449. *Figureoutwhichwaythesnakeisgoing,seeifhe'srunintoanything(the
  450. *walls,himself,oranapple).Ifhe'snotgoingtodie,wethenaddtothe
  451. *frontandsubtractfromtherearinordertosimulatemotion.Ifwewantto
  452. *growhim,wedon'tsubtractfromtherear.
  453. *
  454. */
  455. private void updateSnake(){
  456. boolean growSnake= false ;
  457. //grabthesnakebythehead
  458. //獲取蛇的頭部
  459. Coordinatehead=mSnakeTrail.get( 0 );
  460. //創建一個新的蛇的頭部應該的位置
  461. CoordinatenewHead= new Coordinate( 1 , 1 );
  462. //根據當前的為方向設置坐標的信息
  463. mDirection=mNextDirection;
  464. switch (mDirection){
  465. case EAST:{
  466. newHead= new Coordinate(head.x+ 1 ,head.y);
  467. break ;
  468. }
  469. case WEST:{
  470. newHead= new Coordinate(head.x- 1 ,head.y);
  471. break ;
  472. }
  473. case NORTH:{
  474. newHead= new Coordinate(head.x,head.y- 1 );
  475. break ;
  476. }
  477. case SOUTH:{
  478. newHead= new Coordinate(head.x,head.y+ 1 );
  479. break ;
  480. }
  481. }
  482. //Collisiondetection
  483. //Fornowwehavea1-squarewallaroundtheentirearena
  484. if ((newHead.x< 1 )||(newHead.y< 1 )||(newHead.x>mXTileCount- 2 )
  485. ||(newHead.y>mYTileCount- 2 )){
  486. setMode(LOSE);
  487. return ;
  488. }
  489. //Lookforcollisionswithitself
  490. int snakelength=mSnakeTrail.size();
  491. for ( int snakeindex= 0 ;snakeindex<snakelength;snakeindex++){
  492. Coordinatec=mSnakeTrail.get(snakeindex);
  493. if (c.equals(newHead)){
  494. setMode(LOSE);
  495. return ;
  496. }
  497. }
  498. //Lookforapples
  499. //查找蘋果設置蘋果新的位置的信息
  500. int applecount=mAppleList.size();
  501. for ( int appleindex= 0 ;appleindex<applecount;appleindex++){
  502. Coordinatec=mAppleList.get(appleindex);
  503. if (c.equals(newHead)){
  504. mAppleList.remove(c);
  505. addRandomApple();
  506. mScore++;
  507. //設置的移動的速度
  508. mMoveDelay*= 0.9 ;
  509. growSnake= true ;
  510. }
  511. }
  512. //將蛇頭的位置信息放在第一個的對象中方取值
  513. //pushanewheadontotheArrayListandpulloffthetail
  514. mSnakeTrail.add( 0 ,newHead);
  515. //exceptifwewantthesnaketogrow
  516. if (!growSnake){
  517. mSnakeTrail.remove(mSnakeTrail.size()- 1 );
  518. }
  519. int index= 0 ;
  520. for (Coordinatec:mSnakeTrail){
  521. if (index== 0 ){
  522. setTile(YELLOW_STAR,c.x,c.y);
  523. } else {
  524. setTile(RED_STAR,c.x,c.y);
  525. }
  526. index++;
  527. }
  528. }
  529. /**
  530. *用于存儲每一個位點的x,y坐標信息
  531. *Simpleclasscontainingtwointegervaluesandacomparisonfunction.
  532. *There'sprobablysomethingIshoulduseinstead,butthiswasquickand
  533. *easytobuild.
  534. *
  535. */
  536. private class Coordinate{
  537. public int x;
  538. public int y;
  539. public Coordinate( int newX, int newY){
  540. x=newX;
  541. y=newY;
  542. }
  543. public boolean equals(Coordinateother){
  544. if (x==other.x&&y==other.y){
  545. return true ;
  546. }
  547. return false ;
  548. }
  549. @Override
  550. public StringtoString(){
  551. return "Coordinate:[" +x+ "," +y+ "]" ;
  552. }
  553. }
  554. }

Android中貪吃蛇游戲的學習(三)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚洲国产第一区二区三区 | 网络毛片| 国产精品中文字幕在线观看 | 福利视频自拍 | 国产精品久久久久久影视 | 九九视频在线 | 精品九九九 | 四虎精品影院4hutv四虎 | 中文字幕日本在线观看 | 欧美成人午夜视频免看 | 狠狠久久 | 色射色| 97成人资源| 久久99在线 | 在线看福利影 | 国产精品免费一级在线观看 | 99亚洲精品 | 日韩天天摸天天澡天天爽视频 | 丁香婷婷影音先锋5566 | 在线观看www. | 久久精品人人做人人看最新章 | 香蕉午夜 | 依人综合网 | 亚洲国产成人久久77 | 97在线免费 | 亚洲欧美在线中文字幕不卡 | 99精品国产成人一区二区在线 | 久久国产免费 | 二区三区 | 99视频全部免费 | 国产四虎精品 | 国语性猛交xxxx乱大交 | 日韩一区二区免费视频 | 久久久精品视频免费观看 | 女人zzzooooxxxx | 欧美一区日韩一区中文字幕页 | 伊人激情网 | 欧美国产成人一区二区三区 | 国产高清一区 | 深夜成人性视频免费看 | 免费国产一区二区在免费观看 |