五子棋介绍

五子棋是起源于中国古代的传统黑白棋种之一。五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。五子棋既有现代休闲的明显特征“短、平、快”,又有古典哲学的高深学问“阴阳易理”;它既有简单易学的特性,为人民群众所喜闻乐见,又有深奥的技巧和高水平的国际性比赛;它的棋文化源远流长,具有东方的神秘和西方的直观;既有“场”的概念,亦有“点”的连接。它是中西文化的交流点,是古今哲理的结晶。

游戏玩法

五子棋规则:棋盘采用15条横线×15条坚线组成交叉的每个点都可以放棋。

游戏分黑白两方,每局由规定黑方先行。黑方玩家移动鼠标在棋盘中点击行棋。当黑方行棋完毕,转由白方行棋。同色棋子在棋盘上形成横、竖、斜形成 “五子相连”则获胜。如果弃权,则判为输。

系统需求分析

五子棋游戏的基本功能如下:

下棋功能:此功能是五子棋的基本功能之一,主要是实现了鼠标点击的棋盘位置出现棋子

悔棋功能:下棋时下错棋子,则可以通过这个功能来取消下错棋子的步骤,从而达到悔棋的效果。

重新开局功能:当其中一个玩家无法继续完成一场游戏,或者当判断胜负之后棋盘扔保留的情况,可以通过这个功能来实现重新开新的一局游戏。

系统的设计与实现

项目工程结构

运行环境

Eclipse4.7、jre1.8

代码设计

Chess.java

package impl;import java.awt.Color;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.RadialGradientPaint;import java.awt.RenderingHints;public class Chess {Chessboard cp; //棋盘int row;//横坐标int col;//纵坐标Color color;//棋子颜色public Color getColor() {return color;}public void setColor(Color color) {this.color = color;}public int getRow() {return row;}public void setRow(int row) {this.row = row;}public int getCol() {return col;}public void setCol(int col) {this.col = col;}public static final int BANJING = 18;public Chess(Chessboard cp, int col, int row, Color color) {this.cp = cp;this.col = col;this.row = row;this.color = color;}//画棋子public void draw(Graphics g) {//定义棋子圆心int xPos = col * 20 + 15;int yPos = row * 20 + 15;Graphics2D g2d = (Graphics2D) g;RadialGradientPaint paint = null;Color[] c = { Color.WHITE, Color.BLACK };float[] f = { 0f, 1f };int x = xPos + 3;int y = yPos - 3;if (color == Color.WHITE) {paint = new RadialGradientPaint(x, y, BANJING * 3, f, c);} else {paint = new RadialGradientPaint(x, y, BANJING, f, c);}g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.setPaint(paint);g2d.fillOval(xPos - BANJING / 2, yPos - BANJING / 2, BANJING, BANJING);}}

Chessboard.java

package impl;import java.awt.BasicStroke;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.JOptionPane;import javax.swing.JPanel;public class Chessboard extends JPanel {public static final int MARGIN = 15;public static final int SPAN = 20;public static final int ROWS = 19;public static final int COLS = 19;Chess[] chessList = new Chess[19 * 19]; int chessCount = 0;boolean iso = false;boolean isBlack = true;String message = "黑棋先下";public Chessboard() {this.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {// TODO Auto-generated method stubif (iso) {return;}int col, row;col = (e.getX() - 15 + 10) / 20;row = (e.getY() - 15 + 10) / 20;if (col > 19 || col  19 || row < 0) {return;} else {if (haschess(col, row)) {return;} else {Color c = Color.BLACK;if (isBlack) {c = Color.BLACK;message = "轮到白棋";} else {c = Color.WHITE;message = "轮到黑棋";}Chess cc = new Chess(Chessboard.this, col, row, c);chessList[chessCount++] = cc;repaint();if (isWin(col, row)) {if (c == Color.BLACK) {JOptionPane.showMessageDialog(Chessboard.this, "黑棋获胜!");} else if (c == Color.WHITE) {JOptionPane.showMessageDialog(Chessboard.this, "白旗获胜!");}iso = true;return;}isBlack = !isBlack;}}}});}@Overridepublic void paint(Graphics e) {e.setColor(Color.ORANGE);e.fillRect(0, 0, 410, 460);e.setColor(Color.black);for (int i = 0; i < 20; i++) {e.drawLine(MARGIN, MARGIN + SPAN * i, MARGIN + 19 * 20, MARGIN + 20 * i);}for (int i = 0; i < 20; i++) {e.drawLine(15 + SPAN * i, 15, 15 + SPAN * i, 15 + 19 * 20);}e.fillRect(15 + 3 * 20 - 2, 15 + 3 * 20 - 2, 5, 5);e.fillRect(15 + 9 * 20 - 2, 15 + 3 * 20 - 2, 5, 5);e.fillRect(15 + 15 * 20 - 2, 15 + 3 * 20 - 2, 5, 5);e.fillRect(15 + 3 * 20 - 2, 15 + 9 * 20 - 2, 5, 5);e.fillRect(15 + 9 * 20 - 2, 15 + 9 * 20 - 2, 5, 5);e.fillRect(15 + 15 * 20 - 2, 15 + 9 * 20 - 2, 5, 5);e.fillRect(15 + 3 * 20 - 2, 15 + 15 * 20 - 2, 5, 5);e.fillRect(15 + 9 * 20 - 2, 15 + 15 * 20 - 2, 5, 5);e.fillRect(15 + 15 * 20 - 2, 15 + 15 * 20 - 2, 5, 5);Graphics2D e2 = (Graphics2D) e;e2.setStroke(new BasicStroke(3f));e2.drawLine(10, 10, 10, 400);e2.drawLine(10, 10, 400, 10);e2.drawLine(400, 10, 400, 400);e2.drawLine(10, 400, 400, 400);for (int i = 0; i < chessCount; i++) {chessList[i].draw(e);}e.setFont(new Font("黑体", Font.BOLD, 15));e.drawString("游戏提示:" + message, 20, 420);}private boolean haschess(int col, int row) {boolean result = false;for (int i = 0; i < chessCount; i++) {Chess cc = chessList[i];if (cc != null && cc.getCol() == col && cc.getRow() == row) {return true;}}return result;}private boolean haschess(int col, int row, Color c) {Boolean result = false;for (int i = 0; i = 0; x--) {if (haschess(x, row, c)) {CountCh++;} else {break;}}// 水平向右for (int x = col + 1; x = 5) {result = true;message = "游戏结束";} else {result = false;CountCh = 1;}// 竖直向上for (int y = row - 1; y >= 0; y--) {if (haschess(col, y, c)) {CountCh++;} else {break;}}// 竖直向下for (int y = row + 1; y = 5) {result = true;message = "游戏结束";} else {result = false;CountCh = 1;}// 斜向右上for (int x = col + 1, y = row - 1; x = 0; x++, y--) {if (haschess(x, y, c)) {CountCh++;} else {break;}}// 斜向左下for (int x = col - 1, y = row + 1; x >= 0 && y = 5) {result = true;message = "游戏结束";} else {result = false;CountCh = 1;}// 斜向左上for (int x = col - 1, y = row - 1; x >= 0 && y >= 0; x--, y--) {if (haschess(x, y, c)) {CountCh++;} else {break;}}// 斜向右下for (int x = col + 1, y = row + 1; x <= 19 && y = 5) {result = true;message = "游戏结束";} else {result = false;CountCh = 1;}return result;}public void againGame() {for (int i = 0; i < chessList.length; i++) {chessList[i] = null;}chessCount = 0;iso = false;message = "开局黑棋先手";repaint();}public void huiqi() {if (iso) {return;}chessList[chessCount - 1] = null;chessCount--;if (isBlack) {message = "白棋悔棋";} else {message = "黑棋悔棋";}isBlack = !isBlack;repaint();}}

GameMain.java

package impl;import java.awt.BorderLayout;import java.awt.Button;import java.awt.Color;import java.awt.Dimension;import java.awt.FlowLayout;import java.awt.Font;import java.awt.GridLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JPanel;public class GameMain extends JFrame {Chessboard qpan;public GameMain() {qpan = new Chessboard();// 创建菜单栏JMenuBar menubar = new JMenuBar();JMenu menu = new JMenu("游戏(G)");JMenuItem item1 = new JMenuItem("新游戏");JMenuItem item2 = new JMenuItem("退出");menu.add(item1);menu.addSeparator();menu.add(item2);menubar.add(menu);// 按钮JPanel btn = new JPanel();btn.setLayout(new GridLayout(10, 1));Button btn1 = new Button("重新开始");Button btn2 = new Button("悔棋");btn.add(btn1);btn.add(btn2);// 窗口设置BorderLayout bl = new BorderLayout();this.setTitle("五子棋");this.setSize(480, 490);this.setLocationRelativeTo(null);this.setVisible(true);this.setResizable(false);this.add(menubar, bl.NORTH);this.add(qpan, bl.CENTER);this.add(btn, bl.EAST);// 按钮事件btn1.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubqpan.againGame();}});//悔棋btn2.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubqpan.huiqi();}});// 新游戏item1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubqpan.againGame();}});// 退出item2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubSystem.exit(0);}});}public static void main(String[] args) {// TODO Auto-generated method stubnew GameMain();}}