android studio开发下落四子棋
生活随笔
收集整理的這篇文章主要介紹了
android studio开发下落四子棋
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一次使用Android Studio時你應該知道的一切配置
http://www.cnblogs.com/smyhvae/p/4390905.html
練習:能夠畫出9*9格,有兩個棋手A,B,交替輸入列數0-9,由于重力原理,輸入這個列下幾行沒有棋子,則自動下落;A顯示棋子是X,B顯示棋子O,要求當出現四連勝利!A和B交替進行;
MainActivity源碼:
package com.imooc.wuziqi;import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem;public class MainActivity extends AppCompatActivity {public wuziqipanel wuziqipanel;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);wuziqipanel=(wuziqipanel) findViewById(R.id.id_wuziqi);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main,menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id=item.getItemId();if(id==R.id.action_settings){wuziqipanel.start();return true;}return super.onOptionsItemSelected(item);} }自定義view源碼?
package com.imooc.wuziqi;import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.IntegerRes; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.LinearInterpolator; import android.view.animation.TranslateAnimation; import android.widget.ImageView; import android.widget.Toast;import java.io.FileReader; import java.util.ArrayList; import java.util.List;/*** Created by Administrator on 2018/7/29.*/public class wuziqipanel extends View {private int mpanelWidth;private float mLineHeight;private int MAX_LINE=10;private int MAX_COUNT_IN_COUNT=4;TranslateAnimation translateAnimation=null;private Paint mpaint=new Paint();private Bitmap mwhitepiece;private Bitmap mbiackpiece;private float ratiopieceoflineheight=3*1.0f/4; // wuziqipanel wuziqi=new wuziqipanel(); // private ImageView greenImage = null;private boolean miswhite=true;private ArrayList<Point> mwhitearray=new ArrayList<>();private ArrayList<Point> Mblackarray=new ArrayList<>();private boolean misgameover;private boolean miswhitewinner;public wuziqipanel(Context context, AttributeSet attrs) {super(context, attrs); // setBackgroundColor(0x44ff0000);init();}private void init() {mpaint.setColor(0x88000000);mpaint.setAntiAlias(true);mpaint.setDither(true);mpaint.setStyle(Paint.Style.STROKE);mwhitepiece= BitmapFactory.decodeResource(getResources(),R.drawable.stone_w2);mbiackpiece= BitmapFactory.decodeResource(getResources(),R.drawable.stone_b1);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthSize=MeasureSpec.getSize(widthMeasureSpec);int widtfMode=MeasureSpec.getMode(widthMeasureSpec);int heightSize=MeasureSpec.getSize(heightMeasureSpec);int heightMode=MeasureSpec.getMode(heightMeasureSpec);int width=Math.min(widthSize,heightSize);if(widtfMode==MeasureSpec.UNSPECIFIED){width=heightSize;}else if(heightMode==MeasureSpec.UNSPECIFIED){width=widthSize;}setMeasuredDimension(width,width);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mpanelWidth = w;mLineHeight=mpanelWidth*1.0f/MAX_LINE;int piecewidth=(int)(mLineHeight*ratiopieceoflineheight);mwhitepiece=Bitmap.createScaledBitmap(mwhitepiece,piecewidth,piecewidth,false);mbiackpiece=Bitmap.createScaledBitmap(mbiackpiece,piecewidth,piecewidth,false);}public void startani(int fir, int last, final Point point){ValueAnimator animator = ValueAnimator.ofInt(fir,last);animator.setDuration((last-fir)*100);animator.setRepeatCount(0); // animator.setRepeatMode(ValueAnimator.r);animator.setInterpolator(new LinearInterpolator());animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {int by = (int) animation.getAnimatedValue();point.y=by;invalidate();}});animator.start();}public boolean onTouchEvent(MotionEvent event) {if(misgameover){return false;}int action=event.getAction();if(action==MotionEvent.ACTION_UP){float x=event.getX();float y=event.getY();Point p = getvalidpoint(x,y);if(Mblackarray.contains(p)||mwhitearray.contains(p))return false;int i;int n=p.x;int m=p.y;for ( i = p.y; i <=8 ; i++) {p.set(n,i);if(mwhitearray.contains(p)||Mblackarray.contains(p)){break;}else{p.y=i;}}p.y=i-1;if(miswhite){mwhitearray.add(p);wuziqipanel.this.setClickable(false);startani(m,p.y,p);wuziqipanel.this.setClickable(true);miswhite=!miswhite;}else{Mblackarray.add(p);wuziqipanel.this.setClickable(false);startani(m,p.y,p);wuziqipanel.this.setClickable(true);miswhite=!miswhite;}invalidate();}return true;}private Point getvalidpoint(float x, float y) {return new Point((int)((x-mLineHeight/2)/mLineHeight),(int)(y/mLineHeight));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);drawBoard(canvas);drawpieces(canvas);checkgameover();}private void checkgameover() {boolean whitewin= checkfiveinline(mwhitearray);boolean blackwin= checkfiveinline(Mblackarray);if(whitewin||blackwin){misgameover=true;miswhitewinner=whitewin;String text=miswhitewinner?"白棋勝利":"黑棋勝利";Toast.makeText(getContext(),text,Toast.LENGTH_SHORT).show();}}private boolean checkfiveinline(List<Point> points) {for(Point p:points){int x=p.x;int y=p.y;boolean win= checkhorizontal(x,y,points);if(win)return true;win= checkvertical(x,y,points);if(win)return true;win= checkleftdiagonal(x,y,points);if(win)return true;win= checkrightdiagonal(x,y,points);if(win)return true;}return false;} //判斷橫向是否成五子private boolean checkhorizontal(int x, int y, List<Point> points) {int count=1;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x-i,y))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x+i,y))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;return false;}private boolean checkvertical(int x, int y, List<Point> points) {int count=1;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x,y-i))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x,y+i))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;return false;}private boolean checkleftdiagonal(int x, int y, List<Point> points) {int count=1;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x-i,y+i))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x+i,y-i))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;return false;}private boolean checkrightdiagonal(int x, int y, List<Point> points) {int count=1;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x-i,y-i))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;for (int i = 1; i <MAX_COUNT_IN_COUNT ; i++) {if(points.contains(new Point(x+i,y+i))){count++;}else{break;}}if(count==MAX_COUNT_IN_COUNT)return true;return false;}private void drawpieces(Canvas canvas) {for (int i = 0,n=mwhitearray.size(); i <n ; i++) {Point whitepoint=mwhitearray.get(i);canvas.drawBitmap(mwhitepiece,(whitepoint.x+1-(ratiopieceoflineheight/2))*mLineHeight,(whitepoint.y+1-(ratiopieceoflineheight/2))*mLineHeight,null);}for (int i = 0,n=Mblackarray.size(); i <n ; i++) {Point blackpoint=Mblackarray.get(i);canvas.drawBitmap(mbiackpiece,(blackpoint.x+1-(ratiopieceoflineheight/2))*mLineHeight,(blackpoint.y+1-(ratiopieceoflineheight/2))*mLineHeight,null);}}private void drawBoard(Canvas canvas) {int w=mpanelWidth;float lineHeight=mLineHeight;for (int i = 0; i <MAX_LINE ; i++) { // int startx=(int)(lineHeight); // int end=(int)(w-lineHeight);int startx=(int)(lineHeight/2);int end=(int)(w-lineHeight/2);int y=(int)((0.5+i)*lineHeight); // 上三行代碼使旗子下在中間// int y=(int)(i*lineHeight);canvas.drawLine(startx,y,end,y,mpaint);canvas.drawLine(y,startx,y,end,mpaint);}} private static final String INSTANCE="instance";private static final String INSTANCE_GAME_OVER="instance_game_over";private static final String INSTANCE_WHITE_ARRAY="instance_white_array";private static final String INSTANCE_BLACK_ARRAY="instance_black_array";@Overrideprotected Parcelable onSaveInstanceState() {Bundle bundle=new Bundle();bundle.putParcelable(INSTANCE,super.onSaveInstanceState());bundle.putBoolean(INSTANCE_GAME_OVER,misgameover);bundle.putParcelableArrayList(INSTANCE_WHITE_ARRAY,mwhitearray);bundle.putParcelableArrayList(INSTANCE_WHITE_ARRAY,Mblackarray);return bundle;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {if(state instanceof Bundle){Bundle bundle=(Bundle)state;misgameover=bundle.getBoolean(INSTANCE_GAME_OVER);mwhitearray=bundle.getParcelableArrayList(INSTANCE_WHITE_ARRAY);Mblackarray=bundle.getParcelableArrayList(INSTANCE_BLACK_ARRAY);super.onRestoreInstanceState(bundle.getParcelable(INSTANCE));return;}super.onRestoreInstanceState(state);}public void start(){mwhitearray.clear();Mblackarray.clear();miswhitewinner=false;misgameover=false;invalidate();} }layout:源碼 <?xml version="1.0" encoding="utf-8"?> <RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@drawable/bg"tools:context="com.imooc.wuziqi.MainActivity"><com.imooc.wuziqi.wuziqipanelandroid:id="@+id/id_wuziqi"android:layout_centerInParent="true"android:layout_width="match_parent"android:layout_height="match_parent"/></RelativeLayout>?
menu:源碼:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"tools:context=".MainActivity"><item android:title="再來一局"android:id="@+id/action_settings"android:orderInCategory="100"app:showAsAction="never"/> </menu> 存在的bug: 1.快速點擊會使棋子下落受阻 2.勝負判定失誤原因:
1.動畫未執行完就傳入點擊事件
2,y坐標未處理就傳入判定方法。
githab源碼地址?
?
?
?
總結
以上是生活随笔為你收集整理的android studio开发下落四子棋的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021年度训练联盟热身训练赛第八场 自
- 下一篇: paj7620移植笔记1