相信大家也知道中国象棋是什么,这里我们直接上干货。
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>
初步实现单人玩中国象棋