//五子棋的View
packagelixinsong.game.gobang;
importandroid.content.Context;
importandroid.content.res.Resources;
importandroid.graphics.Bitmap;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Paint.Style;
importandroid.graphics.drawable.Drawable;
importandroid.util.AttributeSet;
importandroid.util.Log;
importandroid.view.KeyEvent;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.widget.TextView;
/*棋盘一共10×10格
* 棋盘居中
*
*
*
*/
//public class GobangView extends View implements Runnable {
publicclassGobangViewextendsView{
protectedstaticintGRID_SIZE =10;
protectedstaticintGRID_WIDTH =30;// 棋盘格的宽度
protectedstaticintCHESS_DIAMETER =26;// 棋的直径
protectedstaticintmStartX;// 棋盘定位的左上角X
protectedstaticintmStartY;// 棋盘定位的左上角Y
privateBitmap[] mChessBW;// 黑棋和白棋
privatestaticint[][] mGridArray;// 网格
booleankey =false;
intwbflag =1;//该下白棋了=2,该下黑棋了=1. 这里先下黑棋(黑棋以后设置为机器自动下的棋子)
intmLevel =1;//游戏难度
intmWinFlag =0;
privatefinalintBLACK=1;
privatefinalintWHITE=2;
intmGameState = GAMESTATE_RUN;//游戏阶段:0=尚未游戏,1=正在进行游戏,2=游戏结束
staticfinalintGAMESTATE_PRE =0;
staticfinalintGAMESTATE_RUN =1;
staticfinalintGAMESTATE_PAUSE =2;
staticfinalintGAMESTATE_END =3;
//private TextView mStatusTextView; // 根据游戏状态设置显示的文字
publicTextView mStatusTextView;// 根据游戏状态设置显示的文字
privateBitmap btm1;
privatefinalPaint mPaint =newPaint();
CharSequence mText;
CharSequence STRING_WIN ="White win! /n Press Fire Key to start new game.";
CharSequence STRING_LOSE ="Black win! /n Press Fire Key to start new game.";
CharSequence STRING_EQUAL ="Cool! You are equal! /n Press Fire Key to start new Game.";
publicGobangView(Context context, AttributeSet attrs,intdefStyle) {
super(context, attrs, defStyle);
}
publicGobangView(Context context, AttributeSet attrs) {//好像调用的是这个构造函数,为什么不是前面的呢
super(context, attrs);
this.setFocusable(true);//20090530
this.setFocusableInTouchMode(true);
init();
}
//这里画棋子后来没有用图片画,而是直接画了圆。因为我做的图片不好看。
// 初始化黑白棋的Bitmap
publicvoidinit() {
mGameState =1;//设置游戏为开始状态
wbflag = BLACK;//初始为先下黑棋
mWinFlag =0;//清空输赢标志。
mGridArray =newint[GRID_SIZE-1][GRID_SIZE-1];
mChessBW =newBitmap[2];
Bitmap bitmap = Bitmap.createBitmap(CHESS_DIAMETER, CHESS_DIAMETER, Bitmap.Config.ARGB_8888);
Canvas canvas =newCanvas(bitmap);
Resources r =this.getContext().getResources();
Drawable tile = r.getDrawable(R.drawable.chess1);
tile.setBounds(0,0, CHESS_DIAMETER, CHESS_DIAMETER);
tile.draw(canvas);
mChessBW[0] = bitmap;
tile = r.getDrawable(R.drawable.chess2);
tile.setBounds(0,0, CHESS_DIAMETER, CHESS_DIAMETER);
tile.draw(canvas);
mChessBW[1] = bitmap;
}
publicvoidsetTextView(TextView tv){
mStatusTextView =tv;
mStatusTextView.setVisibility(View.INVISIBLE);
}
@Override
protectedvoidonSizeChanged(intw,inth,intoldw,intoldh) {
mStartX = w /2- GRID_SIZE * GRID_WIDTH /2;
mStartY = h /2- GRID_SIZE * GRID_WIDTH /2;
}
@Override
publicbooleanonTouchEvent(MotionEvent event){
switch(mGameState) {
caseGAMESTATE_PRE:
break;
caseGAMESTATE_RUN: {
intx;
inty;
floatx0 = GRID_WIDTH - (event.getX() - mStartX) % GRID_WIDTH;
floaty0 = GRID_WIDTH - (event.getY() - mStartY) % GRID_WIDTH;
if(x0
x = (int) ((event.getX() - mStartX) / GRID_WIDTH);
}else{
x = (int) ((event.getX() - mStartX) / GRID_WIDTH) -1;
}
if(y0
y = (int) ((event.getY() - mStartY) / GRID_WIDTH);
}else{
y = (int) ((event.getY() - mStartY) / GRID_WIDTH) -1;
}
if((x >=0&& x
&& (y >=0&& y
if(mGridArray[x][y] ==0) {
if(wbflag == BLACK) {
putChess(x, y, BLACK);
//this.mGridArray[x][y] = 1;
if(checkWin(BLACK)){//如果是黑棋赢了
mText = STRING_LOSE;
mGameState = GAMESTATE_END;
showTextView(mText);
}elseif(checkFull()){//如果棋盘满了
mText = STRING_EQUAL;
mGameState = GAMESTATE_END;
showTextView(mText);
}
wbflag = WHITE;
}elseif(wbflag == WHITE) {
putChess(x, y, WHITE);
//this.mGridArray[x][y] = 2;
if(checkWin(WHITE)){
mText = STRING_WIN;
mGameState = GAMESTATE_END;
showTextView(mText);
}elseif(checkFull()){//如果棋盘满了
mText = STRING_EQUAL;
mGameState = GAMESTATE_END;
showTextView(mText);
}
wbflag = BLACK;
}
}
}
}
break;
caseGAMESTATE_PAUSE:
break;
caseGAMESTATE_END:
break;
}
this.invalidate();
returntrue;
}
@Override
publicbooleanonKeyDown(intkeyCode, KeyEvent msg) {
Log.e("KeyEvent.KEYCODE_DPAD_CENTER"," "+ keyCode);
if(keyCode == KeyEvent.KEYCODE_DPAD_CENTER){
switch(mGameState){
caseGAMESTATE_PRE:
break;
caseGAMESTATE_RUN:
break;
caseGAMESTATE_PAUSE:
break;
caseGAMESTATE_END:
{//游戏结束后,按CENTER键继续
Log.e("Fire Key Pressed:::","FIRE");
mGameState = GAMESTATE_RUN;
this.setVisibility(View.VISIBLE);
this.mStatusTextView.setVisibility(View.INVISIBLE);
this.init();
this.invalidate();
}
break;
}
}
returnsuper.onKeyDown(keyCode, msg);
}
@Override
publicvoidonDraw(Canvas canvas) {
canvas.drawColor(Color.YELLOW);
// 画棋盘
{
Paint paintRect =newPaint();
paintRect.setColor(Color.GRAY);
paintRect.setStrokeWidth(2);
paintRect.setStyle(Style.STROKE);
for(inti =0; i
for(intj =0; j
intmLeft = i * GRID_WIDTH + mStartX;
intmTop = j * GRID_WIDTH + mStartY;
intmRright = mLeft + GRID_WIDTH;
intmBottom = mTop + GRID_WIDTH;
canvas.drawRect(mLeft, mTop, mRright, mBottom, paintRect);
}
}
//画棋盘的外边框
paintRect.setStrokeWidth(4);
canvas.drawRect(mStartX, mStartY, mStartX + GRID_WIDTH*GRID_SIZE, mStartY + GRID_WIDTH*GRID_SIZE, paintRect);
}
//画棋子
for(inti =0; i
for(intj =0; j
if(mGridArray[i][j] == BLACK){
//通过图片来画
//canvas.drawBitmap(mChessBW[0], mStartX + (i+1) * GRID_WIDTH - CHESS_DIAMETER/2 , mStartY + (j+1)* GRID_WIDTH - CHESS_DIAMETER/2 , mPaint);
//通过圆形来画
{
Paint paintCircle =newPaint();
paintCircle.setColor(Color.BLACK);
canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle);
}
}elseif(mGridArray[i][j] == WHITE){
//通过图片来画
//canvas.drawBitmap(mChessBW[1], mStartX + (i+1) * GRID_WIDTH - CHESS_DIAMETER/2 , mStartY + (j+1)* GRID_WIDTH - CHESS_DIAMETER/2 , mPaint);
//通过圆形来画
{
Paint paintCircle =newPaint();
paintCircle.setColor(Color.WHITE);
canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle);
}
}
}
}
}
publicvoidputChess(intx,inty,intblackwhite){
mGridArray[x][y] = blackwhite;
}
publicbooleancheckWin(intwbflag){
for(inti =0; i
for(intj =0; j
//检测横轴五个相连
if(((i+4)
(mGridArray[i][j] == wbflag) && (mGridArray[i+1][j] == wbflag)&& (mGridArray[i +2][j] == wbflag) && (mGridArray[i +3][j] == wbflag) && (mGridArray[i +4][j] == wbflag)){
Log.e("check win or loss:", wbflag +"win");
mWinFlag = wbflag;
}
//纵轴5个相连
if(((j+4)
(mGridArray[i][j] == wbflag) && (mGridArray[i][j+1] == wbflag)&& (mGridArray[i ][j+2] == wbflag) && (mGridArray[i ][j+3] == wbflag) && (mGridArray[i ][j+4] == wbflag)){
Log.e("check win or loss:", wbflag +"win");
mWinFlag = wbflag;
}
//左上到右下5个相连
if(((j+4)
(mGridArray[i][j] == wbflag) && (mGridArray[i+1][j+1] == wbflag)&& (mGridArray[i +2][j+2] == wbflag) && (mGridArray[i +3][j+3] == wbflag) && (mGridArray[i +4][j+4] == wbflag)){
Log.e("check win or loss:", wbflag +"win");
mWinFlag = wbflag;
}
//右上到左下5个相连
if(((i-4) >=0)&& ((j+4)
(mGridArray[i][j] == wbflag) && (mGridArray[i-1][j+1] == wbflag)&& (mGridArray[i -2][j+2] == wbflag) && (mGridArray[i -3][j+3] == wbflag) && (mGridArray[i -4][j+4] == wbflag)){
Log.e("check win or loss:", wbflag +"win");
mWinFlag = wbflag;
}
}
if( mWinFlag == wbflag){
returntrue;
}else
returnfalse;
}
publicbooleancheckFull(){
intmNotEmpty =0;
for(inti =0; i
for(intj =0; j
if(mGridArray[i][j] !=0) mNotEmpty +=1;
}
if(mNotEmpty == (GRID_SIZE-1)*(GRID_SIZE-1))returntrue;
elsereturnfalse;
}
publicvoidshowTextView(CharSequence mT){
this.mStatusTextView.setText(mT);
mStatusTextView.setVisibility(View.VISIBLE);
}
}