本文实例为大家分享了android实现五子棋游戏的具体代码,供大家参考,具体内容如下
实现环境: android studio 3.2.1, 手机分辨率为: 1920 * 1080
局域网采用 socket 连接
分主活动类,主机类,客户端类
代码如下
清单文件要添加的权限:
<uses-permission android:name="android.permission.access_wifi_state" /> <uses-permission android:name="android.permission.access_network_state" /> <uses-permission android:name="android.permission.internet" />
主活动:
package fivechess; import android.os.bundle; import android.preference.preferencemanager; import android.support.v7.app.appcompatactivity; import android.view.view; import android.view.viewgroup; import android.widget.button; import android.widget.edittext; import android.widget.linearlayout; import android.widget.textview; import android.widget.toast; import java.net.inetaddress; import java.net.networkinterface; import java.net.socketexception; import java.util.enumeration; public class mainactivity extends appcompatactivity { private textview txtmain; private button serverbtn; private textview txtclient; private edittext iptext; private button clientbtn; private int ip = 10000; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); initview(); } private void initview() { txtmain = (textview) findviewbyid(r.id.txtmain); serverbtn = (button) findviewbyid(r.id.serverbtn); txtclient = (textview) findviewbyid(r.id.txtclient); iptext = (edittext) findviewbyid(r.id.iptext); clientbtn = (button) findviewbyid(r.id.clientbtn); iptext.settext(getpreference("myip")); // 显示本机的 ip 地址 setip(); // 根据按钮来判断作为主机还是客户端 final viewgroup.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content); serverbtn.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { serverview serverview = new serverview(mainactivity.this, ip, mainactivity.this); addcontentview(serverview, params); serverview.startconn(); // 将当前控件隐藏掉 viewgone(); } }); clientbtn.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { if (iptext.gettext().tostring().isempty()) { toast.maketext(mainactivity.this, "ip 不能为空!", toast.length_short).show(); return; } clientview clientview = new clientview(mainactivity.this, iptext.gettext().tostring(), ip, mainactivity.this); addcontentview(clientview, params); clientview.startjoin(); // 将当前控件隐藏掉 viewgone(); } }); } // 存储当前输入的 ip public void setmyip() { setpreference("myip", iptext.gettext().tostring()); } // 用于获取本机 ip 地址 public void setip() { string s; try { for (enumeration<networkinterface> en = networkinterface.getnetworkinterfaces(); en.hasmoreelements();) { networkinterface face = en.nextelement(); for (enumeration<inetaddress> enaddr = face.getinetaddresses(); enaddr.hasmoreelements();) { inetaddress addr = enaddr.nextelement(); if (!addr.isloopbackaddress()) { s = addr.gethostaddress(); // 只获取局域网地址 if ("192".equals(s.substring(0, 3))) { txtmain.settext(txtmain.gettext().tostring() + " 主机ip: " + s); } } } } } catch (socketexception e) { e.printstacktrace(); } } // 隐藏主活动的辅助空间 public void viewgone() { txtmain.setvisibility(view.gone); serverbtn.setvisibility(view.gone); txtclient.setvisibility(view.gone); iptext.setvisibility(view.gone); clientbtn.setvisibility(view.gone); } // 用于获取上次的ip输入地址 public string getpreference(string key) { return preferencemanager.getdefaultsharedpreferences(this).getstring(key, "192.168."); } // 用于存储数据到本地 public void setpreference(string key, string value) { preferencemanager.getdefaultsharedpreferences(this).edit().putstring(key, value).apply(); } }
布局:
效果图
代码:
<?xml version="1.0" encoding="utf-8"?> <linearlayout 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:orientation="vertical" tools:context=".mainactivity"> <textview android:id="@+id/txtmain" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="作为主机" android:textcolor="#000" /> <button android:id="@+id/serverbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="start server" /> <textview android:id="@+id/txtclient" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:text="作为客户端" android:textcolor="#000" /> <edittext android:id="@+id/iptext" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="ip" android:text="192.168.31.163" /> <button android:id="@+id/clientbtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="client connection" /> </linearlayout>
主机类:
package fivechess; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.graphics.rectf; import android.view.motionevent; import android.view.view; import android.view.viewgroup; import android.widget.button; import android.widget.linearlayout; import android.widget.textview; import android.widget.toast; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.serversocket; import java.net.socket; import java.util.arraylist; import java.util.list; import java.util.timer; import java.util.timertask; public class serverview extends view { // 上边距 public static final int top = 200; // 棋盘的左,上边距 public static final int marginleft = 50, margintop = 100 + top; // 棋子的宽度,视情况而定 public static final int chessw = 62; // 格子的宽度,视情况而定 public static final int w = 70; // 14个格子,15条行列坐标 public static final int l = 15; public static final int blockl = 14; // 棋的颜色标记 public static final int black = 2, white = 1; // public static final int null = -1; // 棋盘的宽度 private int width = w * blockl; // 棋盘的高度 private int height = w * blockl; // 标记我方的棋的颜色 private int player; // 存储所有走过的棋的信息,主要为坐标 private list<string> alllist = new arraylist<>(); // 存储我方走过的棋的信息 private list<string> mylist = new arraylist<>(); // 存储对方走过的棋的信息 private list<string> enemylist = new arraylist<>(); // 是否可以走棋 private boolean canplay; // 是否有滑动事件 private boolean ismove; // 用于开启服务器,所有的网络请求都要在线程中执行 private serversocket serversocket; // 用于与客户端交互 private socket socket; // 对方端口 private int port; // 用于发送消息 private printwriter pw; // 主活动 private mainactivity mainactivity; // 提示文本框 private textview tvtip; // 重新开始 private button btnrestart; public serverview(context context, int port, mainactivity mainactivity) { super(context); this.port = port; this.mainactivity = mainactivity; // 初始化棋盘 initmap(); // 添加提示文本框控件和重新开始按钮 viewgroup.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content); tvtip = new textview(context); tvtip.settext("等待连接..."); tvtip.setx(500); tvtip.sety(20); mainactivity.addcontentview(tvtip, params); btnrestart = new button(context); btnrestart.settext("重新开始"); btnrestart.setx(marginleft); btnrestart.sety(20); mainactivity.addcontentview(btnrestart, params); btnrestart.setenabled(false); btnrestart.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { // 重新开始游戏 restartgame(); // 发送消息给客户端 sendmes("restart"); } }); setontouchlistener(new ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { switch (event.getaction()) { case motionevent.action_down: ismove = false; break; // 判断是否为滑动事件 case motionevent.action_move: ismove = true; break; case motionevent.action_up: if (!canplay) { break; } // 只可处理点击事件 if (!ismove) { // 获取当前点击位置的 x, y 坐标 int x = (int) event.getx() - marginleft; int y = (int) event.gety() - margintop; // 是否在棋盘外 if (x < -w / 2 || x > width + w / 2 || y < -w / 2 || y > width + w / 2) { break; } // 转化为棋盘的 col 列坐标 // x % w > w / 2 ? 1 : 0 为当前的位置的求模后是否满足大于一半的宽度, // 若大于则把它安排到下一个位置,否则不变 x = x / w + (x % w > w / 2 ? 1 : 0); // 转化为棋盘的 row 行坐标 y = y / w + (y % w > w / 2 ? 1 : 0); // 设置移动信息 string move = y + "|" + x; // 当前位置是否有棋存在 if (alllist.contains(move)) { break; } // 把当前移动位置添加到所有列表中 alllist.add(move); // 把当前移动位置添加到我方列表中 mylist.add(move); // 将移动消息发送给对面 sendmes("move|" + move); // 轮到对方下 canplay = false; // 设置提示信息 tvtip.settext("对方下"); // 更新视图 invalidate(); // 判断是否赢了 if (iswin()) { toast.maketext(getcontext(), "黑棋获胜!", toast.length_short).show(); tvtip.settext("我方获胜!"); } } } return true; } }); } // 开启服务器 public void startconn() { // 只能在线程(异步)中执行 new timer().schedule(new timertask() { @override public void run() { try { serversocket = new serversocket(port); // 获取客户端信息,若无客户端连接则会一直暂停在这 socket = serversocket.accept(); settip("连接成功!"); // 发送已连接给客户端 sendmes("conn|"); // 开启接受消息的线程 new mythread().start(); // 更新视图 invalidate(); } catch (ioexception e) { e.printstacktrace(); } } }, 0); } // 是否赢了 private boolean iswin() { // 好像有点多此一举... return iscanlink(); } // 是否有了输赢 private boolean iscanlink() { // 黑棋先,服务端为黑棋,客户端为白棋 // 判断最后下的是谁,为0为白棋,为1为黑棋 int who = alllist.size() % 2; // 将行列坐标分割出来 string[] t = alllist.get(alllist.size() - 1).split("\\|"); // 行坐标 int r1 = integer.valueof(t[0]); // 列坐标 int c1 = integer.valueof(t[1]); // 垂直方向是否有五子 if (canvlink(who, r1, c1)) { return true; } // 水平方向是否有五子 if (canhlink(who, r1, c1)) { return true; } // 左下右上方向 if (canleftobliquelink(who, r1, c1)) { return true; } // 左上右下方向 if (canrightobliquelink(who, r1, c1)) { return true; } return false; } // 左上右下方向 private boolean canrightobliquelink(int who, int r1, int c1) { // 记录连子的个数 int count = 0; // 遍历要用到的行列坐标 int r2; int c2; // 黑棋 if (who == 1) { // left top r2 = r1 - 1; c2 = c1 - 1; // 往左上方向遍历,若存在则表示有连棋 while (mylist.contains(r2 + "|" + c2)) { count++; r2--; c2--; } // right down r2 = r1 + 1; c2 = c1 + 1; // 往右下方向遍历 while (mylist.contains(r2 + "|" + c2)) { count++; r2++; c2++; } // 若有四个以上则代表构成五子 if (count >= 4) { return true; } } else { // 红棋 // right top r2 = r1 - 1; c2 = c1 - 1; // 往左上方向遍历 while (enemylist.contains(r2 + "|" + c2)) { count++; r2--; c2--; } // left down r2 = r1 + 1; c2 = c1 + 1; // 往右下方向遍历 while (enemylist.contains(r2 + "|" + c2)) { count++; r2++; c2++; } // 若有四个以上则代表构成五子 if (count >= 4) { return true; } } return false; } // 左下右上方向 private boolean canleftobliquelink(int who, int r1, int c1) { int count = 0; int r2; int c2; // 黑棋 if (who == 1) { // right top r2 = r1 - 1; c2 = c1 + 1; while (mylist.contains(r2 + "|" + c2)) { count++; r2--; c2++; } // left down r2 = r1 + 1; c2 = c1 - 1; while (mylist.contains(r2 + "|" + c2)) { count++; r2++; c2--; } if (count >= 4) { return true; } } else { // 白棋 // right top r2 = r1 - 1; c2 = c1 + 1; while (enemylist.contains(r2 + "|" + c2)) { count++; r2--; c2++; } // left down r2 = r1 + 1; c2 = c1 - 1; while (enemylist.contains(r2 + "|" + c2)) { count++; r2++; c2--; } if (count >= 4) { return true; } } return false; } // 水平方向 private boolean canhlink(int who, int r1, int c1) { int count = 0; int c2; // 黑棋 if (who == 1) { // left c2 = c1 - 1; while (mylist.contains(r1 + "|" + c2)) { count++; c2--; } // right c2 = c1 + 1; while (mylist.contains(r1 + "|" + c2)) { count++; c2++; } if (count >= 4) { return true; } } else { // 白棋 // left c2 = c1 - 1; while (enemylist.contains(r1 + "|" + c2)) { count++; c2--; } // right c2 = c1 + 1; while (enemylist.contains(r1 + "|" + c2)) { count++; c2++; } if (count >= 4) { return true; } } return false; } // 垂直方向 private boolean canvlink(int who, int r1, int c1) { int count = 0; int r2; // 黑棋 if (who == 1) { // top r2 = r1 - 1; while (mylist.contains(r2 + "|" + c1)) { count++; r2--; } // down r2 = r1 + 1; while (mylist.contains(r2 + "|" + c1)) { count++; r2++; } if (count >= 4) { return true; } } else { // 白棋 // top r2 = r1 - 1; while (enemylist.contains(r2 + "|" + c1)) { count++; r2--; } // down r2 = r1 + 1; while (enemylist.contains(r2 + "|" + c1)) { count++; r2++; } if (count >= 4) { return true; } } return false; } // 接受消息的线程 class mythread extends thread { @override public void run() { bufferedreader br = null; inputstreamreader isr = null; try { string t; while (true) { // 睡眠一段时间,不必每毫秒都执行 sleep(100); isr = new inputstreamreader(socket.getinputstream()); br = new bufferedreader(isr); // 是否接受到了消息 if (br.ready()) { string cmd = br.readline(); // 分割信息 string[] array = cmd.split("\\|"); switch (array[0]) { // 一定是服务器接受到这个消息 case "join": // 服务器一定为黑棋 player = black; // 我方先下 canplay = true; // 发送消息给客户端 sendmes("conn|"); settip("我下"); // ui 更新一定在主线程中执行 // 重新开始按钮可以点了,这个方法可以赚到主线程中 post(new runnable() { @override public void run() { btnrestart.setenabled(true); } }); // mainactivity.runonuithread(new runnable() { @override public void run() { toast.maketext(mainactivity, "你是黑棋", toast.length_short).show(); } }); break; case "move": // 存储对方走的棋坐标 t = array[1] + "|" + array[2]; alllist.add(t); enemylist.add(t); // 我方走棋 canplay = true; settip("我下"); // 是否有了输赢 if (iswin()) { post(new runnable() { @override public void run() { toast.maketext(getcontext(), "白棋获胜!", toast.length_short).show(); tvtip.settext("对方获胜!"); canplay = false; } }); } invalidate(); break; case "restart": // 重新开始游戏 restartgame(); break; } } } } catch (ioexception e) { e.printstacktrace(); } catch (interruptedexception e) { e.printstacktrace(); } } } private void settip(final string s) { post(new runnable() { @override public void run() { tvtip.settext(s); } }); } // 发送消息个客户端 private void sendmes(final string s) { new thread(new runnable() { @override public void run() { try { pw = new printwriter(socket.getoutputstream()); pw.println(s); pw.flush(); } catch (ioexception e) { e.printstacktrace(); } } }).start(); } // 初始化棋盘,把列表全部清空 private void initmap() { alllist.clear(); mylist.clear(); enemylist.clear(); } // 调用 invalidate 是执行 @override protected void ondraw(canvas canvas) { // 画笔,设置线条的样式 paint paint = new paint(); paint.setcolor(color.parsecolor("#ffe869")); // 设置棋盘的位置,视情况而定 canvas.drawrect(0, top, 1080, 1400 + top, paint); // 设置画笔颜色为黑色,用于画棋盘坐标系 paint.setcolor(color.black); paint.setstrokewidth(3); for (int i = 0; i < l; i++) { int hx = marginleft; int hy = margintop + i * w; int vx = marginleft + i * w; int vy = margintop; // 画竖线 canvas.drawline(hx, hy, marginleft + width, hy, paint); // 画横线 canvas.drawline(vx, vy, vx, margintop + height, paint); } // 画初始的九个星位 rectf rectf = new rectf(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int w = 20; int x = marginleft + w * 3 + j * w * 4 - w / 2; int y = margintop + w * 3 + i * w * 4 - w / 2; rectf.set(x, y, x + 20, y + 20); // 画椭圆 canvas.drawoval(rectf, paint); } } // 画棋子 string[] t; int r, c; for (int i = 0; i < alllist.size(); i++) { // 黑棋先,所以黑棋索引为双数,白棋为单数 if (i % 2 == 0) { paint.setcolor(color.black); } else { paint.setcolor(color.white); } t = alllist.get(i).split("\\|"); // 行坐标 r = integer.valueof(t[0]); // 列坐标 c = integer.valueof(t[1]); // 使棋子的中心点对其坐标顶点 c = marginleft + c * w - chessw / 2; r = margintop + r * w - chessw / 2; rectf.set(c, r, c + chessw, r + chessw); // 画椭圆 canvas.drawoval(rectf, paint); } } // 重新开始游戏 public void restartgame() { alllist.clear(); mylist.clear(); enemylist.clear(); canplay = true; settip("我下"); post(new runnable() { @override public void run() { invalidate(); } }); } }
客户端类: 与主机有区别的地方就是 建立连接和接受消息的线程,其它的地方大体相同
代码如下:
package fivechess; import android.content.context; import android.graphics.canvas; import android.graphics.color; import android.graphics.paint; import android.graphics.rectf; import android.view.motionevent; import android.view.view; import android.view.viewgroup; import android.widget.button; import android.widget.linearlayout; import android.widget.textview; import android.widget.toast; import java.io.bufferedreader; import java.io.ioexception; import java.io.inputstreamreader; import java.io.printwriter; import java.net.socket; import java.util.arraylist; import java.util.list; import java.util.timer; import java.util.timertask; public class clientview extends view { public static final int top = 200; public static final int marginleft = 50, margintop = 100 + top; public static final int w = 70; public static final int chessw = 62; // 14个格子,15根线 public static final int l = 15; public static final int blockl = 14; public static final int black = 2, white = 1; private int width = w * blockl; private int height = w * blockl; private int player; private list<string> alllist = new arraylist<>(); private list<string> mylist = new arraylist<>(); private list<string> enemylist = new arraylist<>(); private boolean canplay; private boolean ismove; private socket socket; private int port; private string ip; private mainactivity mainactivity; private printwriter pw; private textview tvtip; private button btnrestart; public clientview(context context, string ip, int port, mainactivity mainactivity) { super(context); this.port = port; this.ip = ip; this.mainactivity = mainactivity; initmap(); viewgroup.layoutparams params = new linearlayout.layoutparams(viewgroup.layoutparams.wrap_content, viewgroup.layoutparams.wrap_content); tvtip = new textview(context); tvtip.settext("连接中"); tvtip.setx(500); tvtip.sety(20); mainactivity.addcontentview(tvtip, params); btnrestart = new button(context); btnrestart.settext("重新开始"); btnrestart.setx(marginleft); btnrestart.sety(20); btnrestart.setenabled(false); mainactivity.addcontentview(btnrestart, params); btnrestart.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { restartgame(); sendmes("restart"); } }); setontouchlistener(new ontouchlistener() { @override public boolean ontouch(view v, motionevent event) { switch (event.getaction()) { case motionevent.action_down: ismove = false; break; case motionevent.action_move: ismove = true; break; case motionevent.action_up: if (!canplay) { break; } if (!ismove) { int x = (int) event.getx() - marginleft; int y = (int) event.gety() - margintop; if (x < -w / 2 || x > width + w / 2 || y < -w / 2 || y > width + w / 2) { break; } // column x = x / w + (x % w > w / 2 ? 1 : 0); // row y = y / w + (y % w > w / 2 ? 1 : 0); string move = y + "|" + x; if (alllist.contains(move)) { break; } alllist.add(move); mylist.add(move); sendmes("move|" + move); canplay = false; tvtip.settext("对方下"); invalidate(); if (iswin()) { toast.maketext(getcontext(), "白棋获胜!", toast.length_short).show(); tvtip.settext("我方获胜!"); sendmes("win"); } } } return true; } }); } public void startjoin() { new timer().schedule(new timertask() { @override public void run() { try { socket = new socket(ip, port); settip("已连接"); // 存储当前输入的 ip mainactivity.setmyip(); sendmes("join|"); new mythread().start(); } catch (ioexception e) { e.printstacktrace(); } } }, 0); } private boolean iswin() { return iscanlink(); } private boolean iscanlink() { // 黑棋先,服务端为黑棋,客户端为白棋 // 判断最后下的是谁 int who = alllist.size() % 2; string[] t = alllist.get(alllist.size() - 1).split("\\|"); int r1 = integer.valueof(t[0]); int c1 = integer.valueof(t[1]); if (canvlink(who, r1, c1)) { return true; } if (canhlink(who, r1, c1)) { return true; } if (canleftobliquelink(who, r1, c1)) { return true; } if (canrightobliquelink(who, r1, c1)) { return true; } return false; } private boolean canrightobliquelink(int who, int r1, int c1) { int count = 0; int r2; int c2; if (who == 0) { // left top r2 = r1 - 1; c2 = c1 - 1; while (mylist.contains(r2 + "|" + c2)) { count++; r2--; c2--; } // right down r2 = r1 + 1; c2 = c1 + 1; while (mylist.contains(r2 + "|" + c2)) { count++; r2++; c2++; } if (count >= 4) { return true; } } else { // right top r2 = r1 - 1; c2 = c1 - 1; while (enemylist.contains(r2 + "|" + c2)) { count++; r2--; c2--; } // left down r2 = r1 + 1; c2 = c1 + 1; while (enemylist.contains(r2 + "|" + c2)) { count++; r2++; c2++; } if (count >= 4) { return true; } } return false; } private boolean canleftobliquelink(int who, int r1, int c1) { int count = 0; int r2; int c2; if (who == 0) { // right top r2 = r1 - 1; c2 = c1 + 1; while (mylist.contains(r2 + "|" + c2)) { count++; r2--; c2++; } // left down r2 = r1 + 1; c2 = c1 - 1; while (mylist.contains(r2 + "|" + c2)) { count++; r2++; c2--; } if (count >= 4) { return true; } } else { // right top r2 = r1 - 1; c2 = c1 + 1; while (enemylist.contains(r2 + "|" + c2)) { count++; r2--; c2++; } // left down r2 = r1 + 1; c2 = c1 - 1; while (enemylist.contains(r2 + "|" + c2)) { count++; r2++; c2--; } if (count >= 4) { return true; } } return false; } private boolean canhlink(int who, int r1, int c1) { int count = 0; int c2; if (who == 0) { // left c2 = c1 - 1; while (mylist.contains(r1 + "|" + c2)) { count++; c2--; } // right c2 = c1 + 1; while (mylist.contains(r1 + "|" + c2)) { count++; c2++; } if (count >= 4) { return true; } } else { // left c2 = c1 - 1; while (enemylist.contains(r1 + "|" + c2)) { count++; c2--; } // right c2 = c1 + 1; while (enemylist.contains(r1 + "|" + c2)) { count++; c2++; } if (count >= 4) { return true; } } return false; } private boolean canvlink(int who, int r1, int c1) { int count = 0; int r2; if (who == 0) { // top r2 = r1 - 1; while (mylist.contains(r2 + "|" + c1)) { count++; r2--; } // down r2 = r1 + 1; while (mylist.contains(r2 + "|" + c1)) { count++; r2++; } if (count >= 4) { return true; } } else { // top r2 = r1 - 1; while (enemylist.contains(r2 + "|" + c1)) { count++; r2--; } // down r2 = r1 + 1; while (enemylist.contains(r2 + "|" + c1)) { count++; r2++; } if (count >= 4) { return true; } } return false; } class mythread extends thread { @override public void run() { // move|r|c // join| // conn| // quit bufferedreader br = null; inputstreamreader isr = null; try { string t; while (true) { sleep(100); isr = new inputstreamreader(socket.getinputstream()); br = new bufferedreader(isr); if (br.ready()) { string cmd = br.readline(); string[] array = cmd.split("\\|"); switch (array[0]) { case "conn": // 客户端一定为白棋 player = white; // 主机先下 canplay = false; settip("对方下"); mainactivity.runonuithread(new runnable() { @override public void run() { btnrestart.setenabled(true); toast.maketext(mainactivity, "你是白棋", toast.length_short).show(); } }); break; case "move": t = array[1] + "|" + array[2]; alllist.add(t); enemylist.add(t); canplay = true; settip("我下"); if (iswin()) { post(new runnable() { @override public void run() { toast.maketext(getcontext(), "黑棋获胜!", toast.length_short).show(); tvtip.settext("对方获胜!"); canplay = false; } }); } invalidate(); break; case "restart": restartgame(); break; case "win": break; case "quit": } } } } catch (ioexception e) { e.printstacktrace(); } catch (interruptedexception e) { e.printstacktrace(); } } } private void sendmes(final string s) { new thread(new runnable() { @override public void run() { try { pw = new printwriter(socket.getoutputstream()); pw.println(s); pw.flush(); } catch (ioexception e) { e.printstacktrace(); } } }).start(); } private void initmap() { alllist.clear(); mylist.clear(); enemylist.clear(); } @override protected void ondraw(canvas canvas) { super.ondraw(canvas); // draw background paint paint = new paint(); paint.setcolor(color.parsecolor("#ffe869")); canvas.drawrect(0, top, 1080, 1400 + top, paint); // draw line paint.setcolor(color.black); paint.setstrokewidth(3); for (int i = 0; i < l; i++) { int hx = marginleft; int hy = margintop + i * w; int vx = marginleft + i * w; int vy = margintop; canvas.drawline(hx, hy, marginleft + width, hy, paint); canvas.drawline(vx, vy, vx, margintop + height, paint); } rectf rectf = new rectf(); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { int w = 20; int x = marginleft + w * 3 + j * w * 4 - w / 2; int y = margintop + w * 3 + i * w * 4 - w / 2; rectf.set(x, y, x + 20, y + 20); canvas.drawoval(rectf, paint); } } // draw chess string[] t; int r, c; for (int i = 0; i < alllist.size(); i++) { if (i % 2 == 0) { paint.setcolor(color.black); } else { paint.setcolor(color.white); } t = alllist.get(i).split("\\|"); r = integer.valueof(t[0]); c = integer.valueof(t[1]); c = marginleft + c * w - chessw / 2; r = margintop + r * w - chessw / 2; rectf.set(c, r, c + chessw, r + chessw); canvas.drawoval(rectf, paint); } } private void settip(final string s) { post(new runnable() { @override public void run() { tvtip.settext(s); } }); } public void restartgame() { alllist.clear(); mylist.clear(); enemylist.clear(); canplay = false; settip("对方下"); post(new runnable() { @override public void run() { invalidate(); } }); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。