当前位置:文档之家› 五子棋设计

五子棋设计

1:序言程序简介:随着计算机网络的迅猛发展,异地计算机之间的通信变得十分便捷。

这也为异地间的用户通过网络来进行下棋提供了可能。

网络五子棋软件利用TCP/IP协议,在异地的玩家之间建立起TCP连接,并用它来交换棋局的各种数据信息。

所以,网络五子棋软件在下棋以前必须要对相关的网络参数进行设置,才能实现玩家双方的成功连接。

连接成功后,玩家双方轮流下棋,并将每一步下棋的信息通过网络传送给对方,使得双方棋盘上的棋子保持一致。

与单机版五子棋软件相同,网络版五子棋软件也提供了倒计时器、“认输”、“与棋”与“悔棋”等功能。

但这些功能的都就是通过网络来实现的,所以,实现过程较单机版要复杂。

在胜负判别方面,单机版五子棋软件与网络版五子棋软件并没有什么不同,只就是网络版的玩家双方各自有一套胜负判别的程序。

当一方玩家下一步棋后,她的胜负判别程序就执行一次,然后再将落子的信息传送给对方,对方的胜负判别程序也将执行一次。

这样就完成一次胜负的判别过程。

另外,网络版五子棋的双方可能相距邀远,双方的语言交流没有单机版方便。

所以,网络版五子棋还必须提供聊天功能。

2:需求分析⑴功能需求①能通过网络进行下棋②符合五子棋的基本规则③提供水平坐标与垂直坐标功能④提供双方的倒计时功能⑤能在棋子上显示的落子的顺序数⑥提供玩家之间的聊天功能⑵环境需求①10/10Mbps共享式HUB一台②装有Windows95/98/NT/XP操作系统的计算机两台③计算机的CPU不低于PII450,内存不小于64M④10/10Mbps自适应网卡每台计算机各一块,SB兼容声卡各一块,5类双绞线若干米⑤每台计算机都应配置有TCP/IP协议⑶用户界面需求①界面友好、亲切②界面简洁、不花哨③操作界面直观、不繁琐3:程序运行4:UML5:应用设计模式轻量级模式(享元模式)Flyweight在拳击比赛中指最轻量级,即"蝇量级",有些作者翻译为"羽量级"。

这里使用"享元模式"更能反映模式的用意。

享元模式以共享的方式高效地支持大量的细粒度对象。

享元对象能做到共享的关键就是区分内蕴状态(Internal State)与外蕴状态(External State)。

内蕴状态就是存储在享元对象内部并且不会随环境改变而改变。

因此内蕴状态并可以共享。

外蕴状态就是随环境改变而改变的、不可以共享的状态。

享元对象的外蕴状态必须由客户端保存,并在享元对象被创建之后,在需要使用的时候再传入到享元对象内部。

外蕴状态与内蕴状态就是相互独立的。

享元模式的应用享元模式在编辑器系统中大量使用。

一个文本编辑器往往会提供很多种字体,而通常的做法就就是将每一个字母做成一个享元对象。

享元对象的内蕴状态就就是这个字母,而字母在文本中的位置与字模风格等其她信息则就是外蕴状态。

比如,字母a可能出现在文本的很多地方,虽然这些字母a的位置与字模风格不同,但就是所有这些地方使用的都就是同一个字母对象。

这样一来,字母对象就可以在整个系统中共享。

6:经验总结与体会网络五子棋的开发让我感受到软件的开发就是十分辛苦的工作,尤其就是一个人独立开发更就是困难,因为一个人的知识与能力就是有限的,一个好的软件需要一个好的团队,集合大家的知识与力量来共同完成。

现在把一些开发的经验总结如下:①在工程开发中,系统的分析就是整个开发的核心,只有前期进行很好的分析、规划,才能做出好的软件产品,这个阶段要进行很好的策划,精密的分析。

尤其就是流程的设计,直接关系到系统功能与编码的成败。

②良好的程序设计风格很重要。

这在一个比较大的工程中,程序设计的风格非常重要,这影响到软件的测试以及后期功能扩展,在增量型的开发模型中,混乱的代码会使维护变的十分困难。

在多人合作团队开发的时候,您的代码要影响到全局,必须了解到:您的代码就是写给别人瞧。

③运用高效的测试手段。

测试要占开发很大的时间,软件编码以后,并非总能百分百的成功,那就要进行测试。

在大程序中,多写异常处理的代码,以及变量合法的检验等,DEBUG中混合使用断点测试以及报告函数,以提高DEBUG效率。

④善于捕捉最新的技术资料。

在每个软件开发过程中,资料就是必不可少的,虽然书本上有比较系统的资料,但就是真正能运用的还就是不多。

在开发时,不要急于设计编码,应该学会先查找软件开发中涉及到的各种最新资料,学习她们关于本系统的一些开发经验。

学会在编码前,吸取别人的代码的一些优点,然后改进设计,使之更加的完善。

网络五子棋的开发让我体会到,要做好软件必须要学会抽象思维,要练好抽象思维,还要学会使用UML软件之类的工具,用UML建模工具建设的时候要一个一个模块设计好,搞清楚,尽可能的把所有的功能分开, 如果有相似性那么就需要抽象然后继承重写来实现自己的功能。

7:代码Client、javaimport java、awt、BorderLayout;import java、awt、Color;import java、awt、Frame;import java、awt、event、WindowAdapter;import java、awt、event、WindowEvent;public class Client extends Frame {JavaChessFive p;Client(String s){super(s);p=new JavaChessFive();setLayout(new BorderLayout());setBounds(100,100,620,418);add(p);setBackground(Color、WHITE);validate();setVisible(true);addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {dispose();System、exit(0);}});}public static void main(String[] a){new Client("五子棋");}}Concretenut、javaimport java、awt、Graphics;import java、awt、Image;import java、awt、Toolkit;import java、awt、image、ImageObserver;public class ConcreteNut extends Nut {Toolkit t = getToolkit();private String key;Image img;public ConcreteNut(String str) {key = str;}void draw(Graphics g, int x, int y, ImageObserver obs) { if (key、equals("black")) {img = t、getImage("images/black、gif");}else{img = t、getImage("images/white、gif");}g、drawImage(img, x, y, 24, 24, obs);}}JavaChessFive、javaimport java、awt、BorderLayout;import java、awt、Button;import java、awt、Color;import java、awt、FlowLayout;import java、awt、Frame;import java、awt、Graphics;import java、awt、GridLayout;import java、awt、Panel;import java、awt、TextArea;import java、awt、TextField;import java、awt、event、MouseAdapter;import java、awt、event、MouseEvent;import java、awt、event、WindowAdapter;import java、awt、event、WindowEvent;import java、awt、geom、Ellipse2D;import java、rmi、Naming;import java、util、ArrayList;import java、util、List;import javax、swing、JOptionPane;public class JavaChessFive extends Panel { List<Point> points = new ArrayList();boolean isMy = false, win = false;boolean flag = true;// 棋子重叠判定NutFactory nutFactory = new NutFactory();// 享元类MyRemote hello;//TextArea t;TextField tt;Button b1, b2;JavaChessFive() {// this、frame = frame;setLayout(new BorderLayout());setSize(620,450);setBackground(Color、gray);t = new TextArea(10,25);tt = new TextField(1);b1 = new Button("接收消息");b2 = new Button("发送消息");Panel p1=new Panel();p1、setLayout(new GridLayout(2,1));p1、add(t);p1、add(tt);add("East",p1);Panel p2=new Panel();p2、add(b1);p2、add(b2);add("South",p2);try {hello = (MyRemote) Naming、lookup("rmi://localhost:8808/RMI_Hello");System、out、println(hello、sayHello());System、out、println(hello、fromstr());} catch (Exception e) {e、printStackTrace();}b1、addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e) {try {t、append(hello、fromstr() + "\r\n");System、out、println(hello、sayHello());System、out、println(hello、fromstr());} catch (Exception ee) {System、out、println("error");}}});b2、addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent e) {try {hello、sendTo(tt、getText());System、out、println(hello、sayHello());System、out、println(hello、fromstr());} catch (Exception ee) {System、out、println("error");}}});this、addMouseListener(new MouseAdapter() {public void mousePressed(MouseEvent event) {int x = event、getX();int y = event、getY();paintItem(x, y);repaint();}});}void paintItem(int x, int y) {if (x >= 30 && x <= 300 && y >= 30 && y <= 300) { int X = (x + 15) / 30;int Y = (y + 15) / 30;for (Point point : points) {if (point、getX() == X && point、getY() == Y) { flag = false;break;}}if (flag) {points、add(new Point(X, Y));}flag = true;}}public void paint(Graphics g) {for (int i = 30; i <= 300; i = i + 30) {g、drawLine(30, i, 300, i);g、drawLine(i, 30, i, 300);}isMy = false;for (int i = 0; i < points、size(); i++) {isMy = !isMy;if (isMy) {// 享元模式方法nutFactory、getFlyWeight("black")、draw(g,points、get(i)、getX() * 30 - 12,points、get(i)、getY() * 30 - 12, this);if (points、size() >= 9) {if (!win) {if (win = winJudge(points、get(i))) {System、out、println("black win");}}}} else {// 享元模式方法nutFactory、getFlyWeight("white")、draw(g,points、get(i)、getX() * 30 - 12,points、get(i)、getY() * 30 - 12, this);if (points、size() > 9) {if (!win) {if (win = winJudge(points、get(i))) {System、out、println("white win");}}}}}if (win) {if (isMy) {winDialog("黑棋");}else{winDialog("白棋");}}}public boolean winJudge(Point point) {int count = 1;int star = 1;// 白棋if (isMy) {// 黑棋star = 0;}for (int i = 1; i < 5; i++) {// 纵向往上扫描for (int j = star; j < points、size(); j += 2) {if (point、getY() + i == points、get(j)、getY()&& point、getX() == points、get(j)、getX()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 纵向往下扫描for (int j = star; j < points、size(); j += 2) { if (point、getY() - i == points、get(j)、getY()&& point、getX() == points、get(j)、getX()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 横向往左扫描for (int j = star; j < points、size(); j += 2) { if (point、getX() - i == points、get(j)、getX()&& point、getY() == points、get(j)、getY()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 纵向往右扫描for (int j = star; j < points、size(); j += 2) {if (point、getX() + i == points、get(j)、getX()&& point、getY() == points、get(j)、getY()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 向往左上扫描for (int j = star; j < points、size(); j += 2) {if (point、getX() - i == points、get(j)、getX()&& point、getY() - i == points、get(j)、getY()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 向往右下扫描for (int j = star; j < points、size(); j += 2) {if (point、getX() + i == points、get(j)、getX()&& point、getY() + i == points、get(j)、getY()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 向往左下扫描for (int j = star; j < points、size(); j += 2) {if (point、getX() + i == points、get(j)、getX()&& point、getY() - i == points、get(j)、getY()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}for (int i = 1; i < 5; i++) {// 向往右上扫描for (int j = star; j < points、size(); j += 2) {if (point、getX() - i == points、get(j)、getX()&& point、getY() + i == points、get(j)、getY()) { count++;break;}}if (count != i + 1) {count = 1;break;}}if (count >= 5) {return true;}return false;}public void init() {points = new ArrayList();isMy = false;win = false;flag = true;}public void winDialog(String p) {int confirm = JOptionPane、showConfirmDialog(null, p + "获胜 \n 点'就是'重新来一局\n点'否'退出", "胜利",JOptionPane、YES_NO_OPTION);if (confirm == JOptionPane、YES_OPTION) {init();repaint();} else if (confirm == JOptionPane、NO_OPTION) {System、exit(0);}}}MyRemote、javaimport java、rmi、Remote;import java、rmi、RemoteException;public interface MyRemote extends Remote {public String fromstr() throws RemoteException;public void sendTo(String to) throws RemoteException;public String sayHello() throws RemoteException;}MyRemoyeImpl、javaimport java、rmi、RemoteException;import java、rmi、server、UnicastRemoteObject;public class MyRemoteImpl extends UnicastRemoteObject implements MyRemote {private String fromstr = "hello!";public MyRemoteImpl() throws RemoteException {}public String fromstr() {return fromstr;}public void sendTo(String to) {fromstr = to;}public String sayHello() {return"Hello, I'm server、";}}Nut、javaimport java、awt、Canvas;import java、awt、Graphics;import java、awt、GraphicsConfiguration;import java、awt、Image;import java、awt、Toolkit;import java、awt、image、ImageObserver;public abstract class Nut extends Canvas {abstract void draw(Graphics g, int x, int y,ImageObserver obs); }NutFactory、javaimport java、util、Hashtable;public class NutFactory {//按钮工厂private Hashtable nuts = new Hashtable();public NutFactory() {}public Nut getFlyWeight(String key) {Nut nut = (Nut) nuts、get(key);if (nut == null) {nut = new ConcreteNut(key);nuts、put(key, nut);}return nut;}}Point、javapublic class Point {private int x,y;public Point(int x, int y) {super();this、x = x;this、y = y;}public int getX() {return x;}public void setX(int x) {this、x = x;}public int getY() {return y;}public void setY(int y) {this、y = y;}}RMIServer、javaimport java、rmi、*;import java、rmi、registry、*;public class RMIServer {public static void main(String[] args) {try {LocateRegistry、createRegistry(8808);MyRemote hello = new MyRemoteImpl();Naming、rebind("//localhost:8808/RMI_Hello", hello);System、out、println("=== Hello server Ready === ");} catch (Exception exception) {exception、printStackTrace();}}}。

相关主题