idea编译器
exe4j
package com.lhy.snake;
import javax.swing.*;
public class StartGames {
public static void main(String[] args){
JFrame frame = new JFrame("贪吃蛇"); //创建一个JFARME窗口
frame.setBounds(100,100,915,735); //窗口起始位置在100,100,窗口大小为915,735
frame.setResizable(false); //设置窗口大小不可以改变
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗口关闭程序结束
frame.setVisible(true); //窗口可见
frame.add(new GamePanel()); //像窗口中添加一个画板,GamePanel为自建类
}
}
package com.lhy.snake;
import javax.swing.*;
import java.net.URL;
public class Data {
public static URL headerUrl =Data.class.getResource("/statics/header.png"); //定位图片地址
public static URL upUrl =Data.class.getResource("/statics/up.png");
public static URL downUrl =Data.class.getResource("/statics/down.png");
public static URL rightUrl =Data.class.getResource("/statics/right.png");
public static URL leftUrl =Data.class.getResource("/statics/left.png");
public static URL bodyUrl =Data.class.getResource("/statics/body.png");
public static URL foodUrl =Data.class.getResource("/statics/food.png");
public static ImageIcon header = new ImageIcon(headerUrl); //获取图片
public static ImageIcon down = new ImageIcon(downUrl);
public static ImageIcon up = new ImageIcon(upUrl);
public static ImageIcon right = new ImageIcon(rightUrl);
public static ImageIcon left = new ImageIcon(leftUrl);
public static ImageIcon body = new ImageIcon(bodyUrl);
public static ImageIcon food = new ImageIcon(foodUrl);
//获取了全部游戏需要的图片素材
}
//定义数据
int lenth; //身体长度
int[]snakeX = new int[600]; //身体数组
int[]snakeY = new int[600];
String fx; //方向
boolean isStart = false; //游戏是否开始
Timer timer = new Timer(100,this);//设置计时器的过程包括创建一个 Timer 对象,在该对象上注册一个或多个动作侦听器,以及使用 start 方法启动该计时器。
//定义一个食物
int foodX;
int foodY;
Random random=new Random(); //创建一个随机数生成对象
//死亡判断
boolean isFail = false;
//积分系统
int score;
public GamePanel(){ //构造器
init(); //初始化函数
//获取键盘的监听事件
this.setFocusable(true);
this.addKeyListener(this);
}
public void init(){
//初始化
lenth=3; //起始长度为3格
snakeX[0]=100; snakeY[0]=100; //头部坐标
snakeX[1]=75; snakeY[1]=100; //身体坐标
snakeX[2]=50; snakeY[2]=100;
fx="R"; //起始方向向右
timer.start(); //计时器启动
foodX =25 +25*random.nextInt(34); //随机生成食物
foodY =75 +25*random.nextInt(24);
score=0; //起始分数为0
}
protected void paintComponent(Graphics g){
super.paintComponent(g);//清屏
this.setBackground(Color.white);//黑色背景
//绘制头部
Data.header.paintIcon(this,g,25,10);
//绘制游戏区域
g.fillRect(25,75,850,600); //绘制一个正方形区域 起始位置27,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("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("D")){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for(int i=1;i<lenth;i++){ //绘制身体部分
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//画食物
Data.food.paintIcon(this,g,foodX,foodY);
//游戏提示是否开始
if(isStart==false){
//画一个文字String
g.setColor(Color.WHITE);//设置画笔颜色
g.setFont(new Font("温软雅黑",Font.BOLD,40)); //设置字体
g.drawString("按下空格开始游戏",300,300); //在300 300的位置写下字符串
}
//失败提醒
if(isFail==true){
g.setColor(Color.RED);//设置画笔颜色
g.setFont(new Font("温软雅黑",Font.BOLD,40)); //设置字体
g.drawString("游戏结束,按下空格重新开始",150,300);
}
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("温软雅黑",Font.BOLD,18)); //设置字体
g.drawString(" "+score,500,50);
}
@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.equals("R"))){ //根据按键方向修改蛇的前进路线
fx="L";
}else if(keyCode==KeyEvent.VK_RIGHT&&!(fx.equals("L"))){
fx="R";
}else if(keyCode==KeyEvent.VK_UP&&!(fx.equals("D"))){
fx="U";
}else if(keyCode==KeyEvent.VK_DOWN&&!(fx.equals("U"))){
fx="D";
}
}
//定时器,监听时间
@Override
public void actionPerformed(ActionEvent e) {
//执行定时操作
//如果游戏处于开始状态 并且游戏没有失败
if(isStart && !isFail){
//右移
for(int i=lenth-1;i>0;i--){//除了脑袋身体向前移动
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//通过控制方向让头部移动
if(fx.equals("R")){
snakeX[0]+=25; //头部移动
if(snakeX[0]>850){
snakeX[0]=25;
}
}else if(fx.equals("L")){
snakeX[0]-=25; //头部移动
if(snakeX[0]<25){
snakeX[0]=850;
}
}else if(fx.equals("U")){
snakeY[0]-=25; //头部移动
if(snakeY[0]<75){
snakeY[0]=650;
}
}else if(fx.equals("D")){
snakeY[0]+=25; //头部移动
if(snakeY[0]>650){
snakeY[0]=75;
}
}
//如果头和食物坐标重合
if(snakeX[0]==foodX&&snakeY[0]==foodY){
lenth++;
score++;
//重新生成食物
foodX =25 +25*random.nextInt(34);
foodY =75 +25*random.nextInt(24);
}
for(int i=1;i<lenth;i++){ //判断头部是否与身体重合 如果重合isFail变为true
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail=true;
}
}
//刷新界面
repaint();
}
timer.start();//让时间动起来
}
package com.lhy.snake;
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 GamePanel extends JPanel implements KeyListener, ActionListener {
int lenth; //身体长度
int[]snakeX = new int[600]; //身体数组
int[]snakeY = new int[600];
String fx;
boolean isStart = false;
Timer timer = new Timer(100,this);//定时器
//定义一个食物
int foodX;
int foodY;
Random random=new Random();
//死亡判断
boolean isFail = false;
//积分系统
int score;
public GamePanel(){ //构造器
init();
//获取键盘的监听事件
this.setFocusable(true);
this.addKeyListener(this);
}
public void init(){
//初始化
lenth=3;
snakeX[0]=100; snakeY[0]=100; //头部坐标
snakeX[1]=75; snakeY[1]=100;
snakeX[2]=50; snakeY[2]=100;
fx="R";
timer.start();
foodX =25 +25*random.nextInt(34);
foodY =75 +25*random.nextInt(24);
score=0;
}
//画板
protected void paintComponent(Graphics g){
super.paintComponent(g);//清屏
this.setBackground(Color.white);//黑色背景
//绘制头部
Data.header.paintIcon(this,g,25,10);
//绘制游戏区域
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("U")){
Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
}else if(fx.equals("D")){
Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);
}
for(int i=1;i<lenth;i++){
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]);
}
//画食物
Data.food.paintIcon(this,g,foodX,foodY);
//游戏提示是否开始
if(isStart==false){
//画一个文字String
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("游戏结束,按下空格重新开始",150,300);
}
g.setColor(Color.BLACK);//设置画笔颜色
g.setFont(new Font("温软雅黑",Font.BOLD,18)); //设置字体
g.drawString(" "+score,500,50);
}
//监听键盘的输入
@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.equals("R"))){
fx="L";
}else if(keyCode==KeyEvent.VK_RIGHT&&!(fx.equals("L"))){
fx="R";
}else if(keyCode==KeyEvent.VK_UP&&!(fx.equals("D"))){
fx="U";
}else if(keyCode==KeyEvent.VK_DOWN&&!(fx.equals("U"))){
fx="D";
}
}
//定时器,监听时间
@Override
public void actionPerformed(ActionEvent e) {
//执行定时操作
//如果游戏处于开始状态 并且游戏没有失败
if(isStart && !isFail){
//右移
for(int i=lenth-1;i>0;i--){//除了脑袋身体向前移动
snakeX[i]=snakeX[i-1];
snakeY[i]=snakeY[i-1];
}
//通过控制方向让头部移动
if(fx.equals("R")){
snakeX[0]+=25; //头部移动
if(snakeX[0]>850){
snakeX[0]=25;
}
}else if(fx.equals("L")){
snakeX[0]-=25; //头部移动
if(snakeX[0]<25){
snakeX[0]=850;
}
}else if(fx.equals("U")){
snakeY[0]-=25; //头部移动
if(snakeY[0]<75){
snakeY[0]=650;
}
}else if(fx.equals("D")){
snakeY[0]+=25; //头部移动
if(snakeY[0]>650){
snakeY[0]=75;
}
}
//如果头和食物坐标重合
if(snakeX[0]==foodX&&snakeY[0]==foodY){
lenth++;
score++;
//重新生成食物
foodX =25 +25*random.nextInt(34);
foodY =75 +25*random.nextInt(24);
}
for(int i=1;i<lenth;i++){
if(snakeX[0]==snakeX[i] && snakeY[0]==snakeY[i]){
isFail=true;
}
}
//刷新界面
repaint();
}
timer.start();//让时间动起来
}
@Override
public void keyReleased(KeyEvent e) {
//释放某个键
}
@Override
public void keyTyped(KeyEvent e) {
//键盘按下弹起
}
}
点击此处
这样就导出了jar包 可以在cmd中运行 也可以继续打包成exe文件
https://jingyan.baidu.com/article/0964eca2a3a07f8285f536a4.html