吉游网提供最新游戏下载和手游攻略!

Android五子棋游戏,自定义棋盘、线路、棋子、游戏状态存储

发布时间:2024-10-17浏览:64

其实Android五子棋游戏,自定义棋盘、线路、棋子、游戏状态存储的问题并不复杂,但是又很多的朋友都不太了解,因此呢,今天小编就来为大家分享Android五子棋游戏,自定义棋盘、线路、棋子、游戏状态存储的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!

视频链接:http://www.imooc.com/learn/641

1.棋盘

我们一看就知道必须自定义View。这里我们定义一个GameView 作为主游戏类。第一步是测量。这里我们不难知道,五子棋棋盘是正方形的,所以我们需要测量它。

/**

* 测量

* @param widthMeasureSpec

* @参数heightMeasureSpec

*/

@覆盖

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

//获取高度和宽度值

int widthSize=MeasureSpec.getSize(widthMeasureSpec);

int widthMode=MeasureSpec.getMode(widthMeasureSpec);

int hightSize=MeasureSpec.getSize(heightMeasureSpec);

int hightMode=MeasureSpec.getMode(heightMeasureSpec);

//获取宽度和高度的最小值,即宽度

int width=Math.min(widthSize, heightMeasureSpec);

//根据测量模式详情进行处理

if (widthMode==MeasureSpec.UNSPECIFIED) {

宽度=高度tSize;

} else if (hightMode==MeasureSpec.UNSPECIFIED) {

宽度=宽度尺寸;

}

//像这样设置,做成一个正方形

setMeasuredDimension(宽度, 宽度);

}

这里的逻辑还是很简单的。我们比较长宽,设置这个View的最小长宽Wie,是一个正方形,所以我们的layout_main.xml是这样写的

?xml 版本='1.0'编码='utf-8'?

xmlns:tools='http://schemas.android.com/tools'

android:layout_width='match_parent'

android:layout_height='match_parent'

android:orientation='垂直'

android:background='@drawable/main_bg'

android:layout_width='match_parent'

android:layout_height='match_parent' /

这里我在构造方法中设置了半透明的红色背景,以便我们在调试的时候可以更清楚的看到GameView的大小。因此,运行结果

2. 线路

这应该算是棋盘的一部分,也就是棋盘上的线。我们应该怎样画呢?首先,我们必须定义一些属性。

//行数

私有静态最终int MAX_LINE=10;

//线的宽度

私有int mPanelWidth;

//线的高度

私有浮动mLineHeight;

然后,我们必须确定尺寸

/**

* 测量尺寸

* @参数w

* @参数h

* @参数旧w

* @参数oldh

*/

@覆盖

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

super.onSizeChanged(w, h, oldw, oldh);

//获取宽度

mPanelWidth=w;

//分割

mLineHeight=mPanelWidth * 1.0f/MAX_LINE;

}

别担心,这些只是一些准备工作。我们必须在onDraw(0方法中画线,但是我们前期需要准备一个画笔,对吧,所以我们需要初始化画笔

/**

* 初始化画笔

*/

私有无效initPaint() {

//设置颜色

mPaint.setColor(0x88000000);

//抗锯齿

mPaint.setAntiAlias(true);

//设置防抖

mPaint.setDither(true);

//设置样式

mPaint.setStyle(Paint.Style.STROKE);

}

现在我们可以画画了。我们在OnDraw(0方法中编写一个drawLine方法来专门绘制线条。

/**

* 如何画棋盘

* @param画布

*/

私人无效drawLine(画布画布){

//获取高度和宽度

int w=mPanelWidth;

浮点线高度=mLineHeight;

//遍历并画线

for (int i=0; i MAX_LINE; i++) {

//横坐标

int startX=(int) (lineHeight/2);

int endX=(int) (w - 行高/2);

//垂直坐标

int y=(int) ((0.5 + i) * 行高);

//水平绘制

canvas.drawLine(startX, y, endX, y, mPaint);

//绘制垂直线

canvas.drawLine(y, startX, y, endX, mPaint);

}

}

让我们运行一下

好的,在这里,请注意我定义了一个

android:gravity='中心'

属性,所以让它居中。同样,我们在initPaint中添加一些代码,使其更加直观。

//设置颜色

mPaint.setColor(Color.BLACK);

//设置线宽

mPaint.setStrokeWidth(3);

同样,我们注释掉构造函数中设置背景的测试代码

//测试代码

//设置背景颜色(0x44ff0000);

那么,让我们跑吧

好吧,我们现在有一些值得期待的事情。

3. 棋子

//黑色棋子

私有位图mBlack;

//白棋子

私有位图mWhite;

//比例,棋子的大小为高度的四分之三

私有浮点数rowSize=3 * 1.0f/4;

然后我们定义一个方法区来初始化Bitmap

/**

* 初始化棋子

*/

私有无效initBitmap() {

//获取图片资源

mBlack=BitmapFactory.decodeResource(getResources(), R.drawable.stone_black);

mWhite=BitmapFactory.decodeResource(getResources(), R.drawable.stone_white);

}

获取到资源后,我们就可以设置大小了。我们在onSizeChanged()中设置它

//片宽

int mWhiteWidth=(int) (mLineHeight * rowSize);

//修改棋子大小

mWhite=Bitmap.createScaledBitmap(mWhite, mWhiteWidth, mWhiteWidth, false);

mBlack=Bitmap.createScaledBitmap(mBlack, mWhiteWidth, mWhiteWidth, false);

但棋子并不像我们想象的那么简单。我们必须点击来画一个棋子。如何实现这个想法?我们实现它的点击事件。这里我们首先定义几个变量。

//存储用户点击的坐标

私有ListmWhiteArray=new ArrayList();

私有ListmBlackArray=new ArrayList();

//标记,无论持黑还是白,白先走

私有布尔值mIsWhite=true;

这将补充触摸事件

/**

* 触摸事件

* @参数事件

* @返回

*/

@覆盖

公共布尔onTouchEvent(MotionEvent事件){

开关(event.getAction()) {

//按下事件

案例MotionEvent.ACTION_UP:

int x=(int) event.getX();

int y=(int) event.getY();

//封装成一个Point

点p=getValidPoint(x, y);

//判断此时是否有棋子

if(mWhiteArray.contains(p) || mBlackArray.contains(p)){

//点击不生效

返回假;

}

//判断是否是白棋,则存储白棋,否则存储黑棋

如果(mIsWhite){

mWhiteArray.add(p);

} 别的{

mBlackArray.add(p);

}

//刷新

无效();

//改变值

mIsWhite=!mIsWhite;

休息;

}

返回真;

}

这样一来,有几点需要说明一下。首先,为了避免创建新Point时重复绘制,我们实现一个方法。

/**

* 不能重复点击

* @参数x

* @参数y

* @返回

*/

私有点getValidPoint(int x, int y) {

返回新点((int)(x/mLineHeight),(int)(y/mLineHeight));

}

然后我们判断如果重复点击的话会返回false,同时我们在action选择中也选择了ACTION_UP。为什么?为什么不是ACTION_DOWN?因为这毕竟是一个View,而父View会拦截它(在某些场景下),所以我们选择UP也是合理的。

好的,当我们点击的时候,我们就绘制棋子了。这里我们也写一个方法

/**

* 如何绘制棋子

* @param画布

*/

私人无效drawPieces(画布画布){

for (int i=0; i mWhiteArray.size(); i++) {

//获取白棋子的坐标

点whitePoint=mWhiteArray.get(i);

canvas.drawBitmap(mBlack, (whitePoint.x + (1 - rowSize)/2) * mLineHeight, (whitePoint.y + (1 - rowSize)/2) * mLineHeight, null);

}

for (int i=0; i mBlackArray.size(); i++) {

//获取黑棋子的坐标

点blackPoint=mBlackArray.get(i);

canvas.drawBitmap(mWhite, (blackPoint.x + (1 - rowSize)/2) * mLineHeight, (blackPoint.y + (1 - rowSize)/2) * mLineHeight, null);

}

}

OK,让我们实际运行一下

4. 游戏逻辑

现在一切都已经有了,我们基本上可以玩了,但重要的是游戏已经结束了。当你到了五的时候,你就需要判断自己是否赢了,对吧?让我们编写一个方法来在每次绘制完成后执行此操作。以确定是否有获胜者

/**

* 判断是否胜利

*/

私有无效checkWin() {

//判断白棋是否有五个相同棋子相连

布尔值mWhiteWin=checkFiveLine(mWhiteArray);

//判断黑棋是否有五个相同的棋子相连

布尔值mBlackWin=checkFiveLine(mBlackArray);

//只要有一场胜利,游戏就结束

如果(mWhiteWin || mBlackWin){

mIsGameOver=true;

mIsWhiteWin=mWhiteWin;

Toast.makeText(getContext(), mIsWhiteWin ? '白胜' : '黑胜', Toast.LENGTH_SHORT).show();

}

}

好的,我们的关键逻辑就在checkFiveLine 方法中。在这里,我们知道胜利有四种情况。

我们先定义一个常量

//胜利棋子数量

私有静态最终int MAX_COUNT_IN_LINE=5;

OK,接下来我们可以实现下面的胜利逻辑

/**

* //判断该棋子是否有五个相同的棋子与其相连

* @参数点

* @返回

*/

私有布尔checkFiveLine(Listpoints) {

//遍历棋子

for (点p : 点) {

//获取棋盘上的位置

int x=p.x;

int y=p.y;

/**

* 四种胜利情况,横、竖、左对角、右对角

*/

//水平的

boolean win=checkHorizontal(x, y, 点);

如果(赢)返回真;

//垂直的

win=checkVertical(x, y, 点);

如果(赢)返回真;

//左倾斜

win=checkLeft(x, y, 点);

如果(赢)返回真;

//右倾斜

win=checkRight(x, y, 点);

如果(赢)返回真;

}

返回假;

}

不管哪个方向返回true,我们就返回true,然后玩Toast。这里,四个方向的逻辑

-水平的

/**

* 确定水平棋子

* @参数x

* @参数y

* @参数点

*/

私有布尔值checkHorizontal(int x, int y, Listpoints) {

//棋子标记,记录是否有五个=1因为是一个

整数计数=1;

//左边

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x - i, y))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

//正确的

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x + i, y))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

返回假;

}

-水平的

/**

* 确定垂直棋子

* @参数x

* @参数y

* @参数点

*/

私有布尔checkVertical(int x, int y, Listpoints) {

//棋子标记,记录是否有五个=1因为是一个

整数计数=1;

//优越的

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x, y - i))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

//向下

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x, y + i))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

返回假;

}

- 左斜

/**

* 确定左斜棋子

* @参数x

* @参数y

* @参数点

*/

私有布尔checkLeft(int x, int y, Listpoints) {

//棋子标记,记录是否有五个=1因为是一个

整数计数=1;

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x - i, y + i))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x + i, y - i))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

返回假;

}

- 右倾斜

/**

* 确定正确的倾斜棋子

* @参数x

* @参数y

* @参数点

*/

私有布尔checkRight(int x, int y, Listpoints) {

//棋子标记,记录是否有五个=1因为是一个

整数计数=1;

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x - i, y - i))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

for (int i=1; i MAX_COUNT_IN_LINE; i++) {

//如果有

if (points.contains(new Point(x + i, y + i))) {

计数++;

} 别的{

休息;

}

}

//如果有五个则为true

如果(计数==MAX_COUNT_IN_LINE){

返回真;

}

返回假;

}

那么,让我们跑吧

呵呵,玩得开心!

5. 游戏状态存储

这意味着当我们的游戏进入后台后,当我们回来时游戏就会消失。我们要把它的状态存储起来,这样每次进入的时候,如果上一句没说完,又继续下一句,我们该怎么实现呢?与Activity 一样,我们的View 也有存储状态的方法。

/**

*存储状态

* @返回

*/

@覆盖

protected Parcelable onSaveInstanceState() {

捆绑包=new Bundle();

bundle.putParcelable(INSTANCE, super.onSaveInstanceState());

bundle.putBoolean(INSTANCE_GAMEOVER, mIsGameOver);

bundle.putParcelableArrayList(INSTANCE_WHITE_ARRAY, mWhiteArray);

bundle.putParcelableArrayList(INSTANCE_BLACK_ARRAY, mBlackArray);

返回捆绑包;

}

/**

* 重新运行

* @参数状态

*/

@覆盖

protected void onRestoreInstanceState(可打包状态) {

//获取值

if (state instanceof Bundle) {

Bundlebundle=(Bundle)状态;

mIsGameOver=bundle.getBoolean(INSTANCE_GAMEOVER);

mWhiteArray=bundle.getParcelableArrayList(INSTANCE_WHITE_ARRAY);

mBlackArray=bundle.getParcelableArrayList(INSTANCE_BLACK_ARRAY);

//称呼

super.onRestoreInstanceState(bundle.getParcelable(INSTANCE));

返回;

}

super.onRestoreInstanceState(状态);

}

没关系,但您需要知道的一件事是不要忘记将ID 添加到布局文件中的控件,否则状态将不会被存储。

android:id='@+id/mGameView'

android:layout_width='match_parent'

android:layout_height='match_parent' /

6、还有一场比赛

现在我们的游戏逻辑已经差不多完成了,我们应该考虑当你赢了的时候是否应该再玩一局,所以我们仍然需要实现这个逻辑。这很简单。

/**

* 还有一场比赛

*/

公共无效重新启动游戏(){

mWhiteArray.clear();

mBlackArray.clear();

mIsGameOver=false;

mIsWhiteWin=false;

无效();

}

这样我们就可以直接调用了。我们看一下MainActivity

包com.lgl. Fiverow;

导入android.support.design.widget.FloatingActionButton;

导入android.support.v7.app.AppCompatActivity;

导入android.os.Bundle;

导入android.view.View;

/**

* 双陆棋游戏

*/

公共类MainActivity 扩展AppCompatActivity {

//重启按钮

私有FloatingActionButton 工厂;

//游戏

私人GameView游戏;

@覆盖

protected void onCreate(Bundle savingInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

游戏=(GameView) findViewById(R.id.mGameView);

fab=(FloatingActionButton) findViewById(R.id.fab);

fab.setOnClickListener(new View.OnClickListener() {

@覆盖

公共无效onClick(查看v){

游戏.RestartGame();

}

});

}

}

OK,最后运行一下

用户评论

太易動情也是罪名

这也太酷了吧!终于有可以完全定制自己的五子棋了,想想看自己设计一套独特的棋盘,搭配喜欢的线条和棋子,玩起来是不是更有仪式感?

    有20位网友表示赞同!

▼遗忘那段似水年华

自定义棋盘真是太好玩了!我以前就想玩一套星空主题的五子棋,现在终于可以实现了。游戏状态存储也是非常方便,不用每次都从头开始,哈哈!

    有20位网友表示赞同!

葵雨

这款游戏太棒了!之前一直想找一款支持自定义选项的游戏,终于找到了。喜欢自己设计的棋盘和线条,还有各种特效,玩上几个小时都不腻!

    有8位网友表示赞同!

疯人疯语疯人愿

感觉这款游戏的可玩性很高,除了经典的五子棋规则,还可以定制棋盘的大小,线条的颜色等等。游戏状态存储也做得很好,可以随时暂停继续。期待以后能添加更多自定义功能!

    有14位网友表示赞同!

信仰

说梦想成真吗!小时候就想自己设计一套五子棋,现在这个软件一下子满足了我的愿望!真是太兴奋了!

    有17位网友表示赞同!

容纳我ii

这款安卓游戏挺不错的!我最喜欢的就是自定义的选项,可以根据自己的喜好设计出独一无二的棋盘图案和颜色。玩起来很新颖有趣。

    有5位网友表示赞同!

颓废i

希望未来能支持更多类型的棋子吧!现在提供的有点少,想要有不同形状、颜色、材质的棋子选择就更棒了。

    有12位网友表示赞同!

陌上蔷薇

这款游戏虽然玩法简单,但自定义选项确实很吸引人!可惜游戏画面看起来比较老fashioned,希望以后能更新一下界面美感。

    有9位网友表示赞同!

巴黎盛开的樱花

安卓五子棋的游戏有很多啊!这款游戏的特色在于自定义功能,可以设计出自己的棋盘和棋子。不过感觉操作界面有点复杂,上手难度略高

    有19位网友表示赞同!

折木

游戏状态存储的功能很棒,但是有时候我会遇到保存失败的问题,不知道是不是我的设备原因?希望开发者能修复一下bug。

    有17位网友表示赞同!

一纸愁肠。

这款游戏的自定义功能确实很强大,可以设置各种棋盘大小和线条样式,玩起来感觉很新颖。不过我个人觉得五子棋的规则太简单了,希望能添加一些更丰富的玩法模式。

    有18位网友表示赞同!

等量代换

游戏性: 自定义选项: 游戏画质一般般,但是功能还是挺强大的!希望以后能改进一下游戏的整体画面效果,让它看起来更加现代化。

    有20位网友表示赞同!

你瞒我瞒

我对这款安卓五子棋游戏的自定义功能感到非常惊喜! 能够自由设计棋盘和棋子的颜色真是太棒了!

    有15位网友表示赞同!

爱到伤肺i

Android端开发游戏也越来越成熟了,这款五子棋游戏做得还不错,尤其是那个自定义棋盘的功能,简直超赞!玩得开心,希望开发者后期还能继续更新内容!

    有15位网友表示赞同!

迷路的男人

五子棋这个经典游戏,没想到现在也能定制棋盘和线条啊,真是太酷了!这款安卓游戏玩起来很有乐趣,强烈推荐给大家试试看!

    有10位网友表示赞同!

米兰

自定义功能很强大,可以设计出各种各样独一无二的五子棋棋盘。不过我希望它能支持更多类型的棋子,比如木材、金属等不同材质的棋子,这样玩家可以选择更丰富的棋子类型。

    有13位网友表示赞同!

若他只爱我。

这款安卓五子棋游戏虽然自定义功能强大,但是我觉得它的AI对手不太智能,有时输给AI的时候 feels pretty weird. 希望开发者加强AI算法,让它能提供更具挑战性的游戏体验!

    有11位网友表示赞同!

热点资讯