匿名内部类:
package six;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class six {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame{
public MyFrame(){
setBackground(Color.blue);
setBounds(300,300,300,300);
setVisible(true);
this.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.out.println("匿名内部类");
}
});
}
}
内部类:
class MyFrame extends Frame{
public MyFrame(){
setBackground(Color.blue);
setBounds(300,300,300,300);
setVisible(true);
}
class MyWindowListener extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
System.out.println("内部类");
}
}
}
目录
1.图纸设计:
2.静态页面绘制:
窗口
public class snake {
public static void main(String[] args) {
// 绘制静态窗口
JFrame frame = new JFrame("贪吃神");
// 设置界面大小
frame.setBounds(10,10,920,720);
frame.setResizable(false); //窗口大小不可变
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
创建画板
package cao;
import javax.swing.*;
import java.awt.*;
public class GamePanle extends JPanel {
// 画板:画🐍
//Graphics 画笔
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏
this.setBackground(Color.black);
Data.header.paintIcon(this,g,25,11);// 绘制头部栏
g.fillRect(25,75,850,600);// 绘制游戏区域
}
}
创建data存放数据:
package cao;
import javax.swing.*;
import java.net.URL;
//存放数据
public class Data {
// 头部
public static URL headerUrl=Data.class.getResource("/statics/header.png");
public static ImageIcon header=new ImageIcon(headerUrl);
// 🐍的头部
public static URL upUrl=Data.class.getResource("/statics/up.png");
public static URL downUrl=Data.class.getResource("/statics/down.png");
public static URL leftUrl=Data.class.getResource("/statics/left.png");
public static URL rightUrl=Data.class.getResource("/statics/right.png");
public static ImageIcon up=new ImageIcon(upUrl);
public static ImageIcon down=new ImageIcon(downUrl);
public static ImageIcon left=new ImageIcon(leftUrl);
public static ImageIcon right=new ImageIcon(rightUrl);
// 身体
public static URL bodyUrl=Data.class.getResource("/statics/body.png");
public static ImageIcon body=new ImageIcon(bodyUrl);
// 食物
public static URL foodUrl=Data.class.getResource("/statics/food.png");
public static ImageIcon food=new ImageIcon(foodUrl);
}
3.让🐍动起来:
定义🐍的长度和坐标并初始化:
int length; //🐍的长度
int[] snakeX=new int[1000]; //🐍的x坐标
int[] snakeY=new int[1000]; //y坐标
//初始化
public void init(){
length=3;
snakeX[0]=100;
snakeY[0]=100;
snakeX[1]=75;
snakeY[1]=100;
snakeX[2]=50;
snakeY[2]=100;
}
创建构造器:(调用init()初始化方法)
// 构造器调用初始化方法
public GamePanle(){
init();
};
使用画笔
// 画一条静态🐍
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
Data.body.paintIcon(this,g,snakeX[1],snakeY[1]);
Data.body.paintIcon(this,g,snakeX[2],snakeY[2]);
改进:
// 画一条静态🐍
if(fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals(("L"))){
Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
}else if(fx.equals(("D"))){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals(("U"))){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for (int i=1;i<length;i++){
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); //🐍的长度,使用for循环动态增加
}
游戏开始提示界面:
boolean isStart=false; //游戏是否开始
@Override
protected void paintComponent(Graphics g) {
// 游戏提示:是否开始
if(isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //设置字体
g.drawString("按下空格开始游戏",300,300);
}
}
在构造器中实现:
// 构造器调用初始化方法
public GamePanle(){
init();
// 获取键盘的监听事件
this.setFocusable(true);
this.addKeyListener(this);
}
设置计时器 Timer timer=new Timer(100, this); //this为当前窗口
// 定时器 执行定时操作
@Override
public void actionPerformed(ActionEvent e) {
if(isStart){
// 右移
for(int i=length-1;i>0;i--){ //除了头部都向前移动 头部是1,所以要i=length-1
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
// 边界判断
if(snakeX[0]>850){
snakeX[0]=25;
}
snakeX[0]=snakeX[0]+25; //头部移动
repaint(); //重新绘制界面
}
}
timer.start(); //计时器开始
实现上下左右动:
// 接受键盘输入
@Override
public void keyPressed(KeyEvent e) {
// 键盘按下 未释放
int keyCode = e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){
isStart=!isStart;
repaint(); //重新绘制界面
}
if(keyCode==KeyEvent.VK_LEFT){
fx="L";
}else if(keyCode==KeyEvent.VK_RIGHT){
fx="R";
}else if(keyCode==KeyEvent.VK_UP){
fx="U";
}else if(keyCode==KeyEvent.VK_DOWN){
fx="D";
}
}
计时器:
// 定时器 执行定时操作
@Override
public void actionPerformed(ActionEvent e) {
if(isStart){
// 右移
for(int i=length-1;i>0;i--){ //除了头部都向前移动 头部是1,所以要i=length-1
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
// 通过控制方向让头部移动
if(fx.equals("R")){
snakeX[0]=snakeX[0]+25; //头部移动
if(snakeX[0]>850){ // 边界判断
snakeX[0]=25;
}
}else if(fx.equals("L")){
snakeX[0]=snakeX[0]-25; //头部移动
if(snakeX[0]<25){ // 边界判断
snakeX[0]=850;
}
}else if(fx.equals("U")){
snakeY[0]=snakeY[0]-25; //头部移动
if(snakeY[0]<75){ // 边界判断
snakeY[0]=600;
}
}else if(fx.equals("D")){
snakeY[0]=snakeY[0]+25; //头部移动
if(snakeY[0]>600){ // 边界判断
snakeY[0]=75;
}
}
4.吃东西
// 定义一个食物
int foodX;
int foodY;
Random random=new Random();
//在初始化中生成食物
foodX=25+25*random.nextInt(34);
foodY=75+25*random.nextInt(34);
// 画食物
Data.food.paintIcon(this,g,foodX,foodY);
//定时器中
//如果食物和🐍重合
if(snakeX[0]==foodX && snakeY[0]==foodY){
length++;
foodX=25+25*random.nextInt(34); //重新生成食物
foodY=75+25*random.nextInt(34);
}
5.死亡判断
// 死亡判断
boolean isFail=false;
// 失败提醒
if(isFail==true){
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //设置字体
g.drawString("失败",300,300);
}
if(keyCode==KeyEvent.VK_SPACE){
if(isFail){
isFail=false; //如果失败重新绘制
init();
}else {
isStart=!isStart;
}
repaint(); //重新绘制界面
}
// 结束判断
for(int i=1;i<length;i++){
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail=true;
}
}
6.积分展示
1.创建int类型的分数
2.初始化为0
3.画分数和长度
4.于食物碰撞,分数+10
完整代码:
package cao;
import javax.swing.*;
public class snake {
public static void main(String[] args) {
// 绘制静态窗口
JFrame frame = new JFrame("贪吃神");
// 设置界面大小
frame.setBounds(10,10,920,720);
frame.setResizable(false); //窗口大小不可变
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 2.画板
frame.add(new GamePanle());
frame.setVisible(true);
}
}
package cao;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GamePanle extends JPanel implements KeyListener, ActionListener {
int length; //🐍的长度
int[] snakeX=new int[1000]; //🐍的x坐标
int[] snakeY=new int[1000]; //y坐标
String fx; //右方向
boolean isStart=false; //游戏是否开始
Timer timer=new Timer(100, this); //this为当前窗口
// 定义一个食物
int foodX;
int foodY;
Random random=new Random();
// 死亡判断
boolean isFail=false;
//积分
int score;
// 构造器调用初始化方法
public GamePanle(){
init();
// 获取键盘的监听事件
this.setFocusable(true);
this.addKeyListener(this);
timer.start(); //时间动起来
}
//初始化
public void init(){
length=3;
snakeX[0]=100;
snakeY[0]=100;
snakeX[1]=75;
snakeY[1]=100;
snakeX[2]=50;
snakeY[2]=100;
fx="R";
foodX=25+25*random.nextInt(34);
foodY=75+25*random.nextInt(34);
score=0;
}
// 画板:画🐍
//Graphics 画笔
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏
this.setBackground(Color.black);
Data.header.paintIcon(this,g,25,11);// 绘制头部栏
g.fillRect(25,75,850,600);// 绘制游戏区域
// 画一条静态🐍
if(fx.equals("R")){
Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals(("L"))){
Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);
}else if(fx.equals(("D"))){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals(("U"))){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for (int i=1;i<length;i++){
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); //🐍的长度
}
// 画食物
Data.food.paintIcon(this,g,foodX,foodY);
//话积分
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,18)); //设置字体
g.drawString("长度:"+length,750,35);
g.drawString("分数:"+score,750,50);
// 游戏提示:是否开始
if(isStart==false){
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //设置字体
g.drawString("按下空格开始游戏",300,300);
}
// 失败提醒
if(isFail==true){
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //设置字体
g.drawString("失败",300,300);
}
}
// 接受键盘输入
@Override
public void keyPressed(KeyEvent e) {
// 键盘按下 未释放
int keyCode = e.getKeyCode();
if(keyCode==KeyEvent.VK_SPACE){
if(isFail){
isFail=false; //如果失败重新绘制
init();
}else {
isStart=!isStart;
}
repaint(); //重新绘制界面
}
if(keyCode==KeyEvent.VK_LEFT){
fx="L";
}else if(keyCode==KeyEvent.VK_RIGHT){
fx="R";
}else if(keyCode==KeyEvent.VK_UP){
fx="U";
}else if(keyCode==KeyEvent.VK_DOWN){
fx="D";
}
}
// 定时器 执行定时操作
@Override
public void actionPerformed(ActionEvent e) {
if(isStart && isFail==false){
// 右移
for(int i=length-1;i>0;i--){ //除了头部都向前移动 头部是1,所以要i=length-1
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
// 通过控制方向让头部移动
if(fx.equals("R")){
snakeX[0]=snakeX[0]+25; //头部移动
if(snakeX[0]>850){ // 边界判断
snakeX[0]=25;
}
}else if(fx.equals("L")){
snakeX[0]=snakeX[0]-25; //头部移动
if(snakeX[0]<25){ // 边界判断
snakeX[0]=850;
}
}else if(fx.equals("U")){
snakeY[0]=snakeY[0]-25; //头部移动
if(snakeY[0]<75){ // 边界判断
snakeY[0]=650;
}
}else if(fx.equals("D")){
snakeY[0]=snakeY[0]+25; //头部移动
if(snakeY[0]>650){ // 边界判断
snakeY[0]=75;
}
}
//如果食物和🐍重合
if(snakeX[0]==foodX && snakeY[0]==foodY){
length++;
score+=10;
foodX=25+25*random.nextInt(34); //重新生成食物
foodY=75+25*random.nextInt(34);
}
// 结束判断
for(int i=1;i<length;i++){
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail=true;
}
}
repaint(); //重新绘制界面
}
timer.start(); //时间动起来
}
@Override
public void keyTyped(KeyEvent e) {
// 键盘按下 弹起
}
@Override
public void keyReleased(KeyEvent e) {
// 释放某个建
}
}
package cao;
import javax.swing.*;
import java.net.URL;
//存放数据
public class Data {
// 头部
public static URL headerUrl=Data.class.getResource("/statics/header.png");
public static ImageIcon header=new ImageIcon(headerUrl);
// 🐍的头部
public static URL upUrl=Data.class.getResource("/statics/up.png");
public static URL downUrl=Data.class.getResource("/statics/down.png");
public static URL leftUrl=Data.class.getResource("/statics/left.png");
public static URL rightUrl=Data.class.getResource("/statics/right.png");
public static ImageIcon up=new ImageIcon(upUrl);
public static ImageIcon down=new ImageIcon(downUrl);
public static ImageIcon left=new ImageIcon(leftUrl);
public static ImageIcon right=new ImageIcon(rightUrl);
// 身体
public static URL bodyUrl=Data.class.getResource("/statics/body.png");
public static ImageIcon body=new ImageIcon(bodyUrl);
// 食物
public static URL foodUrl=Data.class.getResource("/statics/food.png");
public static ImageIcon food=new ImageIcon(foodUrl);
}