前言
玩儿了这么多年的游戏,您有想过自己动手来写一个么,哈哈哈不废话啦,学完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,同理你也可以改成呢心中那个随意的数字。
代码获取
因为代码太长了,而且有图片,所以压缩了,只要关注微信公众号:小黄爱编程
后台回复:贪吃蛇
总结
自己写游戏,你不仅知识得到了总结,而且最重要的就是你自己玩儿起来,感觉就会不一样,还有就是你可以改成你自己想要的样子,在这里不受金钱和外物的影响,这里只属于你的王国,大家也可以动手写起来哟!然后说明一下,可能这几天不能一天一更了,期末了,我也得好好复习了!