第四章 棋类:  华容道 三子棋AI算法

手机棋牌开发的优点和缺点 

与其他手机端游戏相比较,手机棋牌开发演化的手游竞技,与休闲性合二为一,游艺兼备、手游玩家随着公共WIFI的普及,参与门槛越来越低。加上手机棋牌的规则学习与线下的玩法相似,具有广泛的用户基层认知度和接受度;完成一局的时长在3分钟内,与各种类型的手游相比,时短带劲,与手机的移动性、高效性更配哦。

  手机棋牌开发符合移动游戏规律,手游发展后劲大,各大手游类型中,棋牌玩家以忠诚度高、留存率与充值率的喜闻乐见而出名,加上中国当之无愧的棋牌类“国民游戏”、“零门槛”特点。个中秘诀,盈利动态值得一窥究竟。

 本章节从android智能手机的华容道、三子棋,魔方来简要述说开发棋类游戏的过程。

4.1华容道开发

“华容道”游戏名称来源于我国古典四大名著之一的《三国演义》。华容道”以其变化多端,百玩不厌的特点与“魔方”、“独立钻石棋”一起被国外智力专家并称为智力游戏界的“三个不可思议”。它与七巧板,九连环等中国传统益智玩具并称“中国的难题”。国外亦有类似的游戏,称作尖峰时刻(Rush Hour)或叫巧挪妙移。

4.1.1下法与结构

华容道”有一个带二十个小方格的棋盘,代表华容道。棋盘下方有一个两方格边长的出口,是供曹操逃走的。棋盘上共摆有十个大小不一样的棋子,它们分别代表曹操、张飞、赵云、马超、黄忠和关羽,还有四个卒。棋盘上仅有两个小方格空着,玩法就是通过这两个空格移动棋子,用最少的步数把曹操移出华容道。

4.1.2华容道棋盘与人物绘制

华容道”有一个带二十个小方格的棋盘,用两个数组表示十个人物及空格XY坐标。rx[]={140,140,50,230,50,230,50,230,110,170,110,170},ry[]={90,180,90,90,210,210,300,300,240,240,300,300};表示每个棋的中间坐标。

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// 全屏显示窗口

requestWindowFeature(Window.FEATURE_NO_TITLE);

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

//强制横屏

//setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏

// 显示自定义的游戏View

mAnimView = new MyView(this);

setContentView(mAnimView);

}

public class MyView extends SurfaceView implements Callback,Runnable ,SensorEventListener{

public static final int TIME_IN_FRAME = 30;

Paint mPaint = null;

Paint mTextPaint = null;

SurfaceHolder mSurfaceHolder = null;

boolean mRunning = false;

Canvas mCanvas = null;

boolean mIsRunning = false;

int mScreenWidth = 0,   p;

int mScreenHeight = 0;

int i=0,k=0 ,k2=0,k1=0,h0=12;

//cc, gy, c1,c2 ,c3,c4, b1,b2, b3, b4

float h=88,y, maxy=0,maxx=0,maxy0=0,maxx0=0,rx[]={140,140,50,230,50,230,50,230,110,170,110,170},ry[]={90,180,90,90,210,210,300,300,240,240,300,300};

定义布局及用两个数组rx[],ry[]表示十个人物及两个空格XY坐标

public MyView(Context context) {

super(context);

this.setFocusable(true);

this.setFocusableInTouchMode(true);

mMediaPlayer01 = new MediaPlayer();

mMediaPlayer02 = new MediaPlayer();

mSurfaceHolder = this.getHolder();

mSurfaceHolder.addCallback(this);

mCanvas = new Canvas();

mPaint = new Paint();

mPaint.setColor(Color.WHITE);

mbitmapBall = BitmapFactory.decodeResource(this.getResources(), R.drawable.cc);

mbitmapzy = BitmapFactory.decodeResource(this.getResources(), R.drawable.zy);

mbitmapzf = BitmapFactory.decodeResource(this.getResources(), R.drawable.zf);

mbitmapBg = BitmapFactory.decodeResource(this.getResources(), R.drawable.back);

mbitmapgy=BitmapFactory.decodeResource(this.getResources(), R.drawable.gy);

mbitmapmc = BitmapFactory.decodeResource(this.getResources(), R.drawable.mc);

mbitmaphz = BitmapFactory.decodeResource(this.getResources(), R.drawable.hz);

mbitmapb1 = BitmapFactory.decodeResource(this.getResources(), R.drawable.b1);

mbitmapb2 = BitmapFactory.decodeResource(this.getResources(), R.drawable.b2);

mbitmapb3 = BitmapFactory.decodeResource(this.getResources(), R.drawable.b3);

mbitmapb4 = BitmapFactory.decodeResource(this.getResources(), R.drawable.b4);

mbitmapb4 = BitmapFactory.decodeResource(this.getResources(), R.drawable.zg);

4.1.3人物移动算法

.人物移动设计,检测按了哪个人物,及滑动方向,根据棋子的XY面大小移动。

public boolean onTouchEvent(MotionEvent event)

{

// event.getAction() ==

// MotionEvent.ACTION_POINTER_1_DOWN

//  MotionEvent.ACTION_POINTER_2_DOWN

p   =  event.getPointerCount();

//float x = event.getX(p-1);

maxy=0;

for (i=0;i

y = event.getX(i);

// if (maxy

maxy=y;

maxx=event.getY(i);

}

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN: {

for (i=0;i<10;i++){

if   (Math.abs( maxx-ry[i])+ Math.abs( maxy-rx[i] )

{ h0=i;h=Math.abs( maxx-ry[i])+ Math.abs( maxy-rx[i]) ; }

}

//按下时触发

}

4.1.4.碰撞判断,检测步骤2 XY面大小移动的目的地是否为空格的坐标。

case MotionEvent.ACTION_UP: {

h = 38;

if (maxx - ry[h0] > 30) {

if ((ry[h0] + 60 == ry[11]) && (rx[h0] == rx[11]) && h0 > 5) {

ry[11] = ry[h0];

ry[h0] = ry[h0] + 60;

} else if ((ry[h0] + 60 == ry[10]) && (rx[h0] == rx[10])

&& h0 > 5) {

ry[10] = ry[h0];

ry[h0] = ry[h0] + 60;

}

// gy,cc

else if (((ry[h0] + 60 == ry[10])

&& (rx[h0] - 30 == rx[10])

&& (ry[h0] + 60 == ry[11]) && (rx[h0] + 30 == rx[11]))

|| ((ry[h0] + 60 == ry[11])

&& (rx[h0] - 30 == rx[11])

&& (ry[h0] + 60 == ry[10]) && (rx[h0] + 30 == rx[10]))

&& h0 == 1) {

ry[10] = ry[10] - 60;

ry[11] = ry[11] - 60;

;

ry[h0] = ry[h0] + 60;

} else if (((ry[h0] + 90 == ry[10])

&& (rx[h0] - 30 == rx[10])

&& (ry[h0] + 90 == ry[11]) && (rx[h0] + 30 == rx[11]))

|| ((ry[h0] + 90 == ry[11])

&& (rx[h0] - 30 == rx[11])

&& (ry[h0] + 90 == ry[10]) && (rx[h0] + 30 == rx[10]))

&& h0 == 0) {

ry[10] = ry[10] - 120;

ry[11] = ry[11] - 120;

;

ry[h0] = ry[h0] + 60;

}

4.1.5.记录新坐标,用于下步判断。

for (int i = 0; i <= 11; i++) {

rxf[f][i] = rx[i];

ryf[f][i] = ry[i];

}

4.1.6.回放功能,按记录的数据定时画出每个步骤。

if (maxy > 200 & maxx > 380 & maxx < 450) {

f1 = f;

f = 0;f2 = 0;

maxx = 1450;

ff = 1;

}

if (ff == 1) {

// for (int j = 0; j

for (int i = 0; i <= 11; i++) {

rx[i] = rxf[f][i];

ry[i] = ryf[f][i];

}

f2++;

if (f2 <= f1) {

f++;

// f2 = 0;

}

if (f2 == f1) {

ff = 0;

f1 = 0;

}

}

4.1.7华容道游戏玩法技巧

:我在移动板块时,先想办法让“关羽”向下移动,只有这样,“曹操”才有向下移动的可能。评价:你真是一个做事认真的孩子,有着较强的推理能力。:我也是这样做的,我还数了一下,“关羽”移动了五步,“曹操”才走了一步。引导:是的,你非常细心!等到曹操迈出第一步时,你知道所有板块总共移动了多少步吗?最少要26步)

《智能设备艺术、科技、文化作品实例开发与设计》android开发系列介绍---2.1棋类作品:华容道相关推荐

  1. 科技计算机创客发明,创客小工坊 体验现代新科技——文化社区青少年创客工坊体验营系列活动...

    原标题:创客小工坊 体验现代新科技--文化社区青少年创客工坊体验营系列活动 为了将创新精神和实践能力的培养贯彻于创客工坊实施的全过程,推进科学思想.科学方法.科学知识.科学精神四位一体的科技教育新模式 ...

  2. [安卓开发笔记一]Android开发配置opencv环境超详细教程

    [安卓开发笔记一]Android开发配置opencv环境超详细教程 [更新于 2022年4月] 再次提醒,建议现在看到这篇文章的,仅仅把此文做一个流程参考,4年前android studio就使用cm ...

  3. html网站开发实例教程,网页设计与开发——HTML、CSS、JavaScript实例教程

    网页设计与开发--HTML.CSS.JavaScript实例教程[编辑] 作 者:郑娅峰 主编 出 版 社:清华大学出版社 出版时间:2009-7-1 版 次:1 页 数:309 字 数:509000 ...

  4. [Android实例] 最全的Android开发资源整理--进阶必备

    本帖最后由 一切随枫 于 2014-6-9 12:08 编辑 原文链接: http://stormzhang.github.io/android/2014/06/05/android-awesome- ...

  5. Android开发技巧!Android开发大佬的百度,美团,快手等大厂Offer收割之旅,附超全教程文档

    想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. 本文参考了目前大部分 Android 应用启动优化的方案,将大家的方案做一个汇总,如果你有这方 ...

  6. 开发实践 | 使用Android开发TCP、UDP客户端(代码类)

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 在进行Android开发的过程中, ...

  7. android 好的开发工具,使Android开发方便快捷的8个好工具

    Android是第二个最流行的用于 智能手机和平板电脑 的操作系统.这里有8个最好的 Android工具以许多不同的方式 帮助开发人员 ,例如 - SDK和AVD管理器,android ADT,and ...

  8. android 开发 短信,Android开发之短信发送

    今天要讲的是使用Android开发发送短信程序.我们先来看下运行效果 图(1)                                                              ...

  9. android开发分页查询,Android开发中实现分页效果的简单步骤

    分页加载在程序开发中是必备的,但是我们实现这个功能并不仅仅为了美观,用户体验也是很重要的,爱站技术频道下面就带大家了解Android开发中实现分页效果的简单步骤,感兴趣的小伙伴们参考看看吧! 具体内容 ...

最新文章

  1. 手机PIN锁死让输入PUK解决方案
  2. 2.1.6 编码与调制(2)
  3. 【宜搭客户说】宜搭帮助教育局搭建教育管理平台
  4. 35岁电子工程师的艰难抉择
  5. android java 指针,opencv android:向我的代码中添加cascade分类器后出现空指针异常
  6. PHP的学习--PHP的闭包
  7. linux操作系统之信号量、互斥量在进程间的同步、文件锁
  8. 应用上云2小时烧掉近50万,创始人:差点破产,简直噩梦
  9. 最短网络(信息学奥赛一本通-T1350)
  10. ETH联合Meta和鲁汶大学 提出视频恢复算法VRT,在视频超分辨率、去模糊和去噪性能达到SOTA...
  11. teamspeak3服务器搭建_教你快速便捷的搭建Teamspeak 3 服务器和基友开黑必备!
  12. Java NPOIFSFileSystem.getRoot方法代碼示例
  13. 3V、5V混合系统中不同电平器件接口的4种情况
  14. 数据挖掘项目:银行信用评分卡建模分析(下篇)
  15. python画动态图-python画动态图
  16. Latex tabular和tabular* 注意表格样式参数命令
  17. IndexError: Caught IndexError in DataLoader worker process 0.
  18. CQC认证与3C认证的区别是什么
  19. Matlab 网络通信(TCP IP)
  20. 2023中国余热回收利用展览会盛装亮相北京

热门文章

  1. ESP8266学习-内置网页配置(一)
  2. iText生成pdf文书
  3. 嵌入式工程师题库(适用于各大名厂笔试、软考、计算机等级考试)
  4. SonarQube:开源的代码质量管理工具
  5. 45个!最新,最赞,最多样的4G/5G基站落地图集!
  6. CAD小问题解决办法2
  7. 软件工程师要记住的几点
  8. 奉加微采访 BLE
  9. 30天搞定Java--day2
  10. 一文带你搞定抖音最近最火的情侣微信早报信息推送