예제 #1
0
static  void    MergeUp( score *sc, int dst_idx, int src_idx ) {
    /**************************************************************/

    int dst_hi;
    int src_hi;
    int dst_lo;
    int src_lo;

    dst_hi = ScoreList[ dst_idx ]->high_of;
    src_hi = ScoreList[ src_idx ]->high_of;
    dst_lo = ScoreList[ dst_idx ]->low_of;
    src_lo = ScoreList[ src_idx ]->low_of;
    if( dst_hi != NO_INDEX && src_hi != NO_INDEX ) {
        dst_lo = ScoreList[ dst_hi ]->low;
        src_lo = ScoreList[ src_hi ]->low;
        if( dst_lo != NO_INDEX && src_lo != NO_INDEX
                && RegsEqual( sc, dst_lo, src_lo )
                && !RegsEqual( sc, dst_hi, src_hi ) ) {
            RegInsert( sc, dst_hi, src_hi );
            MergeUp( sc, dst_hi, src_hi );
        }
    } else if( dst_lo != NO_INDEX && src_lo != NO_INDEX ) {
        dst_hi = ScoreList[ dst_lo ]->high;
        src_hi = ScoreList[ src_lo ]->high;
        if( dst_hi != NO_INDEX && src_hi != NO_INDEX
                && RegsEqual( sc, dst_hi, src_hi )
                && !RegsEqual( sc, dst_lo, src_lo ) ) {
            RegInsert( sc, dst_lo, src_lo );
            MergeUp( sc, dst_lo, src_lo );
        }
    }
}
예제 #2
0
/***********************************************************************************
 ** Extend a range
 **
 ** ImapCommands::MessageSet::Extend
 ** @param merge Whether to try to merge the extended range with other ranges
 ** @return Whether the range at index could be extended with [start .. end]
 ***********************************************************************************/
BOOL ImapCommands::MessageSet::Extend(INT32 index, UINT32 start, UINT32 end, BOOL merge)
{
    if (index < 0 || index >= (int)m_ranges.GetCount())
        return FALSE;

    Range* range = m_ranges.GetByIndex(index);

    // 'range' is extendable with values in extension if and only if
    //    (range->start - 1 <= end || end == 0) && (start <= range->end + 1 || range->end == 0)
    if ((range->start - 1 > end && end > 0) || (start > range->end + 1 && range->end > 0))
        return FALSE;

    // We can extend this range. Extend start or end?
    if (start < range->start)
    {
        m_count += range->start - start;
        range->start = start;
        if (merge)
            MergeDown(index);
    }
    if (end > range->end && range->end > 0)
    {
        m_count += end - range->end;
        range->end = end;
        if (merge)
            MergeUp(index);
    }

    return TRUE;
}
예제 #3
0
extern  void    RegAdd( score *sc, int dst_idx, int src_idx ) {
    /*************************************************************/

    /* NB: it is important that dst_idx has just become equal to src_idx*/
    /*     NOT vice-versa. Ie: we just did a  MOV R(src_idx) ==> R(dst_idx)*/
    /*     or equivalent*/

    if( ScoreList[ dst_idx ]->size != ScoreList[ src_idx ]->size ) return;
    if( !ScAddOk( ScoreList[ dst_idx ]->reg, ScoreList[ src_idx ]->reg ) )
        return;
    if( RegsEqual( sc, dst_idx, src_idx ) ) return;
    MergeDown( sc, dst_idx, src_idx );
    MergeUp( sc, dst_idx, src_idx );
    RegInsert( sc, dst_idx, src_idx );
}
예제 #4
0
파일: 2048.c 프로젝트: MalihaAkhter/c_2048
void PlayGame()
{
	char userChoice = 'k';
	printf("Going to start game. Use AD for left, right. WS for up, down.\n");
	printf("k to kill game.\n");
	InitTiles();
	NextStep();
	do{

		if(!NextStep()){
			break;
		}
		PrintTiles();
		refresh();	// printing on screen - via ncurses.
		userChoice = getch();
//		if(userChoice=='\n') userChoice = getchar();
		switch(userChoice){
		case 'a':
		case 'A':
			MergeLeft(); ShiftLeft(); break;
		case 'd':
		case 'D':
			MergeRight(); ShiftRight(); break;
		case 'w':
		case 'W':
			MergeUp(); ShiftUp(); break;
		case 's':
		case 'S':
			MergeDown(); ShiftDown(); break;
		}
		clear();		
	}
	while(SpaceAvailable() && userChoice != 'k');
	printf("\nGame over.\n");
	
}