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

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

 找回密碼
 注冊(cè)(開(kāi)放注冊(cè))
查看: 10439|回復(fù): 11
打印 上一主題 下一主題

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

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

緒寫(xiě)

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

然后就簡(jiǎn)單了

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

消息機(jī)制

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

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

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

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

評(píng)分

1

查看全部評(píng)分

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

接商會(huì)

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

接上會(huì)

我們首先創(chuàng)建了一個(gè)小方塊
玩過(guò)俄羅斯方塊的人多知道,我們還得有個(gè)通知下一個(gè)是什么方塊!
我們?cè)俣x一個(gè)變量 CTempBlock  nextBlock
nextBlock.Create();
這是我們有了2個(gè)方塊
然后就是讓方塊動(dòng)起來(lái)
先創(chuàng)建一個(gè)時(shí)間事件,建議這里不用另開(kāi)線(xiàn)程,為什么-----不解釋
然后就是啟動(dòng)時(shí)間事件,同時(shí)要記住時(shí)間事件的句柄
UINT mTimer;
mTimer = this.SetTimer(1,1000);
參數(shù)的意義不解釋?zhuān)约喝ゲ閹椭臋n
我們?cè)跁r(shí)間事件里讓方塊動(dòng)起來(lái)
tempBlock.Move(MM_DOWN);
現(xiàn)在方塊在試圖區(qū)域中可以自己向下移動(dòng)了,但是我們還看不見(jiàn)!
我們?cè)趏npaint事件中寫(xiě)繪圖函數(shù)
CDC*pDC;
pDC = GetDC();
tempBlock.Draw(pDC);
現(xiàn)在我們可以看見(jiàn)一個(gè)小方塊在試圖區(qū)域中自己向下移動(dòng),不過(guò)有點(diǎn)缺點(diǎn),就是閃屏
如何解決閃屏 --------- 等所有東東完事后,我們?cè)僬f(shuō)
現(xiàn)在我們要做的就是如何判斷移動(dòng)的合法性??
什么時(shí)候可以向右移,左移,下移,變形??
思路:
我們?cè)诩o(jì)錄移動(dòng)小方塊的位置是 自紀(jì)錄 索引為 (1,1)的小方塊,他的位置正好的游戲區(qū)域的索引
//明天接著寫(xiě)吧
7#
 樓主| 發(fā)表于 2006-7-18 12:48:57 | 只看該作者
我們?cè)诳刂品綁K移動(dòng)的時(shí)候,只需要知道他的下一個(gè)位置是否有小小方塊,如果有則不能移動(dòng)
我門(mén)定義的方塊為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;
上面的算法,看是正確,但是有危險(xiǎn),posX-1很有可能小于0,而數(shù)組的索引不能小于0,也不可能大于等于定義值
所以在上面的算法中我們還要加格判斷,否則程序在運(yùn)行的時(shí)候會(huì)出錯(cuò)。
這樣我們就可以知道 如何判斷左移,下移,以及 變形的合法控制了

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

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

如何解決閃屏問(wèn)題

我們?cè)谧鐾暧螒蚝螅瑫?huì)發(fā)現(xiàn)出現(xiàn)閃屏現(xiàn)象!怎么辦??
我們可以使用2級(jí)緩存的感念來(lái)解決這個(gè)問(wèn)題
首先我們?cè)趦?nèi)存中創(chuàng)建一個(gè)繪圖設(shè)備
CDC tempDC;
然后獲得當(dāng)前程序的繪圖設(shè)備
CDC*pDC = GetDC();
//
創(chuàng)建當(dāng)前設(shè)備的批陪設(shè)備
tempDC.CreateCompatibleDC(pDC);
這是我們就可以在tempDC上繪圖了,否則無(wú)法再tempDC上繪圖
然后就是創(chuàng)建畫(huà)板
CBitmap bitmap,*oldBitmap;
bitmap.CreateCompatilbeBitmap(pDC,width,height);
再把位圖選入設(shè)備tempDC
oldBitmap = tempDC.SelectObject(&bitmap);
這是我們就可以安全的在tempDC上繪圖了
繪完圖后,我們?cè)侔颜麄(gè)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 | 只看該作者

回帖

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

我想我沒(méi)有必要把界面的程序用win32也給你寫(xiě)一遍吧

所以別和我計(jì)較win32或者mfc

本版積分規(guī)則

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

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

GMT+8, 2025-11-6 07:58 , Processed in 0.067758 second(s), 15 queries .

Powered by 校園招聘信息

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

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