- 浏览: 465999 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
ty1972873004:
sunwang810812 写道我运行了这个例子,怎么结果是这 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
lgh1992314:
simpleDean 写道请问,Logger.setLevel ...
Java内置Logger详解 -
sunwang810812:
我运行了这个例子,怎么结果是这样的:2号车泊车6号车泊车5号车 ...
Java并发编程: 使用Semaphore限制资源并发访问的线程数 -
jp260715007:
nanjiwubing123 写道参考你的用法,用如下方式实现 ...
面试题--三个线程循环打印ABC10次的几种解决方法 -
cb_0312:
SurnameDictionary文章我没看完,现在懂了
中文排序
本文将提供一个Swing版本的贪吃蛇游戏,游戏包括最基本的功能:
1. 用Timer来管理贪吃蛇线程。
2. 实现按钮,键盘的事件响应。
3. 随机产生食物。
4. 游戏结束的判断:蛇头触碰到蛇身或者蛇头触碰到边界。
5. 实现游戏过程中的暂停以及贪吃蛇运行速度调整。
6. … …
程序界面如下:左边是贪吃蛇运行的范围,右边暂时只有分数信息,当蛇吃到食物的时候分数加10.
暂停,调整蛇体运行速度界面如下:
主要的代码如下:
package my.games.snake.model; import java.awt.Color; import java.awt.Graphics2D; import java.awt.geom.Rectangle2D; import java.io.Serializable; import my.games.snake.contants.SnakeGameConstant; /** * * 贪吃蛇游戏用到的格子类 * * @author Eric * */ public class Grid implements Serializable { private static final long serialVersionUID = 5105993927776028563L; private int x; // x location private int y; // y location private Color color; // color for square public Grid() { } public Grid(int x, int y, Color color) { this.x = x; this.y = y; this.color = color; } /** * Draw Grid * * @param g2 */ public void draw(Graphics2D g2) { int clientX = SnakeGameConstant.SNAKE_GAME_PANEL_LEFT + x * SnakeGameConstant.GRID_SIZE; int clientY = SnakeGameConstant.SNAKE_GAME_PANEL_TOP + y * SnakeGameConstant.GRID_SIZE; Rectangle2D.Double rect = new Rectangle2D.Double(clientX, clientY, SnakeGameConstant.GRID_SIZE, SnakeGameConstant.GRID_SIZE); g2.setPaint(color); g2.fill(rect); g2.setPaint(Color.BLACK); g2.draw(rect); } /** * @return the color */ public Color getColor() { return color; } /** * @param color * the color to set */ public void setColor(Color color) { this.color = color; } /** * @return the x */ public int getX() { return x; } /** * @param x * the x to set */ public void setX(int x) { this.x = x; } /** * @return the y */ public int getY() { return y; } /** * @param y * the y to set */ public void setY(int y) { this.y = y; } }
package my.games.snake.model; import java.awt.Graphics2D; import java.io.Serializable; import java.util.LinkedList; import java.util.List; import my.games.snake.contants.SnakeGameConstant; import my.games.snake.enums.Direction; public class Snake implements Serializable { private static final long serialVersionUID = -1064622816984550631L; private List<Grid> list = null; private Direction direction = Direction.RIGHT; public Snake() { this.list = new LinkedList<Grid>(); } public void changeDirection(Direction direction) { if (direction.isUpDirection()) { if (!this.direction.isUpDirection() && !this.direction.isDownDirection()) { this.direction = direction; } } else if (direction.isRightDirection()) { if (!this.direction.isRightDirection() && !this.direction.isLeftDirection()) { this.direction = direction; } } else if (direction.isDownDirection()) { if (!this.direction.isUpDirection() && !this.direction.isDownDirection()) { this.direction = direction; } } else if (direction.isLeftDirection()) { if (!this.direction.isRightDirection() && !this.direction.isLeftDirection()) { this.direction = direction; } } } public void draw(Graphics2D g2) { for (Grid grid : list) { grid.draw(g2); } } /** * @return the list */ public List<Grid> getList() { return list; } /** * @param list * the list to set */ public void setList(List<Grid> list) { this.list = list; } /** * @return the direction */ public Direction getDirection() { return direction; } /** * @param direction * the direction to set */ public void setDirection(Direction direction) { this.direction = direction; } public void move() { Grid currentHead = list.get(0); int headX = currentHead.getX(); int headY = currentHead.getY(); currentHead.setColor(SnakeGameConstant.SNAKE_BODY_COLOR); if (direction.isDownDirection()) { list.add(0, new Grid(headX, headY + 1, SnakeGameConstant.SNAKE_HEADER_COLOR)); list.remove(list.size() - 1); } else if (direction.isUpDirection()) { list.add(0, new Grid(headX, headY - 1, SnakeGameConstant.SNAKE_HEADER_COLOR)); list.remove(list.size() - 1); } else if (direction.isRightDirection()) { list.add(0, new Grid(headX + 1, headY, SnakeGameConstant.SNAKE_HEADER_COLOR)); list.remove(list.size() - 1); } else if (direction.isLeftDirection()) { list.add(0, new Grid(headX - 1, headY, SnakeGameConstant.SNAKE_HEADER_COLOR)); list.remove(list.size() - 1); } } }
package my.games.snake.ui; import java.awt.Container; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.ButtonGroup; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JRadioButtonMenuItem; import my.games.snake.contants.SnakeGameConstant; import my.games.snake.enums.GameState; public class SnakeGameFrame extends JFrame { private static final long serialVersionUID = 998014032682506026L; private SnakeGamePanel panel; private Container contentPane; private JMenuItem startMI = new JMenuItem("Start"); private JMenuItem pauseMI = new JMenuItem("Pause"); private JMenu speedMenu = new JMenu("Speed"); private JMenuItem exitMI = new JMenuItem("Exit"); private JMenuItem aboutMI = new JMenuItem("About"); private JRadioButtonMenuItem speedMI1 = new JRadioButtonMenuItem("Speed1", true); private JRadioButtonMenuItem speedMI2 = new JRadioButtonMenuItem("Speed2", false); private JRadioButtonMenuItem speedMI3 = new JRadioButtonMenuItem("Speed3", false); private JRadioButtonMenuItem speedMI4 = new JRadioButtonMenuItem("Speed4", false); private JRadioButtonMenuItem speedMI5 = new JRadioButtonMenuItem("Speed5", false); public int speedFlag = 1; public SnakeGameFrame() { setTitle(SnakeGameConstant.SNAKE_GAME); setSize(SnakeGameConstant.SNAKE_GAME_FRAME_WIDTH, SnakeGameConstant.SNAKE_GAME_FRAME_HEIGHT); setResizable(false); JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); JMenu setMenu = new JMenu("Set"); JMenu helpMenu = new JMenu("Help"); setMenu.setMnemonic('s'); setMenu.setMnemonic('H'); menuBar.add(setMenu); menuBar.add(helpMenu); setMenu.add(startMI); setMenu.add(pauseMI); setMenu.addSeparator(); setMenu.addSeparator(); setMenu.add(speedMenu); setMenu.addSeparator(); setMenu.add(exitMI); ButtonGroup group = new ButtonGroup(); group.add(speedMI1); group.add(speedMI2); group.add(speedMI3); group.add(speedMI4); group.add(speedMI5); speedMenu.add(speedMI1); speedMenu.add(speedMI2); speedMenu.add(speedMI3); speedMenu.add(speedMI4); speedMenu.add(speedMI5); startMI.addActionListener(new StartAction()); pauseMI.addActionListener(new PauseAction()); exitMI.addActionListener(new ExitAction()); speedMI1.addActionListener(new SpeedAction()); speedMI2.addActionListener(new SpeedAction()); speedMI3.addActionListener(new SpeedAction()); speedMI4.addActionListener(new SpeedAction()); speedMI5.addActionListener(new SpeedAction()); helpMenu.add(aboutMI); aboutMI.addActionListener(new AboutAction()); contentPane = getContentPane(); panel = new SnakeGamePanel(this); contentPane.add(panel); startMI.setEnabled(true); pauseMI.setEnabled(false); // 设置游戏状态是初始化状态 panel.setGameState(GameState.INITIALIZE); } private class StartAction implements ActionListener { public void actionPerformed(ActionEvent event) { startMI.setEnabled(false); pauseMI.setEnabled(true); panel.setGameState(GameState.RUN); panel.getTimer().start(); } } private class PauseAction implements ActionListener { public void actionPerformed(ActionEvent event) { pauseMI.setEnabled(false); startMI.setEnabled(true); panel.setGameState(GameState.PAUSE); if (panel.getTimer().isRunning()) { panel.getTimer().stop(); } } } private class SpeedAction implements ActionListener { public void actionPerformed(ActionEvent event) { Object speed = event.getSource(); if (speed == speedMI1) { speedFlag = 1; } else if (speed == speedMI2) { speedFlag = 2; } else if (speed == speedMI3) { speedFlag = 3; } else if (speed == speedMI4) { speedFlag = 4; } else if (speed == speedMI5) { speedFlag = 5; } panel.getTimer().setDelay(1000 - 200 * (speedFlag - 1)); } } private class ExitAction implements ActionListener { public void actionPerformed(ActionEvent event) { int result = JOptionPane.showConfirmDialog(SnakeGameFrame.this, SnakeGameConstant.QUIT_GAME, SnakeGameConstant.SNAKE_GAME, JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { System.exit(0); } } } private class AboutAction implements ActionListener { public void actionPerformed(ActionEvent event) { String string = SnakeGameConstant.KEYBOARDS_DESCRIPTION; JOptionPane.showMessageDialog(SnakeGameFrame.this, string); } } }
package my.games.snake.ui; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.geom.Rectangle2D; import java.io.Serializable; import java.util.LinkedList; import java.util.List; import java.util.Random; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.Timer; import my.games.snake.contants.SnakeGameConstant; import my.games.snake.enums.Direction; import my.games.snake.enums.GameState; import my.games.snake.model.Grid; import my.games.snake.model.Snake; public class SnakeGamePanel extends JPanel { private static final long serialVersionUID = -4173775119881265176L; private int flag[][] = new int[SnakeGameConstant.GRID_COLUMN_NUMBER][SnakeGameConstant.GRID_ROW_NUMBER];// 在一个20*30的界面中,设置每个方块的flag private Color color[][] = new Color[SnakeGameConstant.GRID_COLUMN_NUMBER][SnakeGameConstant.GRID_ROW_NUMBER];// 在一个20*30的界面中,设置每个方块的颜色 private Snake snake; private Grid food; public TimerAction timerAction; private int score; private SnakeGameFrame frame; private Timer timer; private Grid grid; private GameState gameState = GameState.INITIALIZE; //private GameOverType gameOverType = GameOverType.TOUCH_EDGE; private boolean needToGenerateFood = false; public SnakeGamePanel(SnakeGameFrame frame) { for (int i = SnakeGameConstant.LEFT; i <= SnakeGameConstant.RIGHT; i++) { for (int j = SnakeGameConstant.UP; j <= SnakeGameConstant.DOWN; j++) { flag[i][j] = 0; } } addKeyListener(new KeyHandler()); setFocusable(true); init(); timerAction = new TimerAction(); timer = new Timer(1000, timerAction); score = 0; this.frame = frame; grid = new Grid(); } private void init() { initSnake(); initFood(); } private void initSnake() { snake = new Snake(); List<Grid> list = new LinkedList<Grid>(); list.add(new Grid(4, 1, SnakeGameConstant.SNAKE_BODY_COLOR)); list.add(0, new Grid(5, 1, SnakeGameConstant.SNAKE_HEADER_COLOR)); snake.setList(list); } private void initFood() { food = new Grid(); needToGenerateFood = true; this.generateFoodByRandom(); } public void setGameState(GameState state) { gameState = state; } private void judgeGameOver() { if (isSnakeHeadTouchEdge() || isSnakeHeadTouchBody()) { gameState = GameState.OVER; int result = JOptionPane.showConfirmDialog(frame, SnakeGameConstant.GAME_OVER, SnakeGameConstant.SNAKE_GAME, JOptionPane.YES_NO_OPTION); if (result == JOptionPane.YES_OPTION) { for (int i = SnakeGameConstant.LEFT; i <= SnakeGameConstant.RIGHT; i++) { for (int j = SnakeGameConstant.UP; j <= SnakeGameConstant.DOWN; j++) { flag[i][j] = 0; } } gameState = GameState.RUN; score = 0; init(); timer.start(); } else { System.exit(0); } } } public void drawGameFrame(Graphics2D g2) { } public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; g2.draw(new Rectangle2D.Double(SnakeGameConstant.SNAKE_GAME_PANEL_LEFT, SnakeGameConstant.SNAKE_GAME_PANEL_TOP, SnakeGameConstant.SNAKE_GAME_PANEL_RIGHT, SnakeGameConstant.SNAKEGAME_PANEL_BOTTOM)); if (gameState.isInitializedState()) { return; } draw(g2); drawScore(g); } private void draw(Graphics2D g2) { drawSnake(g2); drawFood(g2); for (int i = SnakeGameConstant.LEFT; i <= SnakeGameConstant.RIGHT; i++) { for (int j = SnakeGameConstant.UP; j <= SnakeGameConstant.DOWN; j++) { if (flag[i][j] == 1) { grid.setX(i); grid.setY(j); grid.setColor(color[i][j]); grid.draw(g2); } } } } private void drawScore(Graphics g) { g.drawString("Score: " + score, SnakeGameConstant.SNAKE_GAME_PANEL_RIGHT + 20, 200); } private void drawSnake(Graphics2D g2) { snake.draw(g2); } private void drawFood(Graphics2D g2) { food.draw(g2); } private class KeyHandler implements KeyListener { public void keyPressed(KeyEvent event) { if (!gameState.isRunState()) { return; } int keyCode = event.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: snake.changeDirection(Direction.LEFT); break; case KeyEvent.VK_RIGHT: snake.changeDirection(Direction.RIGHT); break; case KeyEvent.VK_UP: snake.changeDirection(Direction.UP); break; case KeyEvent.VK_DOWN: snake.changeDirection(Direction.DOWN); break; default: break; } repaint(); } public void keyReleased(KeyEvent event) { } public void keyTyped(KeyEvent event) { } } private class TimerAction implements ActionListener, Serializable { private static final long serialVersionUID = 749074368549207272L; public void actionPerformed(ActionEvent e) { if (!gameState.isRunState()) { return; } generateFoodByRandom(); snake.move(); eatFood(); judgeGameOver(); repaint(); } } private boolean isFoodAvailable(int x, int y) { for (Grid grid : snake.getList()) { if (x == grid.getX() && y == grid.getY()) { return false; } } return true; } private void generateFoodByRandom() { if (needToGenerateFood) { Random r = new Random(); int randomX = r.nextInt(SnakeGameConstant.GRID_COLUMN_NUMBER); int randomY = r.nextInt(SnakeGameConstant.GRID_ROW_NUMBER); if (isFoodAvailable(randomX, randomX)) { food = new Grid(randomX, randomY, SnakeGameConstant.FOOD_COLOR); needToGenerateFood = false; } else { generateFoodByRandom(); } } } private boolean isSnakeHeadTouchEdge() { Grid head = this.snake.getList().get(0); if ((head.getX() >= SnakeGameConstant.GRID_COLUMN_NUMBER) || (head.getX() < 0)) { //this.gameOverType = GameOverType.TOUCH_EDGE; return true; } if ((head.getY() >= SnakeGameConstant.GRID_ROW_NUMBER) || (head.getY() < 0)) { //this.gameOverType = GameOverType.TOUCH_EDGE; return true; } return false; } private boolean isSnakeHeadTouchBody() { Grid head = this.snake.getList().get(0); int length = snake.getList().size(); for (int i = 1; i < length; i++) { if (head.getX() == snake.getList().get(i).getX() && head.getY() == snake.getList().get(i).getY()) { //this.gameOverType = GameOverType.TOUCH_BODY; return true; } } return false; } private boolean isFoodTouched() { Grid head = snake.getList().get(0); return head.getX() == food.getX() && head.getY() == food.getY(); } private void eatFood() { if (isFoodTouched()) { Grid tail = snake.getList().get(snake.getList().size() - 1); snake.getList().add(tail); this.needToGenerateFood = true; this.score += 10; } } /** * @return the timer */ public Timer getTimer() { return timer; } /** * @param timer * the timer to set */ public void setTimer(Timer timer) { this.timer = timer; } }
完整的代码,请参考附件MySnakeGame.7z,有需要的朋友可以下载。
后续的博文将添加如下功能:
(二)添加随机障碍物。
(三)添加游戏进度的存储和读取
(四)完成游戏排行榜
... ...
发表评论
-
工厂类中移除if/else语句
2016-07-10 19:52 900面向对象语言的一个强大的特性是多态,它可以用来在代码中移除 ... -
Java编程练手100题
2014-12-11 17:13 6728本文给出100道Java编程练手的程序。 列表如下: 面 ... -
数组复制的三种方法
2014-11-30 12:57 2212本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
数组复制的三种方法
2014-11-30 12:54 0本文将给出三种实现数组复制的方法 (以复制整数数组为例)。 ... -
四种复制文件的方法
2014-11-29 13:21 1739尽管Java提供了一个类ava.io.File用于文件的操 ... -
判断一个字符串中的字符是否都只出现一次
2014-11-25 12:58 2724本篇博文将给大家带来几个判断一个字符串中的字符是否都只出现一 ... -
使用正则表达式判断一个数是否为素数
2014-11-23 13:35 2166正则表达式能够用于判断一个数是否为素数,这个以前完全没有想过 ... -
几个可以用英文单词表达的正则表达式
2014-11-21 13:12 3748本文,我们将来看一下几个可以用英文单词表达的正则表达式。这些 ... -
(广度优先搜索)打印所有可能的括号组合
2014-11-20 11:58 1953问题:给定一个正整n,作为括号的对数,输出所有括号可能 ... -
随机产生由特殊字符,大小写字母以及数字组成的字符串,且每种字符都至少出现一次
2014-11-19 14:48 3976题目:随机产生字符串,字符串中的字符只能由特殊字符 (! ... -
找出1到n缺失的一个数
2014-11-18 12:57 3173题目:Problem description: You h ... -
EnumSet的几个例子
2014-11-14 16:24 8749EnumSet 是一个与枚举类型一起使用的专用 Set 实现 ... -
给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小
2014-11-12 11:24 3327题目:给定两个有序数组和一个指定的sum值,从两个数组 ... -
Java面试编程题练手
2014-11-04 22:49 6700面试编程 写一个程序,去除有序数组中的重复数字 编 ... -
Collections用法整理
2014-10-22 20:55 9846Collections (java.util.Collect ... -
The Code Sample 代码实例 个人博客开通
2014-09-04 18:48 1418个人博客小站开通 http://thecodesample. ... -
Collections.emptyXXX方法
2014-06-08 13:37 2145从JDK 1.5开始, Collections集合工具类中预先 ... -
这代码怎么就打印出"hello world"了呢?
2014-06-08 00:37 7397for (long l = 4946144450195624L ... -
最短时间过桥
2014-04-21 22:03 4137本文用代码实现最短时间过桥,并且打印如下两个例子的最小过桥时间 ... -
将数组分割成差值最小的子集
2014-04-20 22:34 2899本文使用位掩码实现一个功能 ==》将数组分割成差值最小的子集 ...
相关推荐
在Swing贪吃蛇游戏中,主要涉及以下核心知识点: 1. **Swing组件**:游戏界面通常由多个Swing组件构成,如JFrame作为主窗口,JPanel作为游戏面板,以及可能的JLabel用于显示分数或游戏状态。这些组件通过继承自...
在本项目中,我们探讨的是如何在Java Swing中创建一个贪吃蛇游戏,并且增加了随机产生障碍物的功能。Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和事件处理机制,使得开发桌面应用程序变得更加...
Swing版贪吃蛇游戏是一款基于Java Swing图形用户界面库开发的经典小游戏,它不仅保留了传统贪吃蛇的基本玩法,还增加了许多现代化的功能,如进度保存与加载、得分排行榜和随机生成的障碍物等,提升了游戏的趣味性和...
这个“java swing 贪吃蛇游戏.zip”压缩包包含了一个使用Java Swing开发的贪吃蛇游戏的完整源代码,非常适合初学者进行学习、实践,或者作为毕业设计或课程设计的项目。 贪吃蛇游戏是一个经典的计算机游戏,玩家...
1. **Swing组件**:贪吃蛇游戏的核心是游戏面板,这通常会由`JPanel`类来实现。在`GamePanel.java`中,我们可能会看到如何自定义`JPanel`,添加绘图功能,以显示蛇、食物和边界。 2. **多线程**:为了实现动态的...
【Swing贪吃蛇游戏开发教程】是一套针对Java初学者的编程教学资源,它涵盖了使用Java Swing库创建一个经典游戏——贪吃蛇的过程。Swing是Java AWT(抽象窗口工具包)的一个扩展,提供了丰富的图形用户界面(GUI)...
在本项目“java_swing完整版贪吃蛇”中,开发者利用Java Swing的技术,实现了一个经典的贪吃蛇游戏。 贪吃蛇游戏是一个非常基础且受欢迎的游戏,玩家控制一个不断移动的蛇,通过吃食物来增长蛇的身体长度。当蛇头...
本项目利用Java Swing构建了一个经典的【贪吃蛇游戏】,这款游戏简单易懂,是学习Swing和游戏编程的绝佳案例。 在Java Swing中,我们首先会接触到`JFrame`,它是窗口的基础类,用于展示应用程序的主要界面。在...
总的来说,Java Swing结合贪吃蛇游戏的实现,不仅展示了Swing的基础用法,也涵盖了游戏开发中的基本逻辑处理和图形绘制,是学习Java GUI编程的一个很好的实践项目。通过这个项目,开发者可以深入理解事件处理、线程...
在贪吃蛇游戏中,通常有两个主要的线程:一个是主游戏循环线程,负责游戏的逻辑更新;另一个是渲染线程,用于绘制游戏画面。使用Thread类或者Runnable接口可以创建并管理这些线程。 **4. 坐标系统和碰撞检测** 游戏...
总结,通过Java Swing和基本的面向对象编程,我们可以构建出一款具有趣味性的贪吃蛇游戏。这个过程不仅锻炼了我们的编程技能,也让我们对Java GUI和事件处理有了更深入的理解。实际开发过程中,还可能遇到更多挑战,...
贪吃蛇游戏是一款经典的计算机游戏,它源自早期的诺基亚手机,并且在全球范围内广受欢迎。这个Java版本的贪吃蛇游戏源码是为那些希望深入理解游戏开发和Java GUI编程,特别是AWT(Abstract Window Toolkit)和Swing...
这个基于Swing的贪吃蛇游戏项目不仅展示了Swing组件的使用,还涵盖了基本的游戏编程概念,如定时器、绘图、事件处理和游戏逻辑。通过研究和实践这个项目,开发者可以深入理解Java GUI编程,并提升自己的编程技能。
在这个项目中,开发者使用Swing来实现了一个经典的贪吃蛇游戏,而没有使用多线程技术。通常,游戏开发中会使用线程来实现游戏循环,以便在处理用户输入的同时更新游戏状态。然而,此代码通过Swing的`Timer`类实现了...
在Java Swing中实现贪吃蛇游戏,主要涉及以下几个关键知识点: 1. **图形用户界面(GUI)**:使用JFrame作为主窗口,放置JPanel作为游戏面板。Swing提供了各种组件,如JButton、JLabel等,但在这里主要是自定义组件以...
Java swing框架实现的贪吃蛇游戏完整示例 本文主要介绍了使用Java swing框架实现的贪吃蛇游戏的完整示例,通过结合完整实例形式分析了Java使用swing框架结合awt图形绘制实现贪吃蛇游戏的具体步骤与相关实现技巧。 ...
在这个特定的项目中,"自己写的贪吃蛇游戏源码(swing版本)"是一个利用Swing实现的经典游戏贪吃蛇的示例代码。对于初学者来说,这是一个很好的实践案例,可以帮助他们理解和掌握Swing的基本用法以及游戏开发的基础...
1. 贪吃蛇游戏:实现一个基本的贪吃蛇游戏,包括蛇的移动、食物的随机产生和游戏的结束判断。 2. 游戏升级:游戏可以进行升级,增加吃食物的难度,以便使游戏更具有挑战性。 3. 游戏界面可调整:游戏界面的大小可以...
标题中的“一个小小的贪吃蛇游戏,基于Java Swing .zip”揭示了这是一个使用Java编程语言,特别是Java Swing库开发的简单贪吃蛇游戏。Java Swing是Java AWT(抽象窗口工具包)的一个扩展,提供了丰富的图形用户界面...