Java课程设计-简单五子棋

这篇具有很好参考价值的文章主要介绍了Java课程设计-简单五子棋。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

五子棋介绍

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

游戏玩法

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

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

系统需求分析

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

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

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

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

系统的设计与实现

项目工程结构

五子棋java课程设计,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文章来源地址https://www.toymoban.com/news/detail-772568.html

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


}

到了这里,关于Java课程设计-简单五子棋的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity 简单联网游戏(双人五子棋)开发(二)

    前言:之前我们尝试开发了一个两个比拼分数的不像游戏的超简单的弱数据联网游戏,主要是想让一些没开发过联网游戏的人了解一下最基础的流程;不过有人仍然有人私信我表示看不懂,所以这次我们再开发一个类似的游戏,为了这个项目更像是一个游戏,而不是不像游戏

    2024年02月08日
    浏览(40)
  • 基于Android Studio的五子棋游戏的简单设计

    【摘要】: 随着时代的发展,现代科技的飞跃,我们的日常娱乐生活变得丰富多彩。而手机游戏被业内人士称为继通信之后的有一座“金矿”,手机休闲娱乐应用将成为PC休闲娱乐之后又一重要业务增长点。本文针对该趋势,从用户需求出发,基于Android对五子棋游戏进行设计

    2024年02月11日
    浏览(39)
  • 基于FPGA(basys3)的双人对战人机对战五子棋(vivado)课程设计项目

    目录 主界面显示与选择模式 双人对战 人机对战 胜利界面显示 部分源码 VGA显示器显示图片,显示图片利用Block Memory Generator将图片像素点储存在RAM里面。 效果图:(防止侵权打了马赛克)  通过开发板上的按键进行模式选择,模式确定 双人对战就是采用简单的存数组的办法

    2024年01月18日
    浏览(54)
  • 用Java写一个简易五子棋游戏

     一. 程序基本思路: 1.写窗口、棋盘面板、控制面板; 2.绘制棋盘; 3.绘制棋子; 4.添加组件功能; 5.判断输赢; 6.悔棋; 7.复盘。 二.实际操作 1.创建窗口、添加面板 效果图:  2.绘制棋盘   为了棋盘线在窗体刷新后仍能保存,我们直接重写chesspanel的paint方法,将棋盘绘

    2024年02月06日
    浏览(41)
  • Java五子棋详细步骤及完整代码

    1. 用户输入行和列 2. 将输入设为对应棋子 1. 横向判断 2. 竖向判断 3. 左斜判断 4.右斜判断 1.横向胜利 2.竖向胜利 3. 左斜判断 4. 右斜判断

    2024年02月02日
    浏览(43)
  • Java实现的五子棋游戏 ~java.awt&java.swing

    作业要求: (1)课题代号: 2 (2)课题名称: 2D 游戏设计 (3)课题要求:设计一种二维游戏(如数独,扫雷,飞机大战,贪食蛇,五子棋等),完成界面设计和必要的游戏功能 以下主要实现的功能有: 一、下棋功能,在棋盘的交点处落子。 二、简单人机对战功能。 1.实现

    2024年02月09日
    浏览(42)
  • Java实现五子棋小游戏(附源码)

      铜9铁10已经结束了,但还是有很多Java程序员没有找到工作或者成功跳槽,跳槽成功的也只是从一个坑中,跳入另一个坑中…… ​ 在LZ看来,真正有意义的就业与跳槽,是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。这件事不容易,但也没有想象的遥不可

    2024年02月08日
    浏览(55)
  • 五子棋小游戏 java版(代码+详细注释)

    游戏展示         这周闲来无事,再来写个五子棋小游戏。基本功能都实现了,包括人人对战、人机对战。界面布局和功能都写的还行,没做到很优秀,但也不算差。如有需要,做个java初学者的课程设计或者自己写着玩玩也都是不错的(非常简单,小白照着就能写出来)。

    2024年02月07日
    浏览(47)
  • 纯java编写的联机五子棋项目(附带开源链接)

    这是用java写的一个联机五子棋项目,该项目是我大二上期的时候写的,那时候学完了java基础,想要把学的技术都综合使用一下,于是就在国庆节花了3天还是几天写了这个项目。 这个项目分为服务端和客户端,它们是基于Socket进行通信的,简单编写了一下java的gui界面。 主界

    2023年04月09日
    浏览(46)
  • python五子棋代码最简单的,python五子棋代码能复制

    本篇文章给大家谈谈python五子棋代码红方蓝方,以及python五子棋代码最简单的,希望对各位有所帮助,不要忘了收藏本站喔。 开端 画棋盘 首先肯定是要画出棋盘来,用  pygame  画出一个 19 × 19 或 15 × 15 的棋盘并不是什么难事,这在之前的文章中已经多次用到,就不赘述了

    2024年03月13日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包