资源描述
JAVA五子棋课程设计
23
2020年4月19日
文档仅供参考
— 第一学期
《Java程序设计》课程大作业
题目: 五子棋
专业: 计算机
班级: 09计算机2班
学号:
姓名: 张翔
教师: 杨树林
日期: 12月 22 日
项目
内容
单项分值
总分
选题
1.题目明确,系统功能较集中
4
8
2.题目难度适宜,有一定的综合性
4
功能实现
3.功能完整,能够正确运行
6
24
4.模块划分合理,程序结构清晰
6
5.界面设计合理、易用、协调
6
6.设计与实现程序
6
规范性及文档
7.代码规范性及注释
5
10
8.文档内容齐全,格式规范
5
总体效果
9.完成总体质量
6
12
10.软件功能及技术水平
6
答辩
11.讲解清楚明了,功能演示流畅
6
6
评语
总分
题目:五子棋
作者:张翔
一. 引言
五子棋游戏是常见的经典游戏,在19*19的棋盘方格上进行对弈,由于时间与基础知识的掌握程度限制,现初步完成简易五子棋的实现。本程序完全由JAVA语言编写而成,单击“开始游戏按钮”将弹出确认对话框,当点击对话框上的“确认”按钮,游戏正式开始;“认输”按钮表示当对弈双方有一方认输时,结束比赛而且输出结果;“关于”按钮的功能能够由制作者自己添加,主要表示游戏的版本等级;“退出”按钮单击时推出对弈比赛。
二. 系统概述
本程序分为两类 ChessBoardFrame类和ChessBoardPanel类
游戏开始弹出对话框显示游戏开始 途中如果某一方认输 便可点击 认输按钮 之后显示黑棋/白棋认输 白棋/黑棋获胜 点击退出按钮 即可退出整个程序
四. 系统功能结构设计
x >= 10 && x <= 370 && y >= 50 && y <= 410
开始游戏
x = e.getX();
y = e.getY()
arr [][] = new int[19][19];
boolean start;
chess = 1
确认
i = (x - 10) / 20
j = (y - 50) / 20
(x - 10) % 20 > 10
(y - 50) % 20 > 10
i = i + 1;
j = j + 1;
arr[i][j] == 0;
arr[i][j]= chess;
游戏结束
自定义类说明
类名:ChessBoardFrame
作用:显示五子棋游戏的主界面在整个屏幕中的位置与大小
继承的父类:JFrame
实现接口:无
public class ChessBoardFrame extends JFrame
{
}
//自定义一个继承于Jframe的类用于获取五子棋背景图的大小,在整个屏幕上的显示位置
类名:ChessBoardPanel
作用:实现五子棋的各个功能,经过画直线的成员函数画出棋盘、经过判断函数对鼠标的判断以保证正确落子、在判断函数中还包括了对输与赢的判断、加上清屏函数、每次重新开始时进行清屏。在此类中主要使用了JAVA本身所具有的一些功能,如:鼠标适配器、鼠标单击时间的捕捉、窗口重绘、颜色填充等功能。
继承的父类:JPanel
实现接口:无
public class ChessBoardPanel extends JPanel
{
}
//完成五子棋的主要功能
五. 主要界面
六. 使用说明
点击开始游戏 便可在棋盘进行游戏 如其中一方获胜 游戏会自动弹出结果 若想继续游戏 便可再次点击开始游戏 如退出游戏 点击“退出” 再选定“是”便可退出游戏 途中若有一方认输 点击认输按钮即可
附件(程序清单)
ChessBoardFrame类
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class ChessBoardFrame extends JFrame {
public ChessBoardFrame() {
// 设置标题
this.setTitle("五子棋");
int width = 500;
int height = 456;
// 窗口起点坐标
Toolkit kit = Toolkit.getDefaultToolkit();
Dimension dimension = kit.getScreenSize();
double screenWidth = dimension.getWidth();
double screenHeight = dimension.getHeight();
int x = (int) (screenWidth - width) / 2;
int y = (int) (screenHeight - height) / 2;
// 设置窗口大小和位置
this.setBounds(x, y, width, height);
// 设置窗口大小不可改变
this.setResizable(false);
// 设置默认关闭选项
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 将面板放于窗口中
setBackground(Color.pink);
this.add(new ChessBoardPanel());
this.setVisible(true);
}
public static void main(String[] args) {
new ChessBoardFrame();
}
}
ChessBoardPanel类
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class ChessBoardPanel extends JPanel {
// 保存棋子,1黑棋,-1白棋,0没有棋
int[][] arr = new int[19][19];
// 是否开始游戏
boolean start;
// 棋子
int chess = 1;
public ChessBoardPanel() {
this.addMouseListener(ma);
this.addMouseMotionListener(mma);
}
MouseMotionAdapter mma = new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if ((x >= 400 && x <= 470 && y >= 50 && y <= 80)
|| (x >= 400 && x <= 470 && y >= 250 && y <= 280)
|| (x >= 400 && x <= 470 && y >= 300 && y <= 330)
|| (x >= 400 && x <= 470 && y >= 350 && y <= 380)) {
setCursor(new Cursor(Cursor.HAND_CURSOR));
} else {
setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
}
}
};
// 棋盘:10,50;370,410
// 开始游戏:400,50;470,80
// 认输:400,250;470,280
// 关于:400,300;470,330
// 退出:400,350;470,380
MouseAdapter ma = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
int x = e.getX();
int y = e.getY();
if (start == true) {
if (x >= 10 && x <= 370 && y >= 50 && y <= 410) {
int i = (x - 10) / 20;
int j = (y - 50) / 20;
if ((x - 10) % 20 > 10) {
i = i + 1;
}
if ((y - 50) % 20 > 10) {
j = j + 1;
}
if (arr[i][j] == 0) {
arr[i][j] = chess;
}
// 判断输赢
if (isWin(chess) == true) {
if (chess == 1) {
JOptionPane.showMessageDialog(null, "黑棋获胜");
} else {
JOptionPane.showMessageDialog(null, "白棋获胜");
}
start = false;
}
// 改棋子颜色
chess = chess * (-1);
}
}
// 开始游戏
if (x >= 400 && x <= 470 && y >= 50 && y <= 80) {
// 清盘
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
arr[i][j] = 0;
}
}
start = true;
JOptionPane.showMessageDialog(null, "游戏开始!");
}
// 认输
if (x >= 400 && x <= 470 && y >= 250 && y <= 280) {
int option = JOptionPane.showConfirmDialog(null, "确定要认输吗?",
"确认框", JOptionPane.YES_NO_OPTION);
if (option == 0) {
if (chess == 1) {
JOptionPane.showMessageDialog(null, "黑棋认输,白棋胜");
} else {
JOptionPane.showMessageDialog(null, "白棋认输,黑棋胜");
}
start = false;
}
}
// 关于
if (x >= 400 && x <= 470 && y >= 300 && y <= 330) {
JOptionPane.showMessageDialog(null, "JAVA简易五子棋程序");
}
// 退出
if (x >= 400 && x <= 470 && y >= 350 && y <= 380) {
int option = JOptionPane.showConfirmDialog(null, "确定要退出吗?",
"对话框", JOptionPane.YES_NO_OPTION);
if (option == 0) {
// 退出
System.exit(0);
}
}
}
};
@Override
public void paint(Graphics g) {
super.paint(g);
//画游戏开始外框
g.drawLine(400, 50, 470, 50);
g.drawLine(400, 80, 470, 80);
g.drawLine(400, 50, 400, 80);
g.drawLine(470, 50, 470, 80);
//画认输外框
g.drawLine(400, 250, 470, 250);
g.drawLine(400, 280, 470, 280);
g.drawLine(400, 250, 400, 280);
g.drawLine(470, 250, 470, 280);
//画关于外框
g.drawLine(400, 300, 470, 300);
g.drawLine(400, 330, 470, 330);
g.drawLine(400, 300, 400, 330);
g.drawLine(470, 300, 470, 330);
//画退出外框
g.drawLine(400, 350, 470, 350);
g.drawLine(400, 380, 470, 380);
g.drawLine(400, 350, 400, 380);
g.drawLine(470, 350, 470, 380);
//鼠标事件框内文字
g.drawString("游戏开始", 410, 70);
g.drawString("认输", 420, 270);
g.drawString("关于", 420, 320);
g.drawString("退出", 420, 370);
// 绘制棋盘
// 横向
for (int i = 0; i < 19; i++) {
g.drawLine(10, 50 + i * 20, 370, 50 + i * 20);
}
// 纵向
for (int i = 0; i < 19; i++) {
g.drawLine(10 + i * 20, 50, 10 + i * 20, 410);
}
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
if (arr[i][j] != 0) {
if (arr[i][j] == 1) {
g.setColor(Color.BLACK);
g.fillOval(3 + i * 20, 43 + j * 20, 14, 14);
g.drawOval(3 + i * 20, 43 + j * 20, 14, 14);
} else {
g.setColor(Color.WHITE);
g.fillOval(3 + i * 20, 43 + j * 20, 14, 14);
g.setColor(Color.BLACK);
g.drawOval(3 + i * 20, 43 + j * 20, 14, 14);
}
}
}
}
// 让窗口重绘
this.repaint();
}
// 判断输赢
// 横向
public boolean isH(int chess) {
for (int i = 0; i < 19; i++) {
for (int j = 2; j < 17; j++) {
if (arr[i][j - 2] == chess && arr[i][j - 1] == chess
&& arr[i][j] == chess && arr[i][j + 1] == chess
&& arr[i][j + 2] == chess) {
return true;
}
}
}
return false;
}
// 纵向
public boolean isV(int chess) {
for (int i = 2; i < 17; i++) {
for (int j = 0; j < 19; j++) {
if (arr[i - 2][j] == chess && arr[i - 1][j] == chess
&& arr[i][j] == chess && arr[i + 1][j] == chess
&& arr[i + 2][j] == chess) {
return true;
}
}
}
return false;
}
// 东南
public boolean isEastSouth(int chess) {
for (int i = 2; i < 17; i++) {
for (int j = 2; j < 17; j++) {
if (arr[i - 2][j - 2] == chess && arr[i - 1][j - 1] == chess
&& arr[i][j] == chess && arr[i + 1][j + 1] == chess
&& arr[i + 2][j + 2] == chess) {
return true;
}
}
}
return false;
}
// 东北
public boolean isEastNorth(int chess) {
for (int i = 2; i < 17; i++) {
for (int j = 2; j < 17; j++) {
if (arr[i - 2][j + 2] == chess && arr[i - 1][j + 1] == chess
&& arr[i][j] == chess && arr[i + 1][j - 1] == chess
&& arr[i + 2][j - 2] == chess) {
return true;
}
}
}
return false;
}
public boolean isWin(int chess) {
if ((isH(chess) == true) || (isV(chess) == true)
|| (isEastSouth(chess) == true) || (isEastNorth(chess) == true)) {
return true;
}
return false;
}
}
展开阅读全文