用Java编程制作贪食蛇,娱乐游戏,快乐编程

贪吃蛇游戏的设计步骤:

Part 1:

  设计游戏图纸

  画出900*700的白色窗口

  在窗口上添加画布

  在画布上添加标题

  在画布上添加黑色游戏区

Part 2:

  放置静态的蛇:一个头、两个身体

  加上开始提示:按空格键开始游戏

  让蛇动起来:监听Timer事件,平移数据

  实现游戏暂停

  实现转向功能

Part 3:

  添加食物

  吃掉食物

  添加死亡条件

  实现“重新开始”功能

  添加分数和长度

游戏图纸如下:


蛇及游戏框的素材如下:

packagesnake;  importjavax.swing.JFrame;importjavax.swing.JPanel;  publicclassSnake{ publicstaticvoidmain(String[] args){          JFrame frame =newJFrame();// 创建一个游戏界面的框架frame.setBounds(10,10,900,720);// 设置框架的大小frame.setResizable(false);// 设置框架大小为不能改变// 点击关闭按钮 关闭游戏界面        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        SnakePanel panel =newSnakePanel();//添加画布frame.add(panel);// 刚添加时画布是空的看不到      frame.setVisible(true);// 允许显示游戏界面  }}

SnakePanel类:

packagesnake; importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.KeyEvent;importjava.awt.event.KeyListener;importjava.util.Random;importjavax.swing.ImageIcon;importjavax.swing.JPanel;importjavax.swing.Timer; publicclassSnakePanelextendsJPanelimplementsKeyListener,ActionListener{// 定义七个图片变量,代表七张图片ImageIcon up =newImageIcon("up.png");// 向上的蛇头ImageIcon down =newImageIcon("down.png");// 向下的蛇头ImageIcon left =newImageIcon("left.png");// 向左的蛇头ImageIcon right =newImageIcon("right.png");// 向右的蛇头ImageIcon food =newImageIcon("food.png");// 食物ImageIcon body =newImageIcon("body.png");// 蛇的身体ImageIcon title =newImageIcon("title.jpg");// 游戏界面的主题  // 蛇的每一部分int[] snakex =newint[750];int[] snakey =newint[750];    // 随机生成食物Random rand =newRandom();intfoodx = rand.nextInt(34)*25+25;//此处的数值根据自己设计的游戏界面的大小来确定intfoody = rand.nextInt(24)*25+75;  // 设置游戏的默认属性intlen =3;intscore =0;String direction ="R";// U上 D下 L左 R右  booleanisStarted =false;// 判断游戏是否开始booleanisFailed =false;// 判断游戏是否结束Timer timer =newTimer(100,this);// 每100毫秒调用一次ActionPerformed      publicSnakePanel(){// 建造画布的构造函数this.setFocusable(true);// 获取焦点this.addKeyListener(this);// 监听键盘事件    setup();    timer.start();    }    publicvoidpaint(Graphics g){// Graphics 画笔      this.setBackground(Color.BLACK);// 设置画布背景颜色title.paintIcon(this, g,25,11);// 放置主题图片g.fillRect(25,75,850,650);// 用画笔设置游戏方框      // 画蛇头(注意判断蛇头的方向)if(direction.equals("R"))right.paintIcon(this, g, snakex[0], snakey[0]);elseif(direction.equals("L"))left.paintIcon(this, g, snakex[0], snakey[0]);elseif(direction.equals("U"))up.paintIcon(this, g, snakex[0], snakey[0]);elseif(direction.equals("D"))down.paintIcon(this, g, snakex[0], snakey[0]);      // 画蛇的身体for(inti =1; i < len; i ++)body.paintIcon(this, g, snakex[i], snakey[i]);        // 判断如果游戏没开始显示。。。if(!isStarted){        g.setColor(Color.WHITE);g.setFont(newFont("arial",Font.BOLD,30));g.drawString("Press Space to start / pause",200,300);      }      // 判断如果游戏结束显示。。。if(isFailed){            g.setColor(Color.WHITE); g.setFont(newFont("arial",Font.BOLD,30));g.drawString("Game Over ! Press space to restart",200,300);      }        // 显示食物food.paintIcon(this, g, foodx, foody);      // 设置分数和蛇的长度        g.setColor(Color.WHITE);g.setFont(newFont("arial",Font.PLAIN,15));g.drawString("Score : "+score,650,37);g.drawString("Len :"+len,650,57);  }  publicvoidsetup(){// 游戏初始化isStarted =false;isFailed =false;len =3;score =0;snakex[0] =100; snakex[1] =75; snakex[2] =50;snakey[0] =100; snakey[1] =100; snakey[2] =100;    } @OverridepublicvoidkeyPressed(KeyEvent e){      //实现键盘响应 intKeyCode = e.getKeyCode();if(KeyCode == KeyEvent.VK_SPACE){// 敲击空格现实/消除提示信息if(isFailed){//                isStarted = false;  // 可以将这两行放入setup中//                isFailed = false;            setup();}else            isStarted = !isStarted;}elseif(KeyCode ==  KeyEvent.VK_UP && direction !="D")direction ="U";elseif(KeyCode ==  KeyEvent.VK_DOWN && direction !="U")direction ="D";elseif(KeyCode ==  KeyEvent.VK_RIGHT && direction !="L")direction ="R";elseif(KeyCode ==  KeyEvent.VK_LEFT && direction !="R")direction ="L";    }@OverridepublicvoidactionPerformed(ActionEvent e){// 1. 再定义一个闹钟    timer.start();              // 2. 移动数据if(isStarted && !isFailed){// 移动身体for(inti = len; i>0; i--){snakex[i] = snakex[i-1];snakey[i] = snakey[i-1];      }// 移动头if(direction.equals("R")){snakex[0] = snakex[0] +25;if(snakex[0] >850) snakex[0] =25;}elseif(direction.equals("L")){snakex[0] = snakex[0] -25;if(snakex[0] <25) snakex[0] =850;}elseif(direction.equals("U")){snakey[0] = snakey[0] -25;if(snakey[0] <75) snakey[0] =650;}elseif(direction.equals("D")){snakey[0] = snakey[0] +25;if(snakey[0] >650) snakey[0] =75;      }              if(snakex[0] == foodx && snakey[0] == foody){// 吃食物              len ++;              score ++;foodx = rand.nextInt(34)*25+25;foody = rand.nextInt(24)*25+75;          }              for(inti =1; i < len; i ++){// 如果蛇头碰到自己的身体游戏结束if(snakex[0] == snakex[i] && snakey[0] == snakey[i]){isFailed =true;          }          }                      }// 3. repaint()        repaint();  }  @OverridepublicvoidkeyTyped(KeyEvent e){        }@OverridepublicvoidkeyReleased(KeyEvent e){            } }

 游戏效果如下:



作者:Geoooo 

原文:https://blog.csdn.net/geoooo/article/details/79457301

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容

  • 按照教程写了一个Java小游戏,花了19天时间去抄了一遍,今天终于抄完了?:.?ヽ(?????)??.:?+? g...
    猿学阅读 562评论 1 2
  • 首先说一下扫雷规则。 1.数字是几就表示此数字位置邻接的八个方向有几个地雷 2.鼠标右键单击一次标记此位置为地雷(...
    猿学阅读 814评论 0 0
  • 作为一名java初学者能够独立开发出小游戏也是很有感觉的。 尤其是感受到面向对象的方法,特此总结一下,以备后用。 ...
    爱java的三罗阅读 649评论 0 2
  • ?xml version="1.0" encoding="UTF-8"? importjava.util.Rand...
    窦常荣阅读 409评论 0 0
  • 一个美女,踉跄地走在街上,像是喝醉了。街上的灯,昏暗得有些迷离。我虚拟了几个人物,路人甲乙丙丁,看看你会选哪一个。...
    立黄昏阅读 1,233评论 30 12