大学java课程设计-简单五子棋

前言

第一次写博客,不知道写些什么,就打算记录自己在大学期间的课程设计。在大学期间学过几门编程语言,这篇文章记录了大学自己写的第一个java小程序。

效果图

大学java课程设计-简单五子棋
大学java课程设计-简单五子棋
大学java课程设计-简单五子棋

课设要求

通过课设熟悉Java的GUI图形界面设计、Java编程基础知识和面向对象编程技术。

五子棋介绍

五子棋介绍

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

游戏玩法

五子棋规则:棋盘采用15条横线×15条坚线组成交叉的每个点都可以放棋。
游戏分黑白两方,每局由规定黑方先行。黑方玩家移动鼠标在棋盘中点击行棋。当黑方行棋完毕,转由白方行棋。同色棋子在棋盘上形成横、竖、斜形成 “五子相连”则获胜。如果弃权,则判为输。

系统需求分析

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

  1. 下棋功能:此功能是五子棋的基本功能之一,主要是实现了鼠标点击的棋盘位置出现棋子
  2. 悔棋功能:下棋时下错棋子,则可以通过这个功能来取消下错棋子的步骤,从而达到悔棋的效果。
  3. 重新开局功能:当其中一个玩家无法继续完成一场游戏,或者当判断胜负之后棋盘扔保留的情况,可以通过这个功能来实现重新开新的一局游戏。

系统的设计与实现

项目工程结构

大学java课程设计-简单五子棋

运行环境

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() {

			@Override
			public void mousePressed(MouseEvent e) {
				// TODO Auto-generated method stub
				if (iso) {
					return;
				}
				int col, row;
				col = (e.getX() - 15 + 10) / 20;
				row = (e.getY() - 15 + 10) / 20;

				if (col > 19 || col < 0 || row > 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;
					}
				}
			}
		});
	}

	@Override
	public 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 < chessCount; i++) {
			Chess ch = chessList[i];
			if (ch != null && ch.getCol() == col && ch.getRow() == row && ch.getColor() == c) {
				result = true;
			}
		}
		return result;
	}

	private boolean isWin(int col, int row) {
		boolean result = false;
		int CountCh = 1;
		Color c = null;
		if (isBlack) {
			c = Color.BLACK;
		} else {
			c = Color.WHITE;
		}

		// 水平向左
		for (int x = col - 1; x >= 0; x--) {
			if (haschess(x, row, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 水平向右
		for (int x = col + 1; x <= 19; x++) {
			if (haschess(x, row, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 水平取胜
		if (CountCh >= 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 <= 19; y++) {
			if (haschess(col, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 竖直取胜
		if (CountCh >= 5) {
			result = true;
			message = "游戏结束";
		} else {
			result = false;
			CountCh = 1;
		}
		// 斜向右上
		for (int x = col + 1, y = row - 1; x <= 19 && y >= 0; x++, y--) {
			if (haschess(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向左下
		for (int x = col - 1, y = row + 1; x >= 0 && y <= 19; x--, y++) {
			if (haschess(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向取胜
		if (CountCh >= 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 <= 19; x--, y--) {
			if (haschess(x, y, c)) {
				CountCh++;
			} else {
				break;
			}
		}
		// 斜向取胜
		if (CountCh >= 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() {

			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				qpan.againGame();
			}

		});
		//悔棋
		btn2.addMouseListener(new MouseAdapter() {

			@Override
			public void mouseClicked(MouseEvent e) {
				// TODO Auto-generated method stub
				qpan.huiqi();
			}

		});

		// 新游戏
		item1.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				qpan.againGame();
			}
		});

		// 退出
		item2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.exit(0);
			}
		});

	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new GameMain();
	}

}