2009-06-10 9 views
18

मैं एक ऐसा गेम बना रहा हूं जो खिलाड़ी को इनपुट दर्ज करने, कुछ राज्यों को बदलने देता है, फिर जांचता है कि "लक्ष्य मान" सत्य है (स्पष्ट रूप से यह विवरण बहुत सरल है) और मैं लक्ष्य लक्ष्य मान प्राप्त करने में सक्षम होना चाहता हूं यदि खिलाड़ी जीवन एक निश्चित मूल्य से नीचे है, तो शेष दुश्मनों की राशि शून्य के बराबर है। क्या कोई "अभिव्यक्ति वर्ग" है जो एक सरल "मूल्य 1 तुलना-ऑपरेटर मान 2" रख सकता है और इसे जांच सकता है? यानी:क्या कोई भी "अभिव्यक्ति वर्ग" (सी ++)

expression goal(x = 4); 

यदि नहीं, तो क्या किसी के पास कोई सुझाव है कि मैं अभिव्यक्ति वर्ग कैसे विकसित कर सकता हूं?

संपादित करें: एक और (मैं क्या हासिल करने की कोशिश कर रहा हूँ के प्रति अधिक) उदाहरण:

game.init(){ expression goal = FileRead(goalfile); } 
game.checkstate(){ if(goal) exit(1); } //exit 1 is the games win state 

//another more specific eg.: 
class level1 { public: expression goal(total_enemies == 0); }; 
class level2 { public: expression goal(player.x == goal.x && player.y == goal.y); }; 

उत्तर

22

गतिशील भाव

आप उपयोगकर्ता से एक स्ट्रिंग प्राप्त करना चाहते हैं और उस से एक अभिव्यक्ति का निर्माण करते हैं, तो हो सकता है C++ Mathematical Expression Library अपने बिल फिट बैठता है?

template<typename T> 
void trig_function() 
{ 
    std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(x/2 * pi),+1.0)"; 
    T x; 
    exprtk::symbol_table<T> symbol_table; 
    symbol_table.add_variable("x",x); 
    symbol_table.add_constants(); 

    exprtk::expression<T> expression; 
    expression.register_symbol_table(symbol_table); 

    exprtk::parser<T> parser; 
    parser.compile(expression_string,expression); 

    for (x = T(-5.0); x <= T(+5.0); x += 0.001) 
    { 
     T y = expression.value(); 
     printf("%19.15f\t%19.15f\n",x,y); 
    } 
} 

भी संभावना है इस तरह के Lua या Python, जो आप (भी) और अधिक शक्ति दे देंगे के रूप में एक पटकथा भाषा एम्बेड करते हैं, कर रहे हैं। यह विचार करने के लिए कुछ है कि आप एक गेम लिख रहे हैं, क्योंकि आप शायद इसके बड़े हिस्सों को स्क्रिप्ट करना चाहते हैं।

आप Qt का उपयोग कर रहे हैं, तो आप भाव है कि पढ़ने के अपने QObject व्युत्पन्न वस्तुओं से (स्थिर या गतिशील) गुण को चलाने के लिए QtScript (जावास्क्रिप्ट-ish) का उपयोग कर सकते हैं।

उपर्युक्त में से किसी एक का उपयोग करके आप अपने स्वयं के पार्सर, एएसटी और मूल्यांकनकर्ता को लिखने से रोकते हैं, हालांकि ऑपरेटरों के एक छोटे से सेट के लिए यदि आप Boost.Spirit या कुछ अन्य सभ्य पार्सिंग का उपयोग करते हैं तो कुछ एक साथ हैक करना मुश्किल नहीं होना चाहिए पुस्तकालय।

स्टेटिक भाव

पूर्वनिर्धारित भाव का एक सेट के बीच चयन करने के लिए (अर्थात संकलन समय पर जाना जाता है), तो आप एक बहुरूपी समारोह वस्तु में अभिव्यक्ति की दुकान चाहिए।

सी ++ 11 के लिए, यदि यह आपके लिए उपलब्ध है, तो std::function और लैम्ब्डा अभिव्यक्तियों का उपयोग करें।

std::function<bool (int, int)> expr = [](int a, int b) { a*2 < b }; 

पहले compilers के लिए, मैं समारोह और बाँध की सलाह देते हैं, या तो Boost (बढ़ावा में: :) या C++ 0x TR1 (एसटीडी: :), अपने संकलक पर निर्भर करता है। इसके अलावा, Boost.Lambda यहां सहायता की होगी, क्योंकि यह आपको बाद के मूल्यांकन के लिए अभिव्यक्तियों का निर्माण और संग्रह करने की अनुमति देता है। हालांकि, अगर आप सी ++ और टेम्पलेट्स (या कार्यात्मक प्रोग्रामिंग) से परिचित नहीं हैं, तो यह आपको काफी हद तक डराएगा।

इसी के साथ

आप

using namespace boost::lambda; 
boost::function<bool (int, int)> myexpr1 = (_1 + _2) > 20; 
boost::function<bool (int, int)> myexpr2 = (_1 * _2) > 42; 
std::cout << myexpr1(4,7) << " " << myexpr2(2,5); 
बाँध के साथ

लिख सकता है, यह देखने के लिए चाहते हैं की तरह:

boost::function<bool (Player&)> check = bind(&Player::getHealth, _1) > 20; 
Player p1; 
if (check(p1)) { dostuff(); } 

check = bind(&Player::getGold, _1) < 42; 
if (check(p1)) { doOtherStuff(); } 
+0

दुर्भाग्य से, यह मनमाना भाव के लिए पूरी तरह से अव्यावहारिक है। जो मुझे लगता है वह पोस्टर वास्तव में चाहता है (उसके उदाहरण के बावजूद "val1 op val2")। –

+0

क्या यह है? बूस्ट :: लैम्ब्डा का उपयोग करके आप अभिव्यक्ति के सभी प्रकार, और यहां तक ​​कि कथन और सभी को जोड़ सकते हैं। आपका क्या अर्थ है? – Macke

+0

अच्छी तरह से, के बाद से बढ़ावा lambdas संकलन समय पर निर्माण कर रहे हैं और सिर्फ फोन करने वाले के द्वारा प्रयोग किया। यदि उपयोगकर्ता उस ऑप संयोजन में प्रवेश करता है जिसे आपने जिम्मेदार नहीं ठहराया है तो आप क्या करेंगे। चूंकि गणित संचालन के संयोजनों की असीमित संख्या है ... निश्चित रूप से आप उन सभी के लिए स्थैतिक रूप से खाता नहीं बना सकते हैं। –

0

नहीं, ऐसा कुछ नहीं है। शायद एक अभिव्यक्ति वर्ग थोड़ा बहुत सार है। IsReached() विधि के साथ विभिन्न लक्ष्य वर्गों को परिभाषित करने के बारे में क्या?

0

सी ++ में भाषा के हिस्से के रूप में यह नहीं है - रनटाइम पर कोई रास्ता नहीं है, उसी प्रोग्राम तक पहुंच प्राप्त करें जो आपके प्रोग्राम को पार्स करता है।

मुझे यकीन है कि कई तृतीय-पक्ष अंकगणित पार्सर पुस्तकालय हैं जिनका आप उपयोग कर सकते हैं।

+0

मुझे लगता है कि वह क्या मतलब है नहीं लगता। – dss539

0

मैं तुम्हें सोच रहा हूँ अपने ही वर्ग को परिभाषित करने और 'ज़ोर' का उपयोग कर के आसपास काम कर सकते हैं कीवर्ड, लेकिन मुझे सवाल गलत हो सकता है।

http://www.cplusplus.com/reference/clibrary/cassert/assert/

0

क्यों अपनी खुद की अभिव्यक्ति कक्षाओं का निर्माण नहीं?

class GoalBase 
{ 
    virtual bool goal() = 0; 
}; 

class Enemies : public GoalBase 
{ 
    // .. 
    private: 
     int enemies_; 

    public: 
     Enemies(int start) : enemies_(start) {} 
     void kill() { if (enemies_) --enemies_; } 
     bool goal() { return enemies_ == 0; } 
}; 

int main() 
{ 
    Enemies enemiesToKill(5); 
    enemiesToKill.kill();  

    // .. 
    if (enemiesToKill.goal()) { 
     // .. 
    } 

    return 0; 
} 

अन्य कक्षाओं में अन्य विधियां, पैरामीटर, ऑपरेटर आदि हो सकती हैं। अपनी कल्पना का प्रयोग करें।

-3

सी ++ के लिए कई मान्यता प्राप्त अभिव्यक्ति मूल्यांकन पुस्तकालयों में ऐसा प्रतीत नहीं होता है। मैंने CSVfix के लिए अपना खुद लिखा है जिसे आप a_expr.h और a_expr.cpp फ़ाइलों को एलीब लाइब्रेरी में देखकर मना कर सकते हैं जो CSVfix स्रोत का हिस्सा बनता है। मूल्यांकनकर्ता के पास खुद को अनुशंसा करने का कोई बड़ा सौदा नहीं है, सिवाय इसके कि यह नौकरी करता है और (आईएमएचओ) समझने के लिए काफी सरल है।

अनजाने में, मूल्यांकनकर्ता के लिए वर्तमान में कोई सार्वजनिक दस्तावेज नहीं है, और अंगूठे के अपने नियम से, जिसे दस्तावेज नहीं किया जा सकता है, का पुन: उपयोग नहीं किया जा सकता है। हालांकि, यूनिट परीक्षण दिखाते हैं कि इसका उपयोग कैसे किया जा सकता है, और स्रोत आपको अपने स्वयं के मूल्यांकनकर्ता को लागू करने के बारे में कुछ विचार दे सकता है, क्या फैंसी आपको लेनी चाहिए।

1

रनटाइम के दौरान अभिव्यक्तियों को संकलित करने का कोई मानक तरीका नहीं है। आपको इसे किसी अन्य तरीके से करना होगा।

आप लुआ या पायथन जैसे स्क्रिप्टिंग भाषा का उपयोग करने पर विचार कर सकते हैं और इसे अपने सी ++ में एम्बेड कर सकते हैं। इससे आपके खिलाड़ियों को उस सीमा तक प्रोग्राम करने की क्षमता मिल जाएगी जो आप चाहते हैं।

+0

+1। लुआ खेल और मोबाइल उपकरणों के लिए पसंद के हल्के एम्बेड करने योग्य इंजन के रूप में लगभग सर्वव्यापी बन रहा है। –

0

सी ++ में ऐसा करने का कोई मानक तरीका नहीं है। एक समाधान अपने स्वयं के पार्सर लिखना है।

एक और समाधान, जो मैं अनुशंसा करता हूं: अपने कार्यक्रम में एक लुआ दुभाषिया एम्बेड करें। लुआ एक सरल लेकिन शक्तिशाली प्रोग्रामिंग भाषा है, जिसमें अत्यधिक हल्के वजन (< 300 केबी) और उपयोग में आसान दुभाषिया भी है। यहाँ एक परिचयात्मक लेख पढ़ें: http://www.ibm.com/developerworks/linux/library/l-embed-lua/index.html

करने के बाद लुआ अपने खेल में एम्बेडेड अच्छा पक्ष लाभ की एक संख्या है:

  • आप अपने खेल
  • लुआ साथ
  • के लिए एक शक्तिशाली विन्यास भाषा के रूप में उपयोग कर सकते हैं, आप आसानी से एक कमांड लाइन इंटरैक्टिव वातावरण बना सकते हैं, जो परीक्षण और प्रयोगात्मक के लिए अच्छा है। उदाहरण के लिए, आप खेल इंजन पैरामीटर को बदलने में सक्षम होंगे और प्रभाव के बिना तुरंत प्रभाव देखेंगे। यह "शोध" परियोजनाओं या गेम प्रोग्रामिंग के लिए विशेष रूप से सुविधाजनक है।
0

स्टेटिक भाव

(Macke की पोस्ट में संशोधन)

अपने भाव संकलन समय पर जाना जाता है, तो आप std::function उपयोग कर सकते हैं। हालांकि, प्रदर्शन इष्टतम नहीं हो सकता है।

आप स्वचालित रूप से संकलन समय पर परीक्षण रजिस्टर और (presumambly) कम से कम क्रम भूमि के ऊपर के साथ रनटाइम पर उन्हें निष्पादित कर सकते हैं, सी ++ 11 टेम्पलेट्स और मैक्रो का उपयोग कर। एक सबूत-ऑफ-अवधारणा कार्यान्वयन here पाया जा सकता है।

लंबे समय में, नाम के एक भाषा सुविधा "Contracts" काम कर सकता है। (N4415, N4435, N4378) आज, विभिन्न अनुबंध प्रोग्रामिंग का समर्थन करने के लिए उपलब्ध पुस्तकालय हैं।

संबंधित मुद्दे