Android开发实现的简单五子棋游戏示例

本文实例讲述了Android开发实现的简单五子棋游戏。分享给大家供大家参考,具体如下:

我刚刚在Android上写的一个五子棋的小程序,在这里跟大家分享一下。

写完以后感觉Android的SDK,虽然也是使用Java的,但是跟Java ME还是有很大不一样。

首先就是Android的SDK没有实现所有的Java ME标准,原来运行在KJava上的应用程序是不能在Android上直接跑的。

另外就是Android的SDK有大量的API是Android自己的,需要开发人员去了解。

Android的开发框架也跟别的不一样,需要学习一下。

这个五子棋游戏是我参照Android 的Snake这个Demo还有别的例子,加上自己的需求写出来的。

其中实现了棋盘、下棋、判断输赢、重新开局等功能。目前暂时没有实现机器智能走棋子的功能。

Android的触屏功能是比较好用的,前一段时间见人演示的G1,触屏很好用,而且Android的“Window” 窗、"Shade"帘加上触摸,显得很炫。

呃,这个五子棋,也是用触摸屏实现走棋的。点一下棋盘的位子,把棋子落到棋盘上。

先贴个图看看效果吧。

好了,下面直接贴代码:

/*
 * Five In a Row. (五子棋)
 * 这是一个简单的五子棋程序,是我自己的一个练习,贴出来跟大家分享。
 * 希望跟大家一起多交流。 我的GoogleTalk: lixinso <at> gmail.com
 *
 *
 */
//----------------------
//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="http://schemas.android.com/apk/res/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>

五子棋的View

package 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 int[GRID_SIZE-1][GRID_SIZE-1];
  mChessBW = new Bitmap[2];
  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);
  mChessBW[0] = bitmap;
  tile = r.getDrawable(R.drawable.chess2);
  tile.setBounds(0, 0, CHESS_DIAMETER, CHESS_DIAMETER);
  tile.draw(canvas);
  mChessBW[1] = 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 (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);
       }else if(checkFull()){//如果棋盘满了
        mText = STRING_EQUAL;
        mGameState = GAMESTATE_END;
        showTextView(mText);
       }
       wbflag = WHITE;
      } else if (wbflag == WHITE) {
       putChess(x, y, WHITE);
       //this.mGridArray[x][y] = 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(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 = new Paint();
      paintCircle.setColor(Color.BLACK);
      canvas.drawCircle(mStartX + (i+1) * GRID_WIDTH, mStartY + (j+1)* GRID_WIDTH, CHESS_DIAMETER/2, paintCircle);
     }
    }else if(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 = 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){
  mGridArray[x][y] = 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))&&
     (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) < (GRID_SIZE - 1))&&
       (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) < (GRID_SIZE - 1))&& ((i+4) < (GRID_SIZE - 1)) &&
       (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) < (GRID_SIZE - 1)) &&
       (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){
   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(mGridArray[i][j] != 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);
 }
}

PS:这里再为大家推荐另一款本站的js版五子棋游戏供大家参考(其AI相对简单一些)

在线五子棋游戏:
http://tools.jb51.net/games/wuziqi

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android五子棋游戏程序完整实例分析

    最近学习了五子棋的课程,感觉挺不错.然后自己写了个关于五子棋的android程序,从中还是能够学习到很多东西的.现在我们开始今天五子棋程序的编写历程.程序的源码请参见友情链接: 好了,我们现在开始一步步的构建出项目来,首先是如下的项目结构图: 运行的效果图: 一些前期做准备的代码 1. 主活动类MainActivity,在菜单中加入了再来一局的功能: public class MainActivity extends AppCompatActivity { private ChessBoardV

  • Android下SDL2实现五子棋游戏

    本文实例介绍了Android下用SDL2实现一个简单的五子棋游戏,分享给大家供大家参考,具体内容如下 1. Five.c // Five.c // SDL2 五子棋 // gcc -mwindows -o Five Five.c FiveData.c FiveData.h -lSDL2 -lSDL2main -lSDL2_image -lSDL2_ttf //#define _DEBUG_ #include <stdio.h> #include <string.h> #includ

  • Android自定义View实现五子棋小游戏

    本文实例为大家分享了Android实现五子棋小游戏的具体代码,供大家参考,具体内容如下 配图: 代码: package com.example.fiveson; import java.util.LinkedList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphic

  • Android自定义View实现五子棋游戏

    本文实例为大家分享了Android五子棋游戏的具体代码,供大家参考,具体内容如下 1.效果图: 2.GobangPanel棋盘面板: public class GobangPanel extends View { private int mPanelWidth;//棋盘的宽度 private float mLineHeight;//行,高要为float private int MAX_LINE = 15;//棋盘行数 private int MAX_COUNT_IN_LINE = 5;//设置赢

  • android简单自定义View实现五子棋

    本文实例为大家分享了android自定义View实现五子棋的具体代码,供大家参考,具体内容如下 先说一下吧,android的自定义View就是自己实现一个类去继承View,实现其中的方法,这里面我最感兴趣的就是onDraw方法了,因为你要的样式都要在这里面进实现,看一下效果图吧: 大概就是介个样子的,长得丑不要紧,能用就行,毕竟只是简单的了解一下嘛! *protected void onDraw(Canvas canvas) { super.onDraw(canvas); RectF rectF

  • Android开发实现的简单五子棋游戏示例

    本文实例讲述了Android开发实现的简单五子棋游戏.分享给大家供大家参考,具体如下: 我刚刚在Android上写的一个五子棋的小程序,在这里跟大家分享一下. 写完以后感觉Android的SDK,虽然也是使用Java的,但是跟Java ME还是有很大不一样. 首先就是Android的SDK没有实现所有的Java ME标准,原来运行在KJava上的应用程序是不能在Android上直接跑的. 另外就是Android的SDK有大量的API是Android自己的,需要开发人员去了解. Android的开

  • android自定义View实现简单五子棋游戏

    做一个五子棋练练手,没什么特别的,再复习一下自定义View的知识,onMeasure,MeasureSpec , onDraw以及OnTouchEvent方法等. 效果图 代码如下: package com.fivechess; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas;

  • Android开发中ProgressDialog简单用法示例

    本文实例讲述了Android开发中ProgressDialog简单用法.分享给大家供大家参考,具体如下: 网上一般对进度条的示例都是如何显示,没有在任务结束如何关闭的文章,参考其他文章经过试验之后把整套进度条显示的简单示例如下: 建立android工程等工作都略去,Google一下就可以了. 下面来介绍主要的Activity ProgressBarDemo.java package com.lveyo.android.demo.progressbar; import android.app.Ac

  • Java实现简单的五子棋游戏示例代码

    目录 项目结构 核心代码 ArrComparator.java类 ChessMap.java类 ChessPanel.java类 效果图展示 项目结构 这个是在网上找的资源,出处记不得了,记录一下.程序的总体结构,很简单的: 核心代码 代码如下: ArrComparator.java类 import java.util.Comparator; /** * 排序 Comparator */ class ArrComparator implements Comparator<Object> { i

  • Android开发实现的简单媒体播放器功能示例

    本文实例讲述了Android开发实现的简单媒体播放器功能.分享给大家供大家参考,具体如下: 一.概述: 因为播放视频需要很大的内存,所以必须使用surfaceview , surfaceview 里实现了双缓冲的功能, 二.全部代码: /** * @描述 使用surfaceview 创建视频 * @项目名称 App_Basic * @包名 com.example.basic.media * @类名 MediaPlayerActivity * @author chenlin * @date 201

  • Android开发Flutter 桌面应用窗口化实战示例

    目录 前言 一.应用窗口的常规配置 应用窗口化 自定义窗口导航栏 美化应用窗口 二.windows平台特定交互 注册表操作 执行控制台指令 实现应用单例 三.桌面应用的交互习惯 按钮点击态 获取应用启动参数 四.写在最后 前言 通过此篇文章,你可以编写出一个完整桌面应用的窗口框架. 你将了解到: Flutter在开发windows和Android桌面应用初始阶段,应用窗口的常规配置: windows平台特定交互的实现,如:执行控制台指令,windows注册表,应用单例等: 桌面应用的交互习惯,如

  • android 通过MediaRecorder实现简单的录音示例

    整理文档,搜刮出一个android 通过MediaRecorder实现简单的录音示例,稍微整理精简一下做下分享. MainActivity package com.centaur.collectvoice; import android.media.MediaRecorder; import android.os.Environment; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; impo

  • Android开发中的简单设置技巧集锦

    本文实例总结了Android开发中的简单设置技巧.分享给大家供大家参考,具体如下: 1开机图片: android-logo-mask.png android-logo-shine.png 这两个图片一个在上一个在下 ./out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates/classes/assets/images/android-logo-shine.png ./frameworks/base/core

  • Android开发实现的简单计算器功能【附完整demo源码下载】

    本文实例讲述了Android开发实现的简单计算器功能.分享给大家供大家参考,具体如下: 这个Android计算器虽然还有点小bug,不过简单的计算功能还是没问题的哦: 先上图看效果 比较简单,所以我就没怎么写注释,应该一看就能明白的 有不明白的可以发信问我 先贴MainActivity.java代码 package com.example.calculator; import android.app.Activity; import android.os.Bundle; import andro

  • python实现简单五子棋游戏

    本文实例为大家分享了python实现简单五子棋游戏的具体代码,供大家参考,具体内容如下 from graphics import * from math import * import numpy as np def ai(): """ AI计算落子位置 """ maxmin(True, DEPTH, -99999999, 99999999) return next_point[0], next_point[1] def maxmin(is_ai

随机推荐