Java贪吃蛇小游戏

JFrame j = new JFrame(“贪吃蛇小游戏”);

也可以选择无参构造函数

JFrame j = new JFrame();

j.setTitle(“贪吃蛇小游戏”);

导入一个包:import java.awt.Toolkit;

import java.awt.Toolkit;

得到电脑屏幕的宽度和高度,方便设置对应的窗口大小和窗口打开时会出现在电脑的什么位置

int width = Toolkit.getDefaultToolkit().getScreenSize().width;

System.out.println(width);

int height =Toolkit.getDefaultToolkit().getScreenSize().height;

System.out.println(height);

这个时候就需要一点数学功底了,我设置好窗口大小,并将窗口居中显示在电脑屏幕上

setBounds()有四个参数:

  • 第一个参数改组件在JFrame中的x坐边(指定左上角的新位置)

  • 第二个参数改组件在JFrame中的y坐标(指定左上角的新位置)

  • 第三个参数改组件在JFrame中的组件宽度

  • 第四个参数改组件在JFrame中的组件高度

j.setBounds((width-800)/2, (height-800)/2, 800, 800);

方法setsetResizable(boolean resizable)参数为boolean类型,

  • resizeable值为true时,表示在生成的窗体可以自由改变大小;

  • resizeable值为false时,表示生成的窗体大小是由程序员决定的,用户不可以自由改变该窗体的大小。

j.setResizable(false);

通过方法setVisible(),参数为Boolean类型,将窗体打印出来

j.setVisible(true);

当我们关闭窗口时,程序不一定关闭了,所以要使用setDefaultCloseOperation(3); 这里的‘3’是默认关闭

j.setDefaultCloseOperation(3);

package com.blb.game;

import java.awt.Toolkit;

import javax.swing.JFrame;

public class Snake {

public static void main(String[] args) {

// 创建窗体对象,实例化,JFrame

JFrame j = new JFrame();// 可在里面给名字,有参构造

// 设置窗体的名字,无参构造

j.setTitle(“贪吃蛇小游戏”);

// 得到当前电脑屏幕的宽度

int width = Toolkit.getDefaultToolkit().getScreenSize().width;

System.out.println(width);

// 得到当前电脑屏幕的高度

int height = Toolkit.getDefaultToolkit().getScreenSize().height;

System.out.println(height);

j.setBounds((width-800)/2,(height-800)/2, 800, 800);// 使得界面居中

j.setResizable(false);// 设置窗体的大小不可变

j.setDefaultCloseOperation(3);// 游戏关闭,程序结束

// 创建面板对象

SnakePanel s = new SnakePanel();

j.add(s);

j.setVisible(true);// 设置窗体可见

}

}

创建一个新类(在里面可以对创好的边框进行填充颜色和放置相应的图片),需继承JPanel

JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,可以进行嵌套,功能是对窗体中具有相同逻辑功能的组件进行组合。

SnakePanel

当Swing中的paint方法被调用时,paintComponent,paintBorder、paintChildren这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。

所以paintComponent就是本身这个容器自己画出自己组件的方法了。如果只是为了改变本身这个容器中的组件,只需要改写paintComponent方法就可以了,如果还要保留容器中的原本组件就别忘了调用super.paintComponent(g)如果要改写paint方法来改变本身这个容器的组件,那么也别忘了要调用super.paint(g),不然出来的东西是不包含原组件、原边框和子组件的

paint是系统回调函数,用户不能主动调用,需要进行重绘时,要使用repaint方法,当用户调用repaint方法后,实际上,系统后台调用了paint方法,所以,你的问题,要画一条直线,或者清除一条直线,那么你的绘制代码或清除代码要写到paint方法中,然后需要绘制或清除的时候,调用repaint方法,就可以了

package com.blb.game;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.KeyEvent;

import java.awt.event.KeyListener;

import java.util.Iterator;

import java.util.Random;

import javax.swing.Timer;

import javax.swing.JButton;

import javax.swing.JPanel;

public class SnakePanel extends JPanel implements KeyListener,ActionListener{

// 定义两个数组,表示蛇的坐标

int[] snakeX = new int[10000];

int[] snakeY = new int[10000];

// Timer timer;

// 定义蛇的长度

int length;

// 定义分数

int score;

//定义小蛇状态,初始化小蛇状态

boolean isDied = false;

// 定义游戏初始化状态

boolean isStart = false;

// 定义字符串变量表示小蛇移动方向,初始化小蛇方向

String direction;

// 创建随机数

Random rd = new Random();

// 定义食物的横坐标

int foodX;

// 定义食物的纵坐标

int foodY;

/*

  • 构造方法

*/

public SnakePanel() {

// 将当前的焦点定位在面板上(锁定焦点)

this.setFocusable(true);

// 添加监听事件

this.addKeyListener(this);

// 创建定时器

Timer timer = new Timer(200,this);

// 启动定时器

timer.start();

init();

}

/*

  • 初始化游戏

*/

private void init() {

//初始化小蛇长度

length = 3;

//初始化小蛇方向,R:右 L:左 U:上 D:下

direction = “R”;

//初始化小蛇头部坐标

snakeX[0] = 175;

snakeY[0] = 225;

//初始化第一家身子坐标

snakeX[1] = 150;

snakeY[1] = 225;

//初始化第二节身子坐标

snakeX[2] = 125;

snakeY[2] = 225;

//定义食物的横坐标

foodX = rd.nextInt(30) * 25 + 25;

//定义食物的纵坐标

foodY = rd.nextInt(28) * 25 + 50;

//定义小蛇状态,初始化小蛇状态

isDied = false;

// 定义游戏初始化状态

isStart = false;

//初始分数为0

score = 0;

}

/*

  • 绘画方法

  • Graphics g :画笔

  • */

@Override

protected void paintComponent(Graphics g) {

// TODO Auto-generated method stub

super.paintComponent(g);

// 设置背景颜色

this.setBackground(new Color(245, 239, 239));

g.setColor(new Color(225,212,212));

// 填充矩形,作为游戏区域

g.fillRect(25, 25, 750, 700);

//画出背景头部图像(this是当前面板,g是画笔,后面2个数据是图片在窗口的坐标值)

Images.header.paintIcon(this, g, 25, 0);

//这里你画了向右的蛇头

// Images.right.paintIcon(this, g, snakeX[0], snakeY[0]);

// Images.body.paintIcon(this, g, snakeX[1], snakeY[1]);

// Images.body.paintIcon(this, g, snakeX[2], snakeY[2]);

Images.food.paintIcon(this,g,foodX,foodY);

// 画笔颜色

g.setColor(new Color(1, 1, 1));

// 字体格式(字体样式,加粗,字体大小)

g.setFont(new Font(“微软雅黑”, Font.BOLD, 25));

// 分数及坐标位置

g.drawString(“分数:” + score, 650, 40);

for(int i=1;i<length;i++) {

Images.body.paintIcon(this, g, snakeX[i], snakeY[i]);

}

if (isStart == false) {

// 画笔颜色

g.setColor(new Color(146, 193, 111));

// 字体格式(字体样式,加粗,字体大小)

g.setFont(new Font(“微软雅黑”, Font.BOLD, 35));

// 文字内容以及坐标位置

g.drawString(“点击空格开始游戏”, 250, 300);

}else if (isDied == true) {

// 画笔颜色

g.setColor(new Color(146, 193, 111));

// 字体格式(字体样式,加粗,字体大小)

g.setFont(new Font(“微软雅黑”, Font.BOLD, 35));

// 文字内容以及坐标位置

g.drawString(“游戏结束”, 250, 300);

}

//根据蛇头方向画小蛇的头部

//Images.right.paintIcon(this,g,snakeX[0],snakeY[0]);

if (“R”.equals(direction)){

//这里也画了,上面那个注释掉就行了

// 画图蛇头

Images.right.paintIcon(this,g,snakeX[0],snakeY[0]);

}else if (“L”.equals(direction)){

// 画图蛇头

Images.left.paintIcon(this,g,snakeX[0],snakeY[0]);

}else if (“U”.equals(direction)){

// 画图蛇头

Images.up.paintIcon(this,g,snakeX[0],snakeY[0]);

}else if (“D”.equals(direction)){

// 画图蛇头

Images.down.paintIcon(this,g,snakeX[0],snakeY[0]);

}

}

@Override

public void keyTyped(KeyEvent e) {

// TODO Auto-generated method stub

}

/*

  • 按键方法:实现按键监听

*/

@Override

public void keyPressed(KeyEvent e) {

// TODO Auto-generated method stub

// 获取玩家按键的键盘码

int keyCode = e.getKeyCode();

if (keyCode == KeyEvent.VK_SPACE){

if (isDied) {

init();

}else {

isStart = !isStart;

}

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

一份还热乎的蚂蚁金服面经(已拿Offer)面试流程4轮技术面+1轮HR

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

面试建议是,一定要自信,敢于表达,面试的时候我们对知识的掌握有时候很难面面俱到,把自己的思路说出来,而不是直接告诉面试官自己不懂,这也是可以加分的。

以上就是蚂蚁技术四面和HR面试题目,以下最新总结的最全,范围包含最全MySQL、Spring、Redis、JVM等最全面试题和答案,仅用于参考

[外链图片转存中…(img-XLPmhhXj-1712133139844)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

  • 27
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值