赞
踩
大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。
关注公号“陈橘又青”,后台回复“贪吃蛇”获取完整源代码!
“贪吃蛇大作战”游戏是一个经典的游戏,它因操作简单、娱乐性强,自从计算机实现以来,深受广大电脑玩家的喜爱,本项目基于Java技术,开发了一个 操作简单、界面美观、功能较齐全 的“贪吃蛇”游戏。通过本游戏的开发,达到学习Java技术和熟悉软件开发流程的目的。
本系统主要是完成贪吃蛇游戏的基本操作,用户可自己练习和娱乐。需要满足以下几点要求:
(1)利用方向键来改变蛇的运行方向。
(2)空格键暂停或继续游戏,并在随机的地方产生食物。
(3)吃到食物就变成新的蛇体(蛇身长度变长,游戏继续)。
(1)绘制窗体对象。
(2)静态UI设计(包括小蛇,食物,游戏区域和标题区域)。
(3)使用键盘监听事件和定时器实现小蛇的移动。
(4)小蛇与食物碰撞的实现。
(5)定义变量存放小蛇长度,遍历数组实现小蛇身体的增加功能。
(6)退出条件:当游戏积分到达指定分数,游戏退出。
- package Demo;
- /**
- * 1.画出窗体对象
- *
- *
- * @author 青00-Java
- *
- */
- public class Demo0 {
-
- }
- package Demo;
-
- import java.awt.Color;
- import java.awt.Component;
- 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.Random;
-
- import javax.swing.ImageIcon;
- import javax.swing.JPanel;
- import javax.swing.Timer;
- //画布类
- public class MyPanel extends JPanel implements KeyListener,ActionListener{//继承
- private static final Component This = null;
- //键盘监听交互接口
- int length;
- int score;
- int[] snakeX=new int[500];//坐标
- int[] snakeY=new int[500];
- String fx;
- boolean ifStart=false;
- //定时器
- Timer timer =new Timer(100,this);
- int foodx;
- int foody;
- Random random =new Random();
-
- public MyPanel(){
- init();
- //添加监听事件
- this.setFocusable(true);
- this.addKeyListener(this);
- score=0;
- }
- public void init(){
- length=3;
- fx="r";
- //初始化小蛇的位置
- snakeX[0]=100;
- snakeY[0]=150;
- snakeX[1]=75;
- snakeY[1]=150;
- snakeX[2]=50;
- snakeY[2]=150;
- foodx=25+25*random.nextInt(57);
- foody=125+25*random.nextInt(27);
- System.out.println(foodx);
- System.out.println(foody);
- timer.start();
- }
- @Override
- protected void paintComponent(Graphics g){//画笔对象
- super.paintComponent(g);
- //绘制顶部的标题
- new ImageIcon("C:/Users/Desktop/img/title2.png").paintIcon(this,g,25,11);//创建对象
- //绘制游戏区域
- g.fillRect(25, 125, 1450, 700);
- //绘制小蛇
- //蛇头
- new ImageIcon("C:/Users/Desktop/img/l.png").paintIcon(this, g, snakeX[0], snakeY[0]);
-
- //蛇身
- for(int i=1;i<length;i++){
- new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(This, g, snakeX[i], snakeY[i]);
- }
- //游戏的提示语
- if(ifStart==false){
- g.setColor(Color.white);
- g.setFont(new Font("微软雅黑",Font.BOLD,40));
- g.drawString("按压空格键继续游戏", 550,500);
- g.drawString("无尽模式", 650,400);
- }
- //画出食物的位置
- new ImageIcon("C:/Users/Desktop/img/body.png").paintIcon(this, g, foodx, foody);
- }
-
- @Override//按压
- public void keyPressed(KeyEvent e) {
- int keyCode=e.getKeyCode();
- if(keyCode==KeyEvent.VK_SPACE){
- ifStart=!ifStart;
- }
- if(ifStart==true){
- if(keyCode==KeyEvent.VK_LEFT&&fx!="r"){
- fx="l";
- }else if(keyCode==KeyEvent.VK_RIGHT&&fx!="l"){
- fx="r";
- }else if(keyCode==KeyEvent.VK_UP&&fx!="d"){
- fx="u";
- }else if(keyCode==KeyEvent.VK_DOWN&&fx!="u"){
- fx="d";
- }
- }
- repaint();
- }
- @Override
- public void actionPerformed(ActionEvent e) {
- //改变蛇的位置
- if(ifStart==true){
- for(int i=length-1;i>0;i--){
- snakeX[i]=snakeX[i-1];
- snakeY[i]=snakeY[i-1];
- }
- if(fx.equals("l")){
- snakeX[0]=snakeX[0]-25;
- if(snakeX[0]<25){
- snakeX[0]=1450;
- }
- }else if(fx.equals("r")){
- snakeX[0]=snakeX[0]+25;
- if(snakeX[0]>1450){
- snakeX[0]=25;
- }
- }else if(fx.equals("u")){
- snakeY[0]=snakeY[0]-25;
- if(snakeY[0]<120){
- snakeY[0]=800;
- }
- }else if(fx.equals("d")){
- snakeY[0]=snakeY[0]+25;
- if(snakeY[0]>800){
- snakeY[0]=120;
- }
- }
- //判断是否吃了食物
- if(snakeX[0]==foodx&&snakeY[0]==foody){
- length++;
- score++;
- if(score==100){
- ifStart=!ifStart;
- }
- foodx=25+25*random.nextInt(57);
- foody=125+25*random.nextInt(27);
- System.out.print("当前食物坐标("+foodx+",");
- System.out.print(foody+")");
- System.out.println("|||当前分数:"+score+" ");
- }
- repaint();
- }
- timer.start();
- }
-
- @Override
- public void keyReleased(KeyEvent arg0) {
- // TODO Auto-generated method stub
-
- }
- @Override
- public void keyTyped(KeyEvent arg0) {
- // TODO Auto-generated method stub
-
- }
- }
- package Demo;
-
- import javax.swing.JFrame;
-
- public class Ui {
-
- public static void main(String[] args){
- JFrame frame=new JFrame("无尽版贪吃蛇");
- frame.setSize(1500, 900);
- frame.setLocationRelativeTo(null);//居中显示
- frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- frame.setResizable(true);
- frame.add(new MyPanel());
- frame.setVisible(true);
- }
-
- }
本程序用于初学者学习,共封装三个类,分别是Demo类,MyPanel类,框架Ui类,结构简单,所有方法均在MyPanel类中实现。
本游戏的设计思路类似于游戏“贪吃蛇大作战”,程序在一些功能的实现上还存在许多不足,但该项目的实现对Java新手的实战能力有很大的提升。
在使用Java编写该项目时遇到了很多问题,在解决问题时,可以对java的面向对象编程有更加深入的理解和认识。
所用图片:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。