예제 #1
0
파일: shuffle.c 프로젝트: Fat-Zer/LDP
int main(int argc, char *argv[])
{	int **s_board;
	int n, i, ch;
	tile blank;

	if(argc != 2)
	{	printf("Usage: %s <shuffle board order>\n", argv[0]);
		exit(1);
	}
	n = atoi(argv[1]);
	
	s_board = (int **)calloc(n, sizeof(int *));
	for(i = 0;i < n; ++i)
		s_board[i] = (int *)calloc(n, sizeof(int));
	init_board(s_board, n, &blank);
	initscr();
	keypad(stdscr, TRUE);
	cbreak();
	shuffle_board(s_board, n);
	while((ch = getch()) != KEY_F(1))
	{	switch(ch)
		{	case KEY_LEFT:
				move_blank(RIGHT, s_board, n, &blank);
				break;
			case KEY_RIGHT:
				move_blank(LEFT, s_board, n, &blank);
				break;
			case KEY_UP:
				move_blank(DOWN, s_board, n, &blank);
				break;
			case KEY_DOWN:
				move_blank(UP, s_board, n, &blank);
				break;
		}
		shuffle_board(s_board, n);
		if(check_win(s_board, n, &blank) == TRUE)
		{	mvprintw(24, 0, "You Win !!!\n");
			refresh();
			break;
		}
	}
	endwin();
	return 0;	
}
예제 #2
0
static void init() {
#ifdef PBL_PLATFORM_APLITE
  srand(time(NULL));
#endif

  s_board = malloc(NUM_CELLS * NUM_CELLS * sizeof(char));
  s_step = 0;

  shuffle_board();

  s_main_window = window_create();
  
  window_set_window_handlers(s_main_window, (WindowHandlers){
    .load = main_window_load,
    .unload = main_window_unload
  });
예제 #3
0
static void tick_board() {  
  char *prevBoard = s_board;
  char *newBoard = malloc(NUM_CELLS * NUM_CELLS * sizeof(char));
  
  int x, y, i, j, count, surviveCount;
  int w = NUM_CELLS;
  int h = NUM_CELLS;
  int lastX = w - 1;
  int lastY = h - 1;
  char condMax = CONDITIONS - 1;
  
  surviveCount = 0;
  for(y=0;y<h;y++){
    for(x=0;x<w;x++){
      count = 0;
      
      if(y==0){
        // top edge
        if(x==0){
          // left edge
          if(prevBoard[lastX + lastY * w] == condMax)count++;
          if(prevBoard[0 + lastY * w] == condMax)count++;
          if(prevBoard[1 + lastY * w] == condMax)count++;
          if(prevBoard[lastX + 0 * w] == condMax)count++;
          if(prevBoard[lastX + 1 * w] == condMax)count++;
          
          for(j=0;j<=1;j++){
            for(i=0;i<=1;i++){
              if(prevBoard[i + j * w] == condMax)count++;
            }
          }
        }
        else if(x==lastX){
          // right edge
          if(prevBoard[(lastX-1) + lastY * w] == condMax)count++;
          if(prevBoard[lastX + lastY * w] == condMax)count++;
          if(prevBoard[0 + lastY * w] == condMax)count++;
          if(prevBoard[0 + 0 * w] == condMax)count++;
          if(prevBoard[0 + 1 * w] == condMax)count++;
          
          for(j=0;j<=1;j++){
            for(i=lastX-1;i<=lastX;i++){
              if(prevBoard[i + j * w] == condMax)count++;
            }
          }
        }
        else{
          for(i=x-1;i<=x+1;i++){
            if(prevBoard[i + lastY * w] == condMax)count++;
          }
          
          for(j=0;j<=1;j++){
            for(i=x-1;i<=x+1;i++){
              if(prevBoard[i + j * w] == condMax)count++;
            }
          }
        }
      }
      else if(y==lastY){
        // bottom edge
        if(x==0){
          // left edge
          for(j=lastY-1;j<=lastY;j++){
            for(i=0;i<=1;i++){
              if(prevBoard[i + j * w] == condMax)count++;
            }
          }
          if(prevBoard[lastX + (lastY-1) * w] == condMax)count++;
          if(prevBoard[lastX + lastY * w] == condMax)count++;
          if(prevBoard[lastX + 0 * w] == condMax)count++;
          if(prevBoard[0 + 0 * w] == condMax)count++;
          if(prevBoard[1 + 0 * w] == condMax)count++;
        }
        else if(x==lastX){
          // right edge
          for(j=lastY-1;j<=lastY;j++){
            for(i=lastX-1;i<=lastX;i++){
              count += prevBoard[i + j * w] == condMax ? 1 : 0;
            }
          }
          count += prevBoard[0 + (lastY-1) * w] == condMax ? 1 : 0;
          count += prevBoard[0 + lastY * w] == condMax ? 1 : 0;
          count += prevBoard[(lastX-1) + 0 * w] == condMax ? 1 : 0;
          count += prevBoard[lastX + 0 * w] == condMax ? 1 : 0;
          count += prevBoard[0 + 0 * w] == condMax ? 1 : 0;
        }
        else{
          for(i=x-1;i<=x+1;i++){
            if(prevBoard[i + 0 * w] == condMax)count++;
          }
          
          for(j=lastY-1;j<=lastY;j++){
            for(i=x-1;i<=x+1;i++){
              if(prevBoard[i + j * w] == condMax)count++;
            }
          }
        }
      }
      else if(x==0){
        // left edge
        for(j=y-1;j<=y+1;j++){
          for(i=0;i<=1;i++){
            if(prevBoard[i + j * w] == condMax)count++;
          }
          if(prevBoard[lastX + j * w] == condMax)count++;
        }
      }
      else if(x==lastX){
        // right edge
        for(j=y-1;j<=y+1;j++){
          for(i=lastX-1;i<=lastX;i++){
            count += prevBoard[i + j * w] == condMax ? 1 : 0;
          }
          count += prevBoard[0 + j * w] == condMax ? 1 : 0;
        }
      }
      else{
        for(j=y-1;j<=y+1;j++){
          for(i=x-1;i<=x+1;i++){
            if(prevBoard[i + j * w] == condMax)count++;
          }
        }
      }
      
      if(prevBoard[x + y * w] == condMax)count--;
      
      int env = 0;
      if(count > 0){
        env = (1 << (count - 1));
      } 
      
      char prevCond = prevBoard[x + y * w];
      if(prevCond == 0 && BORN & env){
        newBoard[x + y * w] = condMax;
      }
      else if(prevCond == condMax && SURVIVE & env){
        newBoard[x + y * w] = prevCond;
      }
      else{
        if(prevCond > 0){
          newBoard[x + y * w] = prevCond - 1;
        }
        else{
          newBoard[x + y * w] = 0;
        }
      }
      
      surviveCount += newBoard[x + y * w];
    }
  }
  
  s_board = newBoard;
  free(prevBoard);
  
  s_step++;
  if (s_step > STEP_MAX || surviveCount == 0) {
    shuffle_board();
    s_step = 0;
  }
}