2018-11-13 17:43:25 +03:00
|
|
|
// For more tutorials: https://blog.learngoprogramming.com
|
|
|
|
|
//
|
|
|
|
|
// Copyright © 2018 Inanc Gumus
|
|
|
|
|
// Learn Go Programming Course
|
|
|
|
|
// License: https://creativecommons.org/licenses/by-nc-sa/4.0/
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"time"
|
2018-12-18 15:20:37 +03:00
|
|
|
|
|
|
|
|
"github.com/inancgumus/screen"
|
2018-11-13 17:43:25 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
width = 25
|
|
|
|
|
height = 8
|
|
|
|
|
|
|
|
|
|
maxFrames = 1200
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
|
// -------------------------------------------------
|
|
|
|
|
// CREATE THE BOARD
|
|
|
|
|
// -------------------------------------------------
|
|
|
|
|
board := make([][]bool, width)
|
|
|
|
|
for row := range board {
|
|
|
|
|
board[row] = make([]bool, height)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
X, Y int // ball positions
|
2018-12-18 15:20:37 +03:00
|
|
|
pX, pY int // previous ball positions (for clearing)
|
2018-11-13 17:43:25 +03:00
|
|
|
xVel, yVel = 1, 1 // velocities
|
2018-12-18 15:20:37 +03:00
|
|
|
|
|
|
|
|
buf [width * height]rune // drawing buffer
|
2018-11-13 17:43:25 +03:00
|
|
|
)
|
|
|
|
|
|
2018-12-18 15:20:37 +03:00
|
|
|
screen.Clear()
|
2018-11-13 17:43:25 +03:00
|
|
|
|
2018-12-18 15:20:37 +03:00
|
|
|
for i := 0; i < maxFrames; i++ {
|
2018-11-13 17:43:25 +03:00
|
|
|
// -------------------------------------------------
|
|
|
|
|
// CALCULATE THE NEXT BALL POSITION
|
|
|
|
|
// -------------------------------------------------
|
|
|
|
|
X += xVel
|
|
|
|
|
Y += yVel
|
|
|
|
|
|
|
|
|
|
// when the ball hits the borders change its direction
|
|
|
|
|
// by changing its velocity
|
|
|
|
|
if X <= 0 || X >= width-1 {
|
|
|
|
|
xVel *= -1
|
|
|
|
|
}
|
|
|
|
|
if Y <= 0 || Y >= height-1 {
|
|
|
|
|
yVel *= -1
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// -------------------------------------------------
|
2018-12-18 15:20:37 +03:00
|
|
|
// PUT THE BALL AND CLEAR THE BOARD
|
2018-11-13 17:43:25 +03:00
|
|
|
// -------------------------------------------------
|
|
|
|
|
board[X][Y] = true
|
2018-12-18 15:20:37 +03:00
|
|
|
board[pX][pY] = false
|
|
|
|
|
pX, pY = X, Y
|
2018-11-13 17:43:25 +03:00
|
|
|
|
|
|
|
|
// -------------------------------------------------
|
|
|
|
|
// DRAW THE BOARD
|
|
|
|
|
// -------------------------------------------------
|
2018-12-18 15:20:37 +03:00
|
|
|
var ball rune
|
|
|
|
|
|
|
|
|
|
// rewind the buffer
|
|
|
|
|
bufs := buf[:]
|
2018-11-13 17:43:25 +03:00
|
|
|
|
|
|
|
|
for y := range board[0] {
|
|
|
|
|
for x := range board {
|
2018-12-18 15:20:37 +03:00
|
|
|
ball = ' '
|
2018-11-13 17:43:25 +03:00
|
|
|
if board[x][y] {
|
|
|
|
|
ball = '🎾'
|
|
|
|
|
}
|
2018-12-18 15:20:37 +03:00
|
|
|
bufs = append(bufs, ball, ' ')
|
2018-11-13 17:43:25 +03:00
|
|
|
}
|
2018-12-18 15:20:37 +03:00
|
|
|
bufs = append(bufs, '\n')
|
2018-11-13 17:43:25 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// clear the screen and draw the board
|
2018-12-18 15:20:37 +03:00
|
|
|
screen.MoveTopLeft()
|
|
|
|
|
fmt.Print(string(bufs))
|
|
|
|
|
|
|
|
|
|
// draw after a while: slows down the animation
|
|
|
|
|
time.Sleep(time.Second / 20)
|
2018-11-13 17:43:25 +03:00
|
|
|
}
|
|
|
|
|
}
|