Android五子棋 (2).doc
Android开发-一个简单的五子棋游戏好了,下面直接贴代码:/* * Five In a Row. (五子棋) * 这是一个简单的五子棋程序,是我自己的一个练习,贴出来跟大家分享。 * 希望跟大家一起多交流。 我的GoogleTalk: lixinso <at> * * */-/TBD:AI,悔棋/-package lixinsong.game.gobang;import android.app.Activity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.TextView;/这是主程序,继承自Activity,实现onCreate方法。:public class gobang extends Activity GobangView gbv; /* Called when the activity is first created. */ Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); gbv = (GobangView)this.findViewById(R.id.gobangview); gbv.setTextView(TextView)this.findViewById(R.id.text);里面的R.id.gobangview是在res中定义的View。<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android=" android:layout_width="fill_parent" android:layout_height="fill_parent"> <lixinsong.game.gobang.GobangView android:id="+id/gobangview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="aaaaa" tileSize="24" /> <RelativeLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" > <TextView android:id="+id/text" android:text="hahahhaha" android:visibility="visible" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center_horizontal" android:textColor="#ffff0000" android:textStyle="bold" android:textSize="24sp" /> </RelativeLayout></FrameLayout>/五子棋的Viewpackage lixinsong.game.gobang;import android.content.Context;import android.content.res.Resources;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.widget.TextView;/*棋盘一共10×10格 * 棋盘居中 * * * */public class GobangView extends View implements Runnable public class GobangView extends View protected static int GRID_SIZE = 10; protected static int GRID_WIDTH = 30; / 棋盘格的宽度 protected static int CHESS_DIAMETER = 26; / 棋的直径 protected static int mStartX;/ 棋盘定位的左上角X protected static int mStartY;/ 棋盘定位的左上角Y private Bitmap mChessBW; / 黑棋和白棋 private static int mGridArray; / 网格 boolean key = false; int wbflag = 1; /该下白棋了=2,该下黑棋了=1. 这里先下黑棋(黑棋以后设置为机器自动下的棋子) int mLevel = 1; /游戏难度 int mWinFlag = 0; private final int BLACK=1; private final int WHITE=2; int mGameState = GAMESTATE_RUN; /游戏阶段:0=尚未游戏,1=正在进行游戏,2=游戏结束 static final int GAMESTATE_PRE = 0; static final int GAMESTATE_RUN = 1; static final int GAMESTATE_PAUSE = 2; static final int GAMESTATE_END = 3; /private TextView mStatusTextView; / 根据游戏状态设置显示的文字 public TextView mStatusTextView; / 根据游戏状态设置显示的文字 private Bitmap btm1; private final Paint mPaint = new Paint(); 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." public GobangView(Context context, AttributeSet attrs, int defStyle) super(context, attrs, defStyle); public GobangView(Context context, AttributeSet attrs) /好像调用的是这个构造函数,为什么不是前面的呢 super(context, attrs); this.setFocusable(true); /20090530 this.setFocusableInTouchMode(true); init(); /这里画棋子后来没有用图片画,而是直接画了圆。因为我做的图片不好看。 / 初始化黑白棋的Bitmap public void init() mGameState = 1; /设置游戏为开始状态 wbflag = BLACK; /初始为先下黑棋 mWinFlag = 0; /清空输赢标志。 mGridArray = new intGRID_SIZE-1GRID_SIZE-1; mChessBW = new Bitmap2; Bitmap bitmap = Bitmap.createBitmap(CHESS_DIAMETER, CHESS_DIAMETER, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); Resources r = this.getContext().getResources(); Drawable tile = r.getDrawable(R.drawable.chess1); tile.setBounds(0, 0, CHESS_DIAMETER, CHESS_DIAMETER); tile.draw(canvas); mChessBW0 = bitmap; tile = r.getDrawable(R.drawable.chess2); tile.setBounds(0, 0, CHESS_DIAMETER, CHESS_DIAMETER); tile.draw(canvas); mChessBW1 = bitmap; public void setTextView(TextView tv) mStatusTextView =tv; mStatusTextView.setVisibility(View.INVISIBLE); Override protected void onSizeChanged(int w, int h, int oldw, int oldh) mStartX = w / 2 - GRID_SIZE * GRID_WIDTH / 2; mStartY = h / 2 - GRID_SIZE * GRID_WIDTH / 2; Override public boolean onTouchEvent(MotionEvent event) switch (mGameState) case GAMESTATE_PRE: break; case GAMESTATE_RUN: int x; int y; float x0 = GRID_WIDTH - (event.getX() - mStartX) % GRID_WIDTH; float y0 = GRID_WIDTH - (event.getY() - mStartY) % GRID_WIDTH; if (x0 < GRID_WIDTH / 2) x = (int) (event.getX() - mStartX) / GRID_WIDTH); else x = (int) (event.getX() - mStartX) / GRID_WIDTH) - 1; if (y0 < GRID_WIDTH / 2) y = (int) (event.getY() - mStartY) / GRID_WIDTH); else y = (int) (event.getY() - mStartY) / GRID_WIDTH) - 1; if (x >= 0 && x < GRID_SIZE - 1) && (y >= 0 && y < GRID_SIZE - 1) if (mGridArrayxy = 0) if (wbflag = BLACK) putChess(x, y, BLACK); /this.mGridArrayxy = 1; if(checkWin(BLACK) /如果是黑棋赢了 mText = STRING_LOSE; mGameState = GAMESTATE_END; showTextView(mText); else if(checkFull()/如果棋盘满了 mText = STRING_EQUAL; mGameState = GAMESTATE_END; showTextView(mText); wbflag = WHITE; else if (wbflag = WHITE) putChess(x, y, WHITE); /this.mGridArrayxy = 2; if(checkWin(WHITE) mText = STRING_WIN; mGameState = GAMESTATE_END; showTextView(mText); else if(checkFull()/如果棋盘满了 mText = STRING_EQUAL; mGameState = GAMESTATE_END; showTextView(mText); wbflag = BLACK; break; case GAMESTATE_PAUSE: break; case GAMESTATE_END: break; this.invalidate(); return true; Override public boolean onKeyDown(int keyCode, KeyEvent msg) Log.e("KeyEvent.KEYCODE_DPAD_CENTER", " " + keyCode); if(keyCode = KeyEvent.KEYCODE_DPAD_CENTER) switch(mGameState) case GAMESTATE_PRE: break; case GAMESTATE_RUN: break; case GAMESTATE_PAUSE: break; case GAMESTATE_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; return super.onKeyDown(keyCode, msg); Override public void onDraw(Canvas canvas) canvas.drawColor(Color.YELLOW); / 画棋盘 Paint paintRect = new Paint(); paintRect.setColor(Color.GRAY); paintRect.setStrokeWidth(2); paintRect.setStyle(Style.STROKE); for (int i = 0; i < GRID_SIZE; i+) for (int j = 0; j < GRID_SIZE; j+) int mLeft = i * GRID_WIDTH + mStartX; int mTop = j * GRID_WIDTH + mStartY; int mRright = mLeft + GRID_WIDTH; int mBottom = 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 (int i = 0; i < GRID_SIZE-1; i+) for (int j = 0; j < GRID_SIZE-1; j+) if(mGridArrayij = BLACK) /通过图片来画 /canvas.drawBitmap(mChessBW0, mStartX + (i+1) * GRID_WIDTH - CHESS_DIAMETER/2 , mStartY + (j+1)* GRID_WIDTH - CHESS_DIAMETER/2 , mPaint); /通过圆形来画 Paint paintCircle = new Paint(); paintCircle.setColor(Color.BLACK); canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle); else if(mGridArrayij = WHITE) /通过图片来画 /canvas.drawBitmap(mChessBW1, mStartX + (i+1) * GRID_WIDTH - CHESS_DIAMETER/2 , mStartY + (j+1)* GRID_WIDTH - CHESS_DIAMETER/2 , mPaint); /通过圆形来画 Paint paintCircle = new Paint(); paintCircle.setColor(Color.WHITE); canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle); public void putChess(int x, int y, int blackwhite) mGridArrayxy = blackwhite; public boolean checkWin(int wbflag) for(int i = 0; i < GRID_SIZE - 1 ; i+ ) /i表示列(根据宽度算出来的) for(int j = 0; j < GRID_SIZE - 1; j+)/i表示行(根据高度算出来的) /检测横轴五个相连 if(i+4) < (GRID_SIZE - 1)&& (mGridArrayij = wbflag) && (mGridArrayi+1j = wbflag)&& (mGridArrayi + 2j = wbflag) && (mGridArrayi + 3j = wbflag) && (mGridArrayi + 4j = wbflag) Log.e("check win or loss:", wbflag + "win"); mWinFlag = wbflag; /纵轴5个相连 if(j+4) < (GRID_SIZE - 1)&& (mGridArrayij = wbflag) && (mGridArrayij+1 = wbflag)&& (mGridArrayi j+ 2 = wbflag) && (mGridArrayi j+ 3 = wbflag) && (mGridArrayi j+ 4 = wbflag) Log.e("check win or loss:", wbflag + "win"); mWinFlag = wbflag; /左上到右下5个相连 if(j+4) < (GRID_SIZE - 1)&& (i+4) < (GRID_SIZE - 1) && (mGridArrayij = wbflag) && (mGridArrayi+1j+1 = wbflag)&& (mGridArrayi + 2 j+ 2 = wbflag) && (mGridArrayi + 3j+ 3 = wbflag) && (mGridArrayi + 4 j+ 4 = wbflag) Log.e("check win or loss:", wbflag + "win"); mWinFlag = wbflag; /右上到左下5个相连 if(i-4) >= 0)&& (j+4) < (GRID_SIZE - 1) && (mGridArrayij = wbflag) && (mGridArrayi-1j+1 = wbflag)&& (mGridArrayi - 2 j+ 2 = wbflag) && (mGridArrayi - 3j+ 3 = wbflag) && (mGridArrayi - 4 j+ 4 = wbflag) Log.e("check win or loss:", wbflag + "win"); mWinFlag = wbflag; if( mWinFlag = wbflag) return true; else return false; public boolean checkFull() int mNotEmpty = 0; for(int i = 0; i < GRID_SIZE -1; i +) for(int j = 0; j < GRID_SIZE - 1; j +) if(mGridArrayij != 0) mNotEmpty +=1; if(mNotEmpty = (GRID_SIZE-1)*(GRID_SIZE-1) return true; else return false; public void showTextView(CharSequence mT) this.mStatusTextView.setText(mT); mStatusTextView.setVisibility(View.VISIBLE);