From eaf7eca8ef043be2c898387575d492d7df220de4 Mon Sep 17 00:00:00 2001 From: Alexander Medvednikov Date: Mon, 15 Apr 2019 13:31:32 +0200 Subject: [PATCH] examples/tetris --- examples/tetris/README.md | 1 + examples/tetris/screenshot.png | Bin 0 -> 98186 bytes examples/tetris/tetris.v | 322 +++++++++++++++++++++++++++++++++ 3 files changed, 323 insertions(+) create mode 100644 examples/tetris/README.md create mode 100644 examples/tetris/screenshot.png create mode 100644 examples/tetris/tetris.v diff --git a/examples/tetris/README.md b/examples/tetris/README.md new file mode 100644 index 0000000000..a5db860ebc --- /dev/null +++ b/examples/tetris/README.md @@ -0,0 +1 @@ + diff --git a/examples/tetris/screenshot.png b/examples/tetris/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..67013c10116de5b755923e953bf14b5b75247f38 GIT binary patch literal 98186 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 THD7^$|7CsYY|*dR{`3C;4-f5C literal 0 HcmV?d00001 diff --git a/examples/tetris/tetris.v b/examples/tetris/tetris.v new file mode 100644 index 0000000000..003cee8ef5 --- /dev/null +++ b/examples/tetris/tetris.v @@ -0,0 +1,322 @@ +import rand +import time +import gx +import gl +import gg +import glfw + +const ( + BLOCK_SIZE = 20 // pixels + FIELD_HEIGHT = 20 // # of blocks + FIELD_WIDTH = 10 + TETRO_SIZE = 4 + WIN_WIDTH = BLOCK_SIZE * FIELD_WIDTH + WIN_HEIGHT = BLOCK_SIZE * FIELD_HEIGHT + TIMER_PERIOD = 250 // ms +) + +// TODO: type Tetro [TETRO_SIZE]struct{ x, y int } +struct Block { + x int + y int +} + +const ( + // Tetros and their 4 possible states are encoded in binaries + B_TETROS = [ + // 0000 0 + // 0000 0 + // 0110 6 + // 0110 6 + [66, 66, 66, 66], + // 0000 0 + // 0000 0 + // 0010 2 + // 0111 7 + [27, 131, 72, 232], + // 0000 0 + // 0000 0 + // 0011 3 + // 0110 6 + [36, 231, 36, 231], + // 0000 0 + // 0000 0 + // 0110 6 + // 0011 3 + [63, 132, 63, 132], + // 0000 0 + // 0011 3 + // 0001 1 + // 0001 1 + [311, 17, 223, 74], + // 0000 0 + // 0011 3 + // 0010 2 + // 0010 2 + [322, 71, 113, 47], + // Special case since 15 can't be used + // 1111 + [1111, 9, 1111, 9], + ] + // Each tetro has its unique color + COLORS = [ + gx.rgb(0, 0, 0), + gx.rgb(253, 32, 47), + gx.rgb(0, 110, 194), + gx.rgb(34, 169, 16), + gx.rgb(170, 0, 170), + gx.rgb(0, 0, 170), + gx.rgb(0, 170, 0), + gx.rgb(170, 85, 0), + gx.rgb(0, 170, 170), + ] +) + +struct Game { + // Position of the dropping tetromino + posX int + posY int + // field[y][x] contains the color of the block with (x,y) coordinates + // "-1" border is to avoid bounds checking. + // -1 -1 -1 -1 + // -1 0 0 -1 + // -1 0 0 -1 + // -1 -1 -1 -1 + // TODO: field [][]int + field array_array_int + // TODO: tetro Tetro + tetro []Block + // Index of the dropping tetromino. Refers to its color. + tetroIdx int + // Index of the rotation (0-3) + rotationIdx int + // gg context for drawing + gg *gg.GG +} + +fn main() { + mut game := &Game{} + game.init_game() + glfw.init() + mut window := glfw.create_window(glfw.WinCfg { + width: WIN_WIDTH + height: WIN_HEIGHT + title: 'V Tetris' + ptr: game // glfw user pointer + }) + window.make_context_current() + window.onkeydown(key_down) + gg.init() + game.gg = gg.new_context(gg.Cfg { + width: WIN_WIDTH + height: WIN_HEIGHT + use_ortho: true // This is needed for 2D drawing + }) + go game.run() // Run the game loop in a new thread + gl.clear() // For some reason this is necessary to avoid an intial flickering + gl.clear_color(255, 255, 255, 255) + for { + gl.clear() + gl.clear_color(255, 255, 255, 255) + game.draw_scene() + window.swap_buffers() + glfw.wait_events() + } +} + +fn (g mut Game) init_game() { + rand.seed() + g.generate_tetro() + g.field = []array_int // TODO: g.field = [][]int + // Generate the field, fill it with 0's, add -1's on each edge + for i := 0; i < FIELD_HEIGHT + 2; i++ { + mut row := [0; FIELD_WIDTH + 2] + row[0] = - 1 + row[FIELD_WIDTH + 1] = - 1 + g.field << row + } + mut first_row := g.field[0] + mut last_row := g.field[FIELD_HEIGHT + 1] + for j := 0; j < FIELD_WIDTH + 2; j++ { + first_row[j] = - 1 + last_row[j] = - 1 + } +} + +fn (g mut Game) run() { + for { + g.move_tetro() + g.delete_completed_lines() + glfw.post_empty_event() // force window redraw + time.sleep_ms(TIMER_PERIOD) + } +} + +fn (g mut Game) move_tetro() { + // Check each block in the dropping tetro + for i := 0; i < TETRO_SIZE; i++ { + tetro := g.tetro[i] + y := tetro.y + g.posY + 1 + x := tetro.x + g.posX + // Reached the bottom of the screen or another block? + // TODO: if g.field[y][x] != 0 + row := g.field[y] + if row[x] != 0 { + // The new tetro has no space to drop => end of the game + if g.posY < 2 { + g.init_game() + return + } + // Drop it and generate a new one + g.drop_tetro() + g.generate_tetro() + return + } + } + g.posY++ +} + +fn (g mut Game) move_right(dx int) { + for i := 0; i < TETRO_SIZE; i++ { + // Reached left/right edges? + tetro := g.tetro[i] + y := tetro.y + g.posY + x := tetro.x + g.posX + dx + row := g.field[y] + if row[x] != 0 { + // Do not move + return + } + } + g.posX += dx +} + +fn (g mut Game) delete_completed_lines() { + for y := FIELD_HEIGHT; y >= 1; y-- { + g.delete_completed_line(y) + } +} + +fn (g mut Game) delete_completed_line(y int) { + for x := 1; x <= FIELD_WIDTH; x++ { + f := g.field[y] + if f[x] == 0 { + return + } + } + // Move everything down by 1 position + for yy := y - 1; yy >= 1; yy-- { + for x := 1; x <= FIELD_WIDTH; x++ { + mut a := g.field[yy + 1] + mut b := g.field[yy] + a[x] = b[x] + } + } +} + +// Place a new tetro on top +fn (g mut Game) generate_tetro() { + g.posY = 0 + g.posX = FIELD_WIDTH / 2 - TETRO_SIZE / 2 + g.tetroIdx = rand.next(B_TETROS.len) + g.rotationIdx = 0 + b := B_TETROS[g.tetroIdx] + g.tetro = parse_binary_tetro(b[0]) +} + +fn (g mut Game) drop_tetro() { + for i := 0; i < TETRO_SIZE; i++ { + tetro := g.tetro[i] + x := tetro.x + g.posX + y := tetro.y + g.posY + // Remember the color of each block + // TODO: g.field[y][x] = g.tetroIdx + 1 + mut row := g.field[y] + row[x] = g.tetroIdx + 1 + } +} + +fn (g mut Game) draw_tetro() { + for i := 0; i < TETRO_SIZE; i++ { + tetro := g.tetro[i] + g.draw_block(g.posY + tetro.y, g.posX + tetro.x, g.tetroIdx + 1) + } +} + +fn (g mut Game) draw_block(i, j int, color_idx int) { + g.gg.draw_rect((j - 1) * BLOCK_SIZE, (i - 1) * BLOCK_SIZE, + BLOCK_SIZE - 1, BLOCK_SIZE - 1, COLORS[color_idx]) +} + +fn (g mut Game) draw_field() { + for i := 1; i < FIELD_HEIGHT + 1; i++ { + for j := 1; j < FIELD_WIDTH + 1; j++ { + f := g.field[i] + if f[j] > 0 { + g.draw_block(i, j, f[j]) + } + } + } +} + +fn (g mut Game) draw_scene() { + g.draw_tetro() + g.draw_field() +} + +fn parse_binary_tetro(t int) []Block { + res := [Block{} + ; 4] + mut cnt := 0 + horizontal := t == 9// special case for the horizontal line + for i := 0; i <= 3; i++ { + // Get ith digit of t + p := int(math.pow(10, 3 - i)) + mut digit := int(t / p) + t %= p + // Convert the digit to binary + for j := 3; j >= 0; j-- { + bin := digit % 2 + digit /= 2 + if bin == 1 || (horizontal && i == TETRO_SIZE - 1) { + // TODO: res[cnt].x = j + // res[cnt].y = i + mut point := &res[cnt] + point.x = j + point.y = i + cnt++ + } + } + } + return res +} + +// TODO: this exposes the unsafe C interface, clean up +fn key_down(wnd *glfw.Window, key int, code int, action, mods int) { + if action != 2 && action != 1 { + return + } + // Fetch the game object stored in the user pointer + mut game := &Game(glfw.get_window_user_pointer(wnd)) + switch key { + case GLFW_KEY_UP: + // Rotate the tetro + game.rotationIdx++ + if game.rotationIdx == TETRO_SIZE { + game.rotationIdx = 0 + } + t := B_TETROS[game.tetroIdx] + // game.tetro = parse_binary_tetro(B_TETROS[game.tetroIdx][game.rotationIdx]) + game.tetro = parse_binary_tetro(t[game.rotationIdx]) + if game.posX < 0 { + game.posX = 1 + } + case GLFW_KEY_LEFT: + game.move_right(-1) + case GLFW_KEY_RIGHT: + game.move_right(1) + case GLFW_KEY_DOWN: + game.move_tetro() // drop faster when the player preses + } +} +