Android--中国象棋

象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码:

贴出主要代码,想要Demo的点击下载:中国象棋Demo

package wyf.ytl;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.media.MediaPlayer;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
 * 该类是整个程序最主要的类,是主游戏的界面
 * 该界面继承自SurfaceView并实现了SurfaceHolder.Callback接口
 * 其中包含了一个刷帧的线程类
 *
 */
public class GameView extends SurfaceView implements SurfaceHolder.Callback{
	private TutorialThread thread;//刷帧的线程
	TimeThread timeThread ;
	ChessActivity activity;//声明Activity的引用
	Bitmap qiPan;//棋盘
	Bitmap qizibackground;//棋子的背景图片
	Bitmap win;//胜利的图片
	Bitmap lost;//失败的图片
	Bitmap ok;//确定按钮
	Bitmap vs;//黑方红方VS的图片
	Bitmap right;//向右的指针
	Bitmap left;//向左的指针
	Bitmap current;//“当前”文字
	Bitmap exit2;//退出按钮图片
	Bitmap sound2;//声音按钮图片
	Bitmap sound3;//当前是否播放了声音
	Bitmap time;//冒号
	Bitmap redtime;//红色冒号
	Bitmap background;//背景图片
	MediaPlayer go;//下棋声音
	Paint paint;//画笔
	boolean caiPan = true;//是否为玩家走棋
	boolean focus = false;//当前是否有选中的棋子
	int selectqizi = 0; //当然选中的棋子

	int startI, startJ;//记录当前棋子的开始位置
	int endI, endJ;//记录当前棋子的目标位置
	Bitmap[] heiZi = new Bitmap[7];//黑子的图片数组
	Bitmap[] hongZi = new Bitmap[7];//红子的图片数组
	Bitmap[] number = new Bitmap[10];//数字的图片数组,用于显示时间
	Bitmap[] redNumber = new Bitmap[10];//红色数字的图片,用于显示时间 

	GuiZe guiZe;//规则类

	int status = 0;//游戏状态。0游戏中,1胜利, 2失败
	int heiTime = 0;//黑方总共思考时间
	int hongTime = 0;//红方总共思考时间 

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

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

	public GameView(Context context,ChessActivity activity) {//构造器
		super(context);
		this.activity = activity;//得到Activity的引用
		getHolder().addCallback(this);
		go  = MediaPlayer.create(this.getContext(), R.raw.go);//加载下棋的声音
		this.thread = new TutorialThread(getHolder(), this);//初始化刷帧线程
		this.timeThread = new TimeThread(this);//初始化思考时间的线程
		init();//初始化所需资源
		guiZe = new GuiZe();//初始化规则类
	}

	public void init(){//初始化方法
		paint = new Paint();//初始化画笔
		qiPan = BitmapFactory.decodeResource(getResources(), R.drawable.qipan);//棋盘图片
		qizibackground = BitmapFactory.decodeResource(getResources(), R.drawable.qizi);//棋子的背景
		win = BitmapFactory.decodeResource(getResources(), R.drawable.win);//胜利的图片
		lost = BitmapFactory.decodeResource(getResources(), R.drawable.lost);//失败的图片
		ok = BitmapFactory.decodeResource(getResources(), R.drawable.ok);//确定按钮图片
		vs = BitmapFactory.decodeResource(getResources(), R.drawable.vs);//vs字样的图片
		right = BitmapFactory.decodeResource(getResources(), R.drawable.right);//向右的指针
		left = BitmapFactory.decodeResource(getResources(), R.drawable.left);//向左的指针
		current = BitmapFactory.decodeResource(getResources(), R.drawable.current);//文字“当前”
		exit2 = BitmapFactory.decodeResource(getResources(), R.drawable.exit2);//退出按钮图片
		sound2 = BitmapFactory.decodeResource(getResources(), R.drawable.sound2);//声音按钮图片
		time = BitmapFactory.decodeResource(getResources(), R.drawable.time);//黑色冒号
		redtime = BitmapFactory.decodeResource(getResources(), R.drawable.redtime);//红色冒号
		sound3 = BitmapFactory.decodeResource(getResources(), R.drawable.sound3);

		heiZi[0] = BitmapFactory.decodeResource(getResources(), R.drawable.heishuai);//黑帅
		heiZi[1] = BitmapFactory.decodeResource(getResources(), R.drawable.heiju);//黑车
		heiZi[2] = BitmapFactory.decodeResource(getResources(), R.drawable.heima);//黑马
		heiZi[3] = BitmapFactory.decodeResource(getResources(), R.drawable.heipao);//黑炮
		heiZi[4] = BitmapFactory.decodeResource(getResources(), R.drawable.heishi);//黑士
		heiZi[5] = BitmapFactory.decodeResource(getResources(), R.drawable.heixiang);//黑象
		heiZi[6] = BitmapFactory.decodeResource(getResources(), R.drawable.heibing);//黑兵

		hongZi[0] = BitmapFactory.decodeResource(getResources(), R.drawable.hongjiang);//红将
		hongZi[1] = BitmapFactory.decodeResource(getResources(), R.drawable.hongju);//红车
		hongZi[2] = BitmapFactory.decodeResource(getResources(), R.drawable.hongma);//红马
		hongZi[3] = BitmapFactory.decodeResource(getResources(), R.drawable.hongpao);//红砲
		hongZi[4] = BitmapFactory.decodeResource(getResources(), R.drawable.hongshi);//红仕
		hongZi[5] = BitmapFactory.decodeResource(getResources(), R.drawable.hongxiang);//红相
		hongZi[6] = BitmapFactory.decodeResource(getResources(), R.drawable.hongzu);//红卒

		number[0] = BitmapFactory.decodeResource(getResources(), R.drawable.number0);//黑色数字0
		number[1] = BitmapFactory.decodeResource(getResources(), R.drawable.number1);//黑色数字1
		number[2] = BitmapFactory.decodeResource(getResources(), R.drawable.number2);//黑色数字2
		number[3] = BitmapFactory.decodeResource(getResources(), R.drawable.number3);//黑色数字3
		number[4] = BitmapFactory.decodeResource(getResources(), R.drawable.number4);//黑色数字4
		number[5] = BitmapFactory.decodeResource(getResources(), R.drawable.number5);//黑色数字5
		number[6] = BitmapFactory.decodeResource(getResources(), R.drawable.number6);//黑色数字6
		number[7] = BitmapFactory.decodeResource(getResources(), R.drawable.number7);//黑色数字7
		number[8] = BitmapFactory.decodeResource(getResources(), R.drawable.number8);//黑色数字8
		number[9] = BitmapFactory.decodeResource(getResources(), R.drawable.number9);//黑色数字9

		redNumber[0] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber0);//红色数字0
		redNumber[1] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber1);//红色数字1
		redNumber[2] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber2);//红色数字2
		redNumber[3] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber3);//红色数字3
		redNumber[4] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber4);//红色数字4
		redNumber[5] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber5);//红色数字5
		redNumber[6] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber6);//红色数字6
		redNumber[7] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber7);//红色数字7
		redNumber[8] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber8);//红色数字8
		redNumber[9] = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber9);//红色数字9

		background = BitmapFactory.decodeResource(getResources(), R.drawable.bacnground);

	}
	/**
	 * 该方法是自己定义的并非重写的
	 * 该方法是死的,只根据数据绘制屏幕
	 */
	public void onDraw(Canvas canvas){//自己写的绘制方法
		canvas.drawColor(Color.WHITE);
		canvas.drawBitmap(background, 0,0, null);//清背景
		canvas.drawBitmap(qiPan, 10, 10, null);//绘制棋盘
		for(int i=0; i<qizi.length; i++){
			for(int j=0; j<qizi[i].length; j++){//绘制棋子
				if(qizi[i][j] != 0){
					canvas.drawBitmap(qizibackground, 9+j*34, 10+i*35, null);//绘制棋子的背景
					if(qizi[i][j] == 1){//为黑帅时
						canvas.drawBitmap(heiZi[0], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 2){//为黑车时
						canvas.drawBitmap(heiZi[1], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 3){//为黑马时
						canvas.drawBitmap(heiZi[2], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 4){//为黑炮时
						canvas.drawBitmap(heiZi[3], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 5){//为黑士时
						canvas.drawBitmap(heiZi[4], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 6){//为黑象时
						canvas.drawBitmap(heiZi[5], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 7){//为黑兵时
						canvas.drawBitmap(heiZi[6], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 8){//为红将时
						canvas.drawBitmap(hongZi[0], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 9){//为红车时
						canvas.drawBitmap(hongZi[1], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 10){//为红马时
						canvas.drawBitmap(hongZi[2], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 11){//为红砲时
						canvas.drawBitmap(hongZi[3], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 12){//为红仕时
						canvas.drawBitmap(hongZi[4], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 13){//为红相时
						canvas.drawBitmap(hongZi[5], 12+j*34, 13+i*35, paint);
					}
					else if(qizi[i][j] == 14){//为红卒时
						canvas.drawBitmap(hongZi[6], 12+j*34, 13+i*35, paint);
					}
				}
			}
		}
		canvas.drawBitmap(vs, 10, 360, paint);//绘制VS背景图
		//绘制黑方的时间
		canvas.drawBitmap(time, 81, 411, paint);//绘制冒号
		int temp = this.heiTime/60;//换算时间
		String timeStr = temp+"";//转换成字符串
		if(timeStr.length()<2){//当不足两位时前面填0
			timeStr = "0" + timeStr;
		}
    	for(int i=0;i<2;i++){//循环绘制时间
    		int tempScore=timeStr.charAt(i)-'0';
    		canvas.drawBitmap(number[tempScore], 65+i*7, 412, paint);
    	}
    	//画分钟
    	temp = this.heiTime%60;
		timeStr = temp+"";//转换成字符串
		if(timeStr.length()<2){
			timeStr = "0" + timeStr;//当长度小于2时在前面添加一个0
		}
    	for(int i=0;i<2;i++){//循环
    		int tempScore=timeStr.charAt(i)-'0';
    		canvas.drawBitmap(number[tempScore], 85+i*7, 412, paint);//绘制
    	}
    	//开始绘制红方时间
		canvas.drawBitmap(this.redtime, 262, 410, paint);//红方的冒号
		int temp2 = this.hongTime/60;//换算时间
		String timeStr2 = temp2+"";//转换成字符串
		if(timeStr2.length()<2){//当不足两位时前面填0
			timeStr2 = "0" + timeStr2;
		}
    	for(int i=0;i<2;i++){//循环绘制时间
    		int tempScore=timeStr2.charAt(i)-'0';
    		canvas.drawBitmap(redNumber[tempScore], 247+i*7, 411, paint);//绘制
    	}
    	//画分钟
    	temp2 = this.hongTime%60;//求出当前的秒数
		timeStr2 = temp2+"";//转换成字符串
		if(timeStr2.length()<2){//不足两位时前面用0补
			timeStr2 = "0" + timeStr2;
		}
    	for(int i=0;i<2;i++){//循环绘制
    		int tempScore=timeStr2.charAt(i)-'0';
    		canvas.drawBitmap(redNumber[tempScore], 267+i*7, 411, paint);//绘制时间数字
    	}
		if(caiPan == true){//当该玩家走棋时,即红方走棋
			canvas.drawBitmap(right, 155, 420, paint);//绘制向右的指针
		}
		else{//黑方走棋,即电脑走棋时
			canvas.drawBitmap(left, 120, 420, paint);//绘制向左的指针
		}

		canvas.drawBitmap(current, 138, 445, paint);//绘制当前文字
		canvas.drawBitmap(sound2, 10, 440, paint);//绘制声音
		if(activity.isSound){//如果正在播放声音
			canvas.drawBitmap(sound3, 80, 452, paint);//绘制
		}

		canvas.drawBitmap(exit2, 250, 440, paint);//绘制退出按钮
		if(status == 1){//当胜利时
			canvas.drawBitmap(win, 85, 150, paint);//绘制胜利图片
			canvas.drawBitmap(ok, 113, 240, paint);
		}
		if(status == 2){//失败后
			canvas.drawBitmap(lost, 85, 150, paint);//绘制失败界面
			canvas.drawBitmap(ok, 113, 236, paint);
		}
	}
	/**
	 * 该方法是游戏主要逻辑接口
	 * 接受玩家输入
	 * 根据点击的位置和当前的游戏状态做出相应的处理
	 * 而当需要切换View时,通过给Activity发送Handler消息来处理
	 * 注意的是只取屏幕被按下的事件
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {//重写的屏幕监听
		if(event.getAction() == MotionEvent.ACTION_DOWN){//只取鼠标按下的事件
			if(event.getX()>10&&event.getX()<10+sound2.getWidth()
					&& event.getY()>440 && event.getY()<440+sound2.getHeight()){//按下了声音按钮
				activity.isSound = !activity.isSound;//声音取反
				if(activity.isSound){//当需要放声音时
					if(activity.gamesound != null){//gamesound不为空时
						if(!activity.gamesound.isPlaying()){//当前没有音乐时
			    			activity.gamesound.start();//播放音乐
			    		}
					}
				}
				else{
					if(activity.gamesound != null){//gamesound不为空时
						if(activity.gamesound.isPlaying()){//当前有音乐时
							activity.gamesound.pause();//停止音乐
						}
					}
				}
			}//end 按下了声音按钮
			if(event.getX()>250&&event.getX()<250+exit2.getWidth()
					&& event.getY()>440 && event.getY()<440+exit2.getHeight()){//按下了退出按钮
				activity.myHandler.sendEmptyMessage(1);//发送消息,切换到MenuView
			}
			if(status == 1){//胜利后
				if(event.getX()>135&&event.getX()<190
						&& event.getY()>249 && event.getY()<269){//点击了确定按钮
					activity.myHandler.sendEmptyMessage(1);//发送消息,切换到MenuView
				}
			}
			else if(status == 2){//失败后
				if(event.getX()>135&&event.getX()<190
						&& event.getY()>245 && event.getY()<265){//点击了确定按钮
					activity.myHandler.sendEmptyMessage(1);//发送消息,切换到MenuView
				}
			}
			/**
			 * 游戏过程中的逻辑处理
			 * 当点击棋盘时,先判断当前是否为玩家走棋,
			 * 然后再判断当然玩家是否已经有选中的棋子,如果没有则选中
			 * 如果之前有选中的棋子,再判断点击的位置是空地、对方棋子还是自己的棋子
			 * 是空地判断是否可走
			 * 是对方棋子同样判断是否可以走,能走自然吃子
			 * 是自己的棋子则选中该棋子
			 */
			else if(status == 0){//游戏中时
				if(event.getX()>10&&event.getX()<310
						&& event.getY()>10 && event.getY()<360){//点击的位置在棋盘内时
						if(caiPan == true){//如果是该玩家走棋
							int i = -1, j = -1;
							int[] pos = getPos(event);//根据坐标换算成所在的行和列
							i = pos[0];
							j = pos[1];
							if(focus == false){//之前没有选中的棋子
								if(qizi[i][j] != 0){//点击的位置有棋子
									if(qizi[i][j] > 7){//点击的是自己的棋子。即下面的黑色棋子
										selectqizi = qizi[i][j];//将该棋子设为选中的棋子
										focus = true;//标记当前有选中的棋子
										startI = i;
										startJ = j;
									}
								}
							}
							else{//之前选中过棋子
								if(qizi[i][j] != 0){//点击的位置有棋子
									if(qizi[i][j] > 7){//如果是自己的棋子.
										selectqizi = qizi[i][j];//将该棋子设为选中的棋子
										startI = i;
										startJ = j;
									}
									else{//如果是对方的棋子
										endI = i;
										endJ = j;//保存该点
										boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ);
										if(canMove){//如果可以移动过去
											caiPan = false;//不让玩家走了
											if(qizi[endI][endJ] == 1 || qizi[endI][endJ] == 8){//如果是“帅”或“将”
												this.success();//胜利了
											}
											else{
												if(activity.isSound){
													go.start();//播放下棋声音
												}
												qizi[endI][endJ] = qizi[startI][startJ];//移动棋子
												qizi[startI][startJ] = 0;//将原来处设空
												startI = -1;
												startJ = -1;
												endI = -1;
												endJ = -1;//还原保存点
												focus = false;//标记当前没有选中棋子

												ChessMove cm = guiZe.searchAGoodMove(qizi);//根据当前局势查询一个最好的走法
												if(activity.isSound){
													go.start();//播放下棋声音
												}
												qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子
												qizi[cm.fromX][cm.fromY] = 0;
												caiPan = true;//恢复玩家响应
											}
										}
									}
								}//end点击的位置有棋子
								else{//如果点击的位置没有棋子
									endI = i;
									endJ = j;
									boolean canMove = guiZe.canMove(qizi, startI, startJ, endI, endJ);//查看是否可走
									if(canMove){//如果可以移动
										caiPan = false;//不让玩家走了
										if(activity.isSound){
											go.start();//播放下棋声音
										}
										qizi[endI][endJ] = qizi[startI][startJ];//移动棋子
										qizi[startI][startJ] = 0;//将原来处置空
										startI = -1;
										startJ = -1;
										endI = -1;
										endJ = -1;//还原保存点
										focus = false;//标志位设false

										ChessMove cm = guiZe.searchAGoodMove(qizi);//得到一步走法
										if(qizi[cm.toX][cm.toY] == 8){//电脑吃了您的将
											status = 2;//切换游戏状态为失败
										}
										if(activity.isSound){//需要播放声音时
											go.start();//播放下棋声音
										}
										qizi[cm.toX][cm.toY] = qizi[cm.fromX][cm.fromY];//移动棋子
										qizi[cm.fromX][cm.fromY] = 0;
										caiPan = true;//恢复玩家响应
									}
								}
							}//end 之前选中过棋子
						}
					}//end点击的位置在棋盘内时
			}//end游戏中时
		}
		return super.onTouchEvent(event);
	}

	public int[] getPos(MotionEvent e){//将坐标换算成数组的维数
		int[] pos = new int[2];
		double x = e.getX();//得到点击位置的x坐标
		double y = e.getY();//得到点击位置的y坐标
		if(x>10 && y>10 && x<10+qiPan.getWidth() && y<10+qiPan.getHeight()){//点击的是棋盘时
			pos[0] = Math.round((float)((y-21)/36));//取得所在的行
			pos[1] = Math.round((float)((x-21)/35));//取得所在的列
		}
		else{//点击的位置不是棋盘时
			pos[0] = -1;//将位置设为不可用
			pos[1] = -1;
		}
		return pos;//将坐标数组返回
	}

	public void success(){//胜利了
		status = 1;//切换到胜利状态
	}

	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height) {
	}

	public void surfaceCreated(SurfaceHolder holder) {//重写的
        this.thread.setFlag(true);
        this.thread.start();//启动刷帧线程
        timeThread.setFlag(true);
        timeThread.start();//启动思考时间的线程
	}

	public void surfaceDestroyed(SurfaceHolder holder) {//view被释放时调用的
        boolean retry = true;
        thread.setFlag(false);//停止刷帧线程
        timeThread.setFlag(false);//停止思考时间线程
        while (retry) {
            try {
                thread.join();
                timeThread.join();//等待线程结束
                retry = false;//设置循环标志位为false
            }
            catch (InterruptedException e) {//不断地循环,直到等待的线程结束
            }
        }
	}
	class TutorialThread extends Thread{//刷帧线程
		private int span = 300;//睡眠的毫秒数
		private SurfaceHolder surfaceHolder;//SurfaceHolder的引用
		private GameView gameView;//gameView的引用
		private boolean flag = false;//循环标志位
        public TutorialThread(SurfaceHolder surfaceHolder, GameView gameView) {//构造器
            this.surfaceHolder = surfaceHolder;//得到SurfaceHolder引用
            this.gameView = gameView;//得到GameView的引用
        }
        public void setFlag(boolean flag) {//设置循环标记
        	this.flag = flag;
        }
		public void run() {//重写的方法
			Canvas c;//画布
            while (this.flag) {//循环绘制
                c = null;
                try {
                    c = this.surfaceHolder.lockCanvas(null);
                    synchronized (this.surfaceHolder) {
                    	gameView.onDraw(c);//调用绘制方法
                    }
                } finally {//用finally保证下面代码一定被执行
                    if (c != null) {
                    	//更新屏幕显示内容
                        this.surfaceHolder.unlockCanvasAndPost(c);
                    }
                }
                try{
                	Thread.sleep(span);//睡眠span毫秒
                }catch(Exception e){//不会异常信息
                	e.printStackTrace();//打印异常堆栈信息
                }
            }
		}
	}
}
时间: 2024-10-19 11:04:18

Android--中国象棋的相关文章

编程之美笔记--第一章游戏之乐--1.2中国象棋将帅问题

后来一版作者又将最后一句改为:”要求在代码中只能使用一个字节存储变量“. 我的解法: package android.zlb.java; /** * * @author zhanglibin * */ public class TestXiangqi { public static void main(String[] args) { for(int i = 11; i < 100; i++) { if(i / 10 % 3 == 1 && (i % 10 == 1 || i % 1

Cocos2d-X开发中国象棋《一》

在介绍开发过程前先展示一下游戏 打开游戏后会进入一个欢迎界面 欢迎界面上有两颗棋子红色的帅和黑色的将,可以通过触摸两颗棋子进入游戏场景 当单击红棋子时,玩家持红旗 当单击黑棋时,玩家持黑棋 单击开始显示棋子 通过鼠标点击走棋 单击悔棋可以实现悔棋 单击新局后再单击开始可以实现重新下棋 单击下面的小喇叭可以实现声音的开关 吃掉对方的将后会显示游戏结果 单击游戏结果后重新开始游戏 移植到Android上的效果 开始界面 游戏界面1 游戏界面2 游戏结果界面 代码和资源下载:http://downlo

[AHOI2009]中国象棋

题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子.你也来和小可可一起锻炼一下思维吧! 输入输出格式 输入格式: 一行包含两个整数N,M,之间由一个空格隔开. 输出格式: 总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果. 输入输出样例 输入样例#

团队-编程项目 中国象棋-需求分析

需求分析: 1.棋盘和棋子的绘制 2.按照象棋规则对棋子进行布局   3.鼠标响应 : 在对弈中,棋子是必须可以移动的,不然游戏无法进行.因此,鼠标左键点击是必不可少的一部分. 4.棋子的功能分析:  中国象棋中各色的象棋棋子的功能使象棋具有了真正的趣味性,中国象棋的棋子的类型大致分为:帅(将).士.象.马.车.炮.兵(卒)等几个类型.  帅(将):红方中的帅和黑方中的将的功能相同,都是只能在九宫格中进行横向和竖向的移动,每次移动一格,并且不能移动超出九宫格,帅和将不能见面.  士:士在整片棋盘

JavaScript中国象棋程序(0) - 前言

"JavaScript中国象棋程序" 这一系列教程将带你从头使用JavaScript编写一个中国象棋程序.希望通过这个系列,我们对博弈程序的算法有一定的了解.同时,我们也将构建出一个不错的中国象棋程序. JavaScript中国象棋程序系列共有9个部分: 0.JavaScript中国象棋程序(0)- 前言 1.JavaScript中国象棋程序(1)- 界面设计 2.JavaScript中国象棋程序(2)- 校验棋子走法 3.JavaScript中国象棋程序(3)- 电脑自动走棋 4.J

BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const in

中国象棋棋子及棋盘的绘制

一.题目简介 本课程设计主要是使用Swing这个Java自带的图形开发工具实现中国象棋棋子及棋盘的绘制,并根据相应的象棋规则,可以设计棋谱,完成棋谱的保存和对已保存的棋谱的演示,方便现在爱棋人士对残局的收藏于研究,而且达到了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练的应用面向对象的思想和设计方法解决实际问题的能力的目的. 1.当两方有一方将(帅)被吃掉后,程序不能自动结束或提示游戏结束,但想到该程序并不是要进行两方对弈,而是要设计棋谱所以在能力实现范围内

1.2中国象棋将帅问题

(根据中国象棋的基本原则)在只有双的将帅棋盘上,找出所有双方可以落子的位置(将帅不能碰面),但只能使用一个变量. 直觉上我们想到,只要遍历将帅所有可能的位置,去除将帅冲突的位置即可.可见,剩下的问题就在于如何使用一个变量来做二重循环的遍历.书中解法一给出的方法是将一个Byte变量拆成两个用,前一半代表"帅"可以走的位置,后一个变量代表"将"可以走的位置(事先已经将"将"和"帅"可以走的3*3的位置进行了编号),利用位操作即可获

Qt版本中国象棋开发(四)

内容:走法产生 中国象棋基础搜索AI, 极大值,极小值剪枝搜索, 静态估值函数 理论基础: (一)人机博弈走法产生: 先遍历某一方的所有棋子,再遍历整个棋盘,得到每个棋子的所有走棋情况(效率不高,可以改进) 1 void SingleGame::getAllPossibleMove(QVector<Step *> &steps) 2 { 3 int min, max; 4 if(this->_bRedTurn) 5 { 6 min = 0, max = 16; 7 } 8 els

Cocos2d-X开发中国象棋《六》游戏开始功能的实现

我在前面的博客Cocos2d-X开发中国象棋<四>设计游戏场景中介绍了在游戏场景上场景了一个开始按钮,并没有实现开始的功能 游戏开始功能的实现效果: 实现思路: 1.显示随机位置的棋子 2.将棋子移动到棋盘上的指定位置 具体实现方式: 首先在SceneGame类中定义一个initStone()函数用于初始化棋子 initStone()函数实现了3个功能 1.创建棋子 2.将棋子设置到随机位置 3.隐藏棋子 initStone()中的代码: //初始化32个棋子 void SceneGame::