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

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

標題: 用C開發(fā)游戲經典案例------------俄羅斯方塊 [打印本頁]

作者: 重新來過    時間: 2006-7-11 13:00
標題: 用C開發(fā)游戲經典案例------------俄羅斯方塊
明天中午接著寫 ,現在該工作了
不好意思 ^o^
作者: 重新來過    時間: 2006-7-12 12:51
標題: 緒寫
學習win32以后 我們總想用他寫點東西,可惜的是我們能看懂這些win32程序,自己寫的時候就麻木,不知道如何下手。
我現在要說的游戲編程是利用Cwin32和MFC相結合的產品。
首先我們基于MFC建立一個基于單文檔的工程,其他選項不變,不過為了程序寫完后我們能在朋友面前顯示一下,最好把庫連接方式改為靜態(tài)設置
現在我們有了基本的框架了,本人覺得這個框架沒必要去用win32去寫

然后就簡單了

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

消息機制

#define MSG_GAMEOVER  "游戲結束"
#define MSG_OVERFILL    "超緩存" //用于測試內存泄漏

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

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

//用向導建立一個類,我這個類來管理所有的方塊操作
class CTempBlock
{
     //構造函數以及西溝函數略
  private :
    //定義 移動的 小方塊 4X4結構
  int  iExist[4][4];
    COLORREF clr;//移動方塊的顏色
  public:
    void Create(); //用于創(chuàng)建小方塊
  // 時間不夠明天接著寫 不好意思 中午就一個小時的時間 我還得吃飯
  // 以后給你們上傳更好的代碼!!
}
作者: daho    時間: 2006-7-13 10:31
這么點算什么與什么啊?
作者: 重新來過    時間: 2006-7-14 13:01
標題: 接商會
class CTempBlock
{
     //構造函數以及西溝函數略
  private :
    //定義 移動的 小方塊 4X4結構
  int  iExist[4][4];
    COLORREF clr;//移動方塊的顏色
  CellType      cellType ;//定義方塊的形式,這個數據結構我們在共通函數里面有定義
  //下面的2 個變量用于控制移動的小方塊(1,1)的游戲區(qū)域中的位置,其他小方塊的位置可以相對于改為只算出
  int Row_X;
    int Col_Y;
  public:
    void Create(); //用于創(chuàng)建小方塊
  void Move(MoveModal mm); //MoveModal 是控制方塊移動或旋轉的數據結構,
                           //這個數據結構我們在共通函數里面有定義
  Init();//初始化函數
  void DrawCell(CDC *pDC);
} ;
現在我們已經有了在窗體中移動的小方塊了
下面就是定義游戲區(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)建完畢
這是我們就可以開始組裝游戲了
首先得定義好游戲場景
背景色為 黑色  這個我們在共通頭函書中有定義
小方塊邊線的顏色  這個我們在共通頭函書中有定義
小方塊的顏色種類  這個我們在共通頭函書中有定義
設置背景色應該不用我說吧
pDC->FillRect(&rect,pBrush);
叢這個函數應該能看出來
變現的顏色在這里我們不用考慮,我們在上面的類中的DrawXXX漢書中就已經考慮到
下面就是如何控制
首先1:產生方塊
假如我們在試圖文件中定義了變量
CTempBlock  tempBlock;
tempBlock.Create();//有著個函數創(chuàng)建方塊,具體代買以后在這,我們先弄清概念
// 明天接著寫,又到1點了 時間真短
作者: 蟲二    時間: 2006-7-14 19:11
接著寫吧 寫完了我拿VB寫下
作者: 重新來過    時間: 2006-7-17 13:00
標題: 接上會
我們首先創(chuàng)建了一個小方塊
玩過俄羅斯方塊的人多知道,我們還得有個通知下一個是什么方塊!
我們再定義一個變量 CTempBlock  nextBlock
nextBlock.Create();
這是我們有了2個方塊
然后就是讓方塊動起來
先創(chuàng)建一個時間事件,建議這里不用另開線程,為什么-----不解釋
然后就是啟動時間事件,同時要記住時間事件的句柄
UINT mTimer;
mTimer = this.SetTimer(1,1000);
參數的意義不解釋,自己去查幫助文檔
我們在時間事件里讓方塊動起來
tempBlock.Move(MM_DOWN);
現在方塊在試圖區(qū)域中可以自己向下移動了,但是我們還看不見!
我們在onpaint事件中寫繪圖函數
CDC*pDC;
pDC = GetDC();
tempBlock.Draw(pDC);
現在我們可以看見一個小方塊在試圖區(qū)域中自己向下移動,不過有點缺點,就是閃屏
如何解決閃屏 --------- 等所有東東完事后,我們再說
現在我們要做的就是如何判斷移動的合法性??
什么時候可以向右移,左移,下移,變形??
思路:
我們在紀錄移動小方塊的位置是 自紀錄 索引為 (1,1)的小方塊,他的位置正好的游戲區(qū)域的索引
//明天接著寫吧
作者: 重新來過    時間: 2006-7-18 12:48
我們在控制方塊移動的時候,只需要知道他的下一個位置是否有小小方塊,如果有則不能移動
我門定義的方塊為4X4結構
//算法---左移
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,而數組的索引不能小于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;
}
//
作者: 重新來過    時間: 2006-7-20 12:51
上面的代碼基本上代碼基本上實現了所有功能
現在要做的就是 具體的實現?
如何產生移動的小方塊?
利用數據把它寫死就可以
一共7種類型的方塊
Create()
{
         int i = rand()5000;
         i =  i % 7;
        switch(i)
       {
       case 0:
      case 1:
      case 2:
      ....
     //省略的代碼應該不用我寫出來了吧,很簡單的
   // 有個問題,細心的人應該能發(fā)現,為什么要  rand()5000 再    i =  i % 7
   // 為什么不直接 rand()%7呢?我們想想 從 5000 個數里面 抽 一個數 和 從 7 個數里面  
  //抽一個數的幾率那個大?其實5000 已經夠了,如果想減小游戲難度 可以 用小點的數
       }
    還有個問題就是產生隨機數的問題? 沒期啟動的時候 我們會發(fā)現初始的方塊多一樣?
只要加個函數 srand 就可以,怎么用??看幫助文檔,代碼放在什么地方在C里面放在InitXXX事件中就可以。
}
作者: 重新來過    時間: 2006-7-21 12:42
標題: 如何解決閃屏問題
我們在做完游戲后,會發(fā)現出現閃屏現象!怎么辦??
我們可以使用2級緩存的感念來解決這個問題
首先我們在內存中創(chuàng)建一個繪圖設備
CDC tempDC;
然后獲得當前程序的繪圖設備
CDC*pDC = GetDC();
//
創(chuàng)建當前設備的批陪設備
tempDC.CreateCompatibleDC(pDC);
這是我們就可以在tempDC上繪圖了,否則無法再tempDC上繪圖
然后就是創(chuàng)建畫板
CBitmap bitmap,*oldBitmap;
bitmap.CreateCompatilbeBitmap(pDC,width,height);
再把位圖選入設備tempDC
oldBitmap = tempDC.SelectObject(&bitmap);
這是我們就可以安全的在tempDC上繪圖了
繪完圖后,我們再把整個tempDC上的圖片拷貝到pDC上就可以了
ok 閃屏文體 就解決了
作者: 木蘭雅痞    時間: 2006-8-5 18:57
支持了~加分!
作者: 流浪者    時間: 2006-8-6 20:28
LZ夠寒,,,標題是c.....里面是MFC(c++).......
作者: 重新來過    時間: 2006-8-7 12:28
標題: 回帖
其實MFC是對win32封裝,而且程序中也是用了win32 API函數

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

所以別和我計較win32或者mfc




歡迎光臨 電子科大論壇-非清水河畔 (http://www.hallmarkedu.com/) Powered by Discuz! X3.4