眾所周知目前影院選座是不允許隨便選的,我們不可以任性的挑三揀四,最后留下N個單獨的座位,目的就是要留下至少2個連著的座位;
另外有些影院的座位擺放并不是規則的,有些座位被過道或者特殊座位分割開,產生了不同的分區,這里就實現檢測有沒有座位變成了孤座,
孤座的含義簡單說就是兩個小情侶不能挨著坐了~
但是也存在特殊情況,及因為分區的緣故,某一排連著的座位只有2個,或者只有3個,這時候還是可以允許人家買其中之一,或者之二的~
好,條件說完之后,開始介紹數據結構,正常情況下,影院的每一個座位數據會包含坐標,座位號,如x,y,row,column。
其中,影廳中的面積會以單個座位的大小被分割成M*N的坐標系,即過道也有它的坐標;而row和column才是真正的座位;
啰嗦了半天,下面上代碼:
入口函數是verifySelectedSeatsWithSeatsDic,
1. 參數seatsDic是一個字典,注意該字典過濾掉了非座位的數據?。ㄗ值涫潜卷椖克瑁憧梢灾苯佑靡粋€array,方法中我也是獲取了array;注意座位數據的順序一定是有序的,這樣才能獲取到一個座位的左右座位)
2. 每個座位的數據我封裝成了一個WCSeatButton,并提供了isSeatAvailable方法判斷該座位是否可以被購買(未被售出)
3. 函數getNearBySeatsInSameRowForSeat負責獲取沒有被過道等非座位隔開的所有座位
4. 函數(BOOL)isSeat:(WCSeatButton *)s1 nearBySeatWithoutRoad:(WCSeatButton *)s2判斷兩個座位是否被過道隔開
-(BOOL)verifySelectedSeatsWithSeatsDic:(NSDictionary *)seatsDic { NSArray *seatBtns = [seatsDic allValues]; if ([seatBtns count] > 0) { for (WCSeatButton *btn in seatBtns) { //查看可選座位是否落單 if([btn isSeatAvailable]){ int idx = btn.seatIndex; WCSeatButton *PReBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx - 1]]; WCSeatButton *nextBtn = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx + 1]]; //檢驗是否存在相鄰座位 and 可用 BOOL isPreOK = preBtn != nil && [preBtn.serviceSeat.row isEqualToString:btn.serviceSeat.row] && [preBtn isSeatAvailable]; BOOL isNextOK = nextBtn != nil && [nextBtn.serviceSeat.row isEqualToString:btn.serviceSeat.row]&& [nextBtn isSeatAvailable] ; //再判斷同一分區 if (isPreOK) { isPreOK = ABS([btn.serviceSeat.yCoord intValue] - [preBtn.serviceSeat.yCoord intValue]) == 1; } if (isNextOK) { isNextOK = ABS([btn.serviceSeat.yCoord intValue] - [nextBtn.serviceSeat.yCoord intValue]) == 1; } if (!isPreOK && !isNextOK) { NSArray *nearBySeats = [self getNearBySeatsInSameRowForSeat:btn withSeatsDic:seatsDic]; //例外 兩個座位只選一個 if ([nearBySeats count] == 2) { continue; } //例外 3個座位中2個連續被選,剩下單個座位 if ([nearBySeats count] == 3) { int idx = [nearBySeats indexOfObject:btn]; //空座位如果在兩邊說明中間的座位已經被選,則只要還有一個被選就可以 if (idx == 0 && ![nearBySeats[2] isSeatAvailable]) { continue; }else if(idx == 2 && ![nearBySeats[0] isSeatAvailable]) { continue; } } //只限制當前用戶選擇的座位,防止其他渠道產生孤座導致當前用戶不能選座 for (WC630ServiceSeat *s in self.orderItem.seats) { if((preBtn && [[[preBtn serviceSeat] cineSeatId] isEqualToString:s.cineSeatId]) || (nextBtn && [[[nextBtn serviceSeat] cineSeatId] isEqualToString:s.cineSeatId]) ) { return NO; } } } } } } return YES;}-(NSArray *)getNearBySeatsInSameRowForSeat:(WCSeatButton *)seat withSeatsDic:(NSDictionary *)seatsDic{ NSMutableArray *result = [NSMutableArray array]; [result addObject:seat]; int idx = seat.seatIndex - 1; //left WCSeatButton *tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]]; while([self isSeat:tmp nearBySeatWithoutRoad:seat]){ [result insertObject:tmp atIndex:0]; idx--; tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]]; } idx = seat.seatIndex + 1; //right tmp= [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]]; while([self isSeat:tmp nearBySeatWithoutRoad:seat]){ [result addObject:tmp]; idx++; tmp = [seatsDic objectForKey:[NSString stringWithFormat:@"%i", idx]]; } return result;}-(BOOL)isSeat:(WCSeatButton *)s1 nearBySeatWithoutRoad:(WCSeatButton *)s2{ return s1 != nil && [s1.serviceSeat.row isEqualToString:s2.serviceSeat.row] && ABS([s1.serviceSeat.yCoord intValue] - [s2.serviceSeat.yCoord intValue]) == ABS([s1.serviceSeat.column intValue] - [s2.serviceSeat.column intValue]) ;}
新聞熱點
疑難解答