/** *@author:calm_down2010 *1介紹:貪喫蛇是一款經典的遊戲,本着遊戲的精神,今天無聊蛋疼沒事做,就寫了這個東東的簡單版本當練手用,以備日後複習 *2運行環境(軟、硬件環境:裝有jre的機器上都可運行) *3算法設計的思想:1窗口用繼承自Frame的類來寫,用一個內部類(該類是個線程)來實現不斷重畫屏幕 * 2蛇和食物類用一個list來存儲(用一個個小方塊來模擬)其中蛇的移動式move(last),add(first)來實現 * 3蛇的生死是通過自身蛇頭座標與邊界座標作比較並且蛇頭方塊與其餘方塊作碰撞檢測來實現的 *4算法的流程圖(忽略) *5算法設計分析(忽略) *6源代碼(如下) *7運行結果分析(測試正常) *8收穫及體會 (對面向對象思想及對代碼調控更深接觸,更重要的是培養了程序化思維解決問題,整個思路過程我覺得是最好的經歷) */ import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dialog; import java.awt.Frame; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.Label; import java.awt.Panel; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.ArrayList; import java.util.List; //import javax.swing.JOptionPane; public class TestSnake extends Frame { Snake snake = new Snake(this); Food food = new Food(); List<Food> foods = new ArrayList<Food>(); Image gOffScreen; public int sleepTime = 500; public int score = 0; // public static JOptionPane jop=new JOptionPane(); public void launchFrame() { foods.add(food); setSize(300,400); setVisible(true); setBackground(Color.GREEN); setTitle("Snake"); setResizable(false); this.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); new Thread(new SnakeMonitor()).start(); this.addKeyListener(new KeyMonitor()); } //當失敗的時候彈出對話框提示信息 public void createDialog() { final Dialog dialog = new Dialog(this,"提示信息",true); dialog.setSize(200, 100); dialog.setLayout(new GridLayout(2,1)); dialog.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); //提示信息 Panel topPanel = new Panel(); Label label = new Label("oh yean,你輸了,重新再來!"); topPanel.add(label,BorderLayout.CENTER); dialog.add(topPanel); dialog.setVisible(true); } public void paint(Graphics g) { snake.draw(g); for(Food f : foods) { f.draw(g); } g.setColor(Color.ORANGE); g.drawString("您的得分是:" + score, 20, 50); if(snake.isLive == false) // jop.showMessageDialog(this,"you failed,try again!"); createDialog(); } public void update(Graphics g) { if(gOffScreen == null) { gOffScreen = this.createImage(300,400); } Graphics gOff = gOffScreen.getGraphics(); Color c = gOff.getColor(); gOff.setColor(Color.GREEN); gOff.fillRect(0, 0,300,400); paint(gOff); gOff.setColor(c); g.drawImage(gOffScreen, 0, 0, null); } public static void main(String[] args) { new TestSnake().launchFrame(); } private class KeyMonitor extends KeyAdapter { public void keyPressed(KeyEvent e) { snake.keyPressed(e); } } public class SnakeMonitor implements Runnable { public void run() { while(snake.isLive) { repaint(); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.List; public class Snake { TestSnake ts; private int x = 150;//蛇頭橫座標 private int y = 200;//蛇頭縱座標 private int distance = 1; //方塊之間間隙 public static final int DIA = 10; //方塊邊長 private List<Rectangle> rs = new ArrayList<Rectangle>(); public static final int SPEED = 10; //蛇移動速度 public boolean isLive = true; private int round = 0; private Direction snakeDir = Direction.EAST; private enum Direction {EAST,WEST,SOUTH,NORTH} public Snake(TestSnake ts) { this. ts = ts; rs.add(new Rectangle(x,y,DIA,DIA)); rs.add(new Rectangle(x+DIA+distance,y,DIA,DIA)); rs.add(new Rectangle(x+DIA+distance+DIA+distance,y,DIA,DIA)); } public void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.BLACK); for(Rectangle r : rs) { g.fillRect(r.x,r.y,10,10); } move(); } public void move() { switch (snakeDir) { case WEST: Rectangle rFirst = rs.get(0); rs.add(0, new Rectangle(rFirst.x-SPEED-distance,rFirst.y,DIA,DIA)); rs.remove(rs.size()-1); if(eatFood(ts.foods.get(0))) { ts.foods.add(new Food()); Rectangle rLast = rs.get(rs.size()-1); if(rLast.y == rFirst.y) rs.add(new Rectangle(rLast.x+SPEED+distance,rLast.y,DIA,DIA)); if(rLast.y < rFirst.y) rs.add(new Rectangle(rLast.x,rLast.y-SPEED-distance,DIA,DIA)); if(rLast.y > rFirst.y) rs.add(new Rectangle(rLast.x,rLast.y+SPEED+distance,DIA,DIA)); } //處理邊界 if(rs.get(0).x<=-18) isLive = false; for(int i = 1; i<rs.size()-1; i++) { if(rs.get(i).intersects(rs.get(0))) isLive = false; } break; case EAST: Rectangle r2 = rs.get(0); rs.add(0, new Rectangle(r2.x+SPEED+distance,r2.y,DIA,DIA)); rs.remove(rs.size()-1); if(eatFood(ts.foods.get(0))) { ts.foods.add(new Food()); Rectangle rLast = rs.get(rs.size()-1); if(rLast.y == r2.y) rs.add(new Rectangle(rLast.x+SPEED+distance,rLast.y,DIA,DIA)); if(rLast.y < r2.y) rs.add(new Rectangle(rLast.x,rLast.y-SPEED-distance,DIA,DIA)); if(rLast.y > r2.y) rs.add(new Rectangle(rLast.x,rLast.y+SPEED+distance,DIA,DIA)); } //處理邊界 if(rs.get(0).x >= 307) isLive = false; for(int i = 1; i<rs.size()-1; i++) { if(rs.get(i).intersects(rs.get(0))) isLive = false; } break; case NORTH: Rectangle r3 = rs.get(0); rs.add(0, new Rectangle(r3.x,r3.y-SPEED-distance,DIA,DIA)); rs.remove(rs.size()-1); if(eatFood(ts.foods.get(0))) { ts.foods.add(new Food()); Rectangle rLast = rs.get(rs.size()-1); if(rLast.y == r3.y) rs.add(new Rectangle(rLast.x+SPEED+distance,rLast.y,DIA,DIA)); if(rLast.y < r3.y) rs.add(new Rectangle(rLast.x,rLast.y-SPEED-distance,DIA,DIA)); if(rLast.y > r3.y) rs.add(new Rectangle(rLast.x,rLast.y+SPEED+distance,DIA,DIA)); } //處理邊界 if(rs.get(0).y <= 5) isLive = false; for(int i = 1; i<rs.size()-1; i++) { if(rs.get(i).intersects(rs.get(0))) isLive = false; } break; case SOUTH: Rectangle r4 = rs.get(0); rs.add(0, new Rectangle(r4.x,r4.y+SPEED+distance,DIA,DIA)); rs.remove(rs.size()-1); if(eatFood(ts.foods.get(0))) { ts.foods.add(new Food()); Rectangle rLast = rs.get(rs.size()-1); if(rLast.y == r4.y) rs.add(new Rectangle(rLast.x+SPEED+distance,rLast.y,DIA,DIA)); if(rLast.y < r4.y) rs.add(new Rectangle(rLast.x,rLast.y-SPEED-distance,DIA,DIA)); if(rLast.y > r4.y) rs.add(new Rectangle(rLast.x,rLast.y+SPEED+distance,DIA,DIA)); } //處理邊界 if(rs.get(0).y >= 400) isLive = false; for(int i = 1; i<rs.size()-1; i++) { if(rs.get(i).intersects(rs.get(0))) isLive = false; } break; default: break; } } public boolean eatFood(Food f) { if(rs.get(0).intersects(new Rectangle(f.getX(),f.getY(),10,10))) { ts.foods.remove(f); round++; if(round % 3 == 0) ts.sleepTime -=20; ts.score += 10; return true; } else return false; } public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); switch (keyCode) { case KeyEvent.VK_LEFT: if(snakeDir != Direction.EAST) snakeDir = Direction.WEST; break; case KeyEvent.VK_RIGHT: if(snakeDir != Direction.WEST) snakeDir = Direction.EAST; break; case KeyEvent.VK_UP: if(snakeDir != Direction.SOUTH) snakeDir = Direction.NORTH; break; case KeyEvent.VK_DOWN: if(snakeDir != Direction.NORTH) snakeDir = Direction.SOUTH; break; default: break; } } }
import java.awt.Color; import java.awt.Graphics; import java.util.Random; public class Food { private int x; private int y; public static Random r = new Random(); public Food() { init(); } public void init() { x = r.nextInt(230); y = r.nextInt(350); } public void draw(Graphics g) { Color c = g.getColor(); g.setColor(Color.MAGENTA); g.fillRect(x, y, 10, 10); } 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; } }
這個版本寫的樸素了一些,自己需要界面和功能完善的話有時間自己加
本文分享自華爲雲社區《10分鐘搞懂各種內存溢出案例!!(含完整源碼,建議收藏)》,作者:冰 河。 作爲程序員,多多少少都會遇到一些內存溢出的場景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個假程序員!哈哈,開個玩笑。今天,我
1. 引言 在現代軟件開發過程中,性能優化和故障排查是保證應用穩定運行的關鍵任務之一。Java作爲一種廣泛使用的編程語言,其生態中湧現出了許多優秀的監控和診斷工具,諸如:SkyWalking、Zipkin等,它們幫助開發者和運維人員
1.背景: 最近一段時間研發大佬們在積極的治理告警,經過一段時間的治理,現在告警情況已經有了很大的改觀,但難免還有漏網之魚;具體我們可以以下邊一個例子來看: 這是一個生產的UMP告警,通過這個告警我們發現XXX這個應用的堆內存使用率
一. 現狀問題 代碼評審 Code Review 是提高代碼質量、促進團隊合作、知識間共享的關鍵環節,對於系統代碼質量和穩定性都至關重要。 【人爲代碼評審(Code Review)】存在很多弊端 時間消耗大:代碼評審是一
本文分享自華爲雲社區《超詳細的Java後臺開發面試題之Spring IOC與AOP》,作者:GaussDB 數據庫。 一、前言 IOC和AOP是Spring中的兩個核心的概念,下面談談對這兩個概念的理解。 二、IOC(Inverse o
這是一篇適合Java工程師體質的AI開發教程。 本教程會教你寫一個簡單的junit4的Rule,該Rule在基於junit4的測試方法失敗後,自動向GPT發送錯誤信息並通過GPT分析得出代碼修改建議。 首先向AI問好 簡單的通過AI,讓它
這個其實是一個特別高頻的面試題,松哥也一直很想和大家仔細來聊一聊這個話題,網上關於這塊的文章很多,但是我一直覺得要把這個問題講清楚還有點難度,今天我來試一試,看能不能和小夥伴們把這個問題梳理清楚,當然,如果小夥伴們覺得看文章不過癮,松哥也有
背景 營銷系統中,客戶投訴是業務發展的一大阻礙,一般會過濾掉黑名單高風險賬號,並配合頻控策略,來減少客訴,進而增加營銷效率,減少營銷成本,提升營銷質量。 營銷系統一般是通過大數據分析建模,在CDP(客戶數據平臺,以客戶爲核心,圍繞數據融
作者:尹航 在前文《基於阿里雲服務網格流量泳道的全鏈路流量管理(一):嚴格模式流量泳道》、《基於阿里雲服務網格流量泳道的全鏈路流量管理(二):寬鬆模式流量泳道》中,我們介紹了流量泳道的概念、使用流量泳道進行全鏈路灰度管理的方案,以及阿里雲服
作者:太業 流式處理語言發展 早期流式處理概念: 20 世紀 70 年代,編程語言如 APL 提供了對數組的流式操作,這可以看作是流式處理語法的早期形式。 管道(Pipes)概念在 UNIX 系統中的引進使得可以通過命令行將一個命令的
轉載自牛肉胡辣湯 在大數據分析和處理的領域中,DolphinScheduler是一個開源的分佈式工作流調度系統,可以用於調度和管理複雜的工作流任務。本文將介紹如何使用Java中的URL類來調用DolphinScheduler的API,實現啓
一、背景 在日常部門OpsReview過程中,部門內多次遇到應用容器所在的宿主機磁盤繁忙導致的接口響應緩慢,TP99增高等影響服務性能的問題,其中比較有效的解決方案是開啓日誌的異步打印,可以有效避免同步日誌打印在磁盤IO高起的情況下拖慢業
一. 現狀問題 代碼評審 Code Review 是提高代碼質量、促進團隊合作、知識間共享的關鍵環節,對於系統代碼質量和穩定性都至關重要。 【人爲代碼評審(Code Review)】存在很多弊端 時間消耗大:代碼評審是一個耗時
文|苟振東(花名:盛知) Koupleless 項目 committer 螞蟻集團技術專家 本文 5789 字 閱讀 12 分鐘 本篇文章屬於 Koupleless 進階系列文章第二篇,默認讀者對 Koupleless 的基礎概念、能力都