Android studio做中国象棋,等级1(简单单人操作)

相信大家也知道中国象棋是什么,这里我们直接上干货。

1、自定义view(用于绘制棋子)我上一篇文章已经讲过了,不了解的小伙伴可以点击查看

2.好了,我们直接讲解中国象棋的制作过程

首先初始化一个二维数组的棋盘

int[][] qizi = {
        {3, 4, 5, 6, 7, 6, 5, 4, 3},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {0, 2, 0, 0, 0, 0, 0, 2, 0},
        {1, 0, 1, 0, 1, 0, 1, 0, 1},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},

        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {8, 0, 8, 0, 8, 0, 8, 0, 8},
        {0, 9, 0, 0, 0, 0, 0, 9, 0},
        {0, 0, 0, 0, 0, 0, 0, 0, 0},
        {10, 11, 12, 13, 14, 13, 12, 11, 10}
};

1:卒, 2:黑炮, 3:黑车, 4:黑马, 5:黑象, 6:黑士, 7:将 ,0:什么都没有

8:兵, 9:红炮,10:红车, 11:红马, 12:相,13:红士, 14:帅

相当于把屏幕分割成一个二维数组,然后根据数字摆放棋子

 

执行过程:点击屏幕 ——>判断点击位置是否有自己的棋子(是)——>选中该棋子——>

再次点击屏幕——>判断位置是否符合下棋规则(点击位置有对方棋子或空位)——>

可以移动,改变棋盘(数组)。

直接上代码,代码有注释

MainActivity.java


        import androidx.appcompat.app.AppCompatActivity;
        import android.content.Context;
        import android.graphics.Bitmap;
        import android.graphics.BitmapFactory;
        import android.graphics.Canvas;
        import android.graphics.Color;
        import android.graphics.Matrix;
        import android.graphics.Paint;
        import android.media.MediaPlayer;
        import android.os.Bundle;
        import android.util.Log;
        import android.view.Menu;
        import android.view.MotionEvent;
        import android.view.View;
        import android.view.WindowManager;

        import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {

    boolean isSound =true;//是否有声音

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //setContentView(new CustomView1(this));
        getSupportActionBar().hide();
        //去掉最上面的时间、电量
        this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN
                ,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        inttMenuView();

    }
    //调用一个view
    public void  inttMenuView(){
        this.setContentView(new CustomView1(this,this));
    }

    class CustomView1 extends View {
        ComputerTurn computerTurn;

        Paint paint;
        GuiZe guiZe;
        Jiangjun_tishi jiangjun_tishi;
        Bitmap beijing,qipan, hongbing,hongpao, hongju, hongma, hongxiang,hongshi, hongshuai,
                heizu , heipao, heiju, heima, heixiang, heishi, heijiang,huiqi,jihao1,jihao2,jihao3,chuhe;
        Bitmap Beijing,Qipan, HONGbing, HONGpao, HONGju, HONGma, HONGxiang,HONGshi, HONGshuai,
                HEIzu , HEIpao, HEIju, HEIma, HEIxiang, HEIshi,HEIjiang,Huiqi,Jihao1,Jihao2,Jihao3,Chuhe;
        Bitmap yingqi, shuqi;
        boolean caipan = true;  //caipanhei=false; //是否到玩家?
        boolean de = false; //是否已经选择棋子
        int selectqizi = 0;
        int starI, starJ; //当前棋子的开始位置
        int endI, endJ; //当前棋子的目标位置
        int xiangqizhangtai=1;   //1为走棋状态, 2为赢棋状态, 3为输棋状态
        private MediaPlayer zou , chi, jiangjunsheng;
        Canvas canvas;
        ArrayList<ArrayList<Integer>> fupan=new ArrayList<>();
        int[][] qizi={
                { 3, 4, 5, 6, 7, 6, 5, 4, 3},
                { 0, 0, 0, 0, 0, 0, 0, 0, 0},
                { 0, 2, 0, 0, 0, 0, 0, 2, 0},
                { 1, 0, 1, 0, 1, 0, 1, 0, 1},
                { 0, 0, 0, 0, 0, 0, 0, 0, 0},

                { 0, 0, 0, 0, 0, 0, 0, 0, 0},
                { 8, 0, 8, 0, 8, 0, 8, 0, 8},
                { 0, 9, 0, 0, 0, 0, 0, 9, 0},
                { 0, 0, 0, 0, 0, 0, 0, 0, 0},
                {10,11,12,13,14,13,12,11,10}
        };
        public  int i = 0;

        public boolean b = false;

        public CustomView1(Context context, MainActivity zhujiemian) {
            super(context);
            //this.mainActivity = mainActivity;

            zou = MediaPlayer.create(this.getContext(),R.raw.qisheng);
            chi = MediaPlayer.create(this.getContext(),R.raw.chi);
            jiangjunsheng = MediaPlayer.create(this.getContext(),R.raw.jiangjun);
            fupan();
            initialize();
        }

        //初始化棋子当前数据保存用   //复盘数组
        public void fupan(){
            ArrayList<Integer> p=new ArrayList<>(); //当前数组
            for(int i=0; i<10;i++) {
                for(int j=0; j<9; j++) {
                    p.add(qizi[i][j]);
                }
            }
            fupan.add(p);

        }
        //获取图片
        public void initialize(){
            paint=new Paint();//设置一个笔刷大小是3的黄色的画笔
            paint.setColor(Color.YELLOW);
            //背景
            beijing = BitmapFactory.decodeResource(getResources(),R.drawable.beijing);
            Beijing = imageScale(beijing,1080,2200);

            //棋盘
            qipan= BitmapFactory.decodeResource(getResources(),R.drawable.qipan);
            Qipan= imageScale(qipan,1080,1125);

            //红兵
            hongbing = BitmapFactory.decodeResource(getResources(),R.drawable.hongbing);
            HONGbing = imageScale(hongbing,108,108);

            //红炮
            hongpao= BitmapFactory.decodeResource(getResources(),R.drawable.hongpao);
            HONGpao = imageScale(hongpao,108,108);

            //红车
            hongju = BitmapFactory.decodeResource(getResources(),R.drawable.hongju);
            HONGju = imageScale(hongju,108,108);

            //红马
            hongma = BitmapFactory.decodeResource(getResources(),R.drawable.hongma);
            HONGma = imageScale(hongma,108,108);

            //红相
            hongxiang = BitmapFactory.decodeResource(getResources(),R.drawable.hongxiang);
            HONGxiang = imageScale(hongxiang,108,108);

            //红士
            hongshi = BitmapFactory.decodeResource(getResources(),R.drawable.hongshi);
            HONGshi = imageScale(hongshi,108,108);

            //红帅
            hongshuai = BitmapFactory.decodeResource(getResources(),R.drawable.hongshuai);
            HONGshuai = imageScale(hongshuai,108,108);


            //黑卒
            heizu = BitmapFactory.decodeResource(getResources(),R.drawable.heizu);
            HEIzu = imageScale(heizu,108,108);

            //黑炮
            heipao= BitmapFactory.decodeResource(getResources(),R.drawable.heipao);
            HEIpao = imageScale(heipao,108,108);

            //黑车
            heiju = BitmapFactory.decodeResource(getResources(),R.drawable.heiju);
            HEIju = imageScale(heiju,108,108);

            //黑马
            heima = BitmapFactory.decodeResource(getResources(),R.drawable.heima);
            HEIma = imageScale(heima,108,108);

            //黑相
            heixiang = BitmapFactory.decodeResource(getResources(),R.drawable.heixiang);
            HEIxiang = imageScale(heixiang,108,108);

            //黑士
            heishi = BitmapFactory.decodeResource(getResources(),R.drawable.heishi);
            HEIshi = imageScale(heishi,108,108);

            //黑将
            heijiang = BitmapFactory.decodeResource(getResources(),R.drawable.heijiang);
            HEIjiang = imageScale(heijiang,108,108);

            //悔棋
            huiqi = BitmapFactory.decodeResource(getResources(),R.drawable.huiqi);
            Huiqi = imageScale(huiqi, (int) (huiqi.getWidth()*0.8), (int) (huiqi.getHeight()*0.8));

            //记号1
            jihao1 = BitmapFactory.decodeResource(getResources(),R.drawable.jihao1);
            Jihao1 = imageScale(jihao1,108,108);

            //记号2
            jihao2 = BitmapFactory.decodeResource(getResources(),R.drawable.jihao2);
            Jihao2 = imageScale(jihao2,108,108);

            //记号3
            jihao3 = BitmapFactory.decodeResource(getResources(),R.drawable.jihao3);
            Jihao3 = imageScale(jihao3,108,108);

            //汉界楚河
            chuhe = BitmapFactory.decodeResource(getResources(),R.drawable.chuhe);
            Chuhe= imageScale(chuhe,862,108);

            //赢棋
            yingqi = BitmapFactory.decodeResource(getResources(),R.drawable.yingqi);

            //输棋
            shuqi = BitmapFactory.decodeResource(getResources(),R.drawable.shuqi);

        }
        //棋子图片设置大小
        public  Bitmap imageScale(Bitmap qipan,int dst_w, int dst_h){
            int src_w=qipan.getWidth();
            int src_h=qipan.getHeight();
            float scale_w=((float) dst_w)/src_w;
            float scale_h=((float) dst_h)/src_h;
            Matrix matrix=new Matrix();
            matrix.postScale(scale_w,scale_h);
            Bitmap Qipan=Bitmap.createBitmap(qipan,0,0,src_w,src_h,matrix,true);
            return  Qipan;
        }

        @Override
        public void onDraw(Canvas canvas){

            canvas.drawColor(Color.WHITE);
            //canvas.drawCircle(50,1420,10,paint);
            canvas.drawBitmap(Beijing,0,0,null);
            canvas.drawBitmap(Qipan,0,476,null);
           // canvas.drawBitmap(Huiqi,100,1500,null);
            canvas.drawBitmap(Huiqi,750,1650,null);

            //绘制红色填充矩形
            paint.setColor(Color.RED);//设置画笔颜色

            paint.setColor(Color.RED);//设置画笔颜色
            paint.setStrokeWidth(3);//设置线的粗细
            for(int i=0;i<10;i++)//画横线
            {
                canvas.drawLine(108,560 + 108*i, 108 +108*8, 560 + 108*i, paint);
            }

            for(int i=0;i<9;i++)//画竖线
            {
                canvas.drawLine(108+108*i,560, 108+108*i, 560+108*9, paint);
            }
            canvas.drawLine(122+108*8,546, 122+108*8, 14+560+108*9, paint);
            canvas.drawLine(94,546, 94, 14+560+108*9, paint);

            canvas.drawLine(94,546, 14+108 +108*8, 546, paint);
            canvas.drawLine(94,14+560 + 108*9, 14+108 +108*8, 14+560 + 108*9, paint);

            //九宫斜线
            canvas.drawLine(108+108*3,560, 108+108*5, 560 + 108*2, paint);
            canvas.drawLine(108+108*5,560 , 108+108*3, 560 + 108*2, paint);
            canvas.drawLine(108+108*3,560+108*7, 108+108*5, 560 + 108*9, paint);
            canvas.drawLine(108*6,560+108*7 , 108*4, 560 + 108*9, paint);

            //兵炮记号
            canvas.drawBitmap(Jihao2,52+108,560-56+108*2,null);
            canvas.drawBitmap(Jihao2,52+108*7,560-56+108*2,null);
            canvas.drawBitmap(Jihao2,52+108,560-56+108*7,null);
            canvas.drawBitmap(Jihao2,52+108*7,560-56+108*7,null);

            canvas.drawBitmap(Jihao2,52+108*2,560-56+108*3,null);
            canvas.drawBitmap(Jihao2,52+108*4,560-56+108*3,null);
            canvas.drawBitmap(Jihao2,52+108*6,560-56+108*3,null);

            canvas.drawBitmap(Jihao2,52+108*2,560-56+108*6,null);
            canvas.drawBitmap(Jihao2,52+108*4,560-56+108*6,null);
            canvas.drawBitmap(Jihao2,52+108*6,560-56+108*6,null);

            canvas.drawBitmap(Jihao1,52,560-56+108*3,null);
            canvas.drawBitmap(Jihao1,52,560-56+108*6,null);
            canvas.drawBitmap(Jihao3,52+108*8,560-56+108*3,null);
            canvas.drawBitmap(Jihao3,52+108*8,560-56+108*6,null);

            //楚河
            canvas.drawBitmap(Chuhe,109,560+108*4,null);


            for(int i=0;i<qizi.length;i++){
                for(int j=0;j<qizi[i].length;j++){
                    if(qizi[i][j]!=0){
                        if(qizi[i][j]==1){
                            canvas.drawBitmap(HEIzu,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==2){
                            canvas.drawBitmap(HEIpao,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==3){
                            canvas.drawBitmap(HEIju,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==4){
                            canvas.drawBitmap(HEIma,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==5){
                            canvas.drawBitmap(HEIxiang,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==6){
                            canvas.drawBitmap(HEIshi,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==7){
                            canvas.drawBitmap(HEIjiang,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==8){
                            canvas.drawBitmap(HONGbing,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==9){
                            canvas.drawBitmap(HONGpao,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==10){
                            canvas.drawBitmap(HONGju,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==11){
                            canvas.drawBitmap(HONGma,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==12){
                            canvas.drawBitmap(HONGxiang,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==13){
                            canvas.drawBitmap(HONGshi,54+j*108,560-54+108*i,null);
                        }

                        else if(qizi[i][j]==14){
                            canvas.drawBitmap(HONGshuai,54+j*108,560-54+108*i,null);
                        }

                    }
                }
            }
            if(xiangqizhangtai==2){
                canvas.drawBitmap(yingqi,244,400,null);
            }
            else if(xiangqizhangtai==3){
                canvas.drawBitmap(shuqi,244,400,null);
            }

          /*  if (b && xiangqizhangtai != 2 && xiangqizhangtai!=3){

                b =false;

               *//* if(!caipan){
                    //获取一个最好走法
                    ChessMove cm = computerTurn.searchAGoodMove();
                    //随机获取一个走法
                    //ChessMove cm=computerTurn.searchAGoodMove2();

                    if (qizi[cm.toX][cm.toY] > 7) {
                        qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子
                        qizi[cm.fromX][cm.fromY] = 0;
                        boolean hei_jiang = jiangjun_tishi.hei_jiangjun(qizi);
                        if (hei_jiang) {
                            jiangjunsheng.start();
                        } else {
                            chi.start();
                        }
                    } else {
                        qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子
                        qizi[cm.fromX][cm.fromY] = 0;
                        boolean hei_jiang = jiangjun_tishi.hei_jiangjun(qizi);
                        if (hei_jiang) {
                            jiangjunsheng.start();
                        } else {
                            zou.start();
                        }
                    }
                    // caipan = true;//恢复玩家响应
                    fupan(); //保存当前棋盘数据`    `
                    ComputerTurn computerTurn2 = new ComputerTurn(qizi);
                    boolean hongqi_beijiangsi2 = computerTurn2.hongqi_beijiangsi();
                    if (hongqi_beijiangsi2) {
                        xiangqizhangtai = 3;
                    }

                   // caipan = true;//恢复玩家响应
                    invalidate();

                }
*//*

            }
            else {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


                caipan = true;
                invalidate();
            }
*/


        }


        //屏幕更新重写
        @Override
        public boolean onTouchEvent(MotionEvent event){

                if(event.getAction()==MotionEvent.ACTION_DOWN){ //鼠标按下键

                    if(event.getX()>54 && event.getX()<=1026
                            && event.getY()>506 && event.getY()<=506+108*10){
                        //赢了
                        if(xiangqizhangtai==2){

                        }
                        //输了
                        else if(xiangqizhangtai==3){

                        }
                        //下棋状态
                        else if(xiangqizhangtai==1) {

                            if (caipan == true) { //是否到红棋状态
                                System.out.println("111111111111");
                                int i = -1, j = -1;
                                int[] pos = getPos(event);
                                i = pos[0];
                                j = pos[1];
                                if (de == false) {//还没有选中棋子
                                    if (qizi[i][j] != 0) { //点击的位置有棋子
                                        if (qizi[i][j] > 7) {
                                            selectqizi = qizi[i][j];
                                            de = true; //标记已经选择棋子
                                            starI = i;
                                            starJ = j;
                                        }
                                    }

                                } else { //之前选中过棋子
                                    if (qizi[i][j] != 0) { //点击的位置有棋子
                                        if (qizi[i][j] > 7) { // 选中的时自己的棋子
                                            selectqizi = qizi[i][j]; //将该棋子设为选中棋子
                                            starI = i;
                                            starJ = j;
                                        } else if (qizi[i][j] > 0 && qizi[i][j] <= 7) { //如果是对方棋子
                                            endI = i;
                                            endJ = j;

                                            guiZe = new GuiZe();
                                            boolean canMove = guiZe.canMove(qizi, starI, starJ, endI, endJ);
                                            if (canMove) { //可以移动
                                                caipan = false;
                                                //caipanhei=!caipanhei;

                                                if (qizi[endI][endJ] != 7 || qizi[endI][endJ] != 14) {
                                                    qizi[endI][endJ] = qizi[starI][starJ];
                                                    qizi[starI][starJ] = 0;

                                                    //还原始状态
                                                    starI = -1;
                                                    starJ = -1;
                                                    endI = -1;
                                                    endJ = -1;
                                                    de = false; //当前没有选中棋子
                                                    fupan(); //保存当前棋盘数据

                                                }
                                            }
                                        }

                                    }

                                    else {// 点击的位置没有棋子
                                        endI = i;
                                        endJ = j;
                                        guiZe = new GuiZe();
                                        boolean canMove = guiZe.canMove(qizi, starI, starJ, endI, endJ);
                                        System.out.println("1!!");
                                        if (canMove) { //可以移动
                                            caipan = false;
                                            // caipanhei=!caipanhei;
                                            if (qizi[endI][endJ] != 7 || qizi[endI][endJ] != 14) {
                                                qizi[endI][endJ] = qizi[starI][starJ];
                                                qizi[starI][starJ] = 0;

                                                //还原始状态
                                                starI = -1;
                                                starJ = -1;
                                                endI = -1;
                                                endJ = -1;
                                                de = false; //当前没有选中棋子
                                                fupan(); //保存当前棋盘数据

                                            }

                                        }
                                    }
                                }
                            }

                            else { //是否到黑棋状态
                                System.out.println("2222222222222222222");
                                int i = -1, j = -1;
                                int[] pos = getPos(event);
                                i = pos[0];
                                j = pos[1];
                                if (de == false) {//还没有选中棋子
                                    if (qizi[i][j] != 0) { //点击的位置有棋子
                                        if (qizi[i][j] <= 7) {
                                            selectqizi = qizi[i][j];
                                            de = true; //标记已经选择棋子
                                            starI = i;
                                            starJ = j;
                                        }
                                    }

                                } else { //之前选中过棋子
                                    if (qizi[i][j] != 0) { //点击的位置有棋子
                                        if (qizi[i][j] <= 7) { // 选中的时自己的棋子
                                            selectqizi = qizi[i][j]; //将该棋子设为选中棋子
                                            starI = i;
                                            starJ = j;
                                        } else if (qizi[i][j] > 7) { //如果是对方棋子
                                            endI = i;
                                            endJ = j;

                                            guiZe = new GuiZe();
                                            boolean canMove = guiZe.canMove(qizi, starI, starJ, endI, endJ);
                                            if (canMove) { //可以移动
                                                caipan = true;
                                                //caipanhei=!caipanhei;

                                                if (qizi[endI][endJ] != 7 || qizi[endI][endJ] != 14) {
                                                    qizi[endI][endJ] = qizi[starI][starJ];
                                                    qizi[starI][starJ] = 0;

                                                    //还原始状态
                                                    starI = -1;
                                                    starJ = -1;
                                                    endI = -1;
                                                    endJ = -1;
                                                    de = false; //当前没有选中棋子
                                                    fupan(); //保存当前棋盘数据



                                                }
                                            }
                                        }

                                    }

                                    else {// 点击的位置没有棋子
                                        endI = i;
                                        endJ = j;
                                        guiZe = new GuiZe();
                                        boolean canMove = guiZe.canMove(qizi, starI, starJ, endI, endJ);
                                        System.out.println("1!!");
                                        if (canMove) { //可以移动
                                            caipan = true;
                                            // caipanhei=!caipanhei;
                                            if (qizi[endI][endJ] != 7 || qizi[endI][endJ] != 14) {
                                                qizi[endI][endJ] = qizi[starI][starJ];
                                                qizi[starI][starJ] = 0;

                                                //还原始状态
                                                starI = -1;
                                                starJ = -1;
                                                endI = -1;
                                                endJ = -1;
                                                de = false; //当前没有选中棋子
                                                fupan(); //保存当前棋盘数据


                                            }

                                        }
                                    }
                                }
                            }

                        }

                    }
                    //悔棋调用
                    else if(event.getX()>750 && event.getX()<750+Huiqi.getWidth()
                            && event.getY()>1650 && event.getY()<1650+Huiqi.getHeight()){

                        if(fupan.size()>1 && caipan==true){
                            huiqi();
                            huiqi();//悔棋方法
                        }
                    }
                    invalidate();
                }

            return true;
            //return super.onTouchEvent(event);
        }

        //悔棋
        public void huiqi() {
            if (fupan.size() > 1) {
                int n = 0;
                fupan.remove(fupan.size() - 1);  //删除复盘数组中的最后一步
                for (int i = 0; i < 10; i++) {
                    for (int j = 0; j < 9; j++) {
                        qizi[i][j] = fupan.get(fupan.size() - 1).get(n++);
                    }
                }
            }
        }

        //获取点击的位置(坐标)
        public int[] getPos(MotionEvent e){
            int[] pos = new int[2];
            double x=e.getX();//点击位置的x坐标
            double y=e.getY();//点击位置的y坐标
            if(x>54 && x<=54+108*9 && y>506 && y<=506+108*10){
                //点击棋盘时

                pos[0]=Math.round((int)((y-506)/108)); //10+j*122   200+122*i
                pos[1]=Math.round((int)((x-54)/108));
            }
            else {
                pos[0] = -1;
                pos[1] = -1;
            }
            return pos;//返回坐标数组
        }

    }
}

规则 Guize.java



class GuiZe {
    // 判断棋子是否在棋盘中的数组
    public static short ccInBoard[]=new short[] {
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };

    // 判断棋子是否在九宫的数组
    public static short ccInFort[] = {
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
            0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    };

    Jiangjun_tishi jiangjun_tishi = new Jiangjun_tishi();
    public boolean canMove(int[][] qizi, int fromY, int fromX, int toY, int toX){
        int i=0;
        int j=0;
        int qiID;//起始位置的棋子类型
        int muID;//目标位置
        if(toX<0){ //出左边界
            return false;
        }
        if(toX>8){//出右边界
            return false;
        }
        if(toY<0){//出上边界
            return false;
        }
        if(toY>9){//出下边界
            return false;
        }
        if(fromX==toX && fromY==toY){//目标位置与起始位置相同
            return false;
        }
        qiID = qizi[fromY][fromX];//起始棋子
        muID = qizi[toY][toX];//棋子目标位置

        switch (qiID){
            case 7: //黑将
                if(toY>2 || toX<3 || toX>5){ //只能走在九宫格
                    return false;
                }
                if((Math.abs(fromY-toY)+ Math.abs(toX-fromX))>1){ //只能走一步
                    return false;
                }
                if(qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;

                break;

            case 6: //黒士
                if(toY>2 || toX<3 || toX>5){ //只能在九宫格
                    return false;
                }
                if(Math.abs(fromX-toX)!=1 || Math.abs(toY-fromY)!=1){
                    return false;
                }
                if(qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;

            case 5: //黑象
                if(toY>4){//不过河
                    return false;
                }
                if(Math.abs(fromX-toX)!=2 || Math.abs(fromY-toY)!=2){
                    return false;
                }
                if(qizi[(fromY+toY)/2][(fromX+toX)/2]!=0){
                    return false;
                }
                if(qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            case 1: //黑卒
                if(toY<fromY){ //不回头
                    return false;
                }
                if(fromY<5 && fromY==toY){ //过河前只能直走
                    return false;
                }
                if(toY-fromY+ Math.abs(toX-fromX)>1){ //只走一步直线
                    return false;
                }
                if(qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            case 3: //黑车
                if(qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                if(fromY!=toY && fromX!=toX){  //只走直线
                    return false;
                }
                if(fromY == toY){  //走横线
                    if(fromX<toX){  //向右走
                        for(i = fromX+1; i<toX;i++){ //检查中间是否有棋子
                            if(qizi[fromY][i]!=0){
                                return false;
                            }
                        }
                    }
                    else{  //向左走
                        for(i = toX+1; i<fromX; i++){  //检查中间是否有棋子
                            if(qizi[fromY][i]!=0){
                                return  false;
                            }
                        }
                    }
                }
                else{  //走竖线
                    if(fromY<toY){ //右走
                        for(j = fromY+1; j < toY; j++){
                            if(qizi[j][fromX]!=0){
                                return false;
                            }
                        }
                    }
                    else{  //向左走
                        for(j =toY+1; j<fromY; j++){
                            if(qizi[j][fromX]!=0){
                                return  false;
                            }
                        }
                    }
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;

                break;
            case 4: //黑马
                if(!((Math.abs(toX-fromX)==1 && Math.abs(toY-fromY)==2)
                        || (Math.abs(toX-fromX)==2 && Math.abs(toY-fromY)==1))){
                    return false; //走的不是日字
                }
                if(toX-fromX==2){ //向右移动
                    i = fromX+1;
                    j=fromY;
                }
                else if(fromX-toX==2){ //向左移动
                    i = fromX-1;
                    j = fromY;
                }
                else if(toY - fromY ==2){//向下移动
                    i=fromX;
                    j=fromY+1;
                }
                else if(fromY-toY==2){ //向上移动
                    i=fromX;
                    j=fromY-1;
                }
                if(qizi[j][i] != 0){
                    return false; //绊马脚
                }
                if(qizi[fromY][fromX]==4 && qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            case 2: //黑炮
                if(qizi[fromY][fromX]==2 && qizi[toY][toX]>=1&&qizi[toY][toX]<=7){
                    return false;
                }
                if(fromY!=toY && fromX!=toX){ //走直线
                    return false;
                }
                if(qizi[toY][toX]==0){
                    if(fromY == toY){ // 横线直走
                        if(fromX<toX){ //向右走
                            for(i=fromX+1; i<toX; i++){
                                if(qizi[fromY][i]!=0){
                                    return false;
                                }
                            }
                        }
                        else{ //向左走
                            for(i=toX+1; i<fromX;i++){
                                if(qizi[fromY][i]!=0){
                                    return false;
                                }
                            }
                        }
                    }
                    else{ //竖线直走
                        if(fromY<toY){  //向下走
                            for(j =fromY+1; j<toY;j++){
                                if(qizi[j][fromX]!=0){
                                    return false;
                                }
                            }
                        }
                        else{ //向上走
                            for(j=toY+1;j<fromY;j++){
                                if(qizi[j][fromX]!=0){
                                    return false;
                                }
                            }
                        }
                    }
                }
                else{  //吃子
                    int count=0;
                    if(fromY == toY){  //走的横线
                        if(fromX<toX){//向右
                            for(i=fromX+1;i<toX;i++){
                                if(qizi[fromY][i]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }
                        else{ //向左走
                            for(i=toX+1;i<fromX;i++){
                                if(qizi[fromY][i]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }

                    }
                    else{ //走竖线
                        if(fromY<toY){ //向下走
                            for(j=fromY+1;j<toY;j++){
                                if(qizi[j][fromX]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }
                        else{//向上走
                            for(j=toY+1; j<fromY;j++){
                                if(qizi[j][fromX]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }
                    }
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hong_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;

            case 14:   //红帅
                if(toY<7 || toX>5 || toX<3){ //只能在九宫格
                    return false;
                }
                if(Math.abs(fromX-toX)+ Math.abs(fromY-toY)>1){ //只能走一步
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;

            case 10: //红车
                if(qizi[toY][toX]>=8&&qizi[toY][toX]<=14){
                    return false;
                }
                if(fromY!=toY && fromX!=toX){  //只走直线
                    return false;
                }
                if(fromY == toY){  //走横线
                    if(fromX<toX){  //向右走
                        for(i = fromX+1; i<toX;i++){ //检查中间是否有棋子
                            if(qizi[fromY][i]!=0){
                                return false;
                            }
                        }
                    }
                    else{  //向左走
                        for(i = toX+1; i<fromX; i++){  //检查中间是否有棋子
                            if(qizi[fromY][i]!=0){
                                return  false;
                            }
                        }
                    }
                }
                else if(fromX == toX){  //走竖线
                    if(fromY<toY){ //右走
                        for(j = fromY+1; j < toY; j++){
                            if(qizi[j][fromX]!=0){
                                return false;
                            }
                        }
                    }
                    else{  //向左走
                        for(j =toY+1; j<fromY; j++){
                            if(qizi[j][fromX]!=0){
                                return  false;
                            }
                        }
                    }
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;

                break;

            case 11: //红马
                if(!((Math.abs(toX-fromX)==1 && Math.abs(toY-fromY)==2)
                        || (Math.abs(toX-fromX)==2 && Math.abs(toY-fromY)==1))){
                    return false; //走的不是日字
                }
                if(toX-fromX==2){ //向右移动
                    i = fromX+1;
                    j=fromY;
                }
                else if(fromX-toX==2){ //向左移动
                    i = fromX-1;
                    j = fromY;
                }
                else if(toY - fromY ==2){//向下移动
                    i=fromX;
                    j=fromY+1;
                }
                else if(fromY-toY==2){ //向上移动
                    i=fromX;
                    j=fromY-1;
                }
                if(qizi[j][i] != 0){
                    return false; //绊马脚
                }
                if(qizi[toY][toX]>=8&&qizi[toY][toX]<=14){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;

            case 9: //红炮
                if(qizi[toY][toX]>=8&&qizi[toY][toX]<=14){
                    return false;
                }
                if(fromY!=toY && fromX!=toX){ //走直线
                    return false;
                }
                if(qizi[toY][toX]==0){
                    if(fromY == toY){ // 横线直走
                        if(fromX<toX){ //向右走
                            for(i=fromX+1; i<toX; i++){
                                if(qizi[fromY][i]!=0){
                                    return false;
                                }
                            }
                        }
                        else{ //向左走
                            for(i=toX+1; i<fromX;i++){
                                if(qizi[fromY][i]!=0){
                                    return false;
                                }
                            }
                        }
                    }
                    else{ //竖线直走
                        if(fromY<toY){  //向下走
                            for(j =fromY+1; j<toY;j++){
                                if(qizi[j][fromX]!=0){
                                    return false;
                                }
                            }
                        }
                        else{ //向上走
                            for(j=toY+1;j<fromY;j++){
                                if(qizi[j][fromX]!=0){
                                    return false;
                                }
                            }
                        }
                    }
                }
                else{  //吃子
                    int count=0;
                    if(fromY == toY){  //走的横线
                        if(fromX<toX){//向右
                            for(i=fromX+1;i<toX;i++){
                                if(qizi[fromY][i]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }
                        else{ //向左走
                            for(i=toX+1;i<fromX;i++){
                                if(qizi[fromY][i]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }

                    }
                    else{ //走竖线
                        if(fromY<toY){ //向下走
                            for(j=fromY+1;j<toY;j++){
                                if(qizi[j][fromX]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }
                        else{//向上走
                            for(j=toY+1; j<fromY;j++){
                                if(qizi[j][fromX]!=0){
                                    count++;
                                }
                            }
                            if(count!=1){
                                return false;
                            }
                        }
                    }
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            case 13: //红士
                if(toY<7 || toX<3 || toX>5){ //只能在九宫格
                    return false;
                }
                if(Math.abs(fromX-toX)!=1 || Math.abs(toY-fromY)!=1){
                    return false;
                }
                if(qizi[toY][toX]>=8&&qizi[toY][toX]<=14){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            case 12: //红相
                if(toY<5){//不过河
                    return false;
                }
                if(Math.abs(fromX-toX)!=2 || Math.abs(fromY-toY)!=2){
                    return false;
                }
                if(qizi[(fromY+toY)/2][(fromX+toX)/2]!=0){
                    return false;
                }
                if(qizi[toY][toX]>=8&&qizi[toY][toX]<=14){
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            case 8: //红兵
                if(toY>fromY){//不回头
                    return false;
                }
                if(fromY>4 && fromY==toY){
                    return false;//不让走
                }
                if(fromY-toY+ Math.abs(toX-fromX)>1){ //只能走一步直线
                    return false;
                }
                qizi[toY][toX]=qiID;
                qizi[fromY][fromX]=0;
                if(jiangjun_tishi.hei_jiangjun(qizi)){
                    qizi[fromY][fromX]=qiID;
                    qizi[toY][toX]=muID;
                    return false;
                }
                qizi[fromY][fromX]=qiID;
                qizi[toY][toX]=muID;
                break;
            default:
                break;
        }

        return  true;
    }

}

位置类  ChessMove.java


public class ChessMove {
    int ChessID; //表明什么棋子
    int fromX; //起始坐标
    int fromY;
    int toX; //目标坐标
    int toY;
    int endID;
   // int score; //值,估计值
    public ChessMove(int ChessID, int fromX, int fromY, int toX, int toY, int endID){ //顺序懒得改了
        this.ChessID = ChessID;
        this.fromX = fromX;
        this.fromY = fromY;
        this.toX = toX;
        this.toY = toY;
        this.endID = endID;
        //this.score = score;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

初步实现单人玩中国象棋

  • 1
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Android 《开发》

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值