From e7a7000ff55411a613f4ab2999234c778a7359dc Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Thu, 19 May 2011 22:16:25 +0200 Subject: [PATCH] initial commit --- main.c | 200 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ main.h | 47 ++++++++++++++ tetris | Bin 0 -> 10769 bytes 3 files changed, 247 insertions(+) create mode 100644 main.c create mode 100644 main.h create mode 100755 tetris diff --git a/main.c b/main.c new file mode 100644 index 0000000..8479bf6 --- /dev/null +++ b/main.c @@ -0,0 +1,200 @@ +#include +#include +#include +#include +#include + +#include "main.h" + +static stone_t shapes[NUM_SHAPES] = { + {SHAPE_I, { + 0b00000000, + 0b00000000, + 0b00000000, + 0b00111100 + }, 0}, + {SHAPE_J, { + 0b00000000, + 0b00001000, + 0b00001000, + 0b00011000 + }, 0 + }, + {SHAPE_L, { + 0b00000000, + 0b00010000, + 0b00010000, + 0b00011000 + }, 0}, + {SHAPE_O, { + 0b00000000, + 0b00000000, + 0b00011000, + 0b00011000 + }, 0}, + {SHAPE_S, { + 0b00000000, + 0b00000000, + 0b00011000, + 0b00110000 + }, 0}, + {SHAPE_T, { + 0b00000000, + 0b00000000, + 0b00010000, + 0b00111000 + }, 0}, + {SHAPE_Z, { + 0b00000000, + 0b00000000, + 0b00011000, + 0b00001100 + }, 0} + +}; + +void draw_screen(board_t brd, stone_t stn, uint16_t score, uint8_t level, uint8_t stones) { + /* clear screen */ + clear(); + + for (uint8_t i = 0; i < NUM_LINES; i++) { + addch('|'); + + for (uint8_t j = 0; j < 8; j++) { + + if (brd[i] & (1 << j)) { /* fixed pixel */ + addch('#'); + } + else if (i >= stn.pos && i < stn.pos+4 && stn.clipping[i-stn.pos] & (1 << j)) { + addch('0'); + } + else { + addch(' '); + } + } + + printw("%c\n", (i == 3) ? '-' : '|'); + } + + printw("----------"); + printw("\nScore: %i\tLevel: %i\tStones: %i\n", score, level, stones); +} + +uint8_t flush_lines(board_t brd) { + uint8_t lines = 0; + + for (uint8_t i = NUM_LINES-1; i >= 0; i--) { + if (brd[i] == 0xFF) { + lines++; + + //for () { /* restock with remaining lines */ + + //} + } + else if (brd[i] == 0x00) { /* empty line, no following line can be non-empty => aborting */ + break; + } + } + + return lines; /* required to calculate score */ +} + +bool_t turn_stone(stone_t s) { + +} + +bool_t shift_stone(stone_t stn, direction_t dir) { + if (dir == DIR_DOWN) { + stn.pos++; + } + else { + for (uint8_t i = 0; i < 4; i++) { + if (dir == DIR_LEFT) { + stn.clipping[i] <<= 1; + } + else if (dir == DIR_RIGHT) { + stn.clipping[i] >>= 1; + } + } + } + stn.clipping[3] = 0; +} + +bool_t detect_collision(board_t brd, stone_t stn) { + return FALSE; // TODO implement +} + +WINDOW * init_screen() { + WINDOW * win = initscr(); + noecho(); + cbreak(); + timeout(0); + keypad(win, 1); + curs_set(0); + + return win; +} + +void main() { + board_t brd; + stone_t falling; + uint8_t level = 0; + uint16_t score = 0; + uint16_t stones = 0; + uint16_t steps = 0; + + memset(&brd, 0, NUM_LINES); /* init board */ + WINDOW * win = init_screen(); /* init terminal */ + + /* init prng */ + // TODO init with adc value & eeprom seed + srand(129); + + while (TRUE) { + /* add new stone on the top of our board */ + falling = shapes[rand() % NUM_SHAPES]; + + if (stones > level * 10) { + level++; /* next level */ + } + + while (detect_collision(brd, falling) == FALSE) { + /* lets fall stone */ + falling.pos++; + + draw_screen(brd, falling, score, level, stones); + printw("Steps: %i\n", steps++); + + /* poll for user interaction */ + switch (getch()) { + case KEY_UP: + turn_stone(falling); + break; + case KEY_LEFT: + shift_stone(falling, DIR_LEFT); + break; + case KEY_RIGHT: + shift_stone(falling, DIR_RIGHT); + break; + case KEY_DOWN: + shift_stone(falling, DIR_DOWN); + break; + } + flushinp(); + refresh(); + usleep(800000); + } + + /* check for completed lines and calculate score */ + uint8_t lines = flush_lines(brd); + score += lines * lines; + + if (brd[3] > 0) { + break; /* game over */ + } + } + + // TODO handle highscore + + endwin(); /* reset terminal */ +} diff --git a/main.h b/main.h new file mode 100644 index 0000000..7029086 --- /dev/null +++ b/main.h @@ -0,0 +1,47 @@ +#ifndef _MAIN_H_ +#define _MAIN_H_ + +#include + +#define TRUE 1 +#define FALSE 0 + +#define NUM_SHAPES 7 +#define NUM_LINES 20 /* 16 visible + 4 to spawn new stones */ + +typedef uint8_t board_t[NUM_LINES]; +typedef uint8_t bool_t; + +/* Named according to: http://de.wikipedia.org/wiki/Tetris */ +typedef enum { + SHAPE_I, /* line of four dots */ + SHAPE_J, /* inverted L */ + SHAPE_L, + SHAPE_O, /* cubeoid */ + SHAPE_S, + SHAPE_T, + SHAPE_Z /* inverted S */ +} shape_t; + +typedef enum { + DIR_LEFT, + DIR_RIGHT, + DIR_DOWN +} direction_t; + +typedef struct { + shape_t shape; + uint8_t clipping[4]; + uint8_t pos; +} stone_t; + +uint8_t flush_lines(board_t brd); +bool_t turn_stone(stone_t stn); +bool_t shift_stone(stone_t stn, direction_t dir); +bool_t detect_collision(board_t brd, stone_t stn); + +/* platform dependent */ +void draw_screen(board_t brd, stone_t stn, uint16_t score, uint8_t level, uint8_t stones); + + +#endif /* _MAIN_H_ */ diff --git a/tetris b/tetris new file mode 100755 index 0000000000000000000000000000000000000000..cae565cbcfe45b34037b8c29bab89cc23b8916fc GIT binary patch literal 10769 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 literal 0 HcmV?d00001