68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #include "stddef.h"
 | |
| #include "stdint.h"
 | |
| 
 | |
| #include "game.h"
 | |
| #include "scheduler.h"
 | |
| #include "shapes.h"
 | |
| #include "canvas.h"
 | |
| 
 | |
| 
 | |
| typedef enum { e_idle, e_start, e_newStone, e_down, e_gameOver, e_delay } state_t;
 | |
| 
 | |
| void gameExec(void *handle) {
 | |
|   static state_t state = e_start;
 | |
|   static uint8_t delay;
 | |
| 
 | |
|   switch (state) {
 | |
|     case e_idle:
 | |
|       break;
 | |
| 
 | |
|     case e_start:
 | |
|       canvasClear();
 | |
|       state = e_newStone;
 | |
|       break;
 | |
| 
 | |
|     case e_newStone:
 | |
|       stoneCreate();
 | |
|       if (stoneDraw()) {
 | |
|         state = e_down;
 | |
|       } else {
 | |
|         state = e_gameOver;
 | |
|       }
 | |
|       break;
 | |
|       
 | |
|     case e_down:
 | |
|       if (! stoneMoveDown()) {
 | |
|         state = e_newStone;
 | |
|       }
 | |
|       break;
 | |
| 
 | |
|     case e_gameOver:
 | |
|       for (uint8_t c = 0; c < CANVAS_WIDTH; c++) {
 | |
|         canvasSetPixel(c, 0, 0x0d);
 | |
|         canvasSetPixel(c, CANVAS_HEIGHT - 1, 0x0d);
 | |
|       }
 | |
|       for (uint8_t r = 0; r < CANVAS_HEIGHT; r++) {
 | |
|         canvasSetPixel(0, r, 0x0d);
 | |
|         canvasSetPixel(CANVAS_WIDTH - 1, r, 0x0d);
 | |
|       }
 | |
|       delay = 10;
 | |
|       state = e_delay;
 | |
|       break;
 | |
| 
 | |
|     case e_delay:
 | |
|       delay--;
 | |
|       if (delay == 0) {
 | |
|         state = e_start;
 | |
|       }
 | |
|       break;
 | |
|   }
 | |
| 
 | |
|   canvasShow();
 | |
| }
 | |
| 
 | |
| void gameInit() {
 | |
|   schAdd(gameExec, NULL, 0, 1000);
 | |
| }
 | |
| 
 |