⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gamecanvas.java

📁 用java开发的手机上的5子棋游戏;
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*
* Five - gobang Game for Nokia series60 mobie,just for funny!!
*
* Copyright (C) 2003.3  runer <fqyy@hotmail.com>
* 版权所有 (C)2003.3  runer  <fqyy@hotmail.com>
* 
* 这个五子棋游戏是2003年3月份学习j2me编程时写的,因为程序比较简单,
* 代码结构不太好,但是j2me编程过程中的一些典型case都有涉及到,像
* 界面生成,按键控制,资源文件的读取,小内存编程等等。
*
* 这个游戏在编写时感觉有两个难点,一是界面部分,一是AI部分。
*
* 界面部分就是靠画出来了,很烦琐,但是没有好办法。
* 最开始的时候我是把棋子作为一个单独的class来做,
* 但是后来经过对比发现还是直接画出来比较省内存。
*
*
* AI属于常规编程,这里采用的是最笨的权值判断的方式。
* 如果有好的算法可以将其替换。
* 
* 本代码建议仅供学习j2me编程使用。
*
* 2005.2.23
* 今天是我的生日,公布这个代码就当庆祝一下自己的生日吧
* 当时写这个程序的时候,感谢wda中文网(http://www.wda.com.cn)
* 中国java手机网(http://www.cnjm.net)
* 感谢昨天晚上第一个收到GT的短信祝福,还有别的很多朋友的短信,让我高兴了今天一天
* 也谢谢YWSY(http://bbs.ywsy.net)上的各位好朋友。
*
* 本软件是在GPL条款保护下发布,你可以免费使用并且可以获得所有的源代码。
* 但作者不提供任何形式的担保,无论是明确的还是隐含的。
* 
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* http://www.gnu.org/copyleft/gpl.html
*
*/


package five;

import com.nokia.mid.sound.Sound;
import com.nokia.mid.ui.FullCanvas;
import java.io.*;
import java.util.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.RecordStore;
import javax.microedition.rms.RecordStoreException;

public class GameCanvas extends FullCanvas implements Runnable{

  private static int ChessBoardOffset=11;//偏移量
  private static int ChessUnitage=11;//单位量
  private static int lineNum=15;

  public int gameStatus;
  private boolean isBlack;
  private int winner;
  private boolean canDropChessman;
  private int mainMenu;
  private int subMenu;
  private int helpState;
  private boolean pauseFlag;
  private RecordStore rStore;

  Image hand;
  Image back;
  Random rand=new Random();
  private Sound sD[];
  private Font sFont;

  public int ChessBoard[][];//状态
  public int ChessStatus[][][];//型态
  private int chess_x; //x
  private int chess_y;  //y

  private int computer_x;
  private int computer_y;

  private int last_x; //x
  private int last_y; //y
  private int[][][] power = new int[2][3][5];//存储权值
  int[][] Ctable;
  int computerfirst;





  public GameCanvas() {
    ChessBoard=new int[lineNum][lineNum];
    ChessStatus=new int[lineNum][lineNum][5];
    try{
      hand=Image.createImage("/hand.png");
      back=Image.createImage("/back.png");
    }catch(Exception e){}
    initPower();
    Ctable = new int[lineNum][lineNum];
    for(int i = 0; i < lineNum; i++)
    {
        for(int j = 0; j < lineNum; j++)
        {
            Ctable[i][j] = 0;
        }

        }
    computerfirst=0;
    GameInit();
  }


  private void GameInit(){

    for(int x=0;x<lineNum;x++){
      for(int y=0;y<lineNum;y++){
        ChessBoard[x][y]=0;
      }
    }

    chess_x=ChessBoardOffset+(lineNum/2)*ChessUnitage;
    chess_y=ChessBoardOffset+(lineNum/2)*ChessUnitage;

    computer_x=0;
    computer_y=0;

    gameStatus=1;//init
    isBlack=true;//
    winner=0;
    canDropChessman=true;
    pauseFlag=false;

    sFont=Font.getDefaultFont();

    Thread thread=new Thread(this);
    thread.start();
  }

  protected void paint(Graphics g) {
    g.setFont(sFont);
    int i = sFont.getHeight();
    if(gameStatus==1){
      g.setColor(204,255,94);
      //g.setColor(0xffcc00);
      g.fillRect(0,0,177,212);
      g.drawImage(back,87,104,g.VCENTER|g.HCENTER);
      g.setColor(0x000000);
      draw_chessboard(g);
      for(int x=0;x<lineNum;x++){
        for(int y=0;y<lineNum;y++){
          if(ChessBoard[x][y]==1){
            draw_chessman(g,x*ChessUnitage+ChessBoardOffset,y*ChessUnitage+ChessBoardOffset,true,(last_x==x&&last_y==y)?2:3);
          }
          if(ChessBoard[x][y]==2){
            draw_chessman(g,x*ChessUnitage+ChessBoardOffset,y*ChessUnitage+ChessBoardOffset,false,(last_x==x&&last_y==y)?2:3);
          }
        }
      }
      g.drawImage(hand,chess_x,chess_y+7,g.VCENTER|g.HCENTER);

      g.drawString("五子棋v0.7B by 今天真冷",(getWidth()-"五子棋v0.7B by 今天真冷".length())/2,1,g.HCENTER|g.BASELINE);
      draw_result(g);
      g.drawString("重试",3,203,g.LEFT|g.BOTTOM);
      g.drawString("退出",150,203,g.LEFT|g.BOTTOM);
    }
  }


 /**
  * 显示结果
  * */
  private void draw_result(Graphics g){
    if(winner==1){
       g.setColor(0xCCCCCC);
       g.fillRect(15,25,144,60);
       g.setColor(0xFF0000);
       g.drawString("祝贺您,嬴了这一局!",75,50,g.HCENTER|g.BASELINE);
    }else
     if(winner==2){
       g.setColor(0xCCCCCC);
       g.fillRect(15,25,144,60);
       g.setColor(0xFF0000);
       g.drawString("对不起,这一局输了!",75,50,g.HCENTER|g.BASELINE);
    }else{
        g.drawString("",62,180,g.HCENTER|g.BASELINE);
    }
  }

 /**
  * 打印debug信息
  * */
  private void draw_debug(Graphics g){
    g.drawString("("+java.lang.String.valueOf(chess_x)+","+java.lang.String.valueOf(chess_y)+")("+java.lang.String.valueOf((chess_x-ChessBoardOffset)/ChessUnitage)+","+java.lang.String.valueOf((chess_y-ChessBoardOffset)/ChessUnitage)+")",17,3,g.LEFT|g.TOP);
    g.drawString("LeftRight:"+java.lang.String.valueOf(ChessStatus[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage][0]),17,175,g.LEFT|g.BOTTOM);
    g.drawString("UpDown:"+java.lang.String.valueOf(ChessStatus[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage][1]),90,175,g.LEFT|g.BOTTOM);
    g.drawString("LeftUp:"+java.lang.String.valueOf(ChessStatus[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage][2]),17,190,g.LEFT|g.BOTTOM);
    g.drawString("UpRight:"+java.lang.String.valueOf(ChessStatus[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage][3]),90,190,g.LEFT|g.BOTTOM);
  }

  /**
   * 画棋盘 LineNum
   * */
  public void draw_chessboard(Graphics g){
    for(int x=ChessBoardOffset;x<=(lineNum-1)*ChessUnitage+ChessBoardOffset;x=x+ChessUnitage) {//line
      g.drawLine(x,ChessBoardOffset,x,(lineNum-1)*ChessUnitage+ChessBoardOffset);
      g.drawLine(ChessBoardOffset,x,(lineNum-1)*ChessUnitage+ChessBoardOffset,x);
    }
    g.drawRect(ChessBoardOffset-1,ChessBoardOffset-1,(lineNum-1)*ChessUnitage+2,(lineNum-1)*ChessUnitage+2);

    draw_chessman(g,ChessBoardOffset+7*ChessUnitage,ChessBoardOffset+7*ChessUnitage,true,1);
    draw_chessman(g,ChessBoardOffset+3*ChessUnitage,ChessBoardOffset+3*ChessUnitage,true,1);
    draw_chessman(g,ChessBoardOffset+11*ChessUnitage,ChessBoardOffset+11*ChessUnitage,true,1);
    draw_chessman(g,ChessBoardOffset+3*ChessUnitage,ChessBoardOffset+11*ChessUnitage,true,1);
    draw_chessman(g,ChessBoardOffset+11*ChessUnitage,ChessBoardOffset+3*ChessUnitage,true,1);

  }

  /**
   *  画棋子,分成3种:黑 白 点
   *
   * g : Canvas
   * x : x
   * y : y
   * isBlack :
   * mode : 1 点 2 棋子外加框 3 正常棋子
   *
   * */
  public void draw_chessman(Graphics g,int x,int y,boolean isBlack,int mode){
     if(mode!=1){//not point
       if(isBlack){
         g.setColor(0,0,0);
         g.drawArc(x-5,y-5,10,10,0,360);
         g.fillArc(x-5,y-5,10,10,0,360);
       }else{
         g.setColor(255,255,255);
         g.drawArc(x-5,y-5,10,10,0,360);
         g.fillArc(x-5,y-5,10,10,0,360);
       }
       if(mode==2){
         g.setColor(0,255,0);
         g.drawRect(x-5,y-5,10,10);
       }
     }else{//point
       g.setColor(0,0,0);
       g.drawRect(x-1,y-1,2,2);
       g.fillRect(x-1,y-1,2,2);
     }
       g.setColor(0xff0000);
  }

  public void run(){
    while(gameStatus==1){
      if(!isBlack){
        isBlack=!isBlack;
        checkStatus(2);
        computerdo();
        if(checkWin(computer_x,computer_y,2)) winner=2;
        ChessBoard[computer_x][computer_y]=2;
        canDropChessman=true;
        last_x=computer_x;
        last_y=computer_y;
      }
      try{Thread.sleep(1000L);}catch(Exception e){}
      repaint();
    }
  }



  public void computerdo()
  {
      AI();
      for(int i = 0; i < lineNum; i++)
      {
          for(int j = 0; j < lineNum; j++)
          {
              if(Ctable[i][j] >= Ctable[computer_x][computer_y] && ChessBoard[i][j] == 0)
              {
                  computer_x = i;
                  computer_y = j;
              }
          }

      }
    }


  public void keyPressed(int KeyCode){
    if(gameStatus==1){
      checkStatus(2);
      switch(KeyCode){
              case -1:{
                if(chess_y>=(ChessUnitage+ChessBoardOffset)){
                  chess_y=chess_y-ChessUnitage;
                }else{
                  chess_y=chess_y+ChessUnitage*(lineNum-1);
                }
                break;
              }
              case -2:{
                if(chess_y<(ChessUnitage*(lineNum-1)+ChessBoardOffset)){
                  chess_y=chess_y+ChessUnitage;
                }else{
                  chess_y=chess_y-ChessUnitage*(lineNum-1);
                      }
                break;
              }
              case -3:{
                if(chess_x>=(ChessUnitage+ChessBoardOffset)){
                  chess_x=chess_x-ChessUnitage;
                }else{
                  chess_x=chess_x+ChessUnitage*(lineNum-1);
                      }
                break;
              }
              case -4:{
                if(chess_x<(ChessUnitage*(lineNum-1)+ChessBoardOffset)){
                  chess_x=chess_x+ChessUnitage;
                }else{
                  chess_x=chess_x-ChessUnitage*(lineNum-1);
                      }
                break;
              }
              case -5:{
                if(checkPosition()&&winner==0&&canDropChessman){
                  canDropChessman=false;
                  if(isBlack){
                    if(checkWin((chess_x-ChessBoardOffset)/ChessUnitage,(chess_y-ChessBoardOffset)/ChessUnitage,1)) winner=1;
                    ChessBoard[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage]=1;
                    last_x=(chess_x-ChessBoardOffset)/ChessUnitage;
                    last_y=(chess_y-ChessBoardOffset)/ChessUnitage;
                    isBlack=!isBlack;
                  }else{
                    if(checkWin((chess_x-ChessBoardOffset)/ChessUnitage,(chess_y-ChessBoardOffset)/ChessUnitage,2)) winner=2;
                    ChessBoard[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage]=2;
                  }
                }
                break;
              }
              case -7:{
                  Five.quitApp();
                  break;
              }
              case -6:{
                  GameInit();
                  break;
              }
            case 48:{
                GameInit();
                ChessBoard[7][7]=2;
                last_x=7;
                last_y=7;
                break;
              }
            }
      repaint();
    }
  }

  /**
   * 位置合法性检查
   * */
  private boolean checkPosition(){
      if(ChessBoard[(chess_x-ChessBoardOffset)/ChessUnitage][(chess_y-ChessBoardOffset)/ChessUnitage]==0){
        return true;
      }else{
        return false;
      }
  }


  /**
   * 检查是否发生输赢,返回true则who win
   * */
  private boolean checkWin(int x,int y,int who){

    boolean isWin=false;

    Check(x,y,who);//检查该点棋型
    for(int i=0;i<4;i++){
      if(ChessStatus[x][y][i]==4) isWin=true;
    }

    return isWin;
  }


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -