通过一个游戏编程熟悉线程操作

Rust语言的多线程编程 Rust是一种系统级编程语言,以其内存安全和并发编程的优势而闻名。在当今的计算密集型和高并发的场景中,良好的多线程编程能力显得尤为重要。Rust通过内存安全和避免数据竞争的特性,使得编程者在进行多线程开发时更加高效和安全。本文将深入探讨Rust语言的多线程编程,包括其基本概念、常用工具、示例代码以及最佳实践。 阅读详情

 继《通过一个游戏编程熟悉事件处理》http://blog.youkuaiyun.com/flyuniverse_shell/archive/2009/10/23/4719939.aspx

    《通过一个游戏编程熟悉文件操作》 http://blog.youkuaiyun.com/flyuniverse_shell/archive/2009/11/02/4758566.aspx  之后

 

我们完成第三个目标,请同行指点。代码如下:

 

 

 

import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

class GameButton extends JButton
{
 GameButton(String str)
 {
  super(str);
  super.setSize(10, 10);
  super.setBackground(Color.WHITE);
  super.setFont(new java.awt.Font("Dialog", 1, 60));// 设置字体
 }
}

public class MyGame extends JFrame implements ActionListener
{
 private JFrame f = new JFrame("Game-Java 实现");
 private JPanel jp = new JPanel(new GridLayout(5, 3, 10, 10));
 private GameButton[] gb = new GameButton[9];
 private int[][] relationShips = new int[9][];
 private JButton JBSaveOperation = new JButton("保存操作记录");
 private File fileSave = null; // 游戏记录文件
 private StringBuffer tempSaveStrB = new StringBuffer(); // 暂时保存操作,最终会保存到fileSave中去
 private JButton JBShowLast = new JButton("显示上一局");; // 显示上一局
 private JButton JBRestart = new JButton("重新开始");; // 重新开始
 private JLabel JLshowLastRecord = new JLabel("操作序列:"); // 显示操作过程
 private Thread showLastThread = null; // 上一局游戏新线程
 private JLabel JLshowRecordThread = new JLabel("操作序列:"); // 与线程同步显示
 private BufferedReader in; //取记录的输入流
 private String line;  //从记录文件中读取的记录的用户游戏记录

 MyGame()
 {
  f.setLocation(10, 100);
  f.setSize(600, 400);
  f.getContentPane().add(jp);

  for (int i = 0; i < gb.length; i++)
  {
   gb[i] = new GameButton("-");
   jp.add(gb[i]);
   gb[i].addActionListener(this); // 添加按钮事件
  }

  gb[4].setText("+");
  JBSaveOperation.addActionListener(this);
  JBShowLast.addActionListener(this);
  JBRestart.addActionListener(this);
  jp.add(JBSaveOperation);
  jp.add(JLshowLastRecord);
  jp.add(JBShowLast);
  jp.add(JBRestart);
  jp.add(JLshowRecordThread);

  f.setVisible(true);

  relationShips[0] = new int[] { 0, 1, 3, 4 };
  relationShips[1] = new int[] { 0, 1, 2 };
  relationShips[2] = new int[] { 1, 2, 4, 5 };
  relationShips[3] = new int[] { 0, 3, 6 };
  relationShips[4] = new int[] { 1, 3, 4, 5, 7 };
  relationShips[5] = new int[] { 2, 5, 8 };
  relationShips[6] = new int[] { 3, 4, 6, 7 };
  relationShips[7] = new int[] { 6, 7, 8 };
  relationShips[8] = new int[] { 4, 5, 7, 8 };

  fileSave = new File("game.txt");
  if (!fileSave.exists())
  {
   try
   {
    fileSave.createNewFile();
   } catch (IOException e)
   {
    e.printStackTrace();
   }
  }
 }

 public static void main(String[] args)
 {
  MyGame g = new MyGame();
 }

 public void begin()
 {
  for (int i = 0; i < gb.length; i++)
  {
   gb[i].setText("-");
  }
  gb[4].setText("+");
  tempSaveStrB.delete(0, tempSaveStrB.length());
 }

 public void actionPerformed(ActionEvent e)
 {
  if (e.getSource().equals(JBSaveOperation))// 如果点击的是“保存操作”按钮
  {
   if (writeFile())
   {
    JOptionPane.showMessageDialog(null, "写文件成功!");
   } else
    JOptionPane.showMessageDialog(null, "写文件失败!");
  }
  if (e.getSource().equals(JBRestart))// 如果点击的是“重新开始”按钮
  {
   begin();
   JLshowLastRecord.setText("操作序列:");
  }
  if (e.getSource().equals(JBShowLast))// 如果点击的是“显示上一局”按钮
  {
   try
   {
    in=new BufferedReader(new FileReader("game.txt"));
   } catch (FileNotFoundException e2)
   {
    e2.printStackTrace();
   }
   try
   {
    line=in.readLine();
   } catch (IOException e2)
   {
    e2.printStackTrace();
   }
   if (line != null)
   {
    begin();
    // 显示上一局游戏记录时先撤销方格按钮的响应事件
    for (int i = 0; i < gb.length; i++)
    {
     gb[i].removeActionListener(this);
    }
    
    showLastThread = new Thread("showLastThread")
    {
     public void run()
     {
      JLshowLastRecord.setText("上一局的操作顺序为:" + line
        + "        每隔2秒显示一个步骤");
      JLshowRecordThread.setText("当前执行到:");
      String[] tokens = line.split(",");
      int s = 0;
      for (int i = 0; i < tokens.length; i++)
      {
       s = Integer.parseInt(tokens[i]);
       if (i == tokens.length - 1)
        JLshowRecordThread.setText(JLshowRecordThread.getText() + s);
       else
        JLshowRecordThread.setText(JLshowRecordThread.getText() + s + ">>");
       try
       {
        Thread.sleep(1000); // 设置停顿1秒
        ButtonChange(s);// 进行方格翻转
        Thread.sleep(1000);// 设置停顿1秒
       }
       catch (InterruptedException e1)
       {
        e1.printStackTrace();
       }
      }
     }
    };
    showLastThread.start(); // 启动显示上局游戏结果线程
   }
   else
   {JOptionPane.showMessageDialog(null, "操作记录为空!");}
  }

  for (int i = 0; i < 9; i++)
  {
   if (e.getSource().equals(gb[i])) // 如果点中第i个
   {
    if (gb[i].getText().equals("-"))
    {
     JOptionPane.showMessageDialog(null, "你应该点“+”的");
     return;
    }
    ButtonChange(i);
    tempSaveStrB.append(i + ",");
    JLshowLastRecord.setText("操作序列:" + tempSaveStrB.toString());
    if (isWin())
    {
     JOptionPane.showMessageDialog(null, "你赢了!");
     over();
     if (writeFile())
     {
      JOptionPane.showMessageDialog(null, "写文件成功!");
     } else
      JOptionPane.showMessageDialog(null, "写文件失败!");
    }
    if (isFail())
    {
     JOptionPane.showMessageDialog(null, "你输了!");
     over();
    }
   }
  }
 }

 private boolean writeFile()
 {
  BufferedWriter writer;
  try
  { // 记录游戏结果 写进游戏记录文档
   writer = new BufferedWriter(new FileWriter("game.txt"));
   writer.write(tempSaveStrB.toString());
   writer.newLine();
   writer.close();
  } catch (IOException ex)
  {
   ex.printStackTrace();
   return false;
  }
  return true;
 }

 private boolean isFail()
 {
  int count = 0;
  for (int i = 0; i < gb.length; i++)
  {
   if (gb[i].getText().equals("-"))
    count++;
  }
  if (9 == count)
   return true;
  else
   return false;
 }
 private void over()
 {
  for(int i=0;i<gb.length;i++)
  {
   gb[i].setEnabled(false);
  }
 }
 private boolean isWin() // 遍历所有Button
 {
  int count = 0;
  for (int i = 0; i < gb.length; i++)
  {
   if (gb[i].getText().equals("+"))
    count++;
  }
  if (8 == count && gb[4].getText().equals("-"))
   return true;
  else
   return false;
 }

 private void ButtonChange(int i)
 {
  for (int j = 0; j < relationShips[i].length; j++)
  {
   if (gb[relationShips[i][j]].getText().equals("+"))
   {
    gb[relationShips[i][j]].setText("-");
   }
   else
   {
    gb[relationShips[i][j]].setText("+");
   }
  }
 }
}

射击游戏多线程编程实战指南 摘要: 本文系统解析多线程技术在射击游戏开发中的应用与优化。从基础原理切入,阐述了多线程如何利用多核处理器提升游戏性能,区分了并行与异步的差异。重点分析了多线程在场景加载、AI决策、网络同步和特效渲染等核心场景的应用模式,详细介绍了任务队列、线程池、消息传递等架构设计方法,并探讨了锁优化、缓存一致性、负载均衡等性能调优策略。通过互斥锁、原子操作等同步机制的对比,为开发者提供了解决资源冲突、避免死锁的实用方案。全文以实际案例佐证理论,帮助开发者构建高性能、低延迟的射击游戏多线程架构。 阅读详情

相关推荐

Java多线程编程技巧及游戏开发应用

本文介绍了Java中高级线程编程技术,包括线程的创建、执行以及调度策略。通过示例代码,展示了如何通过继承Thread类或实现Runnable接口来定义线程执行的代码,以及如何控制线程的生命周期。此外,还探讨了线程调度的原理和在多线程游戏开发中的应用。

weixin_35045970的博客 757

线程实现打字小游戏代码

利用Scanner读取文件内容,利用线程实现控制台打印:文件内容 import java.util.Scanner; import java.io.*; class WenZiGame  { public static void main(String[] args)  { String str=""; try{ Scanner input=new Scanner

WGYH_3767的博客 768

Java多线程贪吃蛇游戏实现指南

本文还有配套的精品资源,点击获取 简介:在本项目中,我们将探讨如何使用Java多线程技术来开发贪吃蛇游戏。项目涉及的关键知识点包括Java多线程编程、图形界面绘制、游戏逻辑处理、异常处理以及游戏状态管理。开发者将学习如何通过多线程技术来同步游戏组件,如蛇的移动和食物的生成,并使用Graphics2D类在窗口中绘制游戏元素。此外,还将介绍如何利用窗口类来初始化界面和处理用户输...

weixin_42515340的博客 1295

怎么样才算得上熟悉多线程编程?

多线程编程(或并发编程/异步编程)是现代编程中的一个重要领域,尤其是在追求高性能、低延迟和高并发的应用场景中。招聘信息中提到的“熟悉多线程编程”,通常不只是指“会用”多线程库或框架,而是要求对多线程的。“熟悉多线程编程”并不仅仅是会用多线程 API,而是需要对其原理、常见问题及解决方法有深入理解,能够设计高效的并发程序。通过实践(比如写多线程爬虫、服务器)和阅读经典书籍,逐步提升对多线程编程的理解和应用能力。:知道“为什么”,能够通过调试和分析解决多线程中的复杂问题。多线程编程中最重要的一点是。

小宝哥Code的专栏 1408

C/C++编程:进程与线程的健壮性设计及游戏实战

本文还有配套的精品资源,点击获取 简介:该压缩包“lsfetime-model-robust.rar”包含了C/C++语言编写的进程与线程编程教学内容,重点是创建健壮和稳定的多线程应用。它通过实现24点和斗地主等经典游戏,展示了并发处理和事件驱动的应用。内容包括进程与线程的生命周期管理、进程间通信、线程同步、线程调度、并发编程问题、以及多线程在游戏开发中的应用。学生将学习到...

weixin_31315007的博客 977

C#多线程游戏开发实战:炮打飞机

本文还有配套的精品资源,点击获取 简介:本项目通过“炮打飞机”游戏案例,教授C#编程语言在游戏开发中的多线程应用。涉及C#基础语法、面向对象编程、多线程同步、事件驱动编程、GUI界面设计以及游戏循环和碰撞检测等关键技术点。学生或开发者将通过实践学习如何设计和实现一个简单的多线程游戏,提升编程及游戏开发的能力。 1. C#基础语法应用 在游戏开发的编程世界中,C#...

weixin_42124497的博客 1157

通过一个游戏编程熟悉事件处理

  编程练习        使用你熟悉的开发语言和开发方式,实现以下的编程目标(至少合理实现“编程目标一”才为合格):编程目标一:根据下面的“游戏说明”,实现该游戏程序,完成响应用户的输入、显示游戏局面、判定游戏胜负等功能。编程目标二:在“编程目标一”的基础上,顺序记录用户从游戏开始到游戏结束的所有输入,并在游戏结束时保存到游戏过程记录文件中。编程目标三:在“编程目标二

flyuniverse_shell的专栏 1728

Java游戏编程之动画与线程优化策略

本文深入探讨了Java游戏编程中动画和线程的高效实现方式。通过分析《Java游戏编程的黑艺术》一书中关于Daleks小程序的代码,我们了解了如何通过计算和优化来实现流畅的动画效果,以及如何通过线程控制来提高游戏性能。章节内容涉及动画循环的创建、动画对象的移动逻辑、新线程的创建与控制,以及如何在游戏开始后处理用户输入。

weixin_36122351的博客 287

Java 多线程编程 实验题

Java 多线程编程 实验题 1.创建键盘操作练习 2.双线程猜数字 3.月亮围绕地球

c_y_s_的博客 6363

C语言游戏编程实战:62款游戏源码解析

在游戏开发中,数据结构的应用是至关重要的。它不仅影响着游戏的性能,还决定着代码的可维护性和扩展性。接下来我们将深入探讨链表、栈、队列、树和图结构在游戏中是如何被应用的。SDL 是一个跨平台的开发库,设计用来提供对音频、键盘、鼠标、游戏手柄和图形硬件的低级访问。它被广泛应用于独立游戏的开发中,特别是那些需要快速原型开发和跨平台能力的项目。SDL 的 API 设计简洁明了,使得开发者能够快速上手并实现游戏中的基本图形和音效功能。Allegro。

weixin_36464343的博客 1148

SystemVue 链路预算、仿真分析步骤

使用SystemVue进行链路预算、频谱分析等,相对ADS更全面。

BeCourageable的博客 3836

cpu线程_探讨超线程CPU对游戏的影响和最佳游戏CPU

这遍文章是针对游戏发烧友的,如果是普通玩家或者是普通办公者,直接建议购买支持超线程CPU,这也是大部分用户的选择。什么是超线程(Hyper-threading,简称HT)?简单地表达就是将一个CPU核心虚拟化成两个CPU核心。理论上来讲一个CPU核心在运行的时候只能处理一个线程,超线程的技术使得CPU在运行的时候可以处理两个线程。本质上还是一个CPU核心,总算力不变,只是更有效压榨CPU的性能。超...

weixin_39888180的博客 2103

Linux云服务器上搭建《僵尸毁灭工程》私服全流程指南(避坑版)

本文详细介绍了在Linux云服务器上搭建《僵尸毁灭工程》私服的全流程指南,包括环境准备、SteamCMD安装、游戏服务器部署、内存优化配置及高级调优技巧。特别针对常见问题提供解决方案,帮助玩家快速搭建稳定的私服环境。

solidity8miner的博客 604

《C++游戏服务器开发入门到掌握》多线程编程

63、游戏服务器的基础 可能的问题 死锁; 乱序; 并发访问数据; 低效率(为了防止前面问题的发生,需要做很多防御性工作)。 C++11带来的新概念 高阶接口:(async, future); 低阶接口:(thread, mutex); 例子: void helloworld() { std::cout &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;&amp;amp;amp;am

风铃飞弦的博客 2239

海康VisionMaster表面缺陷滤波实战:从参数调优到工业检测避坑指南

本文深入探讨海康VisionMaster表面缺陷滤波技术在工业检测中的应用,从参数调优到ROI绘制与Blob分析的协同策略,提供金属外壳、锂电池铝壳等复杂表面的缺陷检测实战指南。通过多级滤波架构和动态ROI生成法,显著提升检出率至98.7%,误检率低于0.5%,为工业质检提供智能化解决方案。

ujm5678901的博客 329

Midscene.js 浏览器自动化:10 分钟跑通首个 AI 视觉测试用例

写了一堆 CSS 选择器,前端改了一次 class 名,E2E 脚本集体报错。Midscene.js 换了一条路解决浏览器自动化问题:它不读 DOM,只读截图,你用自然语言描述操作,AI 视觉定位元素并执行。 ## 项目能力速览 Midscene 的定位是 GUI Agent,核心 API 只有几个,但覆盖了一整套 E2E 测试链路: | 能力 | 说明 | |---|---| | 自然语言

gitblog_00802的博客 784

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了在UE5游戏逆向工程中使用FModel提取.pak文件中3D模型的实战技巧,包括Dumper-7工具的深度配置与避坑指南。针对UE5特有的unversioned属性系统,提供了从源码编译到智能注入的全链路解决方案,帮助开发者高效获取游戏资产并优化处理流程。

weixin_30374009的博客 496

《Windows游戏编程大师技巧》(第二版)第11章

第三部分:核心游戏编程  第11章 算法、数据结构、内存管理和多线程  第12章 人工智能  第13章 游戏物理  第14章 文字时代  第15章 综合运用:编写游戏! 第11章 算法、数据结构、内存管理和多线程"You think I can get a hug after this?"—Bear, Armageddon(电影《世界末日》)本章将讨论在其他游戏编程参考书常常会中疏漏的细节问题。我

偶尔写写 7789

告别点不亮!STM32F103驱动HT1621段码屏的常见坑点与调试心得

本文详细解析了STM32F103驱动HT1621段码屏的五大常见问题及解决方案,包括硬件连接、时序控制、RAM地址映射等关键难点。通过实测数据和代码示例,帮助开发者快速排查显示异常问题,提升驱动开发效率。特别针对HT1621与STM32F103的兼容性问题提供了专业调试建议。

weixin_30925435的博客 379

金蝶云星空v8.0私有化部署与cpolar内网穿透:构建企业级远程ERP访问通道

本文详细介绍了金蝶云星空v8.0企业版的私有化部署流程与cpolar内网穿透技术,帮助企业构建安全高效的远程ERP访问通道。从系统环境准备、SQL Server配置到内网穿透安全加固,提供全流程实战指导,助力企业实现本地部署与远程办公的无缝衔接。

weixin_28736335的博客 376

MinecraftForge多线程编程:避免游戏卡顿的关键

在Minecraft模组开发中,游戏卡顿是玩家最常见的抱怨之一。当游戏界面冻结、实体移动不流畅或区块加载延迟时,大多与主线程负担过重有关。MinecraftForge作为**Mod加载框架(Modding Framework)**,提供了完善的多线程编程工具链,帮助开发者将耗时操作从主线程分离,实现流畅的游戏体验。本文将通过实际代码示例和框架原理解析,展示如何在模组开发中正确运用多线程技术。 #...

gitblog_00062的博客 925

ANSYS APDL 异类单元连接实战:MPC方法在壳-实体装配中的应用

本文详细介绍了在ANSYS APDL中使用MPC方法实现壳单元与实体单元高效连接的技术要点。通过分析工程仿真中的常见需求,阐述了MPC方法在解决异类单元连接问题上的优势,包括网格独立性、自由度耦合和载荷传递等特性,并提供了具体的APDL命令流操作示例和实用经验技巧。

weixin_33391446的博客 178

多线程编程和单线程编程_什么是操作系统和编程中的多线程?

多线程编程和单线程编程Multithreading is a popular term used in computing, operating systems, and application development areas. Multithreading is simply used to accelerate the execution of the process dividing i...

cunjiu9486的博客 356

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

“生命游戏”的多线程算法思考

Intel正在ISN网站上举办一个多线程编程大赛,值得关注。Intel过去几年举办过好几次线程技术大赛,包括与topcoder合作的一些竞赛,质量都不错。题目难度适中,而且具有启发性,对多核编程感兴趣的C/C++程序员应该关注一下。其实参与这样的活动,置身于竞赛气氛当中,无论是否获奖,都可以在短时间内大幅度地提高对多线程编程的理解。这次比赛比较有特色,为期长达几个月之久,而且每个月都有一轮竞赛,每

孟岩 1万+

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

线程游戏

     多线程是Java平台的一个重要特性。要了解多线程首先就要了解进程与线程的区别,进程是程序在处理机中的一次运行,一个进程既包括其所要执行的指令,也包括了执行指令所需的系统资源,不同进程所占用的系统资源相对独立,所以进程是重量级的任务,它们之间的通信和转换都需要操作系统付出较大的开销。而线程是进程中的一个实体,是被系统独立调度和分派的基本单位。线程自己基本上不拥有系统资源,但它可以与同属一...

u010119904的博客 207
上一篇: 计算机图形学第二章---概论(OpenGL简介)
下一篇: 计算机图形学第三章---用户接口与交互式技术用户接口设计
flyuniverse_shell
博客等级 码龄18年 119粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值