java實(shí)現(xiàn)簡易貪吃蛇游戲
本文實(shí)例為大家分享了java實(shí)現(xiàn)貪吃蛇游戲的具體代碼,供大家參考,具體內(nèi)容如下
1.封裝貪吃蛇身體,抽象出貪吃蛇結(jié)點(diǎn)類Node,結(jié)點(diǎn)用ArrayList存儲
import java.awt.*; public class Node { private int x; private int y; public Node(int x, int y) { this.x = x; this.y = y; } public Node(){ } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public void drawNode(int i, Graphics g){ if(i==0){//頭繪制成圓 g.fillOval(this.x,this.y,20-1,20-1); }else{//身體繪制成矩形 g.fillRect(this.x,this.y,20-1,20-1); } } }
2.主類
import java.awt.*; import java.awt.event.*; import java.util.ArrayList; public class Snake extends Frame implements KeyListener , ActionListener { //初始蛇移動方向 String fx="right"; //碰撞判斷 boolean is_attack=false; private ArrayList<Node> body=new ArrayList<Node>(); { body.add(new Node(160, 60)); body.add(new Node(140, 60)); body.add(new Node(120, 60)); int x=(int)(Math.random()*580); int y=(int)(Math.random()*580); body.add(new Node(x-x%20,y-y%20)); } /** * 貪吃蛇 * 1、窗體 * 位置(坐標(biāo)) * 標(biāo)題 * 大小 * 背景顏色 * 窗體的大小不可變 * 可見 * 2、繪制蛇 */ public Snake(){ //窗體標(biāo)題 super.setTitle("貪吃蛇游戲"); //窗體位置 super.setLocation(100,100); //窗體大小 super.setSize(600,600); //背景顏色 super.setBackground(new Color(252,255, 208)); //設(shè)置窗體可見 super.setVisible(true); // 窗體大小不可變 super.setResizable(false); //給關(guān)閉按鈕添加事件 super.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); //獲取聚焦 super.setFocusable(true); //添加鍵盤監(jiān)聽 super.addKeyListener(this); start(); } public void start(){ while(!is_attack){ try{ Thread.sleep(200); }catch (Exception e){ e.printStackTrace(); } //碰撞檢測 attack_check(); //刷新窗體,調(diào)用paint方法 repaint(); } } //碰撞檢測 public void attack_check(){ //撞到身體檢測 for(int i=1;i<body.size()-1;i++){ if (body.get(0).getX()==body.get(i).getX()&&body.get(0).getY()==body.get(i).getY()){ is_attack=true; } } //撞到邊界 if(body.get(0).getX()==0||body.get(0).getX()==600||body.get(0).getY()==0||body.get(0).getY()==600){ is_attack=true; } } //移動貪吃蛇 public void move(){ //吃到食物判斷,頭結(jié)點(diǎn)坐標(biāo)和食物坐標(biāo)相等 if ((body.get(0).getX()==body.get(body.size()-1).getX())&&(body.get(0).getY()==body.get(body.size()-1).getY())) { //出現(xiàn)下一個食物 int x=(int)(Math.random() * 580); int y=(int)(Math.random() * 580); body.get(body.size()-1).setX(x-x%20); body.get(body.size()-1).setY(y-y%20); //蛇身加一個結(jié)點(diǎn) body.add(body.size()-1,new Node(0,0)); } //移動頭尾節(jié)點(diǎn),使貪吃蛇移動 Node node=body.get(0); if (fx.equals("up")){ node=new Node(node.getX(),node.getY()-20); //加頭 body.add(0,node); //去尾 body.remove(body.size()-2); }if (fx.equals("down")){ node=new Node(node.getX(),node.getY()+20); //加頭 body.add(0,node); //去尾 body.remove(body.size()-2); }if (fx.equals("right")){ node=new Node(node.getX()+20,node.getY()); //加頭 body.add(0,node); //去尾 body.remove(body.size()-2); }if (fx.equals("left")){ node=new Node(node.getX()-20,node.getY()); //加頭 body.add(0,node); //去尾 body.remove(body.size()-2); } } /** * 展示窗體|每一次刷新窗體都會執(zhí)行的方法 * @param g 畫筆 */ @Override public void paint(Graphics g) { g.setColor(new Color(105, 78,255)); for(int i=0; i<body.size(); i++){ body.get(i).drawNode(i,g); } move(); //游戲結(jié)束繪制 if(is_attack){ g.setColor(new Color(255, 67, 40)); Font ft = new Font("宋體", Font.PLAIN, 40); g.setFont(ft); g.drawString("很遺憾,游戲結(jié)束",150,300); } } //事件監(jiān)聽 @Override public void actionPerformed(ActionEvent e) { } @Override public void keyPressed(KeyEvent e) { int keyCode=e.getKeyCode(); if(keyCode==KeyEvent.VK_UP){ fx="up"; }if (keyCode==KeyEvent.VK_DOWN){ fx="down"; }if (keyCode==KeyEvent.VK_LEFT){ fx="left"; }if (keyCode==KeyEvent.VK_RIGHT){ fx="right"; } } @Override public void keyTyped(KeyEvent e) { } @Override public void keyReleased(KeyEvent e) { } /** * main方法 * @param args */ public static void main(String[] args) { new Snake(); } }
運(yùn)行圖片
游戲結(jié)束
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
基于request.getAttribute與request.getParameter的區(qū)別詳解
本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下2013-04-04Java中Stream的flatMap與map使用場景及區(qū)別詳解
這篇文章主要介紹了Java中Stream的flatMap與map使用場景及區(qū)別詳解,Stream 流式操作,一般用于操作集合即 List 一類的數(shù)據(jù)結(jié)構(gòu),簡單來說 Stream 的 map 使得其中的元素轉(zhuǎn)為另一種元素的映射(map)方法,需要的朋友可以參考下2024-01-01Java實(shí)現(xiàn)用戶短信驗(yàn)證碼登錄功能實(shí)例代碼
現(xiàn)在不管是各類的網(wǎng)站,還是大小社交app,登錄方式是越來越多了,但是大部分還是以短信登錄為主,本文主要介紹了java短信驗(yàn)證碼登錄功能設(shè)計與實(shí)現(xiàn),感興趣的可以了解一下2021-11-11Java并發(fā)編程之CountDownLatch的使用
CountDownLatch是一個倒數(shù)的同步器,常用來讓一個線程等待其他N個線程執(zhí)行完成再繼續(xù)向下執(zhí)行,本文主要介紹了CountDownLatch的具體使用方法,感興趣的可以了解一下2023-05-05springboot訪問template下的html頁面的實(shí)現(xiàn)配置
這篇文章主要介紹了springboot訪問template下的html頁面的實(shí)現(xiàn)配置,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12