第一次写博客,排版啥的都比较乱,大家不要嫌弃啊。
所谓暴力开发,其实是啥也不会,硬怼哈哈哈。只是刚学会一点JAVA编程,参考网络资源写了个联机版五子棋(支持单机),来这里记录一下学习过程,而且我也是靠别人的分享才能写出来,所以本着互相帮助的原则,分享给大家,抛砖引玉,共同进步。
作为一个半路出家,正在学习道路上的渣渣,摸索着写了这样一个乱乱的五子棋,很多地方都不正规,比如因为没有系统学过GUI,对话框都用的JOptionPane组件,模式选择对话框也放在main方法里,算是偷懒吧。。
正如标题里写的“一个类一个main”,写的时候为了快速且方便,都放在一个类里了,因此大家想要测试的话,直接整个复制就行了,没啥黑科技,JDK自带的包就能运行。
因为个人的恶趣味,本五子棋起名“老铁互怼五子棋”,当然各位可以自己随意修改。
转载也请随意,标明出处就行了(如果感觉有用,点个赞就是最好的支持啦)。
游戏打开后是这个界面,直接选择游戏模式,不能半途选别的模式,如果要更换,需要重启游戏(不然老出线程异常,所以直接砍掉这个功能哈哈哈。。。)。
选择“是”则为联机版,“否”或关闭对话框为单机版。
联机版需要输入对方的主机名或IP(局域网)。
没有集成GUI,所以主机名和端口号都需要分别输入(偷个懒)。
这里输入本机的端口号。
输入对方端口号,双方端口号需要互相对应。
以上步骤都没错且网络没问题,则连接成功,点击确定可以开始游戏,先落子的为黑棋。
说明一下,如果输入的主机名或地址为本机,且输入的端口号一致,则为单机模式(预防我预设的9653端口号被占,这种方式可以自己设置端口号)。
因为使用了线程,可以本机打开两个游戏界面,联机模式下可以左右互搏(狗头),也是实现单机模式的原理(好像也是开发中线程老是占用的罪魁祸首,难受)。
如果一开始选择了“否”或关闭对话框,则为单机模式,显示下图所示对话框,点击确定开始游戏。
游戏界面如下,刚落下的棋子有外框显示。
代码如下(注释可能有点啰嗦。。):
package netWuZiQiDemo;
//打开游戏选择"是"则为联机模式,选择"否"或关闭对话框则为单机模式,默认端口号9653(不与常用端口号冲突)
//本版本联机需要输入对方主机名或IP地址,并且需要双方端口号对应相反
//本版本联机模式,双方轮流执黑
//如果主机名或IP为自己主机(或没有输入),则转为单机模式,此时需两个端口号一致
//为了解决线程异常问题(水平有限...),特推出此魔改版,打开游戏必须选择其中一种模式(联机或单机),要想更换,则要关闭游戏重新打开
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.UnknownHostException;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
/**
* 老铁互怼五子棋1.0
* @author Arno-Woke
*
*/
public class NetLTWZQDemo extends JPanel implements MouseListener, Runnable {
int x;// 落子处棋盘坐标
int y;
int[][] chess = new int[12][12];// 棋盘大小为12x12
int ex;// 传送鼠标点击坐标
int ey;
boolean me = true;// 初始化为己方先落黑子
boolean one = true;// 控制联机双方每次只能一个人下子
static boolean start = false;// 默认打开游戏不能下子,需先选择游戏模式
static InetAddress inetAddress;// 客户端确认服务端的IP地址
static String UsernameOrIp;// 联机对方主机名或IP地址
// 客户端和服务端端口号一致则为单机版五子棋
static int clientPort;// 设置客户端端口
static int serverPort;// 设置服务端端口
static boolean danJi;// 选择单机模式,则程序只判断一次胜负,防止对局结束后无法落子,若联机模式,则判断两次胜负
static Thread t;// 声明一个线程
private static final long serialVersionUID = 1L;//emmm 没什么用,提示要有一个就放一个吧
public static void main(String[] args) {
JFrame jFrame = new JFrame("老铁互怼五子棋");
jFrame.setBounds((Toolkit.getDefaultToolkit().getScreenSize().width - 655) / 2,
(Toolkit.getDefaultToolkit().getScreenSize().height - 675) / 2, 655, 675);// 窗口屏幕正中放置
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setResizable(false);//窗体大小固定
jFrame.setVisible(true);//窗体设置可见
NetLTWZQDemo netLTWZQDemo = new NetLTWZQDemo();
jFrame.add(netLTWZQDemo);
t = new Thread(netLTWZQDemo);
//为了方便(又懒又笨..),直接把所有内容写到一个类里,且把模式选择对话框放在main方法里
int respones = JOptionPane.showConfirmDialog(null, "老铁你愁啥,想找个人怼怼?", "生死看淡,不服就干!", JOptionPane.YES_NO_OPTION,
JOptionPane.WARNING_MESSAGE);
if (respones == JOptionPane.YES_OPTION) {
try {
UsernameOrIp = JOptionPane.showInputDialog(null, "输入丫主机名或IP", "记小本本上每天看两遍", JOptionPane.WARNING_MESSAGE)
.trim();
clientPort = Integer.parseInt(JOptionPane
.showInputDialog(null, "老铁从几号门出发?", "门牌号:1024~65535", JOptionPane.WARNING_MESSAGE)
.trim());
serverPort = Integer.parseInt(JOptionPane
.showInputDialog(null, "对面在几号门?", "门牌号:1024~65535", JOptionPane.WARNING_MESSAGE)
.trim());
} catch (Exception e) {
JOptionPane.showMessageDialog(null, "输错了,老铁从头再来吧!", "怜悯的眼神看着你", JOptionPane.ERR