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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)
最后
一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。
这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。
请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!
d303032d36.jpg" alt=“img” style=“zoom: 33%;” />
最后
一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。
这不,马上就要到招聘季了,很多朋友又开始准备“金三银四”的春招啦,那我想这份“java高分面试指南”应该起到不小的作用,所以今天想给大家分享一下。
[外链图片转存中…(img-2w3pFADs-1712033005724)]
请注意:关于这份“java高分面试指南”,每一个方向专题(25个)的题目这里几乎都会列举,在不看答案的情况下,大家可以自行测试一下水平 且由于篇幅原因,这边无法展示所有完整的答案解析
《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门即可获取!