欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android实现中国象棋附源码下载

程序员文章站 2024-03-01 11:25:40
象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码: 贴出主要代码,想要demo的点击下载:中国象棋demo package wyf.ytl;...

象棋,很多人多接触过,学者写了一个,大神可以指点一下~直接上代码:
贴出主要代码,想要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();//打印异常堆栈信息 
        } 
      } 
    } 
  } 
} 

以上就是本文的全部内容,好好玩吧,希望对大家的学习也有帮助。