基于Android的五子棋的开发

需求分析

1 棋盘和棋子绘制
2 按照五子棋的规则制定游戏胜负规则
3 鼠标响应 在对战中 需要通过鼠标点击下棋 进行游戏的基本操作
4 游戏模式 双人对战 两人交替落子 双方孰先孰后随机决定
5 棋子的形式和作用 棋子分为黑白两种棋子 双方各持一种棋子 通过黑先白后的方式来进行对局
6 通过棋子完成五连珠结束游戏

流程图

android stdio中的基本架构

CheckWinner.java

  package com.example.wuziqi;import android.graphics.Point;import java.util.List;
/*** Created by Linux on 2016/4/8.*/
public class CheckWinner {private Point point1, point2;private int checkModel = Constants.HORIZONTAL;public boolean checkFiveInLineWinner(List<Point> points) {for (Point point : points) {int x = point.x;int y = point.y;if (checkHorizontal(x, y, points)) {return true;} else if (checkVertical(x, y, points)) {return true;} else if (checkLeftDiagonal(x, y, points)) {return true;} else if (checkRighttDiagonal(x, y, points)) {return true;}}return false;}private boolean check(int x, int y, List<Point> points, int checkOri) {int count = 1;for (int i = 1; i < Constants.MAX_COUNT_IN_LINE; i++) {switch (checkOri) {case Constants.HORIZONTAL:point1 = new Point(x - i, y);break;case Constants.VERTICAL:point1 = new Point(x, y - i);break;case Constants.LEFT_DIAGONAL:point1 = new Point(x - i, y + i);break;case Constants.RIGHT_DIAGONAL:point1 = new Point(x + i, y + i);break;}if (points.contains(point1)) {count++;} else {break;}}for (int i = 1; i < Constants.MAX_COUNT_IN_LINE; i++) {switch (checkOri) {case Constants.HORIZONTAL:point2 = new Point(x + i, y);break;case Constants.VERTICAL:point2 = new Point(x, y + i);break;case Constants.LEFT_DIAGONAL:point2 = new Point(x + i, y - i);break;case Constants.RIGHT_DIAGONAL:point2 = new Point(x - i, y - i);break;}if (points.contains(point2)) {count++;} else {break;}}if (count == Constants.MAX_COUNT_IN_LINE) {return true;}return false;}// 横向判断private boolean checkHorizontal(int x, int y, List<Point> points) {checkModel = Constants.HORIZONTAL;return check(x, y, points, checkModel);}// 竖向判断private boolean checkVertical(int x, int y, List<Point> points) {checkModel = Constants.VERTICAL;return check(x, y, points, checkModel);}// 左斜判断private boolean checkLeftDiagonal(int x, int y, List<Point> points) {checkModel = Constants.LEFT_DIAGONAL;return check(x, y, points, checkModel);}// 右斜判断private boolean checkRighttDiagonal(int x, int y, List<Point> points) {checkModel = Constants.RIGHT_DIAGONAL;return check(x, y, points, checkModel);}}

ChessBoardView.java

package com.example.wuziqi;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.media.MediaPlayer;
import android.os.Bundle;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;import java.util.ArrayList;public class ChessBoardView extends View {// 棋盘的宽度,也是长度private int mViewWidth;// 棋盘每格的长度private float maxLineHeight;private Paint paint = new Paint();// 定义黑白棋子的Bitmapprivate Bitmap mwhitePiece, mblackPiece;private float ratioPieceOfLineHeight = 3 * 1.0f / 4;// 判断当前落下的棋子是否是白色的
private boolean mIsWhite = true;
// 记录黑白棋子位置的列表
private ArrayList<Point> mwhiteArray = new ArrayList<>();
private ArrayList<Point> mblackArray = new ArrayList<>();// 游戏是否结束
private boolean mIsGameOver;
// 游戏结束,是否是白色方胜利
private boolean mIsWhiteWinner;public ChessBoardView(Context context, AttributeSet attrs) {super(context, attrs);init();
}
private void init() {paint.setColor(0x88000000);paint.setAntiAlias(true);paint.setDither(true);paint.setStyle(Paint.Style.STROKE);mwhitePiece = BitmapFactory.decodeResource(getResources(), R.mipmap.stone_w2);mblackPiece = BitmapFactory.decodeResource(getResources(), R.mipmap.stone_b1);
}@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthSize = MeasureSpec.getSize(widthMeasureSpec);int widthModel = MeasureSpec.getMode(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int heightModel = MeasureSpec.getMode(heightMeasureSpec);int width = Math.min(widthSize, heightSize);if (widthModel == MeasureSpec.UNSPECIFIED) {width = heightSize;} else if (heightModel == MeasureSpec.UNSPECIFIED) {width = widthSize;}setMeasuredDimension(width, width);
}
@Override
protected void onDraw(Canvas canvas) {super.onDraw(canvas);// 绘制棋盘的网格drawBoard(canvas);// 绘制棋盘的黑白棋子drawPieces(canvas);// 检查游戏是否结束checkGameOver();
}
// 检查游戏是否结束
private void checkGameOver() {CheckWinner checkWinner = new CheckWinner();boolean whiteWin = checkWinner.checkFiveInLineWinner(mwhiteArray);boolean blackWin = checkWinner.checkFiveInLineWinner(mblackArray);if (whiteWin || blackWin) {mIsGameOver = true;mIsWhiteWinner = whiteWin;String text = mIsWhiteWinner ? "白棋胜利" : "黑棋胜利";Toast.makeText(getContext(), text, Toast.LENGTH_SHORT).show();}
}
// 根据黑白棋子的数组绘制棋子
private void drawPieces(Canvas canvas) {for (int i = 0, n = mwhiteArray.size(); i < n; i++) {Point whitePoint = mwhiteArray.get(i);float left = (whitePoint.x + (1 - ratioPieceOfLineHeight) / 2) * maxLineHeight;float top = (whitePoint.y + (1 - ratioPieceOfLineHeight) / 2) * maxLineHeight;canvas.drawBitmap(mwhitePiece, left, top, null);}for (int i = 0, n = mblackArray.size(); i < n; i++) {Point blackPoint = mblackArray.get(i);float left = (blackPoint.x + (1 - ratioPieceOfLineHeight) / 2) * maxLineHeight;float top = (blackPoint.y + (1 - ratioPieceOfLineHeight) / 2) * maxLineHeight;canvas.drawBitmap(mblackPiece, left, top, null);}
}
// 绘制棋盘的网线
private void drawBoard(Canvas canvas) {int w = mViewWidth;float lineHeight = maxLineHeight;for (int i = 0; i < Constants.MAX_LINE; i++) {int startX = (int) (lineHeight / 2);int endX = (int) (w - lineHeight / 2);int y = (int) ((0.5 + i) * lineHeight);canvas.drawLine(startX, y, endX, y, paint);canvas.drawLine(y, startX, y, endX, paint);}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mViewWidth = w;maxLineHeight = mViewWidth * 1.0f / Constants.MAX_LINE;int pieceWidth = (int) (maxLineHeight * ratioPieceOfLineHeight);mwhitePiece = Bitmap.createScaledBitmap(mwhitePiece, pieceWidth, pieceWidth, false);mblackPiece = Bitmap.createScaledBitmap(mblackPiece, pieceWidth, pieceWidth, false);
}
@Override
public boolean onTouchEvent(MotionEvent event) {if (mIsGameOver) {return false;}int action = event.getAction();if (action == MotionEvent.ACTION_UP) {int x = (int) event.getX();int y = (int) event.getY();Point point = getValidPoint(x, y);if (mwhiteArray.contains(point) || mblackArray.contains(point)) {return false;}if (mIsWhite) {mwhiteArray.add(point);} else {mblackArray.add(point);}invalidate();mIsWhite = !mIsWhite;}return true;
}
private Point getValidPoint(int x, int y) {int validX = (int) (x / maxLineHeight);int validY = (int) (y / maxLineHeight);return new Point(validX, validY);
}
private static final String INSTANCE = "instance";
private static final String INSTANCE_GAME_OVER = "instance_game_over";
private static final String INSTANCE_WHITE_ARRAY = "instance_white_array";
private static final String INSTANCE_BLACK_ARRAY = "instance_black_array";
@Override
protected Parcelable onSaveInstanceState() {Bundle bundle = new Bundle();bundle.putParcelable(INSTANCE, super.onSaveInstanceState());bundle.putBoolean(INSTANCE_GAME_OVER, mIsGameOver);bundle.putParcelableArrayList(INSTANCE_BLACK_ARRAY, mblackArray);bundle.putParcelableArrayList(INSTANCE_WHITE_ARRAY, mwhiteArray);return bundle;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {if (state instanceof Bundle) {Bundle bundle = (Bundle) state;mIsGameOver = bundle.getBoolean(INSTANCE_GAME_OVER);mwhiteArray = bundle.getParcelableArrayList(INSTANCE_WHITE_ARRAY);mblackArray = bundle.getParcelableArrayList(INSTANCE_BLACK_ARRAY);super.onRestoreInstanceState(bundle.getParcelable(INSTANCE));return;}super.onRestoreInstanceState(state);
}
// 再来一局
public void start() {mwhiteArray.clear();mblackArray.clear();mIsGameOver = false;mIsWhiteWinner = false;invalidate();
}

}

Constants.java

 package com.example.wuziqi;/*** Created by Linux on 2016/4/8.*/
public class Constants {// 五子连珠public final static int MAX_COUNT_IN_LINE = 5;// 棋盘的行数final static int MAX_LINE = 25;// 检查的方向final static int HORIZONTAL = 0;final static int VERTICAL = 1;final static int LEFT_DIAGONAL = 2;final static int RIGHT_DIAGONAL = 3;
}

MainActivity.java

package com.example.wuziqi;import android.content.Intent;
import android.os.Bundle;import android.view.Menu;
import android.view.MenuItem;
import android.view.View;import androidx.appcompat.app.AppCompatActivity;public class MainActivity extends AppCompatActivity {private ChessBoardView chessBoardView;@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);chessBoardView = (ChessBoardView) findViewById(R.id.boardView);
}
public void doClick(View v) {Intent intent = new Intent(MainActivity.this, MusicServer.class);switch (v.getId()) {case R.id.button1:this.startService(intent);break;case R.id.button2:this.stopService(intent);break;}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();// 再来一局if (id == R.id.action_setting) {chessBoardView.start();return true;}return super.onOptionsItemSelected(item);
}@Override
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.menu_main, menu);return true;
}

}

MusicServers.java

package com.example.wuziqi;
import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;
public class MusicServer extends Service {private MediaPlayer mp;public IBinder onBind(Intent intent) {Log.e("Service", "onBind被调用");mp.start();return null;}public void onCreate() {Log.e("Service", "onCreate被调用");mp = MediaPlayer.create(this, R.raw.yinyue);super.onCreate();}public void onDestroy() {Log.e("Service", "onDestroy被调用");mp.stop();super.onDestroy();}public int onStartCommand(Intent intent, int flags, int startId) {Log.e("Service", "onStartCommand被调用");mp.start();return super.onStartCommand(intent, flags, startId);}public boolean onUnbind(Intent intent) {Log.e("Service", "onUnbind被调用");mp.stop();return super.onUnbind(intent);}
}

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.wuziqi"><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:name=".MusicServer"android:enabled="true"android:exported="true"></service>
</application>
</manifest>

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/bg1"tools:context="com.example.wuziqi.MainActivity"><com.example.wuziqi.ChessBoardViewandroid:id="@+id/boardView"android:layout_centerInParent="true"android:layout_width="match_parent"android:layout_height="match_parent" /><Buttonandroid:id="@+id/button1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/textView"android:layout_centerHorizontal="true"android:layout_marginTop="16dp"android:onClick="doClick"android:text="开启音乐" /><Buttonandroid:id="@+id/button2"style="?android:attr/buttonStyleSmall"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_below="@+id/button1"android:layout_alignStart="@+id/button1"android:layout_marginStart="94dp"android:layout_marginTop="-48dp"android:onClick="doClick"android:text="停止音乐" /></RelativeLayout>

menu_main.xml

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:tools="http://schemas.android.com/tools"xmlns:android="http://schemas.android.com/apk/res/android"><item android:id="@+id/action_setting"android:title="再来一局"android:orderInCategory="100"android:showAsAction="never"tools:ignore="AppCompatResource" /><item android:id="@+id/action_setting1"android:title="悔棋"android:orderInCategory="100"android:showAsAction="never"tools:ignore="AppCompatResource" />
</menu>

运行结果


悔棋由于没时间所以没实现,如果有问题希望大家帮忙改正。

基于android的五子棋开发相关推荐

  1. java android五子棋_基于android实现五子棋开发

    基于Android的五子棋的开发,供大家参考,具体内容如下 需求分析 1 棋盘和棋子绘制 2 按照五子棋的规则制定游戏胜负规则 3 鼠标响应 在对战中 需要通过鼠标点击下棋 进行游戏的基本操作 4 游 ...

  2. android五子棋设计模板,基于android的五子棋游戏设计

    内容介绍 原文档由会员 hfnmb 发布 基于Android的五子棋游戏设计 软件工程 [摘 要]本论文主要阐述以面向对象的程序开发语言eclipse为开发工具, 基于智能手机Android之上设计一 ...

  3. java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc

    基于Android平台五子棋游戏最终版 毕业设计(论文)任务书 毕业设计(论文)题目: 基于android平台的五子棋游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.综述国内基于and ...

  4. android和chrome的发展与未来[j].移动通信,基于Android手机app开发与设计 毕业设计 开题报告...

    基于Android 手机app开发 电子同学录的设计与开发 四.检索与本课题有关参考文献资料的简要说明 [1] 成刚编. Eclipse 从入门到精通[M] . 北京:清华大学出版社,2005 [2] ...

  5. 基于android的五子棋游戏的设计——毕业论文.doc,基于Android的五子棋游戏的设计——毕业论文.doc.doc...

    基于Android的五子棋游戏的设计--毕业论文.doc 躁虐方慎养娇陇榷圣枚茵另裙弧懈舅愤拱玫叙未殆鸿嗽透凝彰枝句坯败醋求惦刑退馆罗拖膨清褐兔捻吮嘘唆鞋匆九若秃纽谓跃捡夺浇居汛纠耻生瘟欣糯弹贯住编却 ...

  6. 【基于Android聊天软件开发-哔哩哔哩】 https://b23.tv/109B82i

    [基于Android聊天软件开发-哔哩哔哩] https://b23.tv/109B82i https://b23.tv/109B82i Android聊天软件开发(仿QQ) 要求: Android ...

  7. 基于Android的五子棋游戏APP设计

    目 录 第一章:绪论 1 1.1智能手机与Android系统的发展历程 1 1.1.1 智能手机 1 1.1.2 Android系统基本情况介绍 2 1.2课题现状及应用前景 3 1.2.1 五子棋简 ...

  8. 基于Android的五子棋设计与实现,毕业答辩-基于Android的五子棋游戏的设计与实现...

    ,基于安卓的五子棋游戏的设计与实现,本文中设计与开发实现的是一款基于安卓操作系统的五子棋游戏.Android作为当前智能手机市场的主要占有者,发展态势十分火热,截止2017年3月,在我国安卓市场份额达 ...

  9. 分享篇 - 58同城基于Android APP Bundle开发的全新编译模式(编译速度提升70%)

    目录 1. Wafers 项目背景 2. 效果展示 3. 实现方案 4. 改造期间遇到的问题 5. 如何接入使用 6. 对比 Instant Run 和 Apply Changes 7. 总结 1. ...

最新文章

  1. jquery学习资源
  2. 你以为ACI=SDN?大错特错!
  3. QT的QQuickView类的使用
  4. CF1305E Kuroni and the Score Distribution
  5. MOSS点滴(2):自定义Application Page
  6. mysql静默安装_oracle静默安装文件db_install.rsp详解
  7. 【Flink】Flink 报错 Hash join exceeded Too many duplicate keys
  8. java 9 api_Java9 Process API
  9. 一个被加入下载QQ盗号木马Trojan.PSW.QQPass.rie代码的网站
  10. word流程图怎么使箭头对齐_word流程图箭头怎么画
  11. 如何连接新浪sae共享数据库
  12. mysql授权用户权限能用正则的形式_mysql创建用户及受权
  13. 整理一道测试面试题(微信更换头像测试用例)
  14. 虚拟互动展会沉浸式体验方案设计优势
  15. 模仿天猫商城的J2EE商城网站项目后端5——bean包
  16. 等保2.0测评手册之安全计算环境
  17. Ubuntu Linux操作系统与实验教程(第二版)答案
  18. 离散数学之数理结构推理理论
  19. GD32E232Kx 引脚功能表
  20. 嵌入式ARM下使用ALSA USB声卡

热门文章

  1. 【DC综合】逻辑综合的实施流程
  2. SSIS之Foreach循环容器(文件枚举器)遍历文件(关键点 详细步骤 图文讲解)
  3. 使用openSSL制作SSL证书
  4. epub直接获取书名及书封面
  5. php生成云图,教程:用Python生成词云图
  6. 蜜蜂问题- 斐波那契数列
  7. 云端地球新会员重磅上线,快来解锁最全权益地图!
  8. 共享充电宝有什么好拍? | 拍者手记
  9. 两个用于谷歌输入法的颜文字拓展
  10. 可用的交换空间为 0 MB