📄 gamecanvas.java
字号:
/*
* 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 + -