/ / C - चेक मैट्रिक्स [x] [y] आस-पास, c, मैट्रिक्स

सी - मैट्रिक्स की जांच करें [एक्स] [वाई] आसपास की स्थिति - सी, मैट्रिक्स

मैं आकार 7x7 के साथ एक मैट्रिक्स है जो एक का प्रतिनिधित्व करता हैखेल का बोर्ड। जब कोई खिलाड़ी एक चाल चलता है, तो कार्यक्रम को निर्देशांक के चारों ओर की स्थितियों की जांच करनी होती है कि टुकड़ा कहाँ है, ताकि किसी अन्य टुकड़े का पता लगाया जा सके।

मैं इस फ़ंक्शन का उपयोग करता हूं:

int check_position(COORDINATES coordinates, char board[7][7]) {
int result = -1;

if (board[coordinates.x][coordinates.y] != "O" && board[coordinates.x-1][coordinates.y] != "O" && board[coordinates.x][coordinates.y-1] != "O" && board[coordinates.x+1][coordinates.y] != "O" && board[coordinates.x][coordinates.y+1] != "O" && board[coordinates.x-1][coordinates.y-1] != "O" && board[coordinates.x+1][coordinates.y+1] != "O" && board[coordinates.x-1][coordinates.y+1] != "O" && board[coordinates.x+1][coordinates.y-1] != "O") {
result = 1;
}

return result;
}

पहला पैरामीटर खिलाड़ी के टुकड़े के एक संयोजन के रूप में एक निर्देशांक है, जिसमें सदस्य x और y हैं। दूसरा पैरामीटर बोर्ड सरणी है।

The if बयान "अच्छी तरह से काम नहीं करता है, और मैं नहीं जानता कि जो विकल्प मैं ले जा सकते हैं.

क्या आप मेरी मदद कर सकते हैं? धन्यवाद!

उत्तर:

उत्तर № 1 के लिए 1

आप सीमाओं पर बहते अपने निर्देशांक के बारे में भूल गए। आप या तो इस के लिए परीक्षण कर सकते हैं, या:

सुझाव: सरणी दो पंक्तियाँ और स्तंभ बोर्ड से बड़ा बनाएँ और "रिक्त" मार्कर के साथ बॉर्डर भरें।सक्रिय बोर्ड निर्देशांक होगा 1...7 इस तरह आपके निर्देशांक रैप नहीं कर सकते (1 - 1 तथा 7 + 1 सरणी के भीतर अब भी कर रहे हैं) और आप सीमाओं के बारे में परवाह करने की जरूरत नहीं है।

नोट: यदि आप सिर्फ एक बूलियन मूल्य वापस करना चाहते हैं, यह प्रयोग करने के लिए बेहतर होगा stdbool.h और वापस आ जाओ bool परिणाम. इस तरह, फोन करने वाले सीधे एक शर्त के रूप में है कि समारोह का उपयोग कर सकते हैं:

#include <stdbool.h>

...

bool check_position(COORDINATES coordinates, const char board[9][9]) {
int x = coordinates.x - 1
for ( int xc = 0 ; xc < 3 ; xc++ ) {
int y = coodinates.y - 1;
for ( int yc = 0 ; yc < 3 ; yc++ ) {
if ( board[x][y] != "0" )
return true;
y++;
}
x++;
}
return false;
}

नोट: चूंकि आपको केवल एक गैर-रिक्त फ़ील्ड की आवश्यकता है, यदि आपको कोई फ़ील्ड मिल जाए तो आप तुरंत समाप्त कर सकते हैं। यह कई स्थितियों के समान है। बेशक, यह आपके मूल के लिए भी काम करता है int परिणाम।

Note2: मैंने के प्रकार को संशोधित किया है board किया जा रहा है const, क्योंकि यह फ़ंक्शन के अंदर नहीं बदला जाता है।


उत्तर № 2 के लिए -1

आप इस तरह किनारे के अतिप्रवाह को भी हल कर सकते हैं। संपादित करें @Olaf . के साथ चर्चा के बाद सुधार हुआ

#define BOARD 7

int check_position(COORDINATES coordinates, char board[BOARD][BOARD]) {
int result = -1;
int left   = coordinates.x == 0 ? 0 : coordinates.x - 1;
int top    = coordinates.y == 0 ? 0 : coordinates.y - 1;
int right  = coordinates.x == BOARD-1 ? coordinates.x : coordinates.x + 1;
int bottom = coordinates.y == BOARD-1 ? coordinates.y : coordinates.y + 1;

if (board[left]         [top] != "O" &&
board[coordinates.x][top] != "O" &&
board[right]        [top] != "O" &&
board[left]         [coordinates.y] != "O" &&
board[coordinates.x][coordinates.y] != "O" &&
board[right]        [coordinates.y] != "O" &&
board[left]         [bottom] != "O" &&
board[coordinates.x][bottom] != "O" &&
board[right]        [bottom] != "O" && )
{
result = 1;
}

return result;
}