android五子棋棋子资源,教你开发一个简单的Android五子棋游戏

//五子棋的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);

}

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值