नीचे दिए गए कोड स्निपेट के आधार पर (उन्हें स्पष्टता के लिए छोटा कर दिया गया है)।यदि कोई कथन खराब अभ्यास में असाइनमेंट स्टेटमेंट डाल रहा है?
scoreBoardState
विधि का उद्देश्य एक मिनीमैक्स एल्गोरिदम में पत्ती नोड्स पर गेम की स्थिति के लिए स्कोर निर्धारित करने के लिए उपयोग किया जाना है जो एआई के लिए सबसे अच्छा कदम निर्धारित करने के लिए पारित किया जाएगा।
hasThreeInARowAndTwoOpenSpaces_Horizontal
scoreBoardState
द्वारा कई ऐसी विधियों में से एक है जिसे यह निर्धारित करने के लिए कहा जाता है कि कुछ शर्त पूरी हो गई है (जैसे कि एक पंक्ति में 3 टोकन वाला खिलाड़ी)। यदि यह सच है तो वह उस खिलाड़ी की संख्या लौटाता है जो उस परिस्थितियों को पूरा करता है तो उस खिलाड़ी के स्कोर को बढ़ाता है (या तो मानव खिलाड़ी या एआई)।
विधि को वापस करने के लिए विधि को कॉल करने की आवश्यकता है यह जांचने के लिए कि क्या मान वापस शून्य है (जिसका अर्थ है कि कुछ स्कोर जोड़ा जाना चाहिए)। मैं या तो अगर कथन (जिसे मैंने कोड स्निपेट में किया था) के भीतर विधि द्वारा लौटाए गए मान को सेट कर सकते हैं, या यदि यह 0 वापस नहीं लौटाता है और फिर इसे चर में सेट करता है तो मैं विधि को फिर से कॉल कर सकता हूं। जाहिर है कि दूसरी विधि कम कुशल है, लेकिन यह हो रहा है कि यह क्या हो रहा है, यह ध्यान देने योग्य और अधिक आसान है।
सवाल यह है कि, यदि खराब कथन माना जाता है तो विधि द्वारा लौटाए गए चर द्वारा परिवर्तनीय चर सेट कर रहा है? या यह ठीक है क्योंकि यह अधिक कुशल है?
नोट: दूसरी विधि की अक्षमता काफी तेजी से बढ़ती है क्योंकि यह फॉर-लूप के भीतर है और यह स्थिति कई बार उत्पन्न होती है क्योंकि प्रत्येक स्थिति का परीक्षण किया जाता है। यह प्रत्येक लीफ नोड के लिए एक मिनीमैक्स एल्गोरिदम में भी किया जाता है (प्रत्येक नोड में 7 शाखाएं हो सकती हैं) का मतलब केवल 3 (गहराई से मैं उपयोग कर रहा हूं) की गहराई है, वहां 343 पत्ती नोड्स और 7 की गहराई गहराई है (उच्चतम मैं वर्तमान में हूं उपयोग कर रहे हैं) लगभग 825,000 पत्ते नोड्स हैं।
/* scores the board state of a root node in a minimax algorithm
* @gameState a 2 dimensional array that stores values for each space on the
* board. Stores 0 for empty or 1 or 2 if position is taken by a player
*/
int scoreBoardState (int[][] boardState) {
int aiScore = 0;
int playerScore = 0;
int player = -1;
for (int i = 0; i < boardState.length; i++) {
for (int j = 0; j < boardState[i].length - 4; j++) {
if (j < boardState[i].length - 5 && (player = hasThreeInARowAndTwoOpenSpaces_Horizontal(boardState, i, j)) != 0) {
if (player == AI)
aiScore += 1000; //magic number entered for clarity
else if (player == PLAYER)
playerScore += 1000;
}
else if (i < boardState.length - 4 && j > 2 && (player = hasThreeInARowAndOneOpenSpace_Diagonal_UpperRightToLowerLeft(boardState, i, j)) != 0) {
if (player == AI)
aiScore += SCORE_THREE_IAR_ONE_OS;
else if (player == PL)
playerScore += SCORE_THREE_IAR_ONE_OS;
}
}
}
return aiScore - playerScore;
}
/*
* checks if, starting from the passed in coordinates, whether there are 3
* spaces taken by the same player with an empty space on either side in a horizontal direction (left to right).
*
* returns the player number if the result is true. returns 0 if the result
*is false or all spaces are empty
*/
int hasThreeInARowAndTwoOpenSpaces_Horizontal(int[][] boardState, int row, int col) {
if (boardState[row][col] == 0
&& boardState[row][col + 1] == boardState[row][col + 2] && boardState[row][col + 2] == boardState[row][col + 3]
&& boardState[row][col + 4] == 0)
{
return boardState[row][col + 1];
}
return 0;
}
कृपया इसे [कोड समीक्षा] (https://codereview.stackexchange.com/) पर पोस्ट करें। मेरा 2 ¢? आपके 'if' कथन पहले से ही ** बहुत ** लंबे हैं; एक असाइनमेंट स्टेटमेंट जोड़ने से पठनीयता के लिए बिल्कुल कुछ नहीं होता है, जबकि वहां [स्थापित मुहावरे] हैं [http://www.mkyong.com/java/how-to-read-file-from-java-bufferedreader-example/) जो 'if' में असाइन करता है; यह उनमें से एक नहीं है। –
यह किसी भी कथन को कॉल करने से पहले इसे असाइन करने की तुलना में अधिक कुशल नहीं है। आप एक ही फ़ंक्शन पर एक ही मान के साथ कई कॉल प्राप्त कर सकते हैं। – matt
हां, यह एक बुरा अभ्यास है। यहां तक कि स्थापित मुहावरे बोरीस का उल्लेख सार्वभौमिक रूप से गले लगाया नहीं जाता है। और पहले (प्री-जावा 7) उदाहरण में संसाधन प्रबंधन का उल्लेख सिर्फ सादा गलत है। उम्मीद है कि स्थैतिक विश्लेषण ऐसे कोड के लेखक को डांट देगा। – erickson