实验三结对项目

一、题目简介

1、计算机能对棋局进行分析、判断。根据棋局状态来确定机器方的下棋行为。

2、计算机能根据棋局状态实时的判断对弈双方的胜负。

3、控制双方交替下棋。

4、友好的界面呈现。

二、结对分工及过程

结对 刘永政(学号后四位:1139) 张斌(学号后四位:1136)

 组员各自的优缺点:

      1.刘永政: 代码的编写和代码规范。

     2.张斌:程序的分析和程序的测试及测试代码的编写

三、结对编程优缺点:

    优点:

    1.结对编程时间紧密,在一定程度上可以督促双方学习,提高效率。

   2.Coder在coding过程中会遇到一些细小的问题,而reviewer可以及时指出错误,并给予解决方案进行讨论。

   3.遇到问题时,两个人一起讨论,并补充对方没有想到的地方,是完善程序最好的方式。

   缺点:

   在编程过程中,很长时间是coder在coding的过程中想思路,大概这也是每个程序员的特点,而这个时候reviewer就会长时间遇到空档期。

四、代码地址

https://github.com/heartgo/test

源代码:

importjavax.swing.*;
   
  import java.awt.*;
  import java.awt.event.*;
  import java.net.URL;
  @SuppressWarnings("serial")
  public class ChessMap extends JFrame {
  private ImageIcon map; //棋盘背景位图
  private ImageIcon blackchess; //黑子位图
  private ImageIcon whitechess; //白子位图
  private ChessPanel cp; //棋盘
  private JPanel east;
  private JPanel west;
  private static final int FINAL_WIDTH = 450;
  private static final int FINAL_HEIGHT = 500;
  //以下为下拉菜单
  private JMenuBar menubar;
  private JMenu[] menu={new JMenu("开始"),new JMenu("设置"),new JMenu("帮助")};
  private JMenuItem[] menuitem1={new JMenuItem("重新开始"),new JMenuItem("悔棋"),newJMenuItem("退出")};
  private JMenuItem[] menuitem2={new JMenuItem("禁手选择"),new JMenuItem("人机对战"),newJMenuItem("双人对战")};
  private JMenuItem[] menuitem3={new JMenuItem("规则"),new JMenuItem("关于")};
  private boolean haveai=true; //人与人下还是人与电脑下,true与电脑下
  Mouseclicked mouseclicked=new Mouseclicked();
  MouseMoved mousemoved=new MouseMoved();
  Menuitemclicked menuclicked=new Menuitemclicked();
   
  //构造函数
  public ChessMap(){
  //改变系统默认字体
  Font font = new Font("Dialog", Font.PLAIN, 12);
  java.util.Enumeration keys = UIManager.getDefaults().keys();
  while (keys.hasMoreElements()) {
  Object key = keys.nextElement();
  Object value = UIManager.get(key);
  if (value instanceof javax.swing.plaf.FontUIResource) {
  UIManager.put(key, font);
  }
  }
  setTitle("五子棋 ");
  setSize(FINAL_WIDTH,FINAL_HEIGHT);
  setResizable(false);
  init();
  setLocation(Toolkit.getDefaultToolkit().getScreenSize().width / 2
  - FINAL_WIDTH / 2, Toolkit.getDefaultToolkit()
  .getScreenSize().height
  / 2 - FINAL_HEIGHT / 2);
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  cp.reset();
  setVisible(true);
  }
   
  //初始化与默认值
  public void init()
  {
   
  map=new ImageIcon(getClass().getResource("bg.jpg"));
  blackchess=new ImageIcon(getClass().getResource("blackchess.gif"));
  whitechess=new ImageIcon(getClass().getResource("whitechess.gif"));
  cp=new ChessPanel(map,blackchess,whitechess);
  menubar=new JMenuBar();
  menuitem1[0].setActionCommand("Restart");
  menuitem1[1].setActionCommand("Rollback");
  menuitem1[2].setActionCommand("Exit");
  menuitem2[0].setActionCommand("Forbid");
  menuitem2[1].setActionCommand("Robot");
  menuitem2[2].setActionCommand("Human");
  menuitem3[0].setActionCommand("Rule");
  menuitem3[1].setActionCommand("About");
  for(int i=0;i<3;i++)
  menu[0].add(menuitem1[i]);
  for(int i=0;i<3;i++)
  menu[1].add(menuitem2[i]);
  for(int i=0;i<2;i++)
  menu[2].add(menuitem3[i]);
  for(int i=0;i<3;i++)
  menubar.add(menu[i]);
  Container p = getContentPane();
  setJMenuBar(menubar);
  east = new JPanel();
  west = new JPanel();
  p.add(east, "East");
  p.add(west, "West");
  p.add(cp, "Center");
  cp.addMouseListener(mouseclicked);
  cp.addMouseMotionListener(mousemoved);
  menuitem1[0].addActionListener(menuclicked);
  menuitem1[1].addActionListener(menuclicked);
  menuitem1[2].addActionListener(menuclicked);
  menuitem2[0].addActionListener(menuclicked);
  menuitem2[1].addActionListener(menuclicked);
  menuitem2[2].addActionListener(menuclicked);
  menuitem3[0].addActionListener(menuclicked);
  menuitem3[1].addActionListener(menuclicked);
   
  }
  class Mouseclicked extends MouseAdapter //判断鼠标左击并通知棋盘和电脑
  {
  public void mouseClicked(MouseEvent e)
  {
  if(cp.win==false){
  if(haveai){ //和电脑博弈
  Point p1=new Point();
  p1=cp.getPoint(e.getX(),e.getY());
  int x=p1.x;
  int y=p1.y;
  // 如果该位置已经放置棋子
  System.out.println("x="+x+",y="+y);
  if (cp.isChessOn[x][y] != 2)
  return;
  // 玩家为黑棋,考虑禁手
  if( cp.able_flag && cp.bw == 0) {
  int type = cp.getType(x,y,cp.bw);
  String str = null;
  switch(type){
  case 20:
  str = "黑长连禁手!请选择其它位置下棋!";
  break;
  case 21:
  str = "黑四四禁手!请选择其它位置下棋!";
  break;
  case 22:
  str = "黑三三禁手!请选择其它位置下棋!";
  break;
  default : break;
  }
  if(str != null) {
  JOptionPane.showMessageDialog(null,str);
  return;
  }
  }
  boolean flag=cp.haveWin(x, y, cp.bw);
  cp.update( x, y );
  cp.putVoice(); //落子声音
  // 第一步棋,需初始化设置边界值
  if( cp.chess_num == 1){
  if(x-1>=0)
  cp.x_min = x-1;
  if(x-1<=15)
  cp.x_max = x+1;
  if(y-1>=0)
  cp.y_min = y-1;
  if(y-1<=15)
  cp.y_max = y+1;
  }
  else
  cp.resetMaxMin(x,y);
  if (flag) {
  cp.wined(1 - cp.bw);
  return;
  }
  cp.putOne(cp.bw);
  }else{ //和人博弈
  Point p1=new Point();
  p1=cp.getPoint(e.getX(),e.getY());
  int x=p1.x;
  int y=p1.y;
  // 如果该位置已经放置棋子
  System.out.println("x="+x+",y="+y);
  if (cp.isChessOn[x][y] != 2)
  return;
  // 玩家为黑棋,考虑禁手
  if( cp.able_flag && cp.bw == 0) {
  int type = cp.getType(x,y,cp.bw);
  String str = null;
  switch(type){
  case 20:
  str = "黑长连禁手!请选择其它位置下棋!";
  break;
  case 21:
  str = "黑四四禁手!请选择其它位置下棋!";
  break;
  case 22:
  str = "黑三三禁手!请选择其它位置下棋!";
  break;
  default : break;
  }
  if(str != null) {
  JOptionPane.showMessageDialog(null,str);
  return;
  }
  }
  boolean flag=cp.haveWin(x, y, cp.bw);
  cp.update( x, y );
  cp.putVoice(); //落子声音
  cp.repaint();
  // 第一步棋,需初始化设置边界值
  if( cp.chess_num == 1){
  if(x-1>=0)
  cp.x_min = x-1;
  if(x-1<=15)
  cp.x_max = x+1;
  if(y-1>=0)
  cp.y_min = y-1;
  if(y-1<=15)
  cp.y_max = y+1;
  }
  else
  cp.resetMaxMin(x,y);
  if (flag) {
  cp.wined(1 - cp.bw);
  return;
  }
  }
  }
  }
  }
  class MouseMoved implements MouseMotionListener //调试用,获得鼠标位置
  {
  public void mouseMoved(MouseEvent e)
  {
  cp.showMousePos(e.getPoint());
  }
  public void mouseDragged(MouseEvent e)
  {}
  }
  class Menuitemclicked implements ActionListener //菜单消息处理
  {
  public void actionPerformed(ActionEvent e)
  {
  JMenuItem target = (JMenuItem)e.getSource();
  String actionCommand = target.getActionCommand();
  if(actionCommand.equals("Restart")){ //重开一局
  cp.reset();
  if(cp.sbw==cp.WHITE_ONE)
  cp.update(7, 7);
  //player=cp.BLACK_ONE;
  }
  if(actionCommand.equals("Rollback")){ //悔棋
  if(cp.win) {
  JOptionPane.showMessageDialog(null,"棋局已经结束,不能悔棋!请重新开始新的棋局!");
  return;
  }
  // 当前轮到玩家下棋,取消两步 否则,取消一步
  if(cp.chess_num >= 2 && cp.bw == cp.sbw){
  cp.isChessOn[cp.pre[cp.chess_num-1][0]][cp.pre[cp.chess_num-1][1]] = 2;
  cp.isChessOn[cp.pre[cp.chess_num-2][0]][cp.pre[cp.chess_num-2][1]] = 2;
  cp.chess_num -= 2;
  cp.repaint();
  }
  else if(cp.chess_num >= 1 && cp.bw == 1-cp.sbw){
  cp.isChessOn[cp.pre[cp.chess_num-1][0]][cp.pre[cp.chess_num-1][1]] = 2;
  cp.chess_num --;
  cp.repaint();
  }
  }
  else if(actionCommand.equals("Exit")){ //退出
  System.exit(1);
  }
  else if(actionCommand.equals("Forbid")){ //禁手选择
  Object[] options = { "无禁手", "有禁手" };
  int sel = JOptionPane.showOptionDialog(
  null, "你的选择:", "禁手选择",
  JOptionPane.DEFAULT_OPTION,
  JOptionPane.QUESTION_MESSAGE, null,
  options, options[0]);
  if(sel==1){
  cp.able_flag=true;
  System.out.println("有禁手");
  }else{
  cp.able_flag=false;
  System.out.println("无禁手");
  }
  }
  else if(actionCommand.equals("Robot")){ //人机博弈
  haveai=true;
  Object[] options = { "人类先手", "机器先手" };
  int sel = JOptionPane.showOptionDialog(
  null, "你的选择:", "先手选择",
  JOptionPane.DEFAULT_OPTION,
  JOptionPane.QUESTION_MESSAGE, null,
  options, options[0]);
  if(sel==1){ //机器先手
  cp.sbw=cp.WHITE_ONE;
  cp.update(7, 7);
  System.out.println("机器先手");
   
  }else{ //人先手
  //player=cp.BLACK_ONE;
  cp.sbw=cp.BLACK_ONE;
  System.out.println("人先手");
  }
  }
  else if(actionCommand.equals("Human")){ //人人博弈
  haveai=false;
  cp.setHumanhuman(true);
  }else if(actionCommand.equals("Rule")){ //规则
  JOptionPane.showConfirmDialog(null,
  "1、无禁手:" +"\n"+
  " 黑白双方依次落子,任一方先在棋盘上形成连续的五个(含五个以上)棋子的一方为胜。" +"\n"+
  "2、有禁手:(走禁手就输,禁手不能落子)" +"\n"+
  " 鉴于无禁手规则黑棋必胜,人们不断采用一些方法限制黑棋先行的优势,以平衡黑白双方的形式。" +"\n"+
  " 于是针对黑棋的各种禁手逐渐形成。" +"\n"+
  " 禁手主要分为以下几类:" +"\n"+
  " (1)黑长连禁手:连成六个以上连续相同的棋子。" +"\n"+
  " (2)黑三三禁手:两个以上的活三。" + "\n"+
  " (3)黑四四禁手:两个以上的四。" + "\n"+
  " 禁手是针对黑棋而言的,白棋没有任何禁手。" ,"规则",JOptionPane.CLOSED_OPTION,JOptionPane.INFORMATION_MESSAGE);
  }
  else if(actionCommand.equals("About")){ //版权与帮助
  JOptionPane.showConfirmDialog(null,"团队成员:\n" +
  "张斌\n" +
  "刘永政","关于",JOptionPane.CLOSED_OPTION,JOptionPane.INFORMATION_MESSAGE);
  }
  }
   
  }
  public static void main(String[] args) {
  new ChessMap();
  }
  }

运行截图

五、测试情况

六、心得

通过这次结对作业,我知道了两个人一起编程是需要配合的,如果配合不好会比较痛苦,但也有很多优点,这种方式减少了个人工作量,也会让程序编写的更好

时间: 2024-08-09 14:47:52

实验三结对项目的相关文章

github实验三结对报告

一.题目简介 本项目需要实现一个具有四则运算的计算器,能够实现基本的加.减.乘.除运算,以及其他的辅助功能(阶乘.正弦.余弦.指数运算):界面简洁实用,模拟Windows中的计算器程序,要提供主要的设计思路.类的设计.本程序中Calculator是主类,main方法里会建立一个Calculator对象.Signs,Clear,Num,Dot类为内部类,是一个监听器类. 二.代码地址 https://github.com/ZHANGPING88/Calculator 三.结对分工情况 本次实验是我

实验报告结对项目

实验报告 一.程序题是: 有1.2.3.4.5.6.7个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 二.程序分析:输出的是无重复数字的三位数,那么首先应该解决在一个数组中,一个数字绝对不能出现两次,那么我们就写两个方法来完成,第一个方法 printNum1 先把第一位i找出来,然后在定义一个长度为比上一个数组少一位的数组的方法getArray 三.源代码托管地址 https://github.com/13695318582/software/tree/master 四.程序截图

实践作业三 结对项目

学号: 201303014071  姓名:黄彦潇   班级:计科(高职)13-2 一.题目简介 利用Java GUI的组件类.容器类和辅助类设计所选项目的用户界面,并在深入理解并掌握事件驱动程序设计原理的基础上,实现事件驱动的程序设计. 1.实现图形界面. 2.能以月历形式显示日期与星期.工作日.双休日.当天分别以黑色.红色和蓝色显示. 3.支持用户通过下拉形式菜单来选择月份. 4.通过点击“现在日期”来刷新日历. 二.结对分工 结对者: 张燕   黄彦潇 张燕:代码编写以及程序测试 黄彦潇:程

实验四:201571030116/201571030106《小学四则运算练习软件需求说明》结对项目报告

任务1:以实验二个人项目.实验三结对项目所开发的小学生四则运算练习软件作为原型,实施小学生四则运算练习软件用户调研活动. 由于上次作业小伙伴很机智的把软件的操作过程录成了gif动图,所以在做基于原型的用户需求调查时减少了很多麻烦.对于这个任务我们采用了三种方法做用户需求调查:1.线上问卷调查 2.真实用户线上访谈 3.会议研讨 1.线上问卷调查:地址: 我们通过前两次作业整理了一些问题,用"问卷星"做了一份线上问卷调查,为了更精确的区分不同真实用户对软件的需求,我们把问卷调查分成了三个

201571030133/201571030102《小学四则运算练习软件软件需求说明》结对项目报告

我的学号:201571030133 结对伙伴的学号:201571030102 结对伙伴的博文链接:http://www.cnblogs.com/yuan1229/p/8873824.html 任务一: 以实验二个人项目.实验三结对项目所开发的小学生四则运算练习软件作为原型,实施小学生四则运算练习软件用户调研活动. 1. 调研对象:小学生.小学生家长和小学老师. 2. 需求调研方法:访谈.问卷调查 .原型评估. 问卷样本链接:https://www.wjx.cn/jq/22680152.aspx

201571030122/201571030129《小学四则运算练习软件软件需求说明》结对项目报告

<小学四则运算练习软件>博文链接:http://www.cnblogs.com/mzll/p/8709480.html GitHub的链接地址:https://github.com/13993013291/Shiyan3.git 任务一:        以实验二个人项目.实验三结对项目所开发的小学生四则运算练习软件作为原型,实施小学生四则运算练习软件用户调研活动. 1.调研对象:老师,学生以及家长: 2.调研方法:主要是问卷调查,其次通过即时通讯工具访谈了下当老师的同学: 3.问卷样本链接:h

201571030315\201571030303《小学生四则运算软件需求说明结对项目报告》

以实验二个人项目.实验三结对项目所开发的小学生四则运算练习软件作为原型,实施小学生四则运算练习软件用户调研活动. (1)调研对象:小学生,小学数学代课老师,家长 (2)要利用实验二.实验三开发的程序作为软件原型: (3)采用问卷调查,访谈两种方式来需求获取: (4)和小伙伴设计了网上问卷调查,调查了数学代课老师和小学生及其家长 (5)问卷调查网址https://www.wjx.cn/m/22668847.aspx 1.1 编写目的   本文档的目的是详细地介绍<小学生四则运算练习软件>所包含的

结对项目实验报告

结对实验报告 结对人曹文静的地址: http://www.cnblogs.com/liandiexueying/ 一.实践目标: 敏捷方法之结对编程实践 学会与他人合作 基于项目的Github源代码管理 继续学习JUnit4单元测试 形成良好的编码风格 二.结对项目参考题目 连连看小游戏. 三.实验报告内容 1.题目简介 游戏规则是模仿网络上普通的连连看游戏,主要是鼠标两次点击的图片能否消去的问题.当前,前提是点击两张相同的图片,若点击的是同一张图片或者两张不同的图片,则不予处理.在两张想同图片

20145326蔡馨熠 实验三 &quot;敏捷开发与XP实践&quot;

20145326蔡馨熠 实验三 "敏捷开发与XP实践" 程序设计过程 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 一.git上传代码 首先我通过git上传一个名为“shiyansan”的代码. 设置权限: 然后我的partner从网上把这个文档下载到他的电脑中. 然后再修改,再上传: 我的partner:-  [20145211黄志远开源托管代码](https://git.oschina.net/nostalgia_) 二.敏捷开发与XP 软件工程是把