前言

玩儿了这么多年的游戏,您有想过自己动手来写一个么,哈哈哈不废话啦,学完Java一快有一年了,总结了n多次,这次利用周末假期时间刷了一些视频,自己写了一个贪吃蛇小游戏,下面我们来看看他是怎么实现的吧!

游戏视频

贪吃蛇_重绘

主要实现代码

界面坐标

这个就是相当于把整个窗体变成网格形式,蛇????通过一格一格的移动,进而实现动起来

1.  package com.zzk.snake.core;

2.


3. import java.awt.Graphics;

4. import java.awt.Image;

5. import java.awt.Rectangle;

6.


7. public abstract class SnakeObject implements Drawable {

8.


9. int x;//横坐标

10. int y;//纵坐标

11. Image img;//图片

12. int width;//图片宽度

13. int height;//图片高度

14. public boolean live;//死亡/存活/叛断是否存活

15.


16. @Override

17. public abstract void draw(Graphics g);

18. /**

19. * 获取图片对应的矩形 把图片变成矩形,即为游戏战场

20. *

21. * @return

22. */

23. public Rectangle getRectangle() {

24.


25. return new Rectangle(x, y, width, height);

26. }

27. }

定义窗体界面

其实游戏最主要的就是不停的变换,一帧一帧的让他动起来,实现界面刷新,大家看一下上面代码,应该不难理解!

1. public class MyFrame extends Frame{

2. /**

3. * 加载窗体

4. */

5. public void loadFrame(){

6. this.setTitle("贪吃蛇");//设置窗体标题

7. this.setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);//设置窗体大小

8. this.setBackground(Color.red);//设置背景

9. this.setLocationRelativeTo(null);//居中

10. //设置可关闭

11. this.addWindowListener(new WindowAdapter() {

12. @Override

13. public void windowClosing(WindowEvent e) {

14. System.exit(0);

15. }

16. });

17. //设置可见

18. this.setVisible(true);

19. //运行重绘线程

20. new MyThread().start();

21. }

22. /**

23. * 防止图片闪烁,使用双重缓存

24. *

25. * @param g

26. */

27. Image backImg = null;

28.


29. @Override

30. public void update(Graphics g) {

31. if (backImg == null) {

32. backImg = createImage(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);

33. }

34. Graphics backg = backImg.getGraphics();

35. Color c = backg.getColor();

36. backg.setColor(Color.BLACK);

37. backg.fillRect(0, 0, Constant.GAME_WIDTH, Constant.GAME_HEIGHT);

38. backg.setColor(c);

39. paint(backg);

40. g.drawImage(backImg, 0, 0, null);

41. }

42. /**

43. * 这里创建一个不断重绘的线程内部类

44. *

45. * @param

46. */

47. class MyThread extends Thread{

48. @Override

49. public void run() {

50. while(true){

51. repaint();

52. try {

53. sleep(30);//每30毫秒重绘一次

54. } catch (InterruptedException e) {

55. e.printStackTrace();

56. }

57. }

58. }

59. }

60. }

食物类

定义一个贪吃蛇的食物这里是一个草莓????作为被吃食物,草莓被吃之后分数增加,蛇身长度+1

1.  package com.zzk.snake.core;

2.


3. import java.awt.Graphics;

4. import java.awt.Point;

5.


6. import com.zzk.snake.constant.Constant;

7. import com.zzk.snake.util.ImageUtil;

8.


9. public class Food extends SnakeObject{

10.


11. public Food(){

12. this.live=true;

13. this.img=ImageUtil.images.get("food");

14. this.width=img.getWidth(null);

15. this.height=img.getHeight(null);

16. this.x=(int) (Math.random()*(Constant.GAME_WIDTH-width+10));

17. this.y=(int) (Math.random()*(Constant.GAME_HEIGHT-40-height)+40);

18.


19. }

20. /**

21. * 食物被吃的方法

22. * @param mySnake

23. */

24. public void eaten(MySnake mySnake){

25. if(mySnake.getRectangle().intersects(this.getRectangle())&&live&&mySnake.live){

26. this.live=false;//食物死亡

27. mySnake.setLength(mySnake.getLength()+1);//长度加一

28. mySnake.score+=100*mySnake.getLength();//加分

29. }

30. }

31. /**

32. * 绘制食物

33. */

34. @Override

35. public void draw(Graphics g) {

36. g.drawImage(img, x, y, null);

37. }

38.


39. }

游戏中的骚操作

让我们来看看游戏中有哪些骚操作吧!让你更好的体验这个游戏的乐趣!

撞界面

private void outOfBounds() {   boolean xOut = (x <= 0 || x >= (Constant.GAME_WIDTH- width));   boolean yOut = (y <= 40 || y >= (Constant.GAME_HEIGHT - height));   if (xOut || yOut) {      live = false;   }

将这里的false改成true这样子即使你撞到界面也不会死亡,是不是很爽呢,地图所向无敌,横冲直撞!

撞蛇身

/**     * 处理是否吃到到身体问题     */    public void eatBody(){        for (Point point : bodyPoints) {            for (Point point2 : bodyPoints) {                if(point.equals(point2)&&point!=point2){                    this.live=false;//食物死亡                }

将这里的false改成true之后,在后期你的长度可能很长,这样子,自己从自己身上绕过去也没事儿,不会出现游戏结束字样。

界面大小

private void outOfBounds() {        boolean xOut = (x <= 0 || x >= (Constant.GAME_WIDTH- width));        boolean yOut = (y <= 40 || y >= (Constant.GAME_HEIGHT - height));        if (xOut || yOut) {            live = false;

将这里的false改成true之后,整个界面你就可以畅通无阻了,甚至可以跑到界面外面去,哈哈哈。

长度和加分

/**     * 食物被吃的方法     * @param mySnake     */    public void eaten(MySnake mySnake){        if(mySnake.getRectangle().intersects(this.getRectangle())&&live&&mySnake.live){            this.live=false;//食物死亡            mySnake.setLength(mySnake.getLength()+1);//长度加一            mySnake.score+=100*mySnake.getLength();//加分

我写的时候,默认长度是+1,那么你想一下加入改成10或者100 ,界面是什么感觉,哈哈哈,最重要的是分数,这里是100,同理你也可以改成呢心中那个随意的数字。

代码获取

因为代码太长了,而且有图片,所以压缩了,只要关注微信公众号:小黄爱编程

后台回复:贪吃蛇


总结

自己写游戏,你不仅知识得到了总结,而且最重要的就是你自己玩儿起来,感觉就会不一样,还有就是你可以改成你自己想要的样子,在这里不受金钱和外物的影响,这里只属于你的王国,大家也可以动手写起来哟!然后说明一下,可能这几天不能一天一更了,期末了,我也得好好复习了!