程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 用 DELPHI 寫記憶力游戲

用 DELPHI 寫記憶力游戲

編輯:Delphi

   不知道大家有沒有這種感覺,當我們對編程有了一些興 趣時,不論我們看到什麼程序都會不由自主的在腦子裡面構 想一下這個程序是如何實現的。正如我前一段時間看到一個 鍛煉記憶力的游戲就小試了一把,也算做得有點模樣。不敢 獨享,特在這裡眾樂樂,希望廣大編程愛好者共同指正。

一、游戲的規則
如圖1所示,游戲中有60張牌且均為牌面朝下放置,你 可以用鼠標將牌翻開。如果前後翻開的兩張牌是相同的圖 案,那麼它們就會一起消失,否則就會恢復朝下放置的狀 態。當你使游戲中所有60張牌 都消失掉時,游戲便會結束。怎 麼樣,看起來蠻簡單的吧?實 際上,你需要牢牢地記住各種 圖案牌的位置以便盡快的完成 游戲,所以玩起來還是要費點力氣的喲!

二、程序的實現 讓我們一步一步分析需要完成的任務。 游戲的界面如圖1所示,很顯然,我們可以用一個10×6的二維數組來表示上面的每張牌。在程序中我定義了數組 mymap(i,j),其中的i是x方向上牌的數目,j 是y方向上牌 的數目,總共是 60 張牌。
 
在游戲中每張牌有好幾種狀態,分別是牌沒有翻開、牌 已經翻開、牌已經消失和鼠標正指在牌上這四種。在這裡我 定義了另外一個數組 mmap(i,j)來表示,其取值 0,1,2,3 分別對應著上述的四種狀態。
前面我們定義了表示每張牌的數組mymap(i,j),下面就 要對每張牌進行初始化。程序中用到的圖像文件在 skin/ class目錄下,背景文件叫back.bmp而牌面文件叫map.bmp, 如圖 2 所示。從圖2 中我們可以看到map.bmp中有44 張牌 面,第一張是牌的背面,第二張為鼠標指到牌上所顯示的圖 像,所以牌面的圖案只有42 幅。我為了增加程序的趣味性 還設置了更換skin的功能,也就是在skin/new目錄下同樣 有另外一套程序的外觀文件,玩家可以在程序運行中點右鍵 菜單行更換。
有了這 42 張牌接下來我們就要隨機的“抽牌”了,當 然這裡要注意的是抽的牌必須成對出現。我所實現方法是首 先在 0 到 42 之間取 30 個隨機數,依次賦給數組 a(i)中相隔
30 的兩個元素,合起來也就是60 個元素。由於這樣抽出的
牌是規則排列的,所以我們還要對其進行“洗牌”,也就是 將數組a(i)中元素的排列順序打亂。開始一個循環,在0..60 之間取隨機數 t,將 a(t)賦值給 b(i)同時將 a(t)賦 0,進入下 一個循環給b(i+1)賦值,如果a(t)=0也就是已經賦過值則重 新取隨機數t,直到數組b(i)中所有元素都被賦值。最後再將 b(i)逐個賦值給mymap(i,j),到這裡初始化的工作就結束了。
初始化結束後,就要實現游戲的功能了,也就是當翻開 兩張相同的牌時牌就消失,不相同時恢復牌面朝下。這裡我 們用到了幾個全局變量oldmyx和oldmyy表示翻開的第一 張牌的坐標,curmyx和curmyy表示翻開的第二張牌的坐 標,oldx 和 oldy 表示鼠標剛移過的那張牌的坐標,isopen 表示是牌否翻開了。在Form的MouseDown過程中將點擊 的牌定義為翻開的狀態,在MouseUp過程中判斷翻開的兩 張牌是否相同是則牌消失,否則牌恢復,而在MouseMove 過程中顯示被鼠標指著的牌所顯示的狀態,即牌上有一個綠 色的框 。 這裡當牌被翻開和消失掉時程序都會用 sndPlaySound來同步發出音效,當然要在程序開頭進行聲 明,加上uses MMSystem。
最後要做的就是判斷游戲是否結束,並開始下一回合。 在過程paintmap中統計消失掉牌的數目,當達到60時游戲 結束並詢問是否開始下一回合。
好了游戲的實現原理全部敘述了一遍了,就讓我們快來 看看全部的源代碼吧!希望你能從這些代碼中找出靈感,寫 出更加完美的游戲來!

三、游戲的源代碼
unit Unit1; interface uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Menus;

type
  TForm1 = class(TForm)
    PopupMenu1: TPopupMenu;
    BigmaSoft1: TMenuItem;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure FormMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); 
 procedure N4Click(Sender: TObject);
    procedure N2Click(Sender: TObject);
    procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,Y: Integer);
 &nb

[1] [2] [3] [4] [5] 下一頁

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved