自己動手寫推箱子游戲——設計師(源碼)

源碼下載地址:http://download.csdn.net/source/3503308

 

第三:設計師

  好的程序不僅能夠讓玩家玩設計好的遊戲,還應該讓他們的新想法得以實現,這就需要爲他們提供設計平臺

 

      1:佈局在遊戲界面中,新建一個類來完成裏面的全部功能,玩家可以點選右邊的圖來設計自己的想法

左邊是佈局,可以用一個CRect數組設置其區域

CRect pic[6];//用於存儲六個圖片的位置
	CRect place[64];//用於存儲64個格子的位置
BOOL CDesignDlg::OnInitDialog() 
{
	num=0;//默認初始爲第十關
	chosed=0;//默認選中的是牆
	//初始化六個圖片的位置
	dc=GetDC();
	flag=false;
	//int i,j;
	for(i=0;i<=7;i++)
		for(j=0;j<=7;j++)
			face1[i][j]=-1;
	for(i=0;i<=2;i++)
	{
		pic[i].left=480;
		pic[i].right=530;
		pic[i].top=40+60*i;
		pic[i].bottom=90+60*i;
	}
	for(i=3;i<=5;i++)
	{
		pic[i].left=540;
		pic[i].right=590;
		pic[i].top=40+(i-3)*60;
		pic[i].bottom=90+(i-3)*60;
	}
//初始化64個位置
	for(i=0;i<=7;i++)
		for(j=0;j<=7;j++)
		{
			place[8*i+j].left=BEGIN+50*j;
			place[8*i+j].top=BEGIN+50*i;
			place[8*i+j].right=BEGIN+50*(j+1);
			place[8*i+j].bottom=BEGIN+50*(i+1);
		}	
		CDialog::OnInitDialog();
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


其次就是需要繪製了,其中繪製圖片的函數參見界面的模塊,

   2:鼠標操作,通過鼠標來選擇和繪製圖形,需要一些標籤來確定是否選中的狀態

  

void CDesignDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	int i=0,j=0;
	if(flag==false)//表示沒有選擇目標
	{
		for(i=0;i<=5;i++)
		{
			if(pic[i].PtInRect(point))
			{
				 if(i==5)
					 chosed=6;
				 else
					 chosed=i;
				 flag=true;
				 CDesignDlg::draw_chosed(dc);
			}
		}
	}
	else
	{
		for(i=0;i<=5;i++)
		{
			if(pic[i].PtInRect(point))
			{
				if(i==5)
					chosed=6;
				else
					chosed=i;
				CDesignDlg::draw_chosed(dc);
			}
		}
		if(i>=5)//表示不再圖片區域
		{
			for(i=0;i<=7;i++)
				for(j=0;j<=7;j++)
				{
					if(place[8*i+j].PtInRect(point))
					{
						face1[i][j]=chosed;
						break;
					}
				}
				CDesignDlg::draw_face1(dc);
		}
	}
	
	CDialog::OnLButtonDown(nFlags, point);
}

 3:保存繪製的圖形

     對於保存圖形,使用ini文件比較容易操作,節名,鍵名和鍵值,比txt文檔方便操作,但是使用註冊表又沒有太大必要。對於ini文件的操作主要有幾個函數

   WritePrivateProfileString

  GetPrivateProfileString

  保存的時候需要對繪製的圖形做些判斷,例如沒有人或者人多與1個,或者箱子的數目與目的地的數目不等呀,需要反饋給玩家重新設計

 void CDesignDlg::OnSave() 
{
 int i,j,box,des,man;
   box=des=man=0;
	for(i=0;i<=7;i++)
		for(j=0;j<=7;j++)
		{
			if(face1[i][j]==3)
				man++;
			if(face1[i][j]==2||face1[i][j]==6)
				box++;
			if(face1[i][j]==4||face1[i][j]==6)
				des++;
		}
		if(man==0)
		{
			MessageBox("沒有人的遊戲","提示");
			return ;
		}
		if(man>1)
		{
			MessageBox("遊戲人數多於1","提示");
			return;
		}
		if(des!=box)
		{
			MessageBox("目的地數與箱子數不相等","Warning!");
			return ;
		}
		CString section;
		CString key,value;
		CString s;
		CString path="./save.ini";

		section="已保存總數";key="總數";
	    GetPrivateProfileString(section,key,s,value.GetBuffer(0),100,path);
		num=(int)atof(value.GetBuffer(0));//獲取以保存的總數

        section.Format("界面數據%d",num+1);//默認重20關開始
		BOOL f=false;
		for( i=0;i<=7;i++)
			for(j=0;j<=7;j++)
			{
				key.Format("%d",8*i+j);
				value.Format("%d",face1[i][j]);
				f=WritePrivateProfileString(section,key,value,path);
				if(f==false)
					break;
			}
			if(f==false)
				MessageBox("保存失敗","warning");
			else
			{
			 MessageBox("保存成功","warning");
			 section="已保存總數";key="總數";value.Format("%d",num+1);
			 WritePrivateProfileString(section,key,value,path);
			}
}

4:清除界面

  設計者對界面不滿意時應該可以清除界面,其實也很簡單,只要初始化界面即可

void CDesignDlg::OnClear() 
{
  
	for(i=0;i<=7;i++)
		for(j=0;j<=7;j++)
			face1[i][j]=-1;
		RedrawWindow();
		CDesignDlg::OnPaint();
}



 

   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章