




已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
事件驅(qū)動程序設(shè)計(jì)(英語:Event-driven programming)是一種電腦程序設(shè)計(jì)模型。這種模型的程序運(yùn)行流程是由用戶的動作(如鼠標(biāo)的按鍵,鍵盤的按鍵動作)或者是由其他程序的消息來決定的。相對于批處理程序設(shè)計(jì)(batch programming)而言,程序運(yùn)行的流程是由程序員來決定。批量的程序設(shè)計(jì)在初級程序設(shè)計(jì)教學(xué)課程上是一種方式。然而,事件驅(qū)動程序設(shè)計(jì)這種設(shè)計(jì)模型是在交互程序(Interactive program)的情況下孕育而生的。事件驅(qū)動程序可以由任何編程語言來實(shí)現(xiàn),然而使用某些語言來撰寫會比其他的語言來的簡單。有些集成開發(fā)環(huán)境(簡稱IDE)也會影響實(shí)現(xiàn)事件驅(qū)動程序設(shè)計(jì)的難易程度。有的 IDE 會使的開發(fā)工作變的很簡單,有的則否。取代傳統(tǒng)上一次等待一個完整的指令然后再做運(yùn)行的方式,事件驅(qū)動程序模型下的系統(tǒng),基本上的架構(gòu)是預(yù)先設(shè)計(jì)一個事件循環(huán)所形成的程序,這個事件循環(huán)程序不斷地檢查目前要處理的信息,根據(jù)要處理的信息運(yùn)行一個觸發(fā)函數(shù)進(jìn)行必要的處理。其中這個外部信息可能來自一個目錄夾中的文件,可能來自鍵盤或鼠標(biāo)的動作,或者是一個時(shí)間事件。對一個事件驅(qū)動(event driven)系統(tǒng)進(jìn)行程序設(shè)計(jì),因此可以視為改寫系統(tǒng)默認(rèn)觸發(fā)函數(shù)的行為,來符合自己需要的一種動作。輸入的事件可以放進(jìn)事件循環(huán)或者是經(jīng)由已經(jīng)注冊的中斷處理器來與硬件事件交互;而許多的軟件系統(tǒng)使用了混和這兩種技術(shù)的處理。預(yù)先設(shè)計(jì)好的算法確定了一件事,那就是當(dāng)他們被需要的時(shí)候,就會在適當(dāng)?shù)臅r(shí)機(jī)被觸發(fā)。也因此提供了一個模擬中斷驅(qū)動環(huán)境(interrupt driven environment)的軟件抽象架構(gòu)。事件驅(qū)動程序設(shè)計(jì)基本上包含了許多小程序片段,這些小程序片段被稱為事件處理器并且被用來回應(yīng)外部的事件與分發(fā)事件。通常尚未被事件處理器處理的事件,都會被系統(tǒng)放在一個稱為事件隊(duì)列的數(shù)據(jù)結(jié)構(gòu)中,等待被處理。許多情況下,事件處理器可以自己觸發(fā)事件,因此也可能形成一個事件串。 事件驅(qū)動程序設(shè)計(jì)的著重于彈性以及異步化上面,并且企圖盡可能的modeless。 圖形用戶界面這類程序就是典型的事件驅(qū)動設(shè)計(jì)方式。計(jì)算機(jī)操作系統(tǒng)是事件驅(qū)動程序的典型示例。在操作系統(tǒng)的最底層,中斷處理器的動作就像是硬件事件的直接處理器,搭配著 CPU 運(yùn)行分配事件規(guī)則動作。對軟件進(jìn)程而言,基本上操作系統(tǒng)可視為一個事件分配器,發(fā)送數(shù)據(jù)和軟件中斷給用戶自己寫的軟件進(jìn)程。package text;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class Frame extends JFrame JTextField text; JLabel nowBomb, setBomb; int BombNum, BlockNum; / 當(dāng)前雷數(shù),當(dāng)前方塊數(shù) int rightBomb, restBomb, restBlock; / 找到的地雷數(shù),剩余雷數(shù),剩余方塊數(shù) JButton start = new JButton( 開始 ); JPanel MenuPamel = new JPanel(); JPanel bombPanel = new JPanel(); Bomb bombButton; JPanel c; BorderLayout borderLayout1 = new BorderLayout(); GridLayout gridLayout1 = new GridLayout(); public Frame() try setDefaultCloseOperation(EXIT_ON_CLOSE); jbInit(); catch (Exception exception) exception.printStackTrace(); private void jbInit() throws Exception c = (JPanel) getContentPane(); setTitle(掃雷); c.setBackground(Color.WHITE); MenuPamel.setBackground(Color.GRAY); c.setLayout(borderLayout1); setSize(new Dimension(600, 600); setResizable(false); BlockNum = 144; BombNum = 10; text = new JTextField(10 , 3); nowBomb = new JLabel(當(dāng)前雷數(shù) + : + BombNum); setBomb = new JLabel(設(shè)置地雷數(shù)); start.addActionListener(new Frame1_start_actionAdapter(this); MenuPamel.add(setBomb); MenuPamel.add(text); MenuPamel.add(start); MenuPamel.add(nowBomb); c.add(MenuPamel, java.awt.BorderLayout.SOUTH); bombPanel.setLayout(gridLayout1); gridLayout1.setColumns( (int) Math.sqrt(BlockNum); gridLayout1.setRows( (int) Math.sqrt(BlockNum); bombButton = new Bomb (int) Math.sqrt(BlockNum) (int) Math.sqrt(BlockNum); for (int i = 0; i (int) Math.sqrt(BlockNum); i+) for (int j = 0; j = 5 & num 50) BombNum = num; startBomb(); else if (num 5) JOptionPane.showMessageDialog(null, 您設(shè)置的地雷數(shù)太少了,請重設(shè)!, 錯誤, JOptionPane.ERROR_MESSAGE); num=10; BombNum = num; else JOptionPane.showMessageDialog(null, 您設(shè)置的地雷數(shù)太多了,請重設(shè)!, 錯誤, JOptionPane.ERROR_MESSAGE); num=10; BombNum = num; /* 開始,布雷 */ public void startBomb() nowBomb.setText(當(dāng)前雷數(shù) + : + BombNum); for (int i = 0; i (int) Math.sqrt(BlockNum); i+) for (int j = 0; j (int) Math.sqrt(BlockNum); j+) bombButtonij.isBomb = false; bombButtonij.isClicked = false; bombButtonij.isRight = false; bombButtonij.BombFlag = 0; bombButtonij.BombRoundCount = 9; bombButtonij.setEnabled(true); bombButtonij.setText(); bombButtonij.setFont(new Font(, Font.PLAIN, 14);/設(shè)置字體大小 bombButtonij.setForeground(Color.BLUE); rightBomb = 0; restBomb = BombNum; restBlock = BlockNum - BombNum; for (int i = 0; i BombNum; ) int x = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1); int y = (int) (Math.random() * (int) (Math.sqrt(BlockNum) - 1); if (bombButtonxy.isBomb != true) bombButtonxy.isBomb = true; i+; CountRoundBomb(); /* 計(jì)算方塊周圍雷數(shù) */ public void CountRoundBomb() for (int i = 0; i (int) Math.sqrt(BlockNum); i+) for (int j = 0; j (int) Math.sqrt(BlockNum); j+) int count = 0; / 當(dāng)需要檢測的單元格本身無地雷的情況下,統(tǒng)計(jì)周圍的地雷個數(shù) if (bombButtonij.isBomb != true) for (int x = i - 1; x i + 2; x+) for (int y = j - 1; y = 0) & (y = 0) & (x ( (int) Math.sqrt(BlockNum) & (y ( (int) Math.sqrt(BlockNum) if (bombButtonxy.isBomb = true) count+; bombButtonij.BombRoundCount = count; /* 是否挖完了所有的雷 */ public void isWin() restBlock = BlockNum - BombNum; for (int i = 0; i (int) Math.sqrt(BlockNum); i+) for (int j = 0; j (int) Math.sqrt(BlockNum); j+) if (bombButtonij.isClicked = true) restBlock-; if (rightBomb = BombNum | restBlock = 0) JOptionPane.showMessageDialog(this, 您挖完了所有的雷,您勝利了!, 勝利, JOptionPane.INFORMATION_MESSAGE); startBomb(); /* 當(dāng)選中的位置為空,則翻開周圍的地圖* */ public void isNull(Bomb ClickedButton) int i, j; i = ClickedButton.num_x; j = ClickedButton.num_y; for (int x = i - 1; x i + 2; x+) for (int y = j - 1; y = 0) & (y = 0) & (x ( (int) Math.sqrt(BlockNum) & (y 0) ClickedButton.setText(ClickedButton.BombRoundCount + ); else isNull(ClickedButton); /* 左鍵點(diǎn)擊 */ public void actionPerformed(ActionEvent e) if ( ( (Bomb) e.getSource().isClicked = false & ( (Bomb) e.getSource().isRight = false) if ( ( (Bomb) e.getSource().isBomb = false) turn( ( (Bomb) e.getSource(); isWin(); else for (int i = 0; i (int) Math.sqrt(BlockNum); i+) for (int j = 0; j 0) bombSource.setForeground(Color.RED); bombSource.setText(F); bombSource.isRight = true; restBomb-; else bombSource.BombFlag = 0; else if (bombSource.BombFlag = 2) restBomb+; bombSource.setText(Q); bombSource.isRight = false; else bombSource.setText(); if (bombSource.isBomb = true) if (bombSource.BombFlag = 1) rightBomb+; else if (bombSource.BombFlag = 2) rightBomb-; nowBomb.setText(當(dāng)前雷數(shù) + : + restBomb); isWin(); public static void main(String args) Frame frame = new Frame(); frame.setVisible(true); class Frame1_start_actionAdapter implements ActionListener private Frame adaptee; Frame1_start_actionAdapter(Frame adaptee) this.adaptee = adaptee; public void actionPerformed(ActionEvent e) adaptee.start_actionPerformed(e); class Bomb extends JButton i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 根雕大件轉(zhuǎn)讓協(xié)議書
- 深圳包辦入學(xué)協(xié)議書
- 湖南懷化補(bǔ)償協(xié)議書
- 漁場池塘承包協(xié)議書
- 扶貧幫助銷售協(xié)議書
- 民間糧食收儲協(xié)議書
- 授權(quán)合作系列協(xié)議書
- 溫室氣體京都協(xié)議書
- 森林防火定制協(xié)議書
- 深圳車牌租借協(xié)議書
- 第14課 背影 課件(共26張ppt)
- 健身房運(yùn)營總體策劃方案
- 銷售基礎(chǔ)編碼規(guī)則模板
- 水電安裝施工組織設(shè)計(jì)施工組織設(shè)計(jì)
- 2023年陜西普通高中學(xué)業(yè)水平考試通用技術(shù)試題
- 快遞員(初級)理論培訓(xùn)考試題庫600題(含答案)
- 中西醫(yī)執(zhí)業(yè)醫(yī)師《第二單元》模擬試題卷一(精選)
- 二年級看圖寫話講評
- 審計(jì)業(yè)務(wù)約定書
- 酒店OTA賓客服務(wù)操作流程
- 人教版高中化學(xué)選修二測試題及答案解析
評論
0/150
提交評論