Java语言教程:打造你的第一款五子棋游戏 JAVA学习攻略心得总结

news2024/11/19 12:37:04

目录

Java语言教程:打造你的第一款五子棋游戏

游戏简介

游戏代码

自学Java攻略及功能

1. Java基础知识

2. 面向对象编程(OOP)

Java简介


游戏简介

五子棋,又称连珠,是一种两人对弈的棋类游戏。五子棋的规则简单易懂,变化多端,非常有趣味性。棋盘为15×15或19×19的方形格子,双方轮流在棋盘上放置黑白棋子,先形成连续五个同色棋子的一方获胜。通过编写五子棋小游戏,你可以进一步锻炼Java图形编程技巧和编写程序的能力。

游戏代码

以下是一个基于Java的GUI图形界面实现的双人版五子棋小游戏代码示例。该程序拥有简洁美观的图形化界面,界面主要由棋盘、标题和游戏操作的按钮三部分组成。

java复制代码

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.io.File;

import java.io.IOException;

import javax.imageio.ImageIO;

import java.util.Arrays;

public class GomokuGame extends JFrame {

private static final int BOARD_SIZE = 19;

private static final int CELL_SIZE = 40;

private static final int BOARD_OFFSET = 50;

private static final int MARGIN = 20;

private static final int BUTTON_HEIGHT = 40;

private static final int BUTTON_WIDTH = 100;

private char[][] board = new char[BOARD_SIZE][BOARD_SIZE];

private boolean isBlackTurn = true;

private Image bg;

private JLabel statusLabel;

public GomokuGame() {

this.setTitle("欢乐五子棋");

this.setSize(800, 600);

this.setLocationRelativeTo(null);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setResizable(false);

try {

bg = ImageIO.read(new File("bg.png"));

} catch (IOException e) {

e.printStackTrace();

}

this.setLayout(new BorderLayout());

JPanel boardPanel = new JPanel() {

@Override 

protected void paintComponent(Graphics g) {

super.paintComponent(g);

drawBoard(g);

}

};

boardPanel.addMouseListener(new MouseAdapter() {

@Override 

public void mouseClicked(MouseEvent e) {

handleClick(e);

}

});

statusLabel = new JLabel("黑子先手", SwingConstants.CENTER);

statusLabel.setFont(new Font("Serif", Font.BOLD, 16));

JPanel buttonPanel = new JPanel();

buttonPanel.setLayout(new GridLayout(1, 7, MARGIN, MARGIN));

JButton startButton = new JButton("开始游戏");

JButton helpButton = new JButton("游戏说明");

JButton settingsButton = new JButton("游戏设置");

JButton giveUpButton = new JButton("认输");

JButton regretButton = new JButton("悔棋");

JButton aboutButton = new JButton("关于");

JButton exitButton = new JButton("退出");

startButton.addActionListener(new ActionListener() {

@Override 

public void actionPerformed(ActionEvent e) {

resetGame();

}

});

// Add more button listeners if needed

buttonPanel.add(startButton);

buttonPanel.add(helpButton);

buttonPanel.add(settingsButton);

buttonPanel.add(giveUpButton);

buttonPanel.add(regretButton);

buttonPanel.add(aboutButton);

buttonPanel.add(exitButton);

this.add(boardPanel, BorderLayout.CENTER);

this.add(statusLabel, BorderLayout.NORTH);

this.add(buttonPanel, BorderLayout.EAST);

this.setVisible(true);

}

private void drawBoard(Graphics g) {

g.drawImage(bg, 0, 0, this.getWidth(), this.getHeight(), null);

g.setColor(Color.BLACK);

for (int i = 0; i < BOARD_SIZE; i++) {

g.drawLine(BOARD_OFFSET, BOARD_OFFSET + i * CELL_SIZE, BOARD_OFFSET + (BOARD_SIZE - 1) * CELL_SIZE, BOARD_OFFSET + i * CELL_SIZE);

g.drawLine(BOARD_OFFSET + i * CELL_SIZE, BOARD_OFFSET, BOARD_OFFSET + i * CELL_SIZE, BOARD_OFFSET + (BOARD_SIZE - 1) * CELL_SIZE);

}

for (int i = 0; i < BOARD_SIZE; i++) {

for (int j = 0; j < BOARD_SIZE; j++) {

if (board[i][j] != ' ') {

g.setColor(isBlackTurn ? Color.BLACK : Color.WHITE);

g.fillOval(BOARD_OFFSET + j * CELL_SIZE - CELL_SIZE / 2, BOARD_OFFSET + i * CELL_SIZE - CELL_SIZE / 2, CELL_SIZE, CELL_SIZE);

g.setColor(Color.BLACK);

g.drawOval(BOARD_OFFSET + j * CELL_SIZE - CELL_SIZE / 2, BOARD_OFFSET + i * CELL_SIZE - CELL_SIZE / 2, CELL_SIZE, CELL_SIZE);

}

}

}

}

private void handleClick(MouseEvent e) {

int x = (e.getX() - BOARD_OFFSET) / CELL_SIZE;

int y = (e.getY() - BOARD_OFFSET) / CELL_SIZE;

if (x >= 0 && x < BOARD_SIZE && y >= 0 && y < BOARD_SIZE && board[y][x] == ' ') {

board[y][x] = isBlackTurn ? '●' : '○';

if (checkWin(y, x)) {

statusLabel.setText(isBlackTurn ? "黑子获胜" : "白子获胜");

JOptionPane.showMessageDialog(this, isBlackTurn ? "黑子获胜" : "白子获胜");

resetGame();

} else {

isBlackTurn = !isBlackTurn;

statusLabel.setText(isBlackTurn ? "黑子先手" : "白子先手");

}

this.repaint();

}

}

private boolean checkWin(int row, int col) {

char current = board[row][col];

return (checkDirection(row, col, 1, 0, current) >= 5 || // Horizontal

checkDirection(row, col, 0, 1, current) >= 5 || // Vertical

checkDirection(row, col, 1, 1, current) >= 5 || // Diagonal \

checkDirection(row, col, 1, -1, current) >= 5); // Diagonal /

}

private int checkDirection(int row, int col, int rowDir, int colDir, char current) {

int count = 1;

for (int i = 1; i < 5; i++) {

int newRow = row + i * rowDir;

int newCol = col + i * colDir;

if (newRow >= 0 && newRow < BOARD_SIZE && newCol >= 0 && newCol < BOARD_SIZE && board[newRow][newCol] == current) {

count++;

} else {

break;

}

}

for (int i = 1; i < 5; i++) {

int newRow = row - i * rowDir;

int newCol = col - i * colDir;

if (newRow >= 0 && newRow < BOARD_SIZE && newCol >= 0 && newCol < BOARD_SIZE && board[newRow][newCol] == current) {

count++;

} else {

break;

}

}

return count;

}

private void resetGame() {

Arrays.fill(board, ' ');

isBlackTurn = true;

statusLabel.setText("黑子先手");

this.repaint();

}

public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {

@Override 

public void run() {

new GomokuGame();

}

});

}

}

自学Java攻略及功能
1. Java基础知识

Java是一种广泛使用的面向对象的编程语言,具有跨平台性、封装性、继承性和多态性等特点。Java程序通常由类、对象、方法和属性等组成。你需要掌握Java的基本语法,包括变量和数据类型、运算符、控制结构(条件语句、循环语句)、数组等。

2. 面向对象编程(OOP)

面向对象编程是一种编程范式,它通过使用“对象”来设计软件。在Java中,面向对象编程(OOP)的概念非常核心,主要包括以下几个关键方面:

  1. 类(Class)与对象(Object)
    1. 类是创建对象的蓝图或模板,它定义了对象的属性和行为。
    2. 对象是类的实例,每个对象都是其类的一个具体实现,具有自己的属性和状态。
  2. 封装(Encapsulation)
    1. 封装是将数据和操作数据的方法绑定在一起,形成一个不可分割的单位。通过访问修饰符(如private、protected、public)控制对对象属性和方法的访问,以保护数据的完整性。
  3. 继承(Inheritance)
    1. 继承允许一个类(子类或派生类)继承另一个类(父类或基类)的属性和方法。这是实现代码重用和扩展性的重要手段。
    2. 通过继承,子类可以继承父类的所有非私有属性和方法,并可以添加新的属性或覆盖(重写)父类的方法。
  4. 多态(Polymorphism)
    1. 多态允许一个接口或父类引用指向子类对象。这意味着相同的操作或方法调用会根据实际对象的类型表现出不同的行为。
    2. Java中的多态主要通过方法重写(Override)和接口实现来实现。
  5. 抽象(Abstraction)
    1. 抽象是将类的具体实现与类的接口分离的过程。通过抽象类和方法,可以定义类的行为而不提供具体的实现细节。
    2. 抽象类不能被实例化,但可以包含抽象方法(没有实现的方法),这些方法必须由子类提供实现。
  6. 接口(Interface)
    1. 接口是Java中另一种实现多态的方式,它完全是一种抽象类型,用于指定一组方法,但不提供它们的实现。
    2. 一个类可以实现一个或多个接口,通过提供接口中所有方法的具体实现来遵循接口契约。

自学Java的进一步攻略

  • 实践项目:理论知识的学习是基础,但真正掌握Java需要通过实际的项目来锻炼。尝试开发一些小项目,如简单的计算器、学生信息管理系统等,来应用所学知识。
  • 阅读官方文档和API:Java的官方文档和API是宝贵的资源,它们提供了详细的类库说明和示例代码,有助于深入理解Java的各个方面。
  • 参与开源项目:加入开源项目不仅可以学习他人的代码风格和最佳实践,还能通过贡献代码来提升自己的编程能力。
  • 持续学习:Java是一个不断发展的语言,新的特性和库不断出现。保持对新技术和新工具的关注,持续学习是成为一名优秀Java开发者的关键。

Java简介

Java是一种面向对象的编程语言,由Sun Microsystems公司于1995年推出。它具有简单、安全、可移植等特点。

Java可以在不同的平台上运行,包括Windows、Mac OS、Linux等。它采用了字节码的形式,通过Java虚拟机(JVM)来运行程序。这种设计使得Java程序具有很好的可移植性,即可以在不同平台上运行,而不需要重新编写。

Java提供了丰富的类库和API,使得开发人员可以快速地开发出功能强大的应用程序。它支持多线程编程,允许在一个程序中同时执行多个任务,提高了程序的效率。此外,Java还有自动内存管理机制,即垃圾回收机制,可以自动释放不再使用的内存,减少了内存泄漏的可能性。

Java是一种跨平台的语言,即一次编写,到处运行。这是由于Java的字节码可以在不同平台上被解释和执行。这使得Java成为开发企业级应用程序的首选语言,因为它可以在不同的操作系统和服务器上运行。

Java也是一种广泛使用的语言,在互联网和移动应用开发中得到了广泛应用。许多著名的网站和移动应用程序都使用Java开发,如谷歌、亚马逊等。

总之,Java是一种功能强大、可移植、安全的编程语言,适用于各种类型的应用程序开发。它的广泛应用和丰富的开发资源使得学习和使用Java成为一个有前景的选择。

通过上述步骤和实践,你将能够逐步掌握Java编程的精髓,并在软件开发领域取得长足的进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2200074.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

红帽7—Mysql路由部署

MySQL Router 是一个对应用程序透明的InnoDB Cluster连接路由服务&#xff0c;提供负载均衡、应用连接故障转移和客户端路 由。 利用路由器的连接路由特性&#xff0c;用户可以编写应用程序来连接到路由器&#xff0c;并令路由器使用相应的路由策略 来处理连接&#xff0c;使其…

添加菜品到购物车

分析 数据库设计 代码开发 三个步骤&#xff1a; 判断当前商品是否已经在购物车中如果在购物车中&#xff0c;更新购物车中商品数量如果不在购物车中&#xff0c;添加到购物车 controller层 /*** 添加购物车** return*/PostMapping("/add")ApiOperation("添加购…

MediaTek携手“天玑芯世界探索官”辛芷蕾,开启科技新世界

2024年10月9日&#xff0c;MediaTek举办 2024天玑旗舰芯片新品发布会&#xff0c;正式发布旗舰 5G 智能体 AI 芯片天玑 9400。发布会上&#xff0c;MediaTek回顾了天玑品牌5周年的辉煌历程&#xff0c;展望了AI技术将推动人类进入一个充满人文关怀和情感交流的智慧科技新世界&a…

智能优化算法-引力搜索优化算法(GSA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 引力搜索优化算法 (Gravitational Search Algorithm, GSA) 是一种基于牛顿万有引力定律的元启发式优化算法&#xff0c;由Rashedi等人于2009年提出。GSA通过模拟天体之间的引力作用来搜索最优解&#xff0c;适用…

.NET周刊【9月第4期 2024-09-22】

国内文章 .NET常见的几种项目架构模式&#xff0c;你知道几种&#xff1f;&#xff08;附带使用情况投票&#xff09; https://www.cnblogs.com/Can-daydayup/p/18421685 文章介绍了软件项目的几种架构模式&#xff0c;包括三层架构、MVC、DDD、整洁架构和CQRS。这些模式通过…

算法:双指针系列(二)——对撞指针

双指针系列&#xff08;二&#xff09;——对撞指针 &#xff08;一&#xff09;盛水最多的容器&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示 二、有效的三角形个数&#xff08;一&#xff09;题目分析&#xff08;二&#xff09;代码展示 三、查找总…

Scalable TCP 如何优化长肥管道

来看一个极简的拥塞控制实现 net/ipv4/tcp_scalable.c&#xff0c;去掉注释不到 50 行代码。它的介绍在 Scalable TCP-improving performance in highspeed networks。由于太简单&#xff0c;估计没什么人会在意。 本文说一下它背后的道理。 无论 bic/cubic&#xff0c;westw…

从0开始linux(10)——进程(2)进程属性

欢迎来到博主的专栏&#xff1a;从0开始linux 博主ID&#xff1a;代码小豪 文章目录 进程与操作系统并发与并行进程的状态 linux的进程状态 进程与操作系统 进程的状态可分为3种&#xff0c;分别是新建态&#xff0c;运行态&#xff0c;终止态&#xff0c;就绪态与阻塞态。状态…

【深度学习总结】热力图-Grad-CAM使用

Grad-CAM使用 介绍 Grad-CAM&#xff0c;全称为Gradient-weighted Class Activation Mapping&#xff0c;是一种用于深度学习模型可视化的技术&#xff0c;特别是在卷积神经网络&#xff08;CNN&#xff09;中。它通过生成热力图来展示模型在做出决策时关注的区域&#xff0c…

反应香精市场报告:预计2030年全球市场规模将达到264.3亿美元

“反应香精”通常是指通过在食品或饮料加工过程中发生的物理、化学或酶反应而产生的风味剂。可以有意添加这些香料以增强最终产品的味道、香气或其他感官方面。它们通常用于食品和饮料行业&#xff0c;以保持一致性、提高适口性或创造独特的风味特征。生产工艺香料的方法有多种…

[论文阅读] DVQA: Understanding Data Visualizations via Question Answering

原文链接&#xff1a;http://arxiv.org/abs/1801.08163 启发&#xff1a;没太读懂这篇论文&#xff0c;暂时能理解的就是本文提出了一个专门针对条形图问答的数据集DVQA以及一个端到端模型SANDY&#xff0c;模型有两个版本&#xff0c;Oracle和OCR。主要解决的问题是固定词表无…

树莓派3b安装ubuntu18.04服务器系统server配置网线连接

下载ubuntu镜像网址 img镜像&#xff0c;即树莓派官方烧录器使用的镜像网址 ubuntu18.04-server&#xff1a;ARM/RaspberryPi - Ubuntu Wiki 其他版本&#xff1a;Index of /ubuntu/releases 下载后解压即可。 发现使用官方烧录器烧录配置时配置wifi无论如何都不能使用&am…

AI的历史、现状与理论基础

在本篇文章中&#xff0c;我们将深入探讨人工智能&#xff08;AI&#xff09;的起源、现状以及理论基础&#xff0c;为读者提供一个全面的理解框架。 I. 引言 人工智能&#xff08;AI&#xff09;作为一门跨学科的研究领域&#xff0c;其目标是模拟、延伸和扩展人的智能。本文…

是德(KEYSIGHT) N9040A、N9040B 信号分析仪

Keysight N9040B 的特性和规格包括&#xff1a; 功能性 3 Hz 至 8.4、13.6 或 26.5 GHz&#xff1b;使用是德科技智能混频器将频率扩展至 110 GHz&#xff0c;使用其他供应商的混频器将频率扩展至 THz10 MHz&#xff08;标准&#xff09;、25、40、255 或 510 MHz 分析带宽全…

第十八篇:一文说清楚ICMP的底层原理

作为程序员或者网络工程师&#xff0c;有时候无法访问对方主机&#xff1b;导致这个现象的有很多原因&#xff0c;那要排查具体的网络原因&#xff0c;可能会用到ping的指令。而ping的底层实现是互联⽹控制报⽂协议&#xff08;ICMP&#xff09;。 ICMP 全称是 Internet Contr…

清华系“仓颉”来袭:图形起源:用AI颠覆字体设计,推动大模型商业化落地

大模型如何落地&#xff1f;又该如何实现商业化&#xff1f;这一议题已成为今年科技领域的焦点话题。 在一个鲜为人知的字体设计赛道上&#xff0c;清华创业公司“图形起源”悄然实现了商业变现&#xff1a;他们帮助字体公司将成本降低了80%&#xff0c;生产速度提升了10倍以上…

网站优化门槛低了还是高了?

自从2015年刚接触网站时&#xff0c;从一无所知到现在无人指导&#xff0c;一直跌跌撞撞走过来&#xff0c;当年花了1500元找了广东一个网友用织梦CMS做了一个门户网站&#xff0c;记得那时一星期没下楼&#xff0c;把网站折腾的千疮百孔&#xff0c;而终逐步熟悉网站建设与搜索…

手机怎样改网络ip地址?内容详尽实用

随着网络技术的发展&#xff0c;更改手机IP地址已成为一种常见需求。本文将详细介绍如何在不同网络环境下更改手机IP地址&#xff0c;包括移动网络和WiFi网络&#xff0c;以及同时适用于两种网络的方法&#xff0c;内容详尽实用&#xff0c;干货满满。 一、适用于移动网络&…

sentinel微服务部署

一.启动nacos和redis 1.查看是否有nacos和redis docker ps -a2.启动nacos和redis docker start nacos docker start redis-6379 docker ps 二.使用openfeign项目 这里看我另一个博客OpenFeign微服务部署-CSDN博客&#xff0c;我把SpringSessiondemo复制后改为sentinel1…

钡铼技术R10工业4G路由在智能交通中的应用

随着物联网技术的迅猛发展&#xff0c;智能交通系统&#xff08;Intelligent Transportation System, ITS&#xff09;正逐渐成为现代城市交通管理的重要组成部分。智能交通系统通过集成先进的信息技术、通信技术、传感技术以及计算机处理技术&#xff0c;实现对交通信息的实时…