初学多线程,求教(九格子游戏)

东门吹雪 东门吹雪 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区


/*九格子游戏。请编写多线程游戏,设计一个3*3的格子(每个格子对应一个按钮)。
* 每个格子上对应一个线程,格子上文字只能是A、X或H,而且刚好只有一个格子上是H。
* 其中,H表示人在该格子上,A表示当前的格子是安全的,X表示不安全。每个格子如果不是文字H,
* 则每过一段时间就切换其上的文字A与X。只能单击H所在的格子的上下左右按钮。如果单击的格子当时的文字是A,
* 则单击的格子的文字变成H,而H原来所在格子的文字变为A(然后进行A与X的文字切换)。如果单击的格子当时是
* 文字X,则gameover,如果文字H在每个格子上都出现过,则Pass。*/

/*題目要求是每个按钮对应一个线程,我只用了一个线程,就当着和main方法是多线程吧。
* 现在的问题是程序刚开始运行正常,过一段时间(可能需要3~4分钟)会抛出数组越界和空指针的异常,
* 我想可能是对按钮的处理出现的问题,由于我刚学一个月,周围也没人交流,所以望各位大虾大牛不吝赐教啊,
* 占用您宝贵的时间感到万分抱歉,THX*/

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.LinkedList;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;

class J_NineGrid extends JFrame
{
static JButton [][] b = {{new JButton("1"), new JButton("2"), new JButton("3")},
{new JButton("4"), new JButton("5"), new JButton("6")},
{new JButton("7"), new JButton("8"), new JButton("9")}};

int [][] flag= new int[3][3];
Container c = getContentPane();

public J_NineGrid()
{
super("NineGridGame");

c.setLayout(new FlowLayout());

int [] list = {1, 0, 1, 0, 1, 0, 1, 0, 2};
int [] rList = getList(list); // 随机序列,用于初始化面板
String bText;

for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
if (rList[i*3+j] == 1)
bText = "A";
else if (rList[i*3+j] == 0)
bText = "X";
else
bText = "H";

b[i][j].addActionListener(new ActionListener() // 响应按钮事件
{
int cx , cy; // 当前按下按钮的坐标
int bx , by; // H按钮的坐标
boolean tag;

public void actionPerformed(ActionEvent e)
{
JButton cButton = (JButton)e.getSource();
cx = Integer.parseInt(cButton.getName())/3;
cy = Integer.parseInt(cButton.getName())%3;

for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
if (b[i][j].getText() == "H")
{
bx = i;
by = j;
flag[i][j] = 1;
break;
}
}

if (cButton.getText() != "H")
{
if (Math.abs(bx-cx)+Math.abs(by-cy) == 1) // 判断是否是H按钮的上下左右按钮
{
if (cButton.getText() == "X")
System.out.println("Fail");
else if (cButton.getText() == "A")
{
cButton.setText("H");
b[bx][by].setText("A");
flag[cx][cy] = 1;
}
}
}

tag = true;
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
if (flag[i][j] == 0)
tag = false;
}
if (tag)
System.out.println("Pass(@_@)");
}
});

b[i][j].setText(bText); // set button text
b[i][j].setName(""+(i*3+j)); // set button name
c.add(b[i][j]);
}
}

public void ChangeName()
{
String bText = "";
for (int i=0; i<3; i++)
for (int j=0; j<3; j++)
{
if(b[i][j].getText() == "A")
{
bText = "X";
}
else if(b[i][j].getText() == "X")
{
bText = "A";
}
else if(b[i][j].getText() == "H")
{
bText = "H";
}

b[i][j].setText(bText); // set button text
c.add(b[i][j]);
}
}

public int[] getList(int[] list) // 产生随机序列
{
int count = list.length;
int [] resultList = new int[count];
LinkedList<Integer> temp = new LinkedList<Integer>();
for (int i=0; i<count; i++)
{
temp.add((Integer)list[i]);
}

Random rand = new Random();
for (int i=0; i<count; i++)
{
int num = rand.nextInt(count - i);
resultList[i] = (Integer)temp.get(num);
temp.remove(num);
}

return resultList;
}
}

class T_ChangeName extends Thread
{
J_NineGrid game2;

public T_ChangeName(J_NineGrid game)
{
game2 = game;
}

public void run()
{
System.out.println("Begin");
for ( ; true; )
{
game2.ChangeName();
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}
}

public class J_NineGridGame
{
public static void main(String args[])
{
J_NineGrid game = new J_NineGrid();
game.setLocationRelativeTo(null);
game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
game.setSize(150, 150);
game.setVisible(true);

T_ChangeName thread = new T_ChangeName(game);
thread.start();
}
}




---------------------------------------------------
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: No such child: 8
at java.awt.Container.getComponent(Container.java:294)
at javax.swing.JComponent.rectangleIsObscured(JComponent.java:4339)
at javax.swing.JComponent.paint(JComponent.java:1027)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5124)
at javax.swing.BufferStrategyPaintManager.paint(BufferStrategyPaintManager.java:278)
at javax.swing.RepaintManager.paint(RepaintManager.java:1224)
at javax.swing.JComponent._paintImmediately(JComponent.java:5072)
at javax.swing.JComponent.paintImmediately(JComponent.java:4882)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:785)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:713)
at javax.swing.RepaintManager.seqPaintDirtyRegions(RepaintManager.java:693)
at javax.swing.SystemEventQueueUtilities$ComponentWorkRequest.run(SystemEventQueueUtilities.java:125)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:641)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:611)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
...全文

相关推荐

九格子(java多线程)

在九格子游戏中,多线程可能被用来实现游戏的实时更新,比如玩家的动作即时反映到游戏界面,或者后台计算不影响用户界面的流畅性。

rxd237

拆解Java吃豆子游戏源码:核心语法、游戏循环与AI设计实战

在Java游戏开发中,源码阅读是理解面向对象设计与多线程编程的高效路径。一个看似简单的吃豆子小游戏,实际涵盖了二维数组地图建模、碰撞检测、类职责划分、状态机控制以及Swing双缓冲机制等核心知识点。通过分析游戏主循环中更新与绘制的分离原则,可以掌握避免界面卡顿的工程技巧;而幽灵AI的追踪、散布与惊恐模式切换,则能帮助你深入理解枚举状态在复杂逻辑中的应用。从简单的边界取模运算到多线程可见性处理,这些基础原理不仅适用于游戏制作,也广泛应用于内存管理、实时系统优化等场景。本文以一份Java吃豆子游戏源码为案例,逐

weixin_34268843

Java简易五子棋游戏设计与实现

五子棋是一种两人对弈的纯策略型棋类游戏,要求双方在棋盘上进行对抗,争取率先在横线、竖线、斜线上形成连续的五个棋子。实现五子棋规则时,需要关注几个关键点:棋盘的初始化、落子的合法性检查、判断胜负以及可能存在的禁手规则。棋盘初始化通常使用二维数组来表示,数组中的每个元素代表棋盘上的一点,可初始化为空或用特定的值表示特定玩家的棋子。# 初始化一个空棋盘,以15x15为例合法性检查是判断玩家的落子是否符合规则。在五子棋中,每个新落子点不能和已有的棋子位置重复,这是实现上的基础要求。

苏苏苏苏大霖

JAVA格子变色游戏

**并发与多线程**:如果游戏需要支持多个用户同时在线或者有复杂的动画效果,可能需要考虑并发和多线程。例如,一个线程处理用户输入,另一个线程负责渲染更新,确保界面流畅。7.

tjpangpang52

9格子游戏,基于VB的小游戏代码

【VB源码与游戏编程:探索9格子游戏】在信息技术领域,Visual Basic(VB)是一种流行的编程语言,尤其在初学者和教育环境中被广泛使用。

weixin_38591011
评论 6
收藏 已收藏
分享
返回顶部
东门吹雪
Java SE 62,620 成员 307,251 内容