2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > Android studio做中国象棋 等级1(简单单人操作)

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

时间:2022-01-22 04:35:06

相关推荐

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();}//调用一个viewpublic 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));//记号1jihao1 = BitmapFactory.decodeResource(getResources(),R.drawable.jihao1);Jihao1 = imageScale(jihao1,108,108);//记号2jihao2 = BitmapFactory.decodeResource(getResources(),R.drawable.jihao2);Jihao2 = imageScale(jihao2,108,108);//记号3jihao3 = 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;}@Overridepublic 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();}*/}//屏幕更新重写@Overridepublic 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*ipos[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="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid: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>

初步实现单人玩中国象棋

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。