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

  • 前言
    • 效果图
    • 课设要求
    • 五子棋介绍
      • 五子棋介绍
      • 游戏玩法
    • 系统需求分析
    • 系统的设计与实现
      • 项目工程结构
      • 运行环境
      • 代码设计

前言

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

效果图



课设要求

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

五子棋介绍

五子棋介绍

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

游戏玩法

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

系统需求分析

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

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

系统的设计与实现

项目工程结构

运行环境

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 < 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;}}}});}@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 < 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() {@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();}}

大学java课程设计-简单五子棋相关推荐

  1. Java课程设计-简单五子棋

    五子棋介绍 五子棋是起源于中国古代的传统黑白棋种之一.五子棋不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性.五子棋既有现代休闲的明显特征"短.平.快",又有古典哲学的高 ...

  2. java课程设计数字日历,java课程设计简单日历.doc

    java课程设计简单日历.doc java课程设计报告题目:JAVA简易时间日历程序学生姓名:董兆军学号:2010314120专业班级:信101指导教师:李红强Java课程设计报告信101董兆军201 ...

  3. java课程设计简单计算器_JAVA课程设计--简易计算器(201521123022 黄俊麟)

    1.团队课程设计博客链接 2.个人负责模板或任务说明 1.初始化业务逻辑. 2.开方.正负.清零.退格.数字内容输入拼接,输出结果的实现. 3.四则运算算法的实现. 4.每个按钮返回对应的业务(每个按 ...

  4. 五子棋 java 课设,五子棋java课程设计

    五子棋java课程设计 目目 录录 一.课程设计任务及要求 1 二.需求分析. 1 2.1 棋盘板块 .1 2.2 聊天板块 .1 2.3 ChatSever .1 2.4 编译环境 .1 2.5 参 ...

  5. 教师管理系统设计报告java_Java 教师信息管理系统 简单的java课程设计范例 - 下载 - 搜珍网...

    Java课程设计 C05计算机(1)班/C05计算机(1)班 051005105 赖红莉.rar Java课程设计 C05计算机(1)班/C05计算机1 丁杭飞 1005030223.rar Java ...

  6. java课程设计 考试系统,java课程设计考试系统.

    java课程设计考试系统.Tag内容描述: 1.目 录 第一章第一章 引言引言 3 1 1目的 3 1 2名词解释 3 1 3参考资料 3 1 4文档结构 3 第第 2 章章远景远景 4 2 1项目概 ...

  7. java课程设计心得体会绪论

      java课程设计心得体会绪论[篇1] 在上学期的最后一周和本学期的第一周,我和同组的学员在学校机房进行了JAVA暑期实训,现在已经结束了. 回首上学期的java学习,重点还是在学习概念等一些常识性 ...

  8. Java课程设计——挖地雷游戏设计报告

    源文件: 大学生Java课程设计--挖地雷游戏设计报告源文件-其它文档类资源-CSDN文库 目 录 摘 要. 1 一.引言. 2 1.设计任务和基本要求. 2 二.报告正文. 3 1.需求分析. 3 ...

  9. JAVA课程设计——“小羊吃蓝莓”小游戏

    JAVA课程设计--"小羊吃蓝莓"小游戏 1. 团队课程设计博客链接 http://www.cnblogs.com/HXY071/p/7061216.html 2. 个人负责模块或 ...

最新文章

  1. Go语言之 Struct Tag
  2. 时光不老,我们不散!
  3. 简单有效!在CV/NLP/DL领域中,有哪些修改一行代码或者几行代码提升性能的算法?...
  4. PHP代码审计中你不知道的牛叉技术点
  5. 高速缓冲存储器(Cache)
  6. 【Android】修改Android 模拟器IMEI
  7. linux Centos下mysql安装
  8. Java中类的创建及类与对象的关系
  9. 数据结构 统计二叉树中度为0,1和2的结点个数
  10. oracle 触发器 实例
  11. 手机图形计算器matlab,Mathlab图形计算器下载
  12. 仿9GAG制作过程(五)
  13. 转载:全志问题解决方法
  14. Vue实现页面导航实战
  15. Android DoraemonKit 教程和简介
  16. Email邮件发送设置 工具开发整理(网易邮箱、Mailgun为例) 上篇
  17. 【OTDR曲线工具箱】03 创建sor文件
  18. HTML应用开发基础篇 - MUI 框架(三)MUI 布局
  19. 手把手教你获得电信公网ipv6
  20. XAMPP安装和配置(for mac)

热门文章

  1. Java网络编程小结
  2. linux 日常工作常用软件(持续更新)
  3. 嵌入式系统 - 任务
  4. 【极客大挑战 2019】BuyFlag
  5. windows查看网卡型号
  6. 阿里云OS和android的关系
  7. 【无标题】归生气啦我想你了老婆不行
  8. 如何进行测试优先级划分
  9. Linux面试题及答案,适合毕业生和小白,适合查缺补漏
  10. 网络工程师的就业前景如何?