close

Python寫小遊戲

這是一個小小的遊戲程式,該遊戲程式包含了兩種模式。第一個是"遊戲設計"模式,另一個是"遊戲測試"模式。在"遊戲設計"模式中,遊戲設計者可以加入一些遊戲物件(如:小紅人和其他物品),並且利用滑鼠拖曳的功能在畫面中擺設這些物品。因為我不擅長於美工設計,所以我產生了一些英文字的圖片當做遊戲的物品。這個遊戲是利用小紅人這個角色去收集散落於畫面中的物品,只要集滿9個物品就算是遊戲結束。另外遊戲中有一個叫Energy(能量),這個東西會隨著小紅人的移動而減少,一但這個數值變成0,而小紅人尚未收集到9個物品,就算是任務失敗,並且結束遊戲。Energy這個數值,我們根據小紅人的移動方向的不同,而給予不同的數值。因為向上爬比較費力,所以減少的比較多,向下走比較省力,所以減少的比較少,左右移動減少的數值為兩者之間。Eq1所表示的資料就是上下左右所會減少的Energy值,目前這個數值並未提供設計設去變更,如果要讓遊戲設計者可以變更此設定值,需要撰寫一個介面供設計者變更當中的資料,如果有需要可以花時間撰寫。另外關於物品方面,目前只提供增加物品到螢幕畫面的功能,並沒有提供將某項物品從遊戲中移除的功能,如果有需要可以考慮撰寫此功能,這樣會使整個遊戲設計介面更加完善。Eq2所表示的資料結構為所有物品存放的結構,裡面的資料包含物品的名稱、顯示的圖示資料與擺設的座標位置。posEq3中所顯示的資料為小紅人的基本資料,包含位置、狀態(面向何方)、收集到的物品、他目前的Energy值。因為我怕物品還沒收集完畢,Energy值就歸0,所以將這個值設成10000。

 
self.energy_cost={'up':50,'down':10,'left':20,'right':20}                                                                                 (Eq1)
self.items={}                                                                                                                                                 (Eq2)
self.user_status={'pos':role,'face':32,'status':0,'image':'RedMageSpriteSheet.bmp','item':[],'energy':10000}    (Eq3)
 
pos
圖一所顯示的就是"遊戲設計"模式的畫面,在這個畫面中可以透過"Add Item"這個按鈕增加物品,並利用滑鼠將物品移到所希望的位置,佈置出一個遊戲場景。

 圖一: 遊戲設計介面,利用滑鼠拖曳的功能將文字拉到畫面的中央
 
 
 
 另外一個是"遊戲測試"模式,在這個模式中,參與遊戲者必須使用鍵盤的上、下、左、右來控制人物的移動。並且設法將人物移動到物品的上面,讓人物与物品的圖片重疊,這樣該物品就會被放入小紅人的口袋中。遊戲畫面分成兩個部分,一個部分就是小紅人所能移動的遊戲空間,另一個部分是屬於小紅人的狀態顯示,包含小紅人目前的Energy值與收集到的物品。目前這個遊戲是一個集字遊戲,但是並沒有限定遊戲者集字的順序,參與遊戲者可以盡可能的減少Energy的減少,在歸0前收集到9個字母即可。
 

 圖二: 遊戲測試介面,利用鍵盤來控制人物的移動,並收集畫面上的物品,圖中已經收集了五個物品
 
鍵盤控制程式碼
    def OnPanel1KeyDown(self, event):
        code=event.GetKeyCode()
        dx=0
        dy=0
        if self.isplay:           
            if code==wx.WXK_UP:   #如果偵測到向上的鍵被按下
                can_move = self.user_status['energy'] - self.energy_cost['up']              
                if self.user_status['face']==0 and can_move>=0:
                    self.user_status['energy'] -= self.energy_cost['up']
                    dy+=-5                   
                else:
                    self.user_status['face']=0             
            elif code==wx.WXK_DOWN:   #如果偵測到向下的鍵被按下
                can_move = self.user_status['energy'] - self.energy_cost['down']                
                if self.user_status['face']==32 and can_move>=0:
                    self.user_status['energy'] -= self.energy_cost['down']
                    dy+=5                   
                else:
                    self.user_status['face']=32   
            elif code==wx.WXK_LEFT:   #如果偵測到向左的鍵被按下
                can_move = self.user_status['energy'] - self.energy_cost['left']               
                if self.user_status['face']==64 and can_move>=0:
                    self.user_status['energy'] -= self.energy_cost['left']
                    dx+=-5
                else:
                    self.user_status['face']=64
            elif code==wx.WXK_RIGHT:   #如果偵測到向右的鍵被按下
                can_move = self.user_status['energy'] - self.energy_cost['right']               
                if self.user_status['face']==96 and can_move>=0:
                    self.user_status['energy'] -= self.energy_cost['right']
                    dx+=5
                else:
                    self.user_status['face']=96
            if (self.user_status['pos'].pos[0]+dx)>=0 and (self.user_status['pos'].pos[0]+dx)<=self.bounary[0] and (self.user_status['pos'].pos[1]+dy)>=0 and (self.user_status
                ['pos'].pos[1]+dy)<=self.bounary[1]:
                self.user_status['pos'].setDeltapos((dx,dy))
           
            #check has item
            x=self.user_status['pos'].pos[0]
            y=self.user_status['pos'].pos[1]
            for index, item in self.items.iteritems():
                rect=item['pos']
                if rect.isIn((x,y)) and len(self.user_status['item'])<=9:
                    if not index in self.delItem:
                        self.user_status['item'].append(item)
                        self.delItem.append(index)
 
 
pos
arrow
arrow
    文章標籤
    pos pos機 收銀機
    全站熱搜
    創作者介紹
    創作者 marshalclifa1 的頭像
    marshalclifa1

    marshalclifa1的部落格

    marshalclifa1 發表在 痞客邦 留言(0) 人氣()