《2022年android中国象棋源代码 .pdf》由会员分享,可在线阅读,更多相关《2022年android中国象棋源代码 .pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ChessActivity.java package wyf.ytl; import android.app.Activity;/ 引入相关的包import android.media.MediaPlayer; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.view.Window; import android.view.WindowManager; publicclass ChessActivity extends Activity booleani
2、sSound = true ; / 是否播放声音MediaPlayer startSound; / 开始和菜单时的音乐MediaPlayer gamesound ; / 游戏声音Handler myHandler = new Handler()/ 用来更新 UI线程中的控件publicvoid handleMessage(Message msg) if (msg. what = 1) /WelcomeView或HelpView 或GameView传来的消息,切换到 MenuViewinitMenuView();/ 初始化并切换到菜单界面 elseif(msg. what = 2)/MenuVi
3、ew传来的消息,切换到GameViewinitGameView();/ 初始化并切换到游戏界面 elseif(msg. what = 3)/MenuView传来的消息,切换到HelpViewinitHelpView();/ 初始化并切换到帮助界面 ; publicvoid onCreate(Bundle savedInstanceState) / 重写的 onCreatesuper .onCreate(savedInstanceState); / 全屏requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(Wind
4、owManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN ); startSound = MediaPlayer.create( this, R.raw.startsound); / 加载欢迎声音startSound.setLooping(true ); / 设置游戏声音循环播放gamesound = MediaPlayer.create( this, R.raw.gamesound ); / 游戏过程的背景声音gamesound .setLooping(true); / 设置游戏声音循
5、环播放名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 44 页 - - - - - - - - - this.initWelcomeView();/ 初始化欢迎界面 publicvoid initWelcomeView()/ 初始化欢迎界面this.setContentView(new WelcomeView(this, this);/ 切换到欢迎界面if ( isSound ) / 需要播放声音时startSound.start();/ 播放声音 publicvoid
6、initGameView()/ 初始化游戏界面this.setContentView(new GameView( this, this); / 切换到游戏界面 publicvoid initMenuView()/ 初始化菜单界面if ( startSound != null) / 停止startSound.stop();/ 停止播放声音startSound = null; if ( this. isSound ) / 是否播放声音gamesound .start();/ 播放声音 this.setContentView(new MenuView(this, this);/ 切换 View pu
7、blicvoid initHelpView()/ 初始化帮助界面this.setContentView(new HelpView(this, this);/ 切换到帮助界面 222222222222222222222222222222222222222222222222222222222222222222222222222222 ChessMove.java package wyf.ytl; /* * 该类为棋子的一个走法 * 包含是什么棋子 * 起始点的位置 * 目标点的位置 * 以及估值时所用到的score */publicclass ChessMove intChessID ; / 表明
8、是什么棋子intfromX ; / 起始的坐标intfromY ; inttoX ; / 目的地的坐标inttoY ; intscore ; / 值, 估值时会用到名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 44 页 - - - - - - - - - public ChessMove(int ChessID, int fromX,int fromY,int toX,int toY,intscore)/ 构造器this. ChessID = ChessID;/ 棋子的
9、类型this. fromX = fromX;/ 棋子的起始坐标this. fromY = fromY; this. toX = toX;/ 棋子的目标点x坐标this. toY = toY;/ 棋子的目标点y坐标this. score = score; 33333333333333333333333333333333333333333333333333333333333333333333333 GameView.java package wyf.ytl; import android.content.Context; import android.graphics.Bitmap; import
10、 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; /* * 该类是整个程序最主要的类,是主游戏的界面 * 该界面继承自Surf
11、aceView并实现了 SurfaceHolder.Callback接口 * 其中包含了一个刷帧的线程类 * */publicclassGameView extendsSurfaceView implementsSurfaceHolder.Callback private TutorialThread thread; / 刷帧的线程TimeThread timeThread ; ChessActivity activity; / 声明 Activity的引用Bitmap qiPan ; / 棋盘Bitmap qizibackground; / 棋子的背景图片Bitmap win ; / 胜利的
12、图片Bitmap lost; / 失败的图片Bitmap ok; / 确定按钮Bitmap vs ; / 黑方红方 VS的图片Bitmap right; / 向右的指针Bitmap left; / 向左的指针Bitmap current; / “当前”文字名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 44 页 - - - - - - - - - Bitmap exit2; / 退出按钮图片Bitmap sound2 ; / 声音按钮图片Bitmap sound3 ; /
13、 当前是否播放了声音Bitmap time ; / 冒号Bitmap redtime; / 红色冒号Bitmap background; / 背景图片MediaPlayer go; / 下棋声音Paint paint; / 画笔booleancaiPan = true; / 是否为玩家走棋booleanfocus = false; / 当前是否有选中的棋子intselectqizi = 0; / 当然选中的棋子intstartI, startJ; / 记录当前棋子的开始位置intendI , endJ ; / 记录当前棋子的目标位置Bitmap heiZi = new Bitmap7;/ 黑子
14、的图片数组Bitmap hongZi = new Bitmap7;/ 红子的图片数组Bitmap number = new Bitmap10;/ 数字的图片数组,用于显示时间Bitmap redNumber = new Bitmap10;/ 红色数字的图片,用于显示时间GuiZe guiZe ; / 规则类intstatus = 0;/ 游戏状态。 0游戏中, 1胜利 , 2 失败intheiTime = 0;/ 黑方总共思考时间inthongTime = 0;/ 红方总共思考时间int qizi = new int/ 棋盘2,3,6,5,1,5,6,3,2, 0,0,0,0,0,0,0,0,
15、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(
16、).addCallback(this); go = MediaPlayer.create( this.getContext(), R.raw.go); / 加载下棋的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 44 页 - - - - - - - - - 声音this. thread = new TutorialThread(getHolder(), this); / 初始化刷帧线程this. timeThread = new TimeThread(this); /
17、初始化思考时间的线程init();/ 初始化所需资源guiZe = new GuiZe();/ 初始化规则类 publicvoid init()/ 初始化方法paint = new Paint();/ 初始化画笔qiPan= BitmapFactory.decodeResource(getResources(), R.drawable.qipan ); / 棋盘图片qizibackground= BitmapFactory.decodeResource(getResources(), R.drawable.qizi); / 棋子的背景win= BitmapFactory.decodeResou
18、rce(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.decodeResou
19、rce(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= BitmapFa
20、ctory.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 ); hei
21、Zi0 = BitmapFactory.decodeResource(getResources(), R.drawable.heishuai); / 黑帅heiZi1 = BitmapFactory.decodeResource(getResources(), R.drawable.heiju); / 黑车heiZi2 = BitmapFactory.decodeResource(getResources(), 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 44 页 -
22、 - - - - - - - - R.drawable.heima ); / 黑马heiZi3 = BitmapFactory.decodeResource(getResources(), R.drawable.heipao ); / 黑炮heiZi4 = BitmapFactory.decodeResource(getResources(), R.drawable.heishi); / 黑士heiZi5 = BitmapFactory.decodeResource(getResources(), R.drawable.heixiang); / 黑象heiZi6 = BitmapFactory
23、.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); / 红
24、马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(
25、), R.drawable.hongzu ); / 红卒number 0 = BitmapFactory.decodeResource(getResources(), R.drawable.number0 ); / 黑色数字 0number 1 = BitmapFactory.decodeResource(getResources(), R.drawable.number1 ); / 黑色数字 1number 2 = BitmapFactory.decodeResource(getResources(), R.drawable.number2 ); / 黑色数字 2number 3 = Bit
26、mapFactory.decodeResource(getResources(), R.drawable.number3 ); / 黑色数字 3number 4 = BitmapFactory.decodeResource(getResources(), R.drawable.number4 ); / 黑色数字 4number 5 = BitmapFactory.decodeResource(getResources(), R.drawable.number5 ); / 黑色数字 5number 6 = BitmapFactory.decodeResource(getResources(),
27、R.drawable.number6 ); / 黑色数字 6number 7 = BitmapFactory.decodeResource(getResources(), R.drawable.number7 ); / 黑色数字 7number 8 = BitmapFactory.decodeResource(getResources(), R.drawable.number8 ); / 黑色数字 8number 9 = BitmapFactory.decodeResource(getResources(), 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - -
28、 - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 44 页 - - - - - - - - - R.drawable.number9 ); / 黑色数字 9redNumber 0 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber0); / 红色数字 0redNumber 1 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber1); / 红色数字 1redNumber 2 = BitmapF
29、actory.decodeResource(getResources(), R.drawable.rednumber2); / 红色数字 2redNumber 3 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber3); / 红色数字 3redNumber 4 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber4); / 红色数字 4redNumber 5 = BitmapFactory.decodeResource(getRe
30、sources(), R.drawable.rednumber5); / 红色数字 5redNumber 6 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber6); / 红色数字 6redNumber 7 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber7); / 红色数字 7redNumber 8 = BitmapFactory.decodeResource(getResources(), R.drawable.rednu
31、mber8); / 红色数字 8redNumber 9 = BitmapFactory.decodeResource(getResources(), R.drawable.rednumber9); / 红色数字 9background= BitmapFactory.decodeResource(getResources(), R.drawable.bacnground); /* * 该方法是自己定义的并非重写的 * 该方法是死的,只根据数据绘制屏幕 */publicvoid onDraw(Canvas canvas)/ 自己写的绘制方法canvas.drawColor(Color.WHITE)
32、; canvas.drawBitmap(background, 0,0, null); / 清背景canvas.drawBitmap(qiPan , 10, 10, null); / 绘制棋盘for ( int i=0; iqizi. length; i+) for ( int j=0; jqizii.length; j+)/ 绘制棋子if ( qiziij != 0) canvas.drawBitmap(qizibackground, 9+j*34, 10+i*35, null); / 绘制棋子的背景if ( qiziij = 1)/ 为黑帅时canvas.drawBitmap(heiZi0
33、, 12+j*34, 13+i*35, paint); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 44 页 - - - - - - - - - elseif ( qiziij = 2)/ 为黑车时canvas.drawBitmap(heiZi1, 12+j*34, 13+i*35, paint); elseif ( qiziij = 3)/ 为黑马时canvas.drawBitmap(heiZi2, 12+j*34, 13+i*35, paint); elseif
34、( qiziij = 4)/ 为黑炮时canvas.drawBitmap(heiZi3, 12+j*34, 13+i*35, paint); elseif ( qiziij = 5)/ 为黑士时canvas.drawBitmap(heiZi4, 12+j*34, 13+i*35, paint); elseif ( qiziij = 6)/ 为黑象时canvas.drawBitmap(heiZi5, 12+j*34, 13+i*35, paint); elseif ( qiziij = 7)/ 为黑兵时canvas.drawBitmap(heiZi6, 12+j*34, 13+i*35, pai
35、nt); elseif ( qiziij = 8)/ 为红将时canvas.drawBitmap(hongZi 0, 12+j*34, 13+i*35, paint); elseif ( qiziij = 9)/ 为红车时canvas.drawBitmap(hongZi 1, 12+j*34, 13+i*35, paint); elseif ( qiziij = 10)/ 为红马时canvas.drawBitmap(hongZi 2, 12+j*34, 13+i*35, paint); elseif ( qiziij = 11)/ 为红砲时canvas.drawBitmap(hongZi 3,
36、 12+j*34, 13+i*35, paint); elseif ( qiziij = 12)/ 为红仕时canvas.drawBitmap(hongZi 4, 12+j*34, 13+i*35, paint); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 44 页 - - - - - - - - - elseif ( qiziij = 13)/ 为红相时canvas.drawBitmap(hongZi 5, 12+j*34, 13+i*35, paint); el
37、seif ( qiziij = 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)/ 当不足两位时前面填0timeStr = 0
38、 + timeStr; for ( int i=0;i2;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;i2;i+)/ 循环int tempScore=timeStr.ch
39、arAt(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)/ 当不足两位时前面填0timeStr2 = 0 + timeStr2; for ( int i=0;i2;i+)/ 循环绘制
40、时间int tempScore=timeStr2.charAt(i)-0; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 44 页 - - - - - - - - - canvas.drawBitmap(redNumber tempScore, 247+i*7, 411, paint); / 绘制 / 画分钟temp2 = this. hongTime %60; / 求出当前的秒数timeStr2 = temp2+ ; / 转换成字符串if (timeStr2.leng
41、th()2)/ 不足两位时前面用0补timeStr2 = 0 + timeStr2; for ( int i=0;i10&event.getX()440 & event.getY()250&event.getX()440 & event.getY()135&event.getX()249 & event.getY()135&event.getX()245 & event.getY()10&event.getX()10 & event.getY() 7)/ 点击的是自己的棋子。即下面的黑色棋子selectqizi = qiziij;/ 将该棋子设为选中的棋子focus = true ; / 标记
42、当前有选中的棋子startI = i; startJ = j; else / 之前选中过棋子if ( qiziij != 0)/ 点击的位置有棋子if ( qiziij 7)/ 如果是自己的棋子.selectqizi = qiziij;/ 将该棋子设为选中的棋子startI = i; startJ = j; else / 如果是对方的棋子endI = i; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 44 页 - - - - - - - - - endJ = j;/
43、 保存该点booleancanMove = 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 star
44、tI startJ = 0; /将原来处设空startI = -1; startJ = -1; endI = -1; endJ = -1;/ 还原保存点focus= false; / 标记当前没有选中棋子ChessMove cm = guiZe .searchAGoodMove(qizi); / 根据当前局势查询一个最好的走法if ( activity. isSound ) go.start();/ 播放下棋声音 qizicm. toX cm.toY = qizicm. fromX cm.fromY ; / 移动棋子qizicm. fromX cm.fromY = 0; caiPan = tr
45、ue; / 恢复玩家响应 /end点击的位置有棋子else / 如果点击的位置没有棋子endI = i; endJ = j; booleancanMove = guiZe .canMove(qizi, startI, startJ, endI , endJ ); / 查看是否可走if (canMove)/ 如果可以移动caiPan = false; / 不让玩家走了名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 44 页 - - - - - - - - - if ( a
46、ctivity. isSound ) go.start();/ 播放下棋声音 qizi endI endJ = qizi startI startJ; / 移动棋子qizi startI startJ = 0; / 将原来处置空startI = -1; startJ = -1; endI = -1; endJ = -1;/ 还原保存点focus = false; / 标志位设 falseChessMove cm = guiZe .searchAGoodMove(qizi); / 得到一步走法if ( qizicm. toX cm.toY = 8)/ 电脑吃了您的将status = 2;/ 切换
47、游戏状态为失败 if ( activity. isSound ) /需 要 播 放 声 音时go.start();/ 播放下棋声音 qizicm. toX cm.toY = qizicm. fromX cm.fromY ; / 移动棋子qizicm. fromX cm.fromY = 0; caiPan = true ; / 恢复玩家响应 /end 之前选中过棋子 /end点击的位置在棋盘内时 /end游戏中时 returnsuper .onTouchEvent(event); publicint getPos(MotionEvent e)/ 将坐标换算成数组的维数int pos = new
48、int2; double x = e.getX();/ 得到点击位置的x坐标double y = e.getY();/ 得到点击位置的y坐标if (x10 & y10 & x10+ qiPan .getWidth() & y10+ qiPan .getHeight()/ 点击的是棋盘时pos0 = Math.round ( float)(y-21)/36);/ 取得所在的行名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 44 页 - - - - - - - - - po
49、s1 = Math.round ( float)(x-21)/35);/ 取得所在的列 else / 点击的位置不是棋盘时pos0 = -1;/ 将位置设为不可用pos1 = -1; return pos;/ 将坐标数组返回 publicvoid success()/ 胜利了status = 1;/ 切换到胜利状态 publicvoidsurfaceChanged(SurfaceHolder holder, intformat, intwidth, int height) publicvoid surfaceCreated(SurfaceHolder holder) / 重写的this. th
50、read.setFlag(true ); this. thread.start();/ 启动刷帧线程timeThread.setFlag(true ); timeThread.start();/ 启动思考时间的线程 publicvoid surfaceDestroyed(SurfaceHolder holder) /view被释放时调用的boolean retry = true; thread.setFlag(false); / 停止刷帧线程timeThread.setFlag(false); / 停止思考时间线程while (retry) try thread.join(); timeThr