线程游戏1.0
一.项目总览类名作用UI创建界面添加监听器GameListener声明对象键盘监听设置攻击与移动GameThread声明对象游戏主线程负责所有单位的移动和绘制Bullet设置子弹对象Archer设置玩家对象Spear1设置敌对对象TimeThread设置子弹自动发射AdverThread设置敌对对象出现逻辑二.UI类publicclassUI{publicvoidshowUI(){JFramejfnewJFrame();jf.setSize(800,800);jf.setTitle(游戏界面);jf.setLocationRelativeTo(null);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);jf.getContentPane().setBackground(Color.WHITE);***//实际承载游戏画面的界面***JPanelgamepanelnewJPanel();gamepanel.setBackground(Color.WHITE);jf.add(gamepanel,BorderLayout.CENTER);jf.setVisible(true);***//获取画板对象上的画笔对象g******Graphicsggamepanel.getGraphics();******//将g传入GameListener构造***GameListenergameListenernewGameListener(g);jf.addMouseListener(gameListener);jf.addKeyListener(gameListener);//让gamepanel获取焦点对象gamepanel.requestFocus();jf.requestFocus();}三.BulletArcherSpear1类属性一致方法不同1.以Archer为例publicclassArcher{publicGraphicsg;publicintx,y,size;publicintspeedx,speedy;publicImageIconimg;publicArcher(Graphicsg,intx,inty){this.gg;this.xx;this.yy;this.size30;this.imgnewImageIcon(C:\\Users\\admin\\IdeaProjects\\Pro26\\src\\弓手.png);}publicvoiddraw(){g.drawImage(img.getImage(),x,y,null);move();//传入speedxspeedy}//移动逻辑publicvoidmove(){xspeedx;yspeedy;}}2.Bullet绘制逻辑publicvoiddrawbullet(Graphicsg){speedx1;xspeedx;g.drawImage(img.getImage(),x,y,null);}}3.敌对对象移动逻辑publicvoiddrawspear1(Graphicsg){speedx0;x-speedx;g.drawImage(img.getImage(),x--,y,null);}}四.GameLIstener类1.声明各类对象创建数组privateGraphicsg;publicArrayListBulletarrayListnewArrayList();publicArcherar;publicSpear1sp1;publicBulletbullet;publicGameListenergameListener;publicArrayListSpear1spear1snewArrayList();privatebooleanarstartfalse;//判断运行状态publicGameThreadgameThread;2.构造方法***//创建GameListener对象时必须传入一个Graphics画笔对象*** public GameListener(Graphics g) { //把外部传入的画笔保存到监听器内部之后在鼠标和键盘事件里就可以使用这个画笔绘制 //this代表private Graphics g this.g g; }3.键盘监听操控玩家移动和攻击publicvoidkeyPressed(KeyEvente){intkeyCodee.getKeyCode();switch(keyCode){caseKeyEvent.VK_J:System.out.println(攻击-----);//创建子弹对象设置位置让子弹出现在玩家前面bulletnewBullet(ar.x10,ar.y40);arrayList.add(bullet);break;//通过设置速度操控方向caseKeyEvent.VK_W:System.out.println(向前移动);ar.speedy-5;break;caseKeyEvent.VK_A:System.out.println(向左移动);ar.speedx-5;break;caseKeyEvent.VK_S:System.out.println(向后移动);ar.speedy5;break;caseKeyEvent.VK_D:System.out.println(向右移动);ar.speedx5;break;caseKeyEvent.VK_SPACE:System.out.println(生成单位*****);//判断是否运行若已运行则不在运行if(!arstart){//正式创建Archer对象arnewArcher(g,10,150);//创建线程对象必须传入参数调用方法GameThreadgtnewGameThread(g,ar,sp1,arrayList,spear1s,gameListener);AdverThreadatnewAdverThread(sp1,spear1s);//强制转换因为AdverThread中无start方法newThread(at).start();this.gameThreadgt;gt.start();arstarttrue;}break;caseKeyEvent.VK_Q:System.out.println(使用技能);TimeThreadttnewTimeThread(arrayList,ar);newThread(tt).start();break;caseKeyEvent.VK_R:if(gameThread!null){gameThread.paused!gameThread.paused;System.out.println(gameThread.paused?已暂停:已继续);stop();}default://其他按键不处理break;}}OverridepublicvoidkeyReleased(KeyEvente){intkeyCodee.getKeyCode();switch(keyCode){//停止逻辑防止自动前行caseKeyEvent.VK_W:System.out.println(向前移动);ar.speedy0;break;caseKeyEvent.VK_A:System.out.println(向左移动);ar.speedx0;break;caseKeyEvent.VK_S:System.out.println(向后移动);ar.speedy0;break;caseKeyEvent.VK_D:System.out.println(向右移动);ar.speedx0;break;default://其他按键不处理break;}}五.GameThread类1.声明变量publicclassGameThreadextendsThread{//成员变量只声明暂时是空引用publicGraphicsg;publicArcherar;publicSpear1sp1;publicArrayListBulletarrayList;publicArrayListSpear1spear1s;publicGameListenergameListener;//构造方法publicGameThread(Graphicsg,Archerar,Spear1sp1,ArrayListBulletarrayList,ArrayListSpear1spear1s,GameListenergameListener){***//将已存在的对象全部传入线程只传递引用地址实现数据共享***this.gg;this.arar;this.sp1sp1;this.arrayListarrayList;this.spear1sspear1s;this.gameListenergameListener;}2.run方法操控各单位的绘制publicvolatilebooleanpausedfalse;publicvoidrun(){System.out.println(Thread.currentThread().getName():线程启动...);//无限循环while(true){try{Thread.sleep(20);}catch(InterruptedExceptionex){thrownewRuntimeException(ex);}if(paused)continue;//遍历数组绘制对象for(inti0;iarrayList.size();i){BulletbulletarrayList.get(i);bullet.drawbullet(g);}for(inti0;ispear1s.size();i){Spear1spear1spear1s.get(i);spear1.drawspear1(g);}//重绘画面但会引起闪烁g.setColor(Color.WHITE);g.fillRect(0,0,1000,1000);//调用玩家绘制逻辑并实现移动ar.draw();}}}六.TimeThread1.声明变量publiclongtime;publicArcherar;publicArrayListBulletarrayList;publicTimeThread(ArrayListBulletarrayList,Archerar){this.arrayListarrayList;this.arar;this.time5;}2.run方法publicvoidrun(){while(true){try{Thread.sleep(time);}catch(InterruptedExceptione){thrownewRuntimeException(e);}//不断创建bullet对象以此实现自动发射BulletbulletnewBullet(ar.x10,ar.y40);//插入数组arrayList.add(bullet);}}}七.AdverThread1.声明变量publicclassAdverThreadimplementsRunnable{publiclongtime;publicSpear1sp1;publicArrayListSpear1spear1s;publicAdverThread(Spear1sp1,ArrayListSpear1spear1s){this.sp1sp1;this.spear1sspear1s;this.time3000;}2.run方法publicvoidrun(){***//随机数必须设置在循环外否则对象无法随机出现***RandomranewRandom(600);***//设置随机次数而非范围***intx650while(true){try{//控制出现频率此时为3秒出现一次Thread.sleep(time);}catch(InterruptedExceptione){thrownewRuntimeException(e);}intyra.nextInt(600)60;Spear1spnewSpear1(x,y);spear1s.add(sp);System.out.println(x:xy:y);}}}八.扩展1.继承与接口继承是我是一个单继承接口是我能做多实现2.标志位控制Flag Control用一个 boolean 变量作为开关控制线程循环是否执行业务逻辑本次暂停功能就是由此实现、caseKeyEvent.VK_R://判断gameThread运行状态if(gameThread!null){gameThread.paused!gameThread.paused;System.out.println(gameThread.paused?已暂停:已继续);stop();}publicvolatilebooleanpausedfalse;// 标志位while(true){if(paused)continue;// 标志位为 true 时跳过// 业务逻辑...}

相关新闻

【工程实践·升级版】四人联席研发团队2.0:从SIL项目到华为OD备考的动静结合实战

【工程实践·升级版】四人联席研发团队2.0:从SIL项目到华为OD备考的动静结合实战

一、前言两个月前,我写了一篇文章《我组建了一个“四人联席”研发团队:一个真人与三位AI的SIL项目实战》,讲述了我如何利用三位AI角色(SIL专家、项目经理、Python导师)在48小时内从零搭建ADAS仿真框架的经历。那是一次…

2026/10/4 9:59:46 阅读更多 →
企业会计档案三维安全防护体系设计与实践

企业会计档案三维安全防护体系设计与实践

1. 会计档案安全防护体系概述会计档案作为企业核心数据资产,其安全性直接关系到财务合规与商业机密保护。传统档案管理往往存在"重存储轻防护"的弊端,而现代安全体系需要构建"权限分级加密存储操作追溯"的三维防御机制。这套方案在我…

2026/10/4 3:57:19 阅读更多 →
G-Helper完整实战指南:5个技巧彻底释放华硕笔记本性能

G-Helper完整实战指南:5个技巧彻底释放华硕笔记本性能

G-Helper完整实战指南:5个技巧彻底释放华硕笔记本性能 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Ex…

2026/10/5 11:43:27 阅读更多 →

最新新闻

风光储互补微电网Simulink仿真:建模、控制与调试全流程解析

风光储互补微电网Simulink仿真:建模、控制与调试全流程解析

在微电网相关的项目里泡了大半年,最常听到的问题是:光伏、风机、电池三个模型都拖进Simulink了,为什么一跑就发散,或者跑出来的曲线跟“互补”两个字完全不沾边?问题通常不在某个模块的参数,而在对整套系统…

2026/10/5 11:56:36 阅读更多 →
Unity WebView插件实战:原生封装与跨平台通信方案

Unity WebView插件实战:原生封装与跨平台通信方案

1. 项目概述:为什么Unity需要一个真正可用的WebView插件?在Unity里做网页内嵌,不是“能不能”的问题,而是“怎么不翻车”的问题。我从2018年开始做AR工业可视化项目,第一版需求就是把设备实时监控页面塞进Unity客户端—…

2026/10/5 11:56:36 阅读更多 →
斯坦福CS146S Week1:现代软件开发者与最小可用编程Agent(超详细中文解读+扩展学习+术语诠释)

斯坦福CS146S Week1:现代软件开发者与最小可用编程Agent(超详细中文解读+扩展学习+术语诠释)

CS146S 第 01 节课学习文档 现代软件开发者(The Modern Software Developer) 课程:CS146S — The Modern Software Developer,斯坦福大学,2026 年秋季 讲师:Mihail Eric(themodernsoftware.dev…

2026/10/5 11:56:36 阅读更多 →
视频专网安全技术方案:从接入认证到等级保护落地拆解

视频专网安全技术方案:从接入认证到等级保护落地拆解

简介:这份《视频专网系统安全技术方案》PDF面向视频监控专网的设计、运维与安全管理人员,以及需要完成等保合规建设的技术人员,系统梳理了视频专网从安全形势分析到体系落地的完整思路。文档围绕前端、终端、网络、主机、应用、数据六大层面展…

2026/10/5 11:56:36 阅读更多 →
MapReduce清洗+Hive分析:电商消费行为离线分析实战路径

MapReduce清洗+Hive分析:电商消费行为离线分析实战路径

1. 这不是PPT里的“用户画像”,而是能直接驱动运营决策的真实消费行为分析你手上有几千万条订单日志、几百GB的埋点数据、每天还在涨的用户行为流水——但老板问“上个月复购率为什么跌了3%”,你翻了半小时SQL却只导出一张看不出门道的汇总表&#xff1b…

2026/10/5 11:56:36 阅读更多 →
计算机专业毕业生就业公示信息解析与职业发展启示

计算机专业毕业生就业公示信息解析与职业发展启示

我无法根据您提供的项目标题生成符合要求的博文内容。原因如下:该标题“北京理工大学计算机学院赵曜,中国进出口银行2016年度拟接收毕业生情况公示...”本质上是一则公开人事信息公告片段,属于机构常规行政公示内容,不具备可延展的技术实现路…

2026/10/5 11:55:35 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →