【经典项目】Java小游戏 —— 会说话的汤姆猫

news2025/1/18 4:36:19

一、游戏回顾

【预期效果】

【玩法介绍】

1、 和它说话,它将用有趣的声音重复你的话。
2、打它的头,它会装成被打的样子,连续打还会晕倒;抚摸肚子,它会打呼噜;打肚子,它会装肚子疼;抓尾巴,它会生气;戳脚,它会抓着脚发出痛苦声。
3、忘掉他,他会打呵欠或打喷嚏。
4、点牛奶按键,为它倒了一杯牛奶,它会喝牛奶;
5、点交叉手按键,它会放屁;点锣形按键,它会拍锣;点刷新按键,会有另外玩法出现;点猫爪按键,它会在屏幕上划出痕迹;点小鸟按键,它会吓走一只小鸟;点蛋糕按键,它会把蛋糕扔到屏幕上。
6、汤姆记载影片,上传到网络或经过电子邮件发送它们。

二、实现分析

代码实现倒是不难,主要是预先准备了很多图片素材,然后50毫秒一张,就是幻灯片播放。

注意控制一下图片数组的边界,不要越界就OK了。

【部分代码】

/**
 * 汤姆猫-面板类
 * @author G
 *
 */
public class MyTomPanel extends JPanel implements Runnable,MouseListener {
	
	String[] imgPath_eat  = new String[40];
	String[] imgPath_cymbal  = new String[12];
	String[] imgPath_drink  = new String[80];
	String[] imgPath_fart  = new String[27];
	String[] imgPath_pie  = new String[23];
	String[] imgPath_scratch  = new String[55];
	
	String[] imgPath_angry  = new String[25];
	String[] imgPath_footLeft  = new String[29];
	String[] imgPath_footRight  = new String[29];
	String[] imgPath_knockout  = new String[80];
	String[] imgPath_stomach  = new String[33];
	
	BufferedImage btn_eat = null;
	BufferedImage btn_cymbal = null;
	BufferedImage btn_drink = null;
	BufferedImage btn_fart = null;
	BufferedImage btn_pie = null;
	BufferedImage btn_scratch = null;
	
	BufferedImage img = null;
	int imgIndex = 0;
	
	String action = "angry";
	
	public MyTomPanel() {
		for (int i = 0; i < imgPath_eat.length; i++) {
			imgPath_eat[i]="img/Animations/Eat/eat_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_angry.length; i++) {
			imgPath_angry[i]="img/Animations/Angry/angry_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_cymbal.length; i++) {
			imgPath_cymbal[i]="img/Animations/Cymbal/cymbal_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_drink.length; i++) {
			imgPath_drink[i]="img/Animations/Drink/drink_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_fart.length; i++) {
			imgPath_fart[i]="img/Animations/Fart/fart_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_footLeft.length; i++) {
			imgPath_footLeft[i]="img/Animations/FootLeft/footLeft_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_footRight.length; i++) {
			imgPath_footRight[i]="img/Animations/FootRight/footRight_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_knockout.length; i++) {
			imgPath_knockout[i]="img/Animations/Knockout/knockout_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_pie.length; i++) {
			imgPath_pie[i]="img/Animations/Pie/pie_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_scratch.length; i++) {
			imgPath_scratch[i]="img/Animations/Scratch/scratch_"+(i<10?"0":"")+i+".jpg";
		}
		for (int i = 0; i < imgPath_stomach.length; i++) {
			imgPath_stomach[i]="img/Animations/Stomach/stomach_"+(i<10?"0":"")+i+".jpg";
		}
		
	}
	
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		
		// 画图片 img,x,y,w,h,null
		g.drawImage(img, 0, -10, 430, 700, null);
		
		g.drawImage(btn_eat, 10, 420, null);
		g.drawImage(btn_cymbal, 10, 500, null);
		g.drawImage(btn_drink, 10, 580, null);
		
		g.drawImage(btn_fart, 350, 420, null);
		g.drawImage(btn_pie, 350, 500, null);
		g.drawImage(btn_scratch, 350, 580, null);
	}
	
	@Override
	public void run() {
		
		while (true) {
			imgIndex++;
			try {
				btn_eat = ImageIO.read(MyTomPanel.class.getResource("img/Buttons/eat.png"));
				btn_cymbal = ImageIO.read(MyTomPanel.class.getResource("img/Buttons/cymbal.png"));
				btn_drink = ImageIO.read(MyTomPanel.class.getResource("img/Buttons/drink.png"));
				btn_fart = ImageIO.read(MyTomPanel.class.getResource("img/Buttons/fart.png"));
				btn_pie = ImageIO.read(MyTomPanel.class.getResource("img/Buttons/pie.png"));
				btn_scratch = ImageIO.read(MyTomPanel.class.getResource("img/Buttons/scratch.png"));

				
				switch (action) {
				case "angry":
					if (imgIndex==imgPath_angry.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_angry[imgIndex]));					
					break;
				case "eat":
					if (imgIndex==imgPath_eat.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_eat[imgIndex]));
					break;
				case "cymbal":
					if (imgIndex==imgPath_cymbal.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_cymbal[imgIndex]));
					break;
				case "fart":
					if (imgIndex==imgPath_fart.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_fart[imgIndex]));
					break;
				case "drink":
					if (imgIndex==imgPath_drink.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_drink[imgIndex]));
					break;
				case "footRight":
					if (imgIndex==imgPath_footRight.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_footRight[imgIndex]));
					break;
				case "footLeft":
					if (imgIndex==imgPath_footLeft.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_footLeft[imgIndex]));
					break;
				case "knockout":
					if (imgIndex==imgPath_knockout.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_knockout[imgIndex]));
					break;
				case "pie":
					if (imgIndex==imgPath_pie.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_pie[imgIndex]));
					break;
				case "scratch":
					if (imgIndex==imgPath_scratch.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_scratch[imgIndex]));
					break;
				case "stomach":
					if (imgIndex==imgPath_stomach.length) imgIndex=0;
					img = ImageIO.read(MyTomPanel.class.getResource(imgPath_stomach[imgIndex]));
					break;
				}
				
				
				Thread.sleep(50);
				
			} catch (Exception e) {
				e.printStackTrace();
				imgIndex=0;
			}
			
			repaint();
		}
	}

	@Override
	public void mousePressed(MouseEvent e) {
		
		int x = e.getX();
		int y = e.getY();
		
		if ( x>10 && x<10+btn_eat.getWidth() && y<420+btn_eat.getHeight() && y>420) {
			System.out.println("click eat");
			action = "eat";
		}
		if ( x>10 && x<10+btn_cymbal.getWidth() && y<500+btn_cymbal.getHeight() && y>500) {
			System.out.println("click cymbal");
			action = "cymbal";
		}
		if ( x>10 && x<10+btn_drink.getWidth() && y<580+btn_drink.getHeight() && y>580) {
			System.out.println("click drink");
			action = "drink";
		}
		if ( x>350 && x<350+btn_fart.getWidth() && y<420+btn_fart.getHeight() && y>420) {
			System.out.println("click fart");
			action = "fart";
		}
		if ( x>350 && x<350+btn_pie.getWidth() && y<500+btn_pie.getHeight() && y>500) {
			System.out.println("click pie");
			action = "pie";
		}
		if ( x>350 && x<350+btn_scratch.getWidth() && y<580+btn_scratch.getHeight() && y>580) {
			System.out.println("click scratch");
			action = "scratch";
		}
		if ( x>0 && x<430 && y<400 && y>0) {
			int tmp = (int) (Math.random() * 5);
			switch (tmp) {
			case 0:
				action = "angry";
				break;
			case 1:
				action = "footLeft";
				break;
			case 2:
				action = "footRight";
				break;
			case 3:
				action = "knockout";
				break;
			case 4:
				action = "stomach";
				break;
			}
			System.out.println("click "+action);
		}
		
	}
	
	@Override
	public void mouseClicked(MouseEvent e) {
	}

	@Override
	public void mouseReleased(MouseEvent e) {
	}

	@Override
	public void mouseEntered(MouseEvent e) {
	}

	@Override
	public void mouseExited(MouseEvent e) {
	}
}

三、效果展示

1、抓鸟

2、打铜锣

3、喝牛奶

4、放pi

5、扔饼

6、猫抓

四、完整代码获取

经典项目Java小游戏-会说话的汤姆猫资源-CSDN文库

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

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

相关文章

QUIC with CUBIC or BBR

拥塞控制 拥塞控制算法是 TCP/QUIC 协议的一个基础部分&#xff0c;多年来经过一个个版本的迭代&#xff08;如 Tahoe、Reno、Vegas 等&#xff09;&#xff0c;拥塞控制算法得到了持续的提升。由于篇幅有限&#xff0c;本文就目前比较流行的两种拥塞控制算法&#xff08;CUBI…

[AIGC] 21世纪Java与Go的相爱相杀

在21世纪的软件开发领域中&#xff0c;Java和Go这两门编程语言可谓是相爱相杀的存在。它们各自拥有着强大的特点和独特的优势&#xff0c;同时也存在着一些明显的竞争和冲突。让我们来看看这两门语言的故事&#xff0c;以及它们之间的深远意义。 文章目录 Java的魅力Go的魅力相…

以小猪o2o生活通v17.1为例简要分析SWOOLE加密破解,swoole_loader加密破解swoole加密逆向后的代码修复流程(个人见解高手掠过)

现在用Php加密五花八门除了组件就是混淆&#xff0c;在组件里面响当当的还属swoole&#xff0c;SWOOLEC是不错的国产加密&#xff0c;值得推荐官方宣称是永远无法破解的加密算法&#xff0c;针对swoole compiler的代码修复我谈谈我的看法&#xff0c;以小猪o2o生活通&#xff0…

一、Redis之NoSQL

1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;非关系数据库产…

Scrapy:Python中强大的网络爬虫框架

Scrapy&#xff1a;Python中强大的网络爬虫框架 在当今信息爆炸的时代&#xff0c;从互联网上获取数据已经成为许多应用程序的核心需求。Scrapy是一款基于Python的强大网络爬虫框架&#xff0c;它提供了一种灵活且高效的方式来提取、处理和存储互联网上的数据。本文将介绍Scrap…

fastjson 导致的OOM

fastjson 导致的OOM 示例代码 public static void main(String[] args) throws Exception {try {List<Integer> list JSONObject.parseArray("[2023,2024", Integer.class);}catch (Exception e){System.err.println("error");}System.out.println…

Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

Vue3_基础使用_1

这节主要介绍&#xff1a; vue2与vue3的区别&#xff0c;创建响应式的数据&#xff0c;setup语法糖的使用&#xff0c;watch监听&#xff0c;及vue3创建项目。 vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对…

《Python 网络爬虫简易速速上手小册》第4章:Python 网络爬虫数据抓取技术(2024 最新版)

文章目录 4.1 解析 HTML 与 CSS4.1.1 重点基础知识讲解4.1.2 重点案例&#xff1a;使用 BeautifulSoup 解析博客文章4.1.3 拓展案例 1&#xff1a;使用 lxml 和 XPath 解析产品信息4.1.4 拓展案例 2&#xff1a;动态加载内容的抓取挑战 4.2 动态内容抓取技术4.2.1 重点基础知识…

时间序列预测——GRU模型

时间序列预测——GRU模型 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理时间序列数据的一种常见选择。上期已介绍了LSTM的单步和多步预测。本文将深入介绍一种LSTM变体——门控循环单元&#xff08;GRU&#xff09;模型&#xff0c;包括其理论基础…

ArcGIS Pro 按照字段进行融合或拆分

ArcGIS Pro 按字段融合 在ArcGIS Pro中&#xff0c;通过使用“融合”工具可以轻松地合并具有相同字段的图层。 步骤一&#xff1a;打开ArcGIS Pro 启动ArcGIS Pro应用程序&#xff0c;确保您已经登录并打开您的项目。 步骤二&#xff1a;添加图层 将包含相同字段的图层添加到…

【C++】C++入门 — 类和对象初步介绍

类和对象 1 类的作用域2 类的实例化3 类对象模型4 this指针介绍&#xff1a;特性&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 类的作用域 类定义了一个新的作用域&#xff0c;类的…

项目安全问题及解决方法-----xss处理

XSS 问题的根源在于&#xff0c;原本是让用户传入或输入正常数据的地方&#xff0c;被黑客替换为了 JavaScript 脚本&#xff0c;页面没有经过转义直接显示了这个数据&#xff0c;然后脚本就被 执行了。更严重的是&#xff0c;脚本没有经过转义就保存到了数据库中&#xff0c;随…

Redis之基础篇

Redis简介 Redis是一种基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;它支持string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集…

matplotlib-中文乱码问题解决方案

前言 本文主要解决matplotlib在画图时&#xff0c;出现的中文乱码问题&#xff0c;具体问题示意如下&#xff1a; 下面将针对这个问题直接给出具体的解决步骤。 具体步骤 1、首先去网上下载并安装SimHei字体&#xff0c;其它字体也行&#xff0c;如下 并将它安装在此目录下…

面试150 位1的个数 位运算

Problem: 191. 位1的个数 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 复杂度 Code public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n){int res 0;while (n ! 0){res 1;n & n - 1;// 把最后…

海康IPC摄像机接入国标平台,发现一直不在线(离线)的处理方式

目 录 一、问题 二、问题分析 &#xff08;一&#xff09;常见设备离线问题的原因 &#xff08;二&#xff09;原因分析 三、问题查处 &#xff08;一&#xff09;设备端排查故障&#xff08;设备端自查&#xff09; 1、检查GB28181参数配置是否有误 2、…

【算法与数据结构】739、LeetCode每日温度

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;   程序如下&#xff1a; 复杂度分析&#xff1a; 时间复杂度&#xff1a; O ( ) O() O()。空间复…

【2月比赛合集】28场可报名的数据挖掘大奖赛,任君挑选!

CompHub[1] 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 以下信息仅供参考&#xff0c;以比赛官网为准 目录 Kaggle&#xff08;2场比赛&#xff09;阿里天池&#xff08;…

Elasticsearch:集群故障排除和优化综合指南

Elasticsearch 是一个强大的搜索和分析引擎&#xff0c;是许多数据驱动应用程序和服务的核心。 它实时处理、分析和存储大量数据的能力使其成为当今快节奏的数字世界中不可或缺的工具。 然而&#xff0c;与任何复杂的系统一样&#xff0c;Elasticsearch 可能会遇到影响其性能和…