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; }
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 });
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; } }