java--贪吃蛇

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;public class Snake extends JFrame implements KeyListener, ActionListener, MouseListener {int slong = 2;//蛇当前长度//蛇坐标int[] Snakex = new int[100];int[] Snakey = new int[100];int fx = 1;//蛇的方向 0-左 1-右 2-上 3-下Timer timer = new Timer(100, this);//设置定时器,每100毫秒一次//食物位置int foodx;int foody;Random random = new Random();//随机数,随机位置生成食物int started = 0;//游戏信息 0-未开始 1-开始 2-结束//---------------------------------------------------------------------------------------------------------------------//窗体public void myJFrame() {this.setTitle("贪吃蛇"); //标题this.setSize(800, 600); //窗口大小this.setResizable(false); //窗口是否可以改变大小=否this.setDefaultCloseOperation(Snake.EXIT_ON_CLOSE); //窗口关闭方式为关闭窗口同时结束程序int width = Toolkit.getDefaultToolkit().getScreenSize().width; //获取屏幕宽度int height = Toolkit.getDefaultToolkit().getScreenSize().height; //获取屏幕高度
//        System.out.println("宽度:"+width);//测试
//        System.out.println("高度:"+height);//测试this.setLocation((width - 800) / 2, (height - 600) / 2); //设置窗口默认位置以屏幕居中this.setFocusable(true);this.addKeyListener(this);this.setVisible(true); //窗口是否显示=是//        蛇的初识位置Snakex[0] = 60;Snakey[0] = 100;Snakex[1] = 40;Snakey[1] = 100;//        随机食物的初识位置foodx = random.nextInt(39);foody = random.nextInt(22);foodx = foodx * 20;foody = foody * 20 + 80;System.out.println(foodx + "," + foody);}//---------------------------------------------------------------------------------------------------------------------//覆写paint方法,绘制界面public void paint(Graphics g) {
//        绘制背景g.setColor(Color.LIGHT_GRAY);g.fillRect(0, 0, 800, 600);//绘制游戏区域g.setColor(Color.black);g.fillRect(0, 80, 800, 520);//绘制蛇for (int i = 0; i < slong; i++) {g.setColor(Color.CYAN);g.fillRect(Snakex[i], Snakey[i], 20, 20);}//        绘制食物g.setColor(Color.yellow);g.fillOval(foodx, foody, 20, 20);if (started == 0) {g.setColor(Color.BLACK);//设置画笔颜色g.setFont(new Font("微软雅黑", 10, 20)); //设置字体g.drawString("按下“空格键”开始游戏", 300, 65); //绘制字符} else if (started == 1) {g.setColor(Color.BLACK);//设置画笔颜色g.setFont(new Font("微软雅黑", 10, 20)); //设置字体g.drawString("当前分数为:", 300, 65); //绘制字符g.drawString(String.valueOf(slong - 2), 420, 65); //绘制字符} else if (started == 2) {g.setColor(Color.BLACK);//设置画笔颜色g.setFont(new Font("微软雅黑", 10, 20)); //设置字体g.drawString("游戏结束-", 250, 65); //绘制字符g.drawString("最终分数为:", 350, 65); //绘制字符g.drawString(String.valueOf(slong - 2), 470, 65); //绘制字符}}//    操作监听——控制蛇的不断移动@Overridepublic void actionPerformed(ActionEvent e) {
//        判断游戏是否开始if (started == 1) {
//            通过循环控制蛇移动for (int i = slong - 1; i > 0; i--) {Snakex[i] = Snakex[i - 1];Snakey[i] = Snakey[i - 1];}//            判断蛇移动的方向if (fx == 0) {Snakex[0] = Snakex[0] - 20;} else if (fx == 1) {Snakex[0] = Snakex[0] + 20;} else if (fx == 2) {Snakey[0] = Snakey[0] - 20;} else if (fx == 3) {Snakey[0] = Snakey[0] + 20;}//            判断蛇是否撞到墙外if (Snakex[0] < 0 || Snakex[0] > 780 || Snakey[0] < 80 || Snakey[0] > 580) {started = 2;}//            判断蛇是否吃到了食物if (Snakex[0] == foodx && Snakey[0] == foody) {slong++;foodx = random.nextInt(39);foody = random.nextInt(22);foodx = foodx * 20;foody = foody * 20 + 80;System.out.println(foodx + "," + foody);}//            判断是否吃到了自己for (int i = 1; i < slong; i++) {if (Snakex[0] == Snakex[i] && Snakey[0] == Snakey[i]) {started = 2;}}//            判断食物是否随机在了蛇身上for (int i = 0; i < slong; i++) {if (foodx == Snakex[i] && foody == Snakey[i]) {//        随机食物的初识位置foodx = random.nextInt(39);foody = random.nextInt(22);foodx = foodx * 20;foody = foody * 20 + 80;System.out.println(foodx + "," + foody);}}repaint();}timer.start();}//    输入@Overridepublic void keyTyped(KeyEvent e) {}//    键盘按下——控制游戏的开始以及蛇的移动方向@Overridepublic void keyPressed(KeyEvent e) {
//        获取从键盘输入的键int key = e.getKeyCode();
//        判断是否为空格if (key == KeyEvent.VK_SPACE) {if (started == 0) {started = 1;} else if (started == 1) {started = 0;} else if (started == 2) {started = 0;slong = 2;//蛇当前长度//        蛇的初识位置Snakex[0] = 60;Snakey[0] = 100;Snakex[1] = 40;Snakey[1] = 100;//        随机食物的初识位置foodx = random.nextInt(39);foody = random.nextInt(22);foodx = foodx * 20;foody = foody * 20 + 80;//                初始化方向fx = 1;}repaint();timer.start();//            左} else if (key == KeyEvent.VK_LEFT) {if (fx != 1) {fx = 0;}
//            右} else if (key == KeyEvent.VK_RIGHT) {if (fx != 0) {fx = 1;}
//            上} else if (key == KeyEvent.VK_UP) {if (fx != 3) {fx = 2;}
//下} else if (key == KeyEvent.VK_DOWN) {if (fx != 2) {fx = 3;}}}//    弹起@Overridepublic void keyReleased(KeyEvent e) {}//    点击@Overridepublic void mouseClicked(MouseEvent e) {}//    按下@Overridepublic void mousePressed(MouseEvent e) {}//    抬起@Overridepublic void mouseReleased(MouseEvent e) {}//    进入@Overridepublic void mouseEntered(MouseEvent e) {}//    离开@Overridepublic void mouseExited(MouseEvent e) {}
}

 

该程序主要实现了以下功能:
  1.按空格开始游戏、暂停游戏或重新开始游戏。
  2.方向键控制蛇移动的方向。
  3.蛇吃掉食物可以增长,并增加游戏分数(不会加快游戏速度)。
  4.蛇咬到自己会结束游戏。
  5.蛇撞到游戏区域外会结束游戏。 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用贝锐花生壳内网穿透远程访问JupyterNotebook?

在数据科学领域&#xff0c;Jupyter Notebook 已成为处理数据的必备工具。 其用途包括数据清理和探索、可视化、机器学习和大数据分析。Jupyter Notebook的安装非常简单&#xff0c;如果你是小白&#xff0c;那么建议你通过安装Anaconda来解决Jupyter Notebook的安装问题&#…

贝锐蒲公英路由器X4C如何远程访问NAS?

在目前网盘前路坎坷的情况下&#xff0c;私人云盘已然是一种新的趋势&#xff01;那自己打造一个私有云盘&#xff0c;是否需要高成本或是高门槛呢&#xff1f;其实并不用&#xff01;蒲公英针对个人玩家打造了全方位的私有云解决方案。 &#xff08;1&#xff09;入门级玩家只…

Unity 场景烘培 ——unity Post-Processing后处理1(四)

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、Post-Processing是什么&#xff1f;二、安装使用Post-Processing1.安装Post-Processing2.使用Post-Processing&#xff08;1&#xff09;.添加Post-process Volume&#xff08…

解析Spring Boot中的CommandLineRunner和ApplicationRunner:用法、区别和适用场景详解

在Spring Boot应用程序中&#xff0c;CommandLineRunner和ApplicationRunner是两个重要的接口&#xff0c;它们允许我们在应用程序启动后执行一些初始化任务。本文将介绍CommandLineRunner和ApplicationRunner的区别&#xff0c;并提供代码示例和使用场景&#xff0c;让我们更好…

Hive调优

1.参数配置优化 设定Hive参数有三种方式&#xff1a; &#xff08;1&#xff09;配置Hive文件 当修改配置Hive文件的设定后&#xff0c;对本机启动的所有Hive进程都有效&#xff0c;因此配置是全局性的。 一般地&#xff0c;Hive的配置文件包括两部分&#xff1a; a&#xff…

线性变换功能块S_RTI工程上的主要应用

西门子S_RTI模拟量转换功能块算法公式和代码介绍请参考下面文章链接: PLC模拟量输出 模拟量转换FC S_RTI-CSDN博客文章浏览阅读5.3k次,点赞2次,收藏11次。1、本文主要展示西门子博途模拟量输出转换的几种方法, 方法1:先展示下自编FC:计算公式如下:intput intput Real IS…

Oracle主备切换,ogg恢复方法(集成模式)

前言: 文章主要介绍Oracle数据库物理ADG主备在发生切换时(switchover,failover)&#xff0c;在主库运行的ogg进程(集成模式)如何进行恢复。 测试恢复场景&#xff0c;因为集成模式不能在备库配置&#xff0c;所以场景都是基于主库端: 1 主备发生switchover切换&#xff0c;主库…

吴恩达《机器学习》9-1-9-3:反向传播算法、反向传播算法的直观理解

一、正向传播的基础 在正向传播中&#xff0c;从神经网络的输入层开始&#xff0c;通过一层一层的计算&#xff0c;最终得到输出层的预测结果。这是一种前向的计算过程&#xff0c;即从输入到输出的传播。 二、反向传播算法概述 反向传播算法是为了计算代价函数相对于模型参数…

数据结构与算法之美学习笔记:22 | 哈希算法(下):哈希算法在分布式系统中有哪些应用?

目录 前言应用五&#xff1a;负载均衡应用六&#xff1a;数据分片应用七&#xff1a;分布式存储解答开篇 & 内容小结 前言 本节课程思维导图 今天&#xff0c;我们再来看剩余三种应用&#xff1a;负载均衡、数据分片、分布式存储。你可能已经发现&#xff0c;这三个应用都…

一、zabbix 5.0 部署

zabbix 5.0版本为长期支持版本&#xff0c;安装方式封装成都更高&#xff0c;web ui更加细致&#xff0c;喜人&#xff0c;本篇记录zabbix5.0安装细节 官方部署文档&#xff0c;同样简单好用 1、安装yum源 [rootzabbix-server ~]# yum install -y https://repo.zabbix.com/zab…

从 0 开始手写一个 Mybatis 框架,三步搞定!

MyBatis框架的核心功能其实不难&#xff0c;无非就是动态代理和jdbc的操作&#xff0c;难的是写出来可扩展&#xff0c;高内聚&#xff0c;低耦合的规范的代码。本文完成的Mybatis功能比较简单&#xff0c;代码还有许多需要改进的地方&#xff0c;大家可以结合Mybatis源码去动手…