求助关于安卓五子棋棋盘图片游戏画棋盘问题

欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 7918 人关注过本帖
标题:五子棋的棋盘怎么绘制?
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
&&已结贴√
&&问题点数:20&&回复次数:6&&&
五子棋的棋盘怎么绘制?
想自己用C#制作一个类似于五子棋的小游戏但一开始就遇到了问题。不知道棋盘应该怎么绘制。
可把我郁闷坏了,请高手前辈们指点一二。先谢谢了
搜索更多相关主题的帖子:
等 级:侠之大者
帖 子:69
专家分:441
&&得分:10&
用 GDI+ 画图
参考下这个代码吧
附件: 您没有浏览附件的权限,请
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
来 自:重庆
等 级:蝙蝠侠
帖 子:245
专家分:932
&&得分:10&
其实也可以用label标签来绘制。
[url=http://blog.csdn.net/ouxianzhi520]csdn个人博客[/url]
来 自:山东
等 级:论坛游民
帖 子:11
专家分:18
用LABEL标签做很麻烦的
等 级:新手上路
等 级:新手上路
帖 子:10
循环用GDI+
版权所有,并保留所有权利。
Powered by , Processed in 0.063059 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights ReservedAndroid实训案例(八)――单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android实训案例(八)――单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局
&&Android实训案例(八)――单机五子棋游戏,自定义棋盘,线条,棋子,游戏逻辑,游戏状态存储,再来一局
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩16页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢请问要用MFC做五子棋游戏,在对话框中画出棋盘要怎么做?_百度知道
请问要用MFC做五子棋游戏,在对话框中画出棋盘要怎么做?
之前在网上找到了在单文档程序中画棋盘的函数,但是在对话框中好像不能用,求可能用到的函数,有代码最好。谢谢谢谢
我有更好的答案
对话框画棋盘 不就是划线吗.。不要告诉我你不知道怎么划线啊!!! onpaint函数里画线。(横竖方向 for循环 划线操作)
但是只有第一个对话框有onpoint函数,第二个没有啊。
自己添加啊 !!!选中你的对话框对应的类视图里的类,右键类向导。
采纳率:65%
来自团队:
网上找棋盘和棋子的图片资源,用贴图的方式呈现棋盘和棋子
谢谢,但是我感觉那样更麻烦啊。还要把图上的点标号坐标。
这个需要自己创建的一个窗体,win api自带的会话框不支持这种功能,方法很复杂,你可以做一个dll,dll中用win api画窗口。
抱歉,我不太懂...
为您推荐:
其他类似问题
五子棋的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。匿名用户不能发表回复!|当前位置: >>
基于Android的五子棋游戏设计
五子棋手机游戏开发专 班 姓 学业:软件工程 级:1221808 名:曾庆鹏 号: 2015 年 5月 16 日 目录1 开发概述....................................................................................................................................... 1 2 相关技术概念................................................................................................................................ 2 2.1 坐标布局(AbsoluteLayout) ........................................................................................... 2 2.2 相关的算法研究................................................................................................................ 3 2.2.1 相关的数据结构 ...................................................................................................... 3 2.2.2 分析规则.................................................................................................................. 4 2.2.3 胜负判断.................................................................................................................. 6 2.2.4 算法实现描述 .......................................................................................................... 6 3.各个模块的截图............................................................................................................................ 9 3.1 游戏主界面........................................................................................................................ 9 3.2 新游戏界面....................................................................................................................... 10 3.3 帮助界面.......................................................................................................................... 10 3.4 关于五子棋介绍界面 ...................................................................................................... 11 3.5 五子棋的退出.................................................................................................................. 12 4 总结 ............................................................................................................................................. 12 参考文献......................................................................................................................................... 13 附录 ................................................................................................................................................ 141 开发概述1 在手机游戏的早期, 大多数开发者都是想要玩转设备、学习技巧和快速攻关 的狂热分子。但是,随着更多的开发者加入这个行业,手机游戏已经进化成涉及 到专业设计师、构造师、开发者、产品经销商、律师、和艺术家在内的主导产品。 这是行业走向成熟的必然趋势。 尽管在某人的业余时间内要开发和推销简单的游 戏更加困难,但是更多的专业商店将为许多人提供更多的就业机会。2 相关技术概念本章节主要介绍一下此论文中用到了的 Android 的布局文件,可视化控件 以及它们的具体实现。2.1 坐标布局(AbsoluteLayout)坐标布局(AbsoluteLayout)的子控件需要指定相对与此坐标布局的横、纵 坐标的值,将会想 FrameLayout 那样被排在左上角。 项目中进入游戏的布局文件代码如下:&AbsoluteLayout xmlns:android=&http://schemas.android.com/apk/res/android& android:layout_width=&wrap_content& android:layout_height=&wrap_content& android:background=&@android:color/black&& &ImageView android:id=&@+id/menu& android:layout_width=&wrap_content& android:layout_height=&wrap_content& android:src=&@drawable/menu& android:layout_x=&55px& android:layout_y=&10px& /& &Button android:id=&@+id/b1& android:layout_width=&110px& android:layout_height=&40px& android:layout_x=&100px& android:layout_y=&150px& android:text=&新游戏&2 /& &Button android:id=&@+id/b3& android:layout_width=&110px& android:layout_height=&40px& android:layout_x=&100px& android:layout_y=&200px& android:text=&帮助& /& &Button android:id=&@+id/b4& android:layout_width=&110px& android:layout_height=&40px& android:layout_x=&100px& android:layout_y=&250px& android:text=&关于& /& &Button android:id=&@+id/b5& android:layout_width=&110px& android:layout_height=&40px& android:layout_x=&100px& android:layout_y=&300px& android:text=&退出& /&&/AbsoluteLayout&2.2 相关的算法研究 2.2.1 相关的数据结构关于盘面情况的表示,首先得到屏幕的大小, 然后根据所画棋子的大小来确定下一条棋 盘的画线。产生棋盘上所有的线 private void createLines(){ for (int i = 0; i &= maxX; i++) {//竖线 lines.add(new Line(xOffset+i*pointSize-pointSize/2, yOffset, xOffset+i*pointSize-pointSize/2, yOffset+maxY*pointSize)); } for (int i = 0; i &= maxY; i++) {//横线 lines.add(new Line(xOffset, yOffset+i*pointSize-pointSize/2, xOffset+maxX*pointSize, yOffset+i*pointSize-pointSize/2)); } } 3 以数组形式画棋盘:画棋盘 private List&Line& lines = new ArrayList&Line&(); private void drawChssboardLines(Canvas canvas){ for (Line line : lines) { canvas.drawLine(line.xStart, line.yStart, line.xStop, line.yStop, paint); } }2.2.2 分析规则判断各个四个方向的棋子:在某个方向(八个中的一个)可下多少棋子,这个方法是第一分析中的核心方法 private void countPoint(List&Point& myPoints, List&Point& enemyPoints, Point point, FirstAnalysisResult fr,int direction,boolean forward) { if(myPoints.contains(pointToNext(point,direction,forward))){ fr.count ++; if(myPoints.contains(pointToNext(point,direction,forward))){ fr.count ++; if(myPoints.contains(pointToNext(point,direction,forward))){ fr.count ++; if(myPoints.contains(pointToNext(point,direction,forward))){ fr.count ++; }else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){ fr.aliveState=HALF_ALIVE; } }else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){ fr.aliveState=HALF_ALIVE; } }else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){ fr.aliveState=HALF_ALIVE; } }else if(enemyPoints.contains(point) || isOutSideOfWall(point,direction)){ fr.aliveState=HALF_ALIVE; } }4 //在某个方向上是否还能下到满五个棋子 private int maxCountOnThisDirection(Point point,List&Point& enemyPoints,int direction,int count){ int x=point.getX(),y=point.getY(); switch (direction) { //横向 case HENG: while (!enemyPoints.contains(point.setX(point.getX()-1)) && point.getX()&=0 && count&6) { count ++; } point.setX(x); while (!enemyPoints.contains(point.setX(point.getX()+1)) && point.getX()&maxX && count&6) { count ++; } //纵向 case ZHONG: while (!enemyPoints.contains(point.setY(point.getY()-1)) && point.getY()&=0) { count ++; } point.setY(y); while (!enemyPoints.contains(point.setY(point.getY()+1)) && point.getY()&maxY && count&6) { count ++; } //正斜向 / case ZHENG_XIE: while (!enemyPoints.contains(point.setX(point.getX()-1).setY(point.getY()+1)) && point.getX()&=0 && point.getY()&maxY) { count ++; } point.setX(x).setY(y); while (!enemyPoints.contains(point.setX(point.getX()+1).setY(point.getY()-1)) && point.getX()&maxX && point.getY()&=0 && count&6) { count ++; } //反斜 / 5 case FAN_XIE: while (!enemyPoints.contains(point.setX(point.getX()-1).setY(point.getY()-1)) && point.getX()&=0 && point.getY()&=0) { count ++; } point.setX(x).setY(y); while (!enemyPoints.contains(point.setX(point.getX()+1).setY(point.getY()+1)) && point.getX()&maxX && point.getY()&maxY && count&6) { count ++; } } }2.2.3 胜负判断实际上,是根据当前最后一个落子的情况来判断胜负的。实际上需要从 四个位置判断,以该子为出发点的水平,竖直和两条分别为 45 度角和 135 度角 的线, 目的是看在这四个方向是否最后落子的一方构成连续五个的棋子,如果是 的话,就表示该盘棋局已经分出胜负。2.2.4 算法实现描述开始分析,扫描所有空白点,形成第一次分析结果:private Point doFirstAnalysis(List&Point& comuters, List&Point& humans){ int size = allFreePoints.size(); Point computerPoint = Point humanPoint = int x,y; FirstAnalysisResult firstAnalysisR for (int i = 0; i & i++) { computerPoint = allFreePoints.get(i); //先把X、Y坐标记下来,因为在分析过程中会改变原来的对象 x = computerPoint.getX(); y = computerPoint.getY(); if(x&currentRange.xStart || x&currentRange.xStop || y&currentRange.yStart || y&currentRange.yStop){ } 6 // // //if(x==debugx && y==debugy){ System.out.println(&sssssssssssss&); }//尝试在此位置上下一个棋子,并分析在“横向”这个方向上我方可形成的状态,如活4, 活3,半活4,活2等所有状态 firstAnalysisResult = tryAndCountResult(comuters,humans, computerPoint, HENG); computerPoint.setX(x).setY(y);//回复点位的原值,以供下次分析 if(firstAnalysisResult!=null){//无返回结果此方向上不可能达到五个棋子, if(firstAnalysisResult.count==5)//等于5表示在此点上下棋子即可连成5 个,胜利了,不再往下进行分析 return computerP //记录第一次分析结果 addToFirstAnalysisResult(firstAnalysisResult,computerFirstResults); }第二次分析,分析第一次形成的结果,第一次分析结果会把一步棋在四个 方向上可形成的结果生成最多四个 FirstAnalysisResult 对象(敌我各四)//这里要把这四个对象组合成一个SencondAnalysisResult对象, private Point doComputerSencondAnalysis(Map&Point,List&FirstAnalysisResult&& firstResults,List&SencondAnalysisResult& sencodResults) { List&FirstAnalysisResult& list = SencondAnalysisResult sr = for (Point p : firstResults.keySet()) { sr = new SencondAnalysisResult(p); list = firstResults.get(p); for (FirstAnalysisResult result : list) { if(result.count==4){ if(result.aliveState==ALIVE){//经过前面的过滤,双方都排除了绝杀 棋,有活4就下这一步了,再下一步就赢了 return result.//如果有绝杀,第一轮已返回,在此轮活4已 经是好的棋子,直接返回,不再往下分析 }else{ sr.halfAlive4 ++; computer4HalfAlives.add(sr); } }else if(result.count==3){ if(result.aliveState==ALIVE){ sr.alive3++; if(sr.alive3==1){ 7 computer3Alives.add(sr); }else{ computerDouble3Alives.add(sr); } }else{ sr.halfAlive3++; computer3HalfAlives.add(sr); } }else{//半活2在第一阶段已被排除,不再处理 sr.alive2++; if(sr.alive2==1){ computer2Alives.add(sr); }else{ computerDouble2Alives.add(sr); } } } sencodResults.add(sr); } //没有找到活4 }第三次分析,双方都不可以制造活 4,找双活 3 棋子,不行就找半活 4,再 不行就找单活 3,双活 2private Point doThirdAnalysis() { if(!computer4HalfAlives.isEmpty()){ return computer4HalfAlives.get(0). } System.gc(); sleep(300); Collections.sort(computerSencodResults); System.gc(); //即将单活4,且我没有半活4以上的,只能堵 Point mostBest = getBestPoint(human4Alives, computerSencodResults); if(mostBest!=null) return mostB Collections.sort(humanSencodResults); System.gc(); mostBest = getBestPoint(); 8 if(mostBest!=null) return mostB //拿出各自排第一的,谁好就下谁 return computerSencodResults.get(0). }3.各个模块的截图3.1 游戏主界面图 5-2 游戏主界面9 3.2 新游戏界面图 5-3 游戏结束再操作界面新游戏的功能描述:当我们进入游戏后,它会有一个操作提示: “按两下右 键是人-机对战,按两下左键是人-人对战。 ”当我们按着操作进行游戏了。当游 戏结束是又会一个 “**棋输了的提示”然后又是一个操作提示重新进行新的游戏 的开始。3.3 帮助界面帮助界面的功能秒杀:当我们还没有进入新的游戏的时候,想知道游戏 是怎么开始操作的,点击帮助界面,提示我们该进行怎样的操作。10 图 5-4 游戏提示界面3.4 关于五子棋介绍界面图 5-5 五子棋的关于11 3.5 五子棋的退出图 5-6 游戏推出4 总结上有许多的控件和类在 JAVAME 上是没有的,在这方面我遇到了很大的难 题。还有就是对五子棋游戏的算法不是很清楚。在编码实现的时候,会出现一些 开始完全意料不到的问题,也许这些问题当中,有的是老师讲过的,不过我想大 部分还是老师没有讲过, 这个时候就是体现出自己解决问题的能力的时候了。在 遇到问题时要学会如何去分析错误,再是学会如何去解决掉这个问题。在遇到问 题是,不要有害怕困难的情绪,解决问题也是一个不断学习进步的过程,遇到的 问题越多,学到的东西也就越多。因此在遇到困难之时,不要轻言放弃,要努力 向前解决问题。12 参考文献[1] (美)威尔顿,麦可匹克. JavaScript 入门经典(第 3 版). 施宏斌译. 北京:清华大学 出版社,2009 [2] 张孝祥. Java 就业培训教程[M]. 北京:清华大学出版社,2003 [3] E2ECloud 工作室 著 深入浅出 Google Android 人民邮电出版社 [4] (美)Bruce Eckel. Java 编程思想. 陈昊鹏译. 北京:机械工业出版社,2007 [5] Eric J.Braucle 等.软件设计―从程序设计到体系结构[M].李仁发等译.北京:电子工业 出版社,2007. [6] 孔令德.毕业设计案例教程―从系统开发到论文写作[M].北京:国防工业出版社,2007. [7] 雍俊海编著.Java 程序设计习题集.北京:清华大学出版社,2006 [8] 朱福喜编著.Java 语言习题与解析.北京:清华大学出版社,2006 [9]吴其庆编著.Java 程序设计实例教程.北京:冶金工业出版社,2006 [10] 赵文靖编著.Java 程序设计基础与上机指导.北京:清华大学出版社,2006 [11] 赵毅主编.跨平台程序设计语言――Java.西安:西安电子科技大学出版社,2006 [12]王克宏 著.Java 技术教程(基础篇) .北京:高等教育出版社,2002.0413 附录部分代码如下: 主界面代码:import android.app.A import android.app.AlertD import android.content.DialogI import android.content.I import android.os.B import android.provider.MediaStore.I import android.view.V import android.view.View.OnClickL import android.widget.B import android.widget.ImageV import android.widget.TextV public class biye extends Activity { ImageV Button b1,b2,b3,b4,b5; OnClickListener oc1; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); menu=(ImageView)findViewById(R.drawable.menu); b1=(Button)findViewById(R.id.b1); b3=(Button)findViewById(R.id.b3); b4=(Button)findViewById(R.id.b4); b5=(Button)findViewById(R.id.b5); oc1=new OnClickListener(){ public void onClick(View v) { if(v==b1){ Intent i1=new Intent(biye.this,MainActivity.class); startActivity(i1); } if(v==b3){ setContentView(R.layout.bangzhu); } if(v==b4){ new AlertDialog.Builder(biye.this) .setTitle(&关于五子棋&) .setIcon(R.drawable.icon) 14 .setMessage(&五子棋起源于中国古代的传统黑白棋种之一,它不仅能增强思维能 力 提高智力,而且富含哲理,有助于修身养性。&) .setPositiveButton(&确定&,new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } }).show(); } if(v==b5){ new AlertDialog.Builder(biye.this) .setTitle(&退出&) .setIcon(R.drawable.icon) .setMessage(&确定离开游戏吗?&) .setPositiveButton(&确定&, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); } } ).setNegativeButton(&取消&, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { } } ).show(); } } }; b1.setOnClickListener(oc1); b3.setOnClickListener(oc1); b4.setOnClickListener(oc1); b5.setOnClickListener(oc1); } }新游戏的开始到结束:import java.util.ArrayL import java.util.L import android.content.C import android.content.res.R import android.graphics.B import android.graphics.C import android.graphics.C15 import android.graphics.P import android.graphics.drawable.D import android.os.H import android.os.M import android.util.AttributeS import android.view.KeyE import android.view.MotionE import android.view.V import android.widget.TextV import five.itcast.cn.player.AiF import five.itcast.cn.player.concrete.HumanP import five.itcast.cn.player.interfaces.IP //棋盘 public class Chessboard extends View implements IChessboard{ //游戏状态常量: //已准备好,可开局 private static final int READY = 1; //已开局 private static final int RUNNING = 2; //已结束 private static final int PLAYER_TWO_LOST = 3; private static final int PLAYER_ONE_LOST = 4; //当前状态,默认为可开局状态 private int currentMode = READY; //画笔对象 private final Paint paint = new Paint(); //代表黑色 private static final int BLACK = 0; private static final int NEW_BLACK = 1; //白色 private static final int WHITE = 2; //黄色 private static final int NEW_WHITE = 3; //点大小 private static int pointSize = 20; //用于提示输赢的文本控件 private TextView textView =16 //不同颜色的 Bigmap 数组 private Bitmap[] pointArray = new Bitmap[4]; //屏幕右下角的坐标值,即最大坐标值 private static int maxX; private static int maxY; //第一点偏离左上角从像数,为了棋盘居中 private static int yO private static int xO //两个玩家 //第一个玩家默认为人类玩家 private IPlayer player1 = new HumanPlayer(); //第二个则根据选择人机战还是对战模式来初始化 private IPlayer player2; //预先初始两个第二玩家 //电脑玩家 private static final IPlayer computer = AiFactory.getInstance(2); //人类玩家 private static final IPlayer human = new HumanPlayer(); // 所有未下的空白点 private final List&Point& allFreePoints = new ArrayList&Point&(); public Chessboard(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); //把三个颜色的点准备好,并放入数组 Resources r = this.getContext().getResources(); fillPointArrays(BLACK,r.getDrawable(R.drawable.Black_point)); fillPointArrays(NEW_BLACK,r.getDrawable(R.drawable.new_Black_point)); fillPointArrays(WHITE,r.getDrawable(R.drawable.White_point)); fillPointArrays(NEW_WHITE,r.getDrawable(R.drawable.new_White_point)); //设置画线时用的颜色 paint.setColor(Color.LTGRAY); }//初始横线和竖线的数目 @Override17 protected void onSizeChanged(int w, int h, int oldw, int oldh) { maxX = (int) Math.floor(w / pointSize); maxY = (int) Math.floor(h / pointSize); //设置 X、Y 座标微调值,目的整个框居中 xOffset = ((w - (pointSize * maxX)) / 2); yOffset = ((h - (pointSize * maxY)) / 2); //创建棋盘上的线条 createLines(); //初始化棋盘上所有空白点 createPoints(); } //产生棋盘上所有的线 private void createLines(){ for (int i = 0; i &= maxX; i++) {//竖线 lines.add(new Line(xOffset+i*pointSize-pointSize/2, yOffset, xOffset+i*pointSize-pointSize/2, yOffset+maxY*pointSize)); } for (int i = 0; i &= maxY; i++) {//横线 lines.add(new Line(xOffset, yOffset+i*pointSize-pointSize/2, xOffset+maxX*pointSize, yOffset+i*pointSize-pointSize/2)); } } //画棋盘 private List&Line& lines = new ArrayList&Line&(); private void drawChssboardLines(Canvas canvas){ for (Line line : lines) { canvas.drawLine(line.xStart, paint); } } //线类 class Line{ float xStart,yStart,xStop,yS public Line(float xStart, float yStart, float xStop, float yStop) { this.xStart = xS this.yStart = yS this.xStop = xS this.yStop = yS } }18line.yStart,line.xStop,line.yStop, //画点 private void drawPoint(Canvas canvas,Point p,int color){ canvas.drawBitmap(pointArray[color],p.x*pointSize+xOffset,p.y*point Size+yOffset,paint); }//设置运行状态 public void setMode(int newMode) { currentMode = newM if(currentMode==PLAYER_TWO_LOST){ //提示玩家 2 输了 textView.setText(R.string.player_two_lost); currentMode = READY; }else if(currentMode==RUNNING){ textView.setText(null); }else if(currentMode==READY){ textView.setText(R.string.mode_ready); }else if(currentMode==PLAYER_ONE_LOST){ //提示玩家 1 输了 textView.setText(R.string.player_one_lost); currentMode = READY; } }//设置提示控件 public void setTextView(TextView textView) { this.textView = textV } //监听键盘事件 @Override public boolean onKeyDown(int keyCode, KeyEvent msg) { if (currentMode == READY && (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT || keyCode == KeyEvent.KEYCODE_DPAD_LEFT)) { if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){//向右键,人机 对战 player2 = }else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){//向左键,19 人--人对战 player2 = } restart(); setMode(RUNNING); }else if(currentMode==RUNNING KeyEvent.KEYCODE_DPAD_DOWN){//重新开始 restart(); setMode(READY); }else{ } }&&keyCode==//根据触摸点坐标找到对应点 private Point newPoint(Float x, Float y){ Point p = new Point(0, 0); for (int i = 0; i & maxX; i++) { if ((i * pointSize + xOffset) &= x && x & ((i + 1) * pointSize + xOffset)) { p.setX(i); } } for (int i = 0; i & maxY; i++) { if ((i * pointSize + yOffset) &= y && y & ((i + 1) * pointSize + yOffset)) { p.setY(i); } } } //重新开始 private void restart() { createPoints(); player1.setChessboard(this); player2.setChessboard(this); setPlayer1Run(); //刷新一下 refressCanvas(); } //是否已开局20 private boolean hasStart(){ return currentMode==RUNNING; } //处理触摸事件 @Override public boolean onTouchEvent(MotionEvent event) { //还没有开局,或者是按下事件,不处理,只处理开局后的触摸 弹起事件 if(!hasStart() || event.getAction()!=MotionEvent.ACTION_UP){ } //是否正在处理一步棋的过程中 if(onProcessing()){ } playerRun(event); } private synchronized void playerRun(MotionEvent event){ if(isPlayer1Run()){//第一玩家下棋 player1Run(event); }else if(isPlayer2Run()){//第二玩家下棋 player2Run(event); } }private void player1Run(MotionEvent event){ Point point = newPoint(event.getX(), event.getY()); if(allFreePoints.contains(point)){//此棋是否可下 setOnProcessing(); player1.run(player2.getMyPoints(),point); //playerOnePoints.add(point); //刷新一下棋盘 refressCanvas(); //判断第一个玩家是否已经下了 if(!player1.hasWin()){//我还没有赢 if(player2==computer){//如果第二玩家是电脑 //10 豪秒后才给玩家 2 下棋 refreshHandler.computerRunAfter(10);21 }else{ setPlayer2Run(); } }else{ //否则,提示游戏结束 setMode(PLAYER_TWO_LOST); } } } private void player2Run(MotionEvent event){ Point point = newPoint(event.getX(), event.getY()); if(allFreePoints.contains(point)){//此棋是否可下 setOnProcessing(); player2.run(player1.getMyPoints(),point); //刷新一下棋盘 refressCanvas(); //判断我是否赢了 if(!player2.hasWin()){//我还没有赢 setPlayer1Run(); }else{ //否则,提示游戏结束 setMode(PLAYER_ONE_LOST); } } }private RefreshHandler refreshHandler = new RefreshHandler(); class RefreshHandler extends Handler { //这个方法主要在指定的时刻发一个消息 public void computerRunAfter(long delayMillis) { this.removeMessages(0); //发消息触发 handleMessage 函数 sendMessageDelayed(obtainMessage(0), delayMillis); } //收到消息 public void handleMessage(Message msg) { //电脑 AI 每走一步棋子 player2.run(player1.getMyPoints(),null); //刷新一下棋局界面 refressCanvas();22 if(!player2.hasWin()){ //人继续下棋 setPlayer1Run(); }else {//第二个玩家赢了 setMode(PLAYER_ONE_LOST); } } }; //是否正在下某一步棋过程中,主是电脑下棋时需要较长的计算时间,这期间一定不可 以再响应触摸事件 private boolean onProcessing() { return whoRun == -1; }//默认第一个玩家先行 private int whoRun = 1; private void setPlayer1Run(){ whoRun = 1; } private void setOnProcessing(){ whoRun = -1; } //是否轮到人类玩家下子 private boolean isPlayer1Run(){ return whoRun==1; } //是否轮到人类玩家下子 private boolean isPlayer2Run(){ return whoRun==2; } private void setPlayer2Run(){ whoRun = 2; } private void refressCanvas(){ //触发 onDraw 函数 Chessboard.this.invalidate(); }23 private void drawPlayer1Point(Canvas canvas){ int size = player1.getMyPoints().size()-1; if(size&0){ } for (int i = 0; i & i++) { drawPoint(canvas, player1.getMyPoints().get(i), BLACK); } //最后下的一个点标成黄色 drawPoint(canvas, player1.getMyPoints().get(size), NEW_BLACK); } private void drawPlayer2Point(Canvas canvas){ if(player2==null){ } int size = player2.getMyPoints().size()-1; if(size&0){ } for (int i = 0; i & i++) { drawPoint(canvas, player2.getMyPoints().get(i), WHITE); } //最后下的一个点标成黄色 drawPoint(canvas, player2.getMyPoints().get(size), NEW_WHITE); }//初始化好三种颜色的点 public void fillPointArrays(int color,Drawable drawable) { Bitmap bitmap = Bitmap.createBitmap(pointSize, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, pointSize, pointSize); drawable.draw(canvas); pointArray[color] = }pointSize,//doRun 方法操作的是看不见的内存数据,此方法内容数据以图画的方式表现出来,所 以画之前数据一定要先准备好 @Override protected void onDraw(Canvas canvas) { drawChssboardLines(canvas);24 //画鼠标所在的点 drawPlayer1Point(canvas); //画电脑下的棋子 drawPlayer2Point(canvas); }public List&Point& getFreePoints() { return allFreeP } //初始化空白点集合 private void createPoints(){ allFreePoints.clear(); for (int i = 0; i & maxX; i++) { for (int j = 0; j & maxY; j++) { allFreePoints.add(new Point(i, j)); } } } public int getMaxX() { return maxX; } public int getMaxY() { return maxY; } }25
更多搜索:
赞助商链接
All rights reserved Powered by
文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 五子棋棋盘打印 的文章

 

随机推荐