• GUI:贪吃蛇


    以上是准备工作

    Data

    1. import javax.swing.*;
    2. import java.net.URL;
    3. public class Data {
    4. public static URL headerURL=Data.class.getResource("static/header.png");
    5. public static ImageIcon header =new ImageIcon(headerURL);
    6. public static URL upURL=Data.class.getResource("static/up.png");
    7. public static URL downURL=Data.class.getResource("static/down.png");
    8. public static URL leftURL=Data.class.getResource("static/left.png");
    9. public static URL rightURL=Data.class.getResource("static/right.png");
    10. public static ImageIcon up =new ImageIcon(upURL);
    11. public static ImageIcon down =new ImageIcon(downURL);
    12. public static ImageIcon left =new ImageIcon(leftURL);
    13. public static ImageIcon right =new ImageIcon(rightURL);
    14. public static URL bodyURL=Data.class.getResource("static/body.png");
    15. public static ImageIcon body =new ImageIcon(bodyURL);
    16. public static URL foodURL=Data.class.getResource("static/food.png");
    17. public static ImageIcon food =new ImageIcon(foodURL);
    18. }

    GamePanel

    1. import javax.swing.*;
    2. import java.awt.*;
    3. import java.awt.event.ActionEvent;
    4. import java.awt.event.ActionListener;
    5. import java.awt.event.KeyEvent;
    6. import java.awt.event.KeyListener;
    7. import java.util.Random;
    8. public class GamePanel extends JPanel implements KeyListener , ActionListener {
    9. //定义蛇的数据结构
    10. int length;//蛇的长度
    11. // 蛇的x,y坐标
    12. int[]snakeX=new int[600];
    13. int[]snakeY=new int[500];
    14. String fx;
    15. //游戏当前的状态:开始,停止
    16. boolean isStart=false;//默认是不开始
    17. boolean isFail=false;//游戏结果的状态
    18. int score;
    19. int foody,foodx;
    20. Random random=new Random();
    21. //定时器 ms为单位 1000ms=1s
    22. Timer timer=new Timer(100,this);
    23. //构造器
    24. public GamePanel(){
    25. init();
    26. //获得焦点和键盘事件
    27. this.setFocusable(true);
    28. this.addKeyListener(this);
    29. timer.start();//游戏qidong
    30. }
    31. public void init(){
    32. length=3;
    33. snakeX[0]=100;snakeY[0]=100;//脑袋坐标
    34. snakeX[1]=75;snakeY[1]=100;//第一个身体的坐标
    35. snakeX[2]=50;snakeY[2]=100;//第二个身体的坐标
    36. fx="R";//inti向右
    37. //随机分布food
    38. foodx=25+25*random.nextInt(34);
    39. foody=75+25*random.nextInt(24);
    40. score=0;
    41. }
    42. @Override
    43. protected void paintComponent(Graphics g) {
    44. super.paintComponent(g);//清屏
    45. //绘制静态的面板
    46. this.setBackground(Color.WHITE);
    47. Data.header.paintIcon(this,g,25,11);//画头部广告
    48. g.fillRect(25,75,850,600);//默认的游戏界面
    49. //画积分
    50. g.setColor(Color.WHITE);
    51. g.setFont(new Font("微软雅黑",Font.BOLD,18));
    52. g.drawString("长度 "+length,750,30);
    53. g.drawString("积分 "+score,750,55);
    54. //画食物
    55. Data.food.paintIcon(this,g,foodx,foody);
    56. //把小蛇画上去
    57. if(fx.equals("R")){
    58. Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右
    59. }
    60. else if(fx.equals("L")){
    61. Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向L
    62. }
    63. else if(fx.equals("U")){
    64. Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向UP
    65. }
    66. else if(fx.equals("D")){
    67. Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向down
    68. }
    69. for(int i=1;i<length;i++){
    70. Data.body.paintIcon(this,g,snakeX[i],snakeY[i] );
    71. }
    72. //游戏状态
    73. if(isStart==false){
    74. g.setColor(Color.white);
    75. g.setFont(new Font("微软雅黑",Font.BOLD,30));
    76. g.drawString("Pressed the Blank Key Begin Game",300,300);
    77. }
    78. //游戏结束
    79. if(isFail){
    80. g.setColor(Color.RED);
    81. g.setFont(new Font("微软雅黑",Font.BOLD,30));
    82. g.drawString("The Game Is Failed",250,300);
    83. }
    84. }
    85. @Override
    86. public void keyPressed(KeyEvent e) {
    87. int keyCode=e.getKeyCode();//获得键盘参数
    88. //空格开始
    89. if(keyCode==KeyEvent.VK_SPACE){
    90. if(isFail){
    91. isFail=false;
    92. }else{
    93. isStart=!isStart;}
    94. repaint();
    95. }
    96. //小蛇移动
    97. if(keyCode==KeyEvent.VK_UP){
    98. fx="U";
    99. } else if (keyCode==KeyEvent.VK_DOWN) {
    100. fx="D";
    101. }else if (keyCode==KeyEvent.VK_LEFT) {
    102. fx="L";
    103. }else if (keyCode==KeyEvent.VK_RIGHT) {
    104. fx="R";
    105. }
    106. //走向
    107. if(fx.equals("R")){
    108. snakeX[0]=snakeX[0]+25;
    109. if(snakeX[0]>850){snakeX[0]=25;}//边界判断
    110. }else if(fx.equals("L")){
    111. snakeX[0]=snakeX[0]-25;
    112. if(snakeX[0]<25){snakeX[0]=850;}//边界判断
    113. }else if(fx.equals("U")){
    114. snakeY[0]=snakeY[0]-25;
    115. if(snakeY[0]<75){snakeY[0]=650;}//边界判断
    116. }else if(fx.equals("D")){
    117. snakeY[0]=snakeY[0]+25;
    118. if(snakeY[0]>650){snakeY[0]=75;}//边界判断
    119. }
    120. }
    121. @Override
    122. public void actionPerformed(ActionEvent e) {
    123. if(isStart&&isFail==false){
    124. for (int i = length-1; i >0 ; i--) {
    125. snakeX[i]=snakeX[i-1];
    126. snakeY[i]=snakeY[i-1];
    127. }
    128. if(snakeX[0]==foodx&&snakeY[0]==foody){
    129. length++;
    130. score+=10;
    131. //重置食物
    132. foodx=25+25*random.nextInt(34);
    133. foody=75+25*random.nextInt(24);
    134. }
    135. //头部走向
    136. if(fx.equals("R")){
    137. snakeX[0] = snakeX[0]+25; //头部右移25个单位(即一格)
    138. if(snakeX[0]>850){ //边界判断:如果蛇右移到了边界,则回到左边
    139. snakeX[0] = 25;
    140. }
    141. }else if(fx.equals("L")){
    142. snakeX[0] = snakeX[0]-25; //头部左移25个单位(即一格)
    143. if(snakeX[0]<25){snakeX[0] = 850;} //边界判断
    144. }else if(fx.equals("U")){
    145. snakeY[0] = snakeY[0]-25; //向上移动应该是-25
    146. if(snakeY[0]<75){snakeY[0] = 650;} //边界判断
    147. }else if(fx.equals("D")){
    148. snakeY[0] = snakeY[0]+25; //向下移动
    149. if(snakeY[0]>650){snakeY[0] = 75;} //边界判断
    150. }
    151. for (int i = 1; i < length; i++) { //头部与身体的某一节坐标重合,即撞到自己
    152. if(snakeX[0] == snakeX[i] && snakeY[0]==snakeY[i]){
    153. isFail=true;
    154. init();
    155. }
    156. }
    157. repaint();
    158. }
    159. timer.start();
    160. }
    161. @Override
    162. public void keyReleased(KeyEvent e) {
    163. }
    164. @Override
    165. public void keyTyped(KeyEvent e) {
    166. }
    167. }

    StartGame

    1. import javax.swing.*;
    2. public class StartGame {
    3. public static void main(String[] args) {
    4. JFrame frame=new JFrame();
    5. frame.setBounds(10,10,900,720);
    6. //窗口设置大小固定
    7. frame.setResizable(false);
    8. frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    9. //正常游戏界面都应该在面上
    10. frame.add(new GamePanel());
    11. frame.setVisible(true);
    12. }
    13. }

  • 相关阅读:
    基于BP-Adaboost神经网络的高斯函数模型预测研究-含Matlab代码
    Java Web开发环境配置
    使用c++视觉处理----canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测
    【填坑】乐鑫ESP32C3 Bootloader开发(上)
    3 万亿美元,苹果问鼎全球市值最高公司宝座
    微信小程序登录授权流程及所用API
    Hangfire Pro 2022-08-31 update
    Linux—-vim基础使用
    vue 实现级联选择器功能
    艾美捷Bio-Helix CCH321 超敏ECL化学发光试剂盒(皮克级)特点
  • 原文地址:https://blog.csdn.net/2201_75903640/article/details/134220987