影音先锋男人资源av站_狠狠色综合激情丁香五月_爱爱爱爱看视频_在线播放免费人成视频在线观看_少妇人妻综合久久中文字幕_国产午夜无码精品免费看_久久久久久夜精品精品免费啦_男人女人午夜视频免费_日本xxxx裸体xxxx_丰满人妻熟妇乱又仑精品

電子科大論壇-非清水河畔

 找回密碼
 注冊(開放注冊)
查看: 10440|回復(fù): 11
打印 上一主題 下一主題

[軟件] 用C開發(fā)游戲經(jīng)典案例------------俄羅斯方塊

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
1#
發(fā)表于 2006-7-11 13:00:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
明天中午接著寫 ,現(xiàn)在該工作了
不好意思 ^o^
2#
 樓主| 發(fā)表于 2006-7-12 12:51:45 | 只看該作者

緒寫

學(xué)習(xí)win32以后 我們總想用他寫點東西,可惜的是我們能看懂這些win32程序,自己寫的時候就麻木,不知道如何下手。
我現(xiàn)在要說的游戲編程是利用Cwin32和MFC相結(jié)合的產(chǎn)品。
首先我們基于MFC建立一個基于單文檔的工程,其他選項不變,不過為了程序?qū)懲旰笪覀兡茉谂笥衙媲帮@示一下,最好把庫連接方式改為靜態(tài)設(shè)置
現(xiàn)在我們有了基本的框架了,本人覺得這個框架沒必要去用win32去寫

然后就簡單了

首先建立個頭文件
ComData.h
在這個文件里我們寫一些經(jīng)常用到的東西
首先是文檔
#define  TITLE_MAIN    "俄羅斯方塊游戲"
#define TITLE_ERROR "錯誤提示"  //這個主要用于消息提示

消息機(jī)制

#define MSG_GAMEOVER  "游戲結(jié)束"
#define MSG_OVERFILL    "超緩存" //用于測試內(nèi)存泄漏

/;/定義小方塊大小(像素)
#define CELL   15
//定義游戲屏幕的大小 (以格數(shù)為單位)
#define  SCR_WID     24
#define  SCR_HEI      12 //

//這樣基本信息我們已經(jīng)創(chuàng)建,以后如有需要的信息我們可以在這個頭文件中添加

//用向?qū)Ы⒁粋類,我這個類來管理所有的方塊操作
class CTempBlock
{
     //構(gòu)造函數(shù)以及西溝函數(shù)略
  private :
    //定義 移動的 小方塊 4X4結(jié)構(gòu)
  int  iExist[4][4];
    COLORREF clr;//移動方塊的顏色
  public:
    void Create(); //用于創(chuàng)建小方塊
  // 時間不夠明天接著寫 不好意思 中午就一個小時的時間 我還得吃飯
  // 以后給你們上傳更好的代碼!!
}

評分

1

查看全部評分

3#
發(fā)表于 2006-7-13 10:31:01 | 只看該作者
這么點算什么與什么啊?
4#
 樓主| 發(fā)表于 2006-7-14 13:01:13 | 只看該作者

接商會

class CTempBlock
{
     //構(gòu)造函數(shù)以及西溝函數(shù)略
  private :
    //定義 移動的 小方塊 4X4結(jié)構(gòu)
  int  iExist[4][4];
    COLORREF clr;//移動方塊的顏色
  CellType      cellType ;//定義方塊的形式,這個數(shù)據(jù)結(jié)構(gòu)我們在共通函數(shù)里面有定義
  //下面的2 個變量用于控制移動的小方塊(1,1)的游戲區(qū)域中的位置,其他小方塊的位置可以相對于改為只算出
  int Row_X;
    int Col_Y;
  public:
    void Create(); //用于創(chuàng)建小方塊
  void Move(MoveModal mm); //MoveModal 是控制方塊移動或旋轉(zhuǎn)的數(shù)據(jù)結(jié)構(gòu),
                           //這個數(shù)據(jù)結(jié)構(gòu)我們在共通函數(shù)里面有定義
  Init();//初始化函數(shù)
  void DrawCell(CDC *pDC);
} ;
現(xiàn)在我們已經(jīng)有了在窗體中移動的小方塊了
下面就是定義游戲區(qū)域
class GameState
{
private:
       int iExist[SCR_HEI][SCR_WID ];
       COLORREF clrArray[SCR_HEI][SCR_WID ];
public:
     void DrawState(CDC * pDC);//這里不能用HDC,因為我們在MFC里做程序,不用那么麻煩,傳遞CDC就可以
};
游戲區(qū)域創(chuàng)建完畢
這是我們就可以開始組裝游戲了
首先得定義好游戲場景
背景色為 黑色  這個我們在共通頭函書中有定義
小方塊邊線的顏色  這個我們在共通頭函書中有定義
小方塊的顏色種類  這個我們在共通頭函書中有定義
設(shè)置背景色應(yīng)該不用我說吧
pDC->FillRect(&rect,pBrush);
叢這個函數(shù)應(yīng)該能看出來
變現(xiàn)的顏色在這里我們不用考慮,我們在上面的類中的DrawXXX漢書中就已經(jīng)考慮到
下面就是如何控制
首先1:產(chǎn)生方塊
假如我們在試圖文件中定義了變量
CTempBlock  tempBlock;
tempBlock.Create();//有著個函數(shù)創(chuàng)建方塊,具體代買以后在這,我們先弄清概念
// 明天接著寫,又到1點了 時間真短
5#
發(fā)表于 2006-7-14 19:11:27 | 只看該作者
接著寫吧 寫完了我拿VB寫下
6#
 樓主| 發(fā)表于 2006-7-17 13:00:05 | 只看該作者

接上會

我們首先創(chuàng)建了一個小方塊
玩過俄羅斯方塊的人多知道,我們還得有個通知下一個是什么方塊!
我們再定義一個變量 CTempBlock  nextBlock
nextBlock.Create();
這是我們有了2個方塊
然后就是讓方塊動起來
先創(chuàng)建一個時間事件,建議這里不用另開線程,為什么-----不解釋
然后就是啟動時間事件,同時要記住時間事件的句柄
UINT mTimer;
mTimer = this.SetTimer(1,1000);
參數(shù)的意義不解釋,自己去查幫助文檔
我們在時間事件里讓方塊動起來
tempBlock.Move(MM_DOWN);
現(xiàn)在方塊在試圖區(qū)域中可以自己向下移動了,但是我們還看不見!
我們在onpaint事件中寫繪圖函數(shù)
CDC*pDC;
pDC = GetDC();
tempBlock.Draw(pDC);
現(xiàn)在我們可以看見一個小方塊在試圖區(qū)域中自己向下移動,不過有點缺點,就是閃屏
如何解決閃屏 --------- 等所有東東完事后,我們再說
現(xiàn)在我們要做的就是如何判斷移動的合法性??
什么時候可以向右移,左移,下移,變形??
思路:
我們在紀(jì)錄移動小方塊的位置是 自紀(jì)錄 索引為 (1,1)的小方塊,他的位置正好的游戲區(qū)域的索引
//明天接著寫吧
7#
 樓主| 發(fā)表于 2006-7-18 12:48:57 | 只看該作者
我們在控制方塊移動的時候,只需要知道他的下一個位置是否有小小方塊,如果有則不能移動
我門定義的方塊為4X4結(jié)構(gòu)
//算法---左移
int  posX,posY;
for(int x = 0; x<5;x++)
  for(int y = 0;yx<5;y++)
{
    if(iExist[x][y] == 0)
          continue;
   GetPos(posX,posY,x,y);
   // 我們知道 方塊的位置就是游戲區(qū)域的索引
// 所以
  if(gs.iExist[posX-1][posY] == 1)
         return false;
}
return true;
上面的算法,看是正確,但是有危險,posX-1很有可能小于0,而數(shù)組的索引不能小于0,也不可能大于等于定義值
所以在上面的算法中我們還要加格判斷,否則程序在運行的時候會出錯。
這樣我們就可以知道 如何判斷左移,下移,以及 變形的合法控制了

這些做完后我們就可以 完善游戲了

首先給程序添加個時間事件---------再XXXXView.h/.cpp中添加
再時間中我們寫
if(tempBlock.Move(MM_DOWN) == false)
{
      Swap();
     tempBlock.Create();
}
//上面的只能是控制自動向下運動
//我們還要自己控制他
//給程序添加keyDown/up事件
添加如下代碼
switch(nChar)
{
case VK_LFET:
    return;
case VK_RIGHT:
tempBlocl.Move(MM_RIGHT);
return;
case VK_DOWN:
tempBlocl.Move(MM_DOWN)
return;
case VK_UP:
tempBlocl.Move(MM_CHG);//變形
return;
}
//
8#
 樓主| 發(fā)表于 2006-7-20 12:51:02 | 只看該作者
上面的代碼基本上代碼基本上實現(xiàn)了所有功能
現(xiàn)在要做的就是 具體的實現(xiàn)?
如何產(chǎn)生移動的小方塊?
利用數(shù)據(jù)把它寫死就可以
一共7種類型的方塊
Create()
{
         int i = rand()5000;
         i =  i % 7;
        switch(i)
       {
       case 0:
      case 1:
      case 2:
      ....
     //省略的代碼應(yīng)該不用我寫出來了吧,很簡單的
   // 有個問題,細(xì)心的人應(yīng)該能發(fā)現(xiàn),為什么要  rand()5000 再    i =  i % 7
   // 為什么不直接 rand()%7呢?我們想想 從 5000 個數(shù)里面 抽 一個數(shù) 和 從 7 個數(shù)里面  
  //抽一個數(shù)的幾率那個大?其實5000 已經(jīng)夠了,如果想減小游戲難度 可以 用小點的數(shù)
       }
    還有個問題就是產(chǎn)生隨機(jī)數(shù)的問題? 沒期啟動的時候 我們會發(fā)現(xiàn)初始的方塊多一樣?
只要加個函數(shù) srand 就可以,怎么用??看幫助文檔,代碼放在什么地方在C里面放在InitXXX事件中就可以。
}
9#
 樓主| 發(fā)表于 2006-7-21 12:42:22 | 只看該作者

如何解決閃屏問題

我們在做完游戲后,會發(fā)現(xiàn)出現(xiàn)閃屏現(xiàn)象!怎么辦??
我們可以使用2級緩存的感念來解決這個問題
首先我們在內(nèi)存中創(chuàng)建一個繪圖設(shè)備
CDC tempDC;
然后獲得當(dāng)前程序的繪圖設(shè)備
CDC*pDC = GetDC();
//
創(chuàng)建當(dāng)前設(shè)備的批陪設(shè)備
tempDC.CreateCompatibleDC(pDC);
這是我們就可以在tempDC上繪圖了,否則無法再tempDC上繪圖
然后就是創(chuàng)建畫板
CBitmap bitmap,*oldBitmap;
bitmap.CreateCompatilbeBitmap(pDC,width,height);
再把位圖選入設(shè)備tempDC
oldBitmap = tempDC.SelectObject(&bitmap);
這是我們就可以安全的在tempDC上繪圖了
繪完圖后,我們再把整個tempDC上的圖片拷貝到pDC上就可以了
ok 閃屏文體 就解決了
10#
發(fā)表于 2006-8-5 18:57:32 | 只看該作者
支持了~加分!
11#
發(fā)表于 2006-8-6 20:28:57 | 只看該作者
LZ夠寒,,,標(biāo)題是c.....里面是MFC(c++).......
12#
 樓主| 發(fā)表于 2006-8-7 12:28:51 | 只看該作者

回帖

其實MFC是對win32封裝,而且程序中也是用了win32 API函數(shù)

我想我沒有必要把界面的程序用win32也給你寫一遍吧

所以別和我計較win32或者mfc
您需要登錄后才可以回帖 登錄 | 注冊(開放注冊)

本版積分規(guī)則

手機(jī)訪問本頁請
掃描左邊二維碼
本網(wǎng)站聲明
本網(wǎng)站所有內(nèi)容為網(wǎng)友上傳,若存在版權(quán)問題或是相關(guān)責(zé)任請聯(lián)系站長!
站長電話:0898-66661599    站長聯(lián)系QQ:12726567   
站長微信:hainanok
請掃描右邊二維碼
www.myujob.com

小黑屋|手機(jī)版|Archiver|電子科大論壇-非清水河畔 ( 瓊ICP備10001196號-2 )

GMT+8, 2025-11-6 11:28 , Processed in 0.065386 second(s), 15 queries .

Powered by 校園招聘信息

© 2001-2020 電子科大論壇-非清水河畔校園招聘

快速回復(fù) 返回頂部 返回列表