结对作业:五子棋

本次结对作业我们组做的是五子棋,代码如下:package com.temptation.gobang;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class FiveChessGame {

    private JFrame frame;
    private GameMap map;
    private JMenuBar bar;
    private JMenu game;
    private JMenuItem[] items; 

    private static final int BOARD_SIZE = 15;
    private static final int ROW_WIDTH = 36;
    private static final int SPACE = ROW_WIDTH / 2; 

    private boolean player;
    private char[][] board; 

    public FiveChessGame() {
        player = true;
        board = new char[BOARD_SIZE][BOARD_SIZE];
        clearMap();
        createGUI();
    }

    private void createGUI() {
        frame = new JFrame("五子棋");
        map = new GameMap();
        bar = new JMenuBar();
        game = new JMenu("开始");
        items = new JMenuItem[2];
        game.add(items[0] = new JMenuItem("重新开始"));
        game.add(items[1] = new JMenuItem("关闭"));
    }

    protected void clearMap() {
        for (int i = 0; i < BOARD_SIZE; i++) {
            for (int j = 0; j < BOARD_SIZE; j++) {
                board[i][j] = ‘+‘;
            }
        }
    }

    public void start() {
        map.setPreferredSize(new Dimension(ROW_WIDTH * (BOARD_SIZE - 1) + SPACE
                * 2, ROW_WIDTH * (BOARD_SIZE - 1) + SPACE * 2));
        map.addMouseListener(new MouseAdapter() {

            public void mouseClicked(MouseEvent e) {

                int xPos = (int) (e.getX() / ROW_WIDTH);
                int yPos = (int) (e.getY() / ROW_WIDTH);
                if (board[xPos][yPos] == ‘+‘) {//
                    board[xPos][yPos] = player ? ‘b‘ : ‘w‘; //
                    map.repaint();
                    if (isWin(xPos, yPos)) {
                        map.repaint();
                        String str = player ? "黑棋获胜" : "白棋获胜";
                        JOptionPane.showMessageDialog(null, str, "游戏结束",
                                JOptionPane.PLAIN_MESSAGE);
                        clearMap();
                        map.repaint();
                        player = true;
                    } else {
                        player = player ? false : true;
                    }
                }
            }
        });
        //
        items[0].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String str = "是否重新开始";
                //
                if (JOptionPane.showConfirmDialog(null, str, "重新开始",
                        JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    clearMap(); //
                    map.repaint(); //
                    player = true; //
                }
            }
        });

        items[1].addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String str = "是否关闭游戏";

                if (JOptionPane.showConfirmDialog(null, str, "关闭游戏",
                        JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    System.exit(0);
                }
            }
        });

        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                String str = "是否关闭游戏";

                if (JOptionPane.showConfirmDialog(null, str, "关闭游戏",
                        JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                    System.exit(0);
                }
            }
        });
        bar.add(game);
        frame.setJMenuBar(bar);
        frame.add(map);
        frame.pack();
        frame.setLocation(250, 50);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    }

    protected boolean find(int x, int y) {
        int i, num = 1;
        char temp = player ? ‘b‘ : ‘w‘;
        for (i = x + 1; i < 15; i++) {
            if (board[i][y] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        for (i = x - 1; i >= 0; i--) {
            if (board[i][y] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        return false;
    }

    protected boolean find2(int x, int y) {
        int i, num = 1;
        char temp = player ? ‘b‘ : ‘w‘;
        for (i = y + 1; i < 15; i++) {
            if (board[x][i] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        for (i = y - 1; i >= 0; i--) {
            if (board[x][i] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        return false;
    }

    protected boolean find3(int x, int y) {
        int i, j, num = 1;
        char temp = player ? ‘b‘ : ‘w‘;
        for (i = x + 1, j = y + 1; i < 15 && j < 15; i++, j++) {
            if (board[i][j] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        for (i = x - 1, j = y - 1; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        return false;
    }

    protected boolean find4(int x, int y) {
        int i, j, num = 1;
        char temp = player ? ‘b‘ : ‘w‘;
        for (i = x + 1, j = y - 1; i < 15 && j >= 0; i++, j--) {
            if (board[i][j] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        for (i = x - 1, j = y + 1; i >= 0 && j < 15; i--, j++) {
            if (board[i][j] == temp) {
                num++;
                if (num == 5) {
                    return true;
                }
            } else {
                break;
            }
        }
        return false;
    }

    protected boolean isWin(int x, int y) {
        return (find(x, y) || find2(x, y) || find3(x, y) || find4(x, y));
    }

    private class GameMap extends JPanel {
        private static final long serialVersionUID = 16578987565248L;

        public void paintComponent(Graphics g) {
            super.paintComponent(g);

            g.setColor(new Color(200, 100, 50));
            g.fillRect(0, 0, ROW_WIDTH * (BOARD_SIZE + 1), ROW_WIDTH
                    * (BOARD_SIZE + 1));
            g.setColor(Color.black);
            for (int i = 0; i < BOARD_SIZE; i++) {
                g.drawLine(SPACE + ROW_WIDTH * i, SPACE, SPACE + ROW_WIDTH * i,
                        SPACE + ROW_WIDTH * (BOARD_SIZE - 1));
            }
            for (int i = 0; i < BOARD_SIZE; i++) {
                g.drawLine(SPACE, SPACE + ROW_WIDTH * i, SPACE + ROW_WIDTH
                        * (BOARD_SIZE - 1), SPACE + ROW_WIDTH * i);
            }

            g.fillOval(SPACE + 3 * ROW_WIDTH - 3, SPACE + 3 * ROW_WIDTH - 3, 7,
                    7);
            g.fillOval(SPACE + 11 * ROW_WIDTH - 3, SPACE + 3 * ROW_WIDTH - 3,
                    7, 7);
            g.fillOval(SPACE + 3 * ROW_WIDTH - 3, SPACE + 11 * ROW_WIDTH - 3,
                    7, 7);
            g.fillOval(SPACE + 7 * ROW_WIDTH - 3, SPACE + 7 * ROW_WIDTH - 3, 7,
                    7);
            g.fillOval(SPACE + 11 * ROW_WIDTH - 3, SPACE + 11 * ROW_WIDTH - 3,
                    7, 7);

            for (int i = 0; i < BOARD_SIZE; i++) {
                for (int j = 0; j < BOARD_SIZE; j++) {
                    if (board[i][j] == ‘b‘) {
                        g.setColor(Color.black);
                        g.fillOval(SPACE + i * ROW_WIDTH - ROW_WIDTH / 2, SPACE
                                + j * ROW_WIDTH - ROW_WIDTH / 2, ROW_WIDTH,
                                ROW_WIDTH);
                    }
                    if (board[i][j] == ‘w‘) {
                        g.setColor(Color.white);
                        g.fillOval(SPACE + i * ROW_WIDTH - ROW_WIDTH / 2, SPACE
                                + j * ROW_WIDTH - ROW_WIDTH / 2, ROW_WIDTH,
                                ROW_WIDTH);
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
        FiveChessGame game = new FiveChessGame();
        game.start();
    }
}

运行截图如下

程序能够良好运行

时间: 2024-12-20 21:53:47

结对作业:五子棋的相关文章

软件工程结对作业02(借鉴版)

软件工程结对作业02(借鉴版) 在编写程序的时候因为不会将Java程序嵌入进jsp中所以借鉴了一个学姐的程序,下面是学姐的程序.但在对学姐程序就行修改时发现了一些问题: 在Newjsp中能调用html中的题目个数的参数 在Myjsp中不能调用html中的题目个数的参数 其中这个参数timugeshu,是我自己后来添加的,用来改变题目个数的,与Java程序无关,只在jsp文件中作用 源程序: NewFeil.html <!DOCTYPE html> <html> <head&g

结对作业电梯调度问题

以下为结对作业,我只能做到看懂,真的不太会编..我会努力学的 问题描述: 某大楼共有20层,现安装4个电梯参数如下: 1号电梯 全楼层 最大负载800kg 2号电梯 单数层 最大负载800kg 3号电梯 双数层 最大负载1600kg 4号电梯 全楼层 最大负载2000kg 分析: 4个电梯是相互独立工作的,那么分为4个相互独立的调度模块.1号电梯与4号电梯均服务于全楼层且仅有最大负载不同,而2号和3号电梯 服务模式类似.那么1.4号电梯调度模块可合并为一个.同样地,2.3号模块也可以合并.电梯调

结对作业——我的体会

首先非常荣幸能和李保全同学搭档 ,因为李保全同学的编程能力非常强,和他搭档可以让我学到很多东西. 在真正实践的过程中,我和李保全同学重复做了好几次算法设计,但是每次都出现很多问题,然后又一次次的推翻,在这个过程中,我最大的感触就是只有不断的尝试,才可以学的更过的东西,虽然在前面几次做算法的时候出现了很多问题,不是考虑太简单,就是考虑的过于复杂.对问题没有一个统筹的认识.在李保全身上我学到了对问题分析的一些东西.例如他把电梯分成了内和外两部分 来考虑,而我刚开始只是考虑功能,没有分开去想,我觉得这

结对作业--电梯调度

结对编程 结对成员:王长(2011040101179)CODING:https://coding.net/u/smile-wang  高庆阳(2013040101173) 博客:http://www.cnblogs.com/gaoqingyang1994/   CODING:https://coding.net/u/gaoqingyang1994 结对编程的优缺点 在结对编程模式下,一对程序员可以平等的.互补地进行开发工作:他们一起分析,一起设计,一起写测试用例,一起编码,一起做测试...这样在

结对作业(1.0版)

import java.awt.EventQueue; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.GroupLayout; import javax.swing.GroupLayout.Alignment; import javax.swing.LayoutStyle.ComponentPlacement; import java.awt.Font; import javax.swing.JT

软件工程网络15结对作业1

一.需求分析 1.题目需求 1)除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 2)运算符为 +, ?, ×, ÷ 3)并且要求能处理用户的输入,并判断对错,打分统计正确率. 4)要求能处理用户输入的真分数, 如 1/2, 5/12 等 5)使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目Myapp.exe -n 10 题目分析: 1)支持真分数和整数的运算: 2)能够判断对错,且输出正确答案:能够计算正确率并输出: 3)将程序弄

结对作业1

结对作业1 结对成员:孟鲜鲜 代码跳转入口. 代码功能:静态链表实现查找功能 代码审查表 功能模块名称 静态链表实现查找功能 审查人 张子扬 审查日期 2018/4/6 代码名称 用静态链表实现查找功能 代码作者 孟鲜鲜 文件结构 重要性 审查项 结论 头文件和定义文件的名称是否合理? 是 头文件和定义文件的目录结构是否合理? 是 版权和版本声明是否完整? 无版权声明 重要 头文件是否使用了 ifndef/define/endif 预处理块? 否 头文件中是否只存放"声明"而不存放&q

软件工程结对作业 四则运算界面设计

软件工程结对作业 四则运算界面设计 康鑫  PB16060203 娄雨禛  PB16060356 一.项目分析 二.进度规划与完成情况 三.主要函数 四.简单的数据测试 五.编程困惑与心得 原文地址:https://www.cnblogs.com/RainLou/p/8735480.html

结对作业——随机生成四则运算

结对作业 UI 第三组 朱池苇 PB16150206 刘鼎乾 PB16070837 Github 地址: 项目简介 这次软件工程结对项目为制作一个给小学生用的四则运算出题软件,然后我们抽到的是UI组,也就是负责人机交互--随机生成四则运算--使用Core组封装好的dll模块. 需求分析 对上述各属性参数(生成题目的数量,操作数的数量,题目及答案中的数值的范围--)进行设置 调用Core模块得到题目和运算结果,显示题目,接受输入,并能判断答案是否正确 增加"倒计时"功能,每个题目必须在2