2008-11-20 8 views
7

एक मूल आईफोन एप्लिकेशन के लिए सुडोकू बोर्ड के समान इंटरैक्टिव ग्रिड को लागू करने का सबसे अच्छा तरीका क्या है? मुझे एसडीके में इस आवश्यकता को भरने के लिए कोई ऑब्जेक्ट नहीं मिला।सुडोकू बोर्ड की तरह ग्रिड के साथ आप कैसे निर्माण और बातचीत करेंगे?

क्या मुझे एक व्यक्तिगत सेल के लिए कस्टम नियंत्रण करना चाहिए, फिर उनमें से कई को ग्रिड रूप में शुरू करने के रूप में शुरू करना चाहिए?

Sudoku grid http://www.sudoku.4thewww.com/Grids/grid.jpg

किसी भी और सभी टिप्पणियों का स्वागत है। धन्यवाद!

+0

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

+0

आपको कौन सा उपयोगी लगता है? मुझे भी एक की जरूरत है! – Dinesh

उत्तर

0

ग्रिड सामग्री को देखने का माध्यम है, प्रतिनिधित्व को संग्रहीत करने के लिए नहीं। आखिरकार, आपका ग्रिड उन कोशिकाओं से बना होता है जिनमें सामग्री होती है और आपके अंतर्निहित मॉडल ऑब्जेक्ट के लिए शायद सेल द्वारा सबसे अच्छा अवशोषित किया जाता है। सुडोकू गेम के लिए अंतर्निहित भंडारण को डिजाइन करने के कई तरीके हैं और बड़ी चुनौती निश्चित रूप से पहेली की पीढ़ी में झूठ बोलती है। हालांकि, इस से लेने की सलाह यह है कि स्क्रीन पर यह कैसा दिखाई देता है, इस आधार पर आपका मॉडल निर्धारित नहीं करना है - दृश्य परत पूरी तरह से अलग है और इसलिए बोर्ड को दो-आयामी सरणी को संग्रहीत करने जैसी कुछ करना एक बुरा विचार होगा।

0

आप इसे मुख्य पर्यवेक्षण के उप-दृश्य के रूप में या तो UIViews या CALayers के साथ कर सकते हैं। आपको उनमें से कम से कम 81 की आवश्यकता होगी (सुडोकू ग्रिड में प्रत्येक नंबर के लिए एक)। परतें हल्के वजन और कम संसाधन गहन हैं, लेकिन विचारों की थोड़ी अधिक कार्यक्षमता है। जो आप चुनते हैं उस पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं।

0

सुडोकू सॉल्वर को कार्यान्वित करने के तरीके के बारे में कहीं एक लेख था। मुझे लगता है कि वह इस तरह का डेटा संरचना का प्रयोग किया:

  • एक ग्रिड 81 कोशिकाएं होती हैं
  • एक सेल तीन समूह सदस्यता है: एक कॉलम, एक पंक्ति, और एक बॉक्स
  • एक समूह 9 कोशिकाएं होती हैं (संदर्भ)

एक सेल, कुछ और गुण है कि तुम क्या संरचना के साथ क्या करना चाहते हैं पर निर्भर करता है:

  • एक मूल्य
  • एक hidden ध्वज (एक खेल के लिए)
  • संभव मानों का एक सेट (एक solver के लिए)
+0

यह उचित जवाब है जो मुझे लगता है लेकिन मुझे नहीं पता कि सुडोकू ग्रिड + ज़ूमिंग कार्यक्षमता के लिए UITableViewCell का लाभ उठाने के लिए मुझे क्या जोड़ना है .. कृपया अधिक जानकारी के लिए नीचे दी गई मेरी पोस्ट देखें और यदि कोई उत्तर लेम पता है .. धन्यवाद ..! –

3

इस तरह के एक पूरी तरह से वर्दी ग्रिड के लिए, मैं UIView का एक उपवर्ग बना सकते हैं और यह तय करना होगा जो पंक्ति और स्तंभ उपयोगकर्ता एक साधारण गणना का उपयोग कर छुआ है:

int touchedRow = 9 * touch.x/[self bounds].width; 
int touchedCol = 9 * touch.y/[self bounds].width;

मैं, स्मृति में 81 अलग-अलग वस्तुओं को बनाते समय एक वस्तु पर्याप्त होगा में ज्यादा लाभ नहीं दिख रहा।

+0

यह अच्छा जवाब है, लेकिन मुझे यह नहीं पता कि मैं उन सभी ग्रे और ब्लैक सीमाओं के साथ कैसे कार्यान्वित कर सकता हूं + अनुभाग के चयन पर ज़ूमिंग कार्यक्षमता ..! अधिक जानकारी के लिए नीचे दी गई मेरी पोस्ट देखें जो मैं करना चाहता हूं .. धन्यवाद। –

1

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

कोर एनीमेशन निश्चित रूप से यहां भी काम करेगा, अगर आपको एनीमेशन की आवश्यकता है या नहीं। एक सुडोकू बोर्ड में शायद अधिक एनीमेशन नहीं होगा, लेकिन यदि आप करते हैं (शायद एक स्लाइडिंग 'चयन' बॉक्स?) यह बेहतर विकल्प हो सकता है।

+0

येस .....! हमें ग्रिड पर स्लाइडिंग और ज़ूमिंग कार्यक्षमता जोड़ने की जरूरत है .. क्या आप अनावरण कर सकते हैं कि मैं यह कैसे कर सकता हूं? कृपया मेरी मदद करें..! मैंने ऐसे कार्यों के लिए n x n uiimageviews का उपयोग किया था, लेकिन जब मैं ज़ूम करता हूं, तो ऑटोरेसाइज़ ठीक काम नहीं कर रहा है, कुछ छवियां फैली हुई हैं ... और साथ ही, एनीमेशन धीमा है ...! वैसे, मैं ग्रिड निर्माण तर्क को ViewDidLoad() में डाल दूंगा, इसलिए नेविगेशन की पुश एनीमेशन भी अच्छी नहीं है, क्या मुझे OpenGL का उपयोग करने की आवश्यकता है ..? कृपया ग्रिड से मेरी मदद करें ..! –

+0

कृपया नीचे मेरी पोस्ट देखें ..! –

1

मैं हर समय this code (source: this blog) का उपयोग करता हूं। यह ग्रिड बनाने के मजेदार और misadventures में एक महान "प्रवेश" है। मैं इसे एल्गोरिदम के साथ जोड़ता हूं जो ऑब्जेक्ट्स "वांछित" और उपलब्ध "फ्रेम" की संख्या को देखता है, और मुझे कॉलम/पंक्तियों की सबसे अच्छी संख्या बताता है। सापेक्ष सोचो .. int % int ...

- (void)awakeFromNib { 
    self.wantsLayer = YES; 
    CALayer *grid = self.layer; 
    grid.backgroundColor = CGColorCreateGenericRGB(0.1, 0.1, 0.4, .8); 
    grid.layoutManager = [CAConstraintLayoutManager layoutManager]; 
    int rows = 8; int columns = 8; 
    for (int r = 0; r < rows; r++) { 
     for (int c = 0; c < columns; c++) { 
      CALayer *cell = [CALayer layer]; 
      cell.borderColor = CGColorCreateGenericGray(0.8, 0.8); 
      cell.borderWidth = 1; cell.cornerRadius = 4; 
      cell.name = [NSString stringWithFormat:@"%[email protected]%u", c, r]; 
      [cell addConstraint: 
      [CAConstraint constraintWithAttribute: kCAConstraintWidth 
       relativeTo: @"superlayer" 
       attribute: kCAConstraintWidth 
       scale: 1.0/columns offset: 0]]; 
      [cell addConstraint: 
      [CAConstraint constraintWithAttribute: kCAConstraintHeight 
       relativeTo: @"superlayer" 
       attribute: kCAConstraintHeight 
       scale: 1.0/rows offset: 0]]; 
      [cell addConstraint: 
      [CAConstraint constraintWithAttribute: kCAConstraintMinX 
       relativeTo: @"superlayer" 
       attribute: kCAConstraintMaxX 
       scale: c/(float)columns offset: 0]]; 
      [cell addConstraint: 
      [CAConstraint constraintWithAttribute: kCAConstraintMinY 
       relativeTo: @"superlayer" 
       attribute: kCAConstraintMaxY 
       scale: r/(float)rows offset: 0]]; 
     [grid addSublayer:cell]; 
} } } 

enter image description here

+0

लेकिन अगर आपको अपने विचार का आकार बदलना है तो क्या होगा? चौड़ाई और ऊंचाई के आधार पर ग्रिड व्यू बनाने के लिए कुछ कठिन नहीं है। लेकिन यदि आपका विचार बड़ा हो जाता है, और आप हमेशा सब कुछ की गणना करना चाहते हैं तो यह लॉजिंग शुरू कर देगा। –

+0

कोई मंदी नहीं है, अगर आप "ग्रिड" और "कोशिकाओं" पर "अंतर्निहित एनिमेशन" को आकार देने के लिए अतिरिक्त देखभाल करते हैं, तो प्रत्येक परत के "क्रियाएं" शब्दकोश को '@ {@ "सीमाओं" जैसे कुछ के साथ सेट करके: NSNull.null, @ "स्थिति": NSNull.null} '। –

+0

मैं वास्तव में समस्या को हल करने के तरीके को समझ नहीं पा रहा हूं। देखो मैंने इस समस्या के आधार पर एक पोस्ट खोला है http://stackoverflow.com/questions/22358563/scroll-on-a-two-dimensional-uicollectionview-with-uipinchgesture –

1

यह एक UIViewController वर्ग के रूप में बहुत Simple.I उपयोग GridView और gridView.m में निम्न कोड जोड़ने

#import "SudokuClass.h" 
#import "GridView.h" 

@interface GridView() 

@end 

@implementation GridView 


-(void)createNumberButton { 

    int cellWidth = 34; 
    int cellHeight = 34; 
    int xSta = 7 - cellWidth; 
    int ySta = 50 - cellHeight; 
    //NSMutableDictionary *buttonTable = [[NSMutableDictionary alloc] initWithCapacity:81]; 
    for (int i = 1; i < 10; i++) { 
     xSta = xSta + cellWidth; 
     for (int j = 1 ; j < 10; j++) { 
      ySta = ySta + cellHeight; 
      CGRect pos = CGRectMake(xSta, ySta, cellWidth, cellHeight); 
      UIButton *b = [SudokuClass createSudokuButtonForView:self atPos:pos 
                  withTag:j*10+i forAction:@selector(numButtonPressed:)]; 
      NSString *picName = @"ButtonPic.jpg"; 
      [b setBackgroundImage:[[UIImage imageNamed:picName] stretchableImageWithLeftCapWidth:0 topCapHeight:0] forState:0]; 
      [self.view addSubview:b]; 
      //[numButtons addObject:b]; 
     } 
     ySta = 50 - cellHeight; 
    }} 
-(void)viewDidLoad 
{ 

    [self createNumberButton]; 
    [super viewDidLoad]; 
} 
@end 
यहाँ

सुडोकू वर्ग है मेरी विधि

+(UIButton *)createSudokuButtonForView:(UIViewController *)view atPos:(CGRect)position withTag:(int)tag forAction:(SEL)action { 
UIButton *b = [UIButton buttonWithType:UIButtonTypeCustom]; 
[b setFrame:position]; 
[b.titleLabel setFont:[UIFont boldSystemFontOfSize:15]]; 
[b setTag:tag]; 
[b addTarget:view action:action forControlEvents:UIControlEventTouchDown]; 
[b setTitle:@"" forState:0]; 
[b setTitleColor:[UIColor blackColor] forState:0]; 
//b.layer.frame = CGRectMake(xSta-1, ySta-1, 31, 31); 
//[b.layer setBorderWidth:borderWidth]; 


b.userInteractionEnabled = YES; 
return b;} 

उम्मीद है कि किसी के साथ nsobject क्लास यह उपयोगी है .. :)