First commit, some basic Tetris types
This commit is contained in:
		
						commit
						7cdf59d5aa
					
				
					 9 changed files with 266 additions and 0 deletions
				
			
		
							
								
								
									
										22
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								.gitignore
									
										
									
									
										vendored
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,22 @@
 | 
			
		|||
*.swp
 | 
			
		||||
*.swo
 | 
			
		||||
 | 
			
		||||
dist
 | 
			
		||||
dist-*
 | 
			
		||||
cabal-dev
 | 
			
		||||
*.o
 | 
			
		||||
*.hi
 | 
			
		||||
*.chi
 | 
			
		||||
*.chs.h
 | 
			
		||||
*.dyn_o
 | 
			
		||||
*.dyn_hi
 | 
			
		||||
.hpc
 | 
			
		||||
.hsenv
 | 
			
		||||
.cabal-sandbox/
 | 
			
		||||
cabal.sandbox.config
 | 
			
		||||
*.prof
 | 
			
		||||
*.aux
 | 
			
		||||
*.hp
 | 
			
		||||
*.eventlog
 | 
			
		||||
.stack-work/
 | 
			
		||||
cabal.project.local
 | 
			
		||||
							
								
								
									
										30
									
								
								LICENSE
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								LICENSE
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
Copyright Sam Tay (c) 2017
 | 
			
		||||
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
modification, are permitted provided that the following conditions are met:
 | 
			
		||||
 | 
			
		||||
    * Redistributions of source code must retain the above copyright
 | 
			
		||||
      notice, this list of conditions and the following disclaimer.
 | 
			
		||||
 | 
			
		||||
    * Redistributions in binary form must reproduce the above
 | 
			
		||||
      copyright notice, this list of conditions and the following
 | 
			
		||||
      disclaimer in the documentation and/or other materials provided
 | 
			
		||||
      with the distribution.
 | 
			
		||||
 | 
			
		||||
    * Neither the name of Sam Tay nor the names of other
 | 
			
		||||
      contributors may be used to endorse or promote products derived
 | 
			
		||||
      from this software without specific prior written permission.
 | 
			
		||||
 | 
			
		||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 | 
			
		||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 | 
			
		||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 | 
			
		||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 | 
			
		||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 | 
			
		||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | 
			
		||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | 
			
		||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | 
			
		||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 | 
			
		||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
							
								
								
									
										1
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								README.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1 @@
 | 
			
		|||
# tetris
 | 
			
		||||
							
								
								
									
										2
									
								
								Setup.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								Setup.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
import Distribution.Simple
 | 
			
		||||
main = defaultMain
 | 
			
		||||
							
								
								
									
										6
									
								
								app/Main.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								app/Main.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,6 @@
 | 
			
		|||
module Main where
 | 
			
		||||
 | 
			
		||||
import Tetris
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main = someFunc
 | 
			
		||||
							
								
								
									
										92
									
								
								src/Tetris.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								src/Tetris.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,92 @@
 | 
			
		|||
{-# LANGUAGE TemplateHaskell #-}
 | 
			
		||||
{-# LANGUAGE RecordWildCards #-}
 | 
			
		||||
{-# LANGUAGE TypeSynonymInstances #-}
 | 
			
		||||
{-# LANGUAGE FlexibleInstances #-}
 | 
			
		||||
module Tetris
 | 
			
		||||
    (
 | 
			
		||||
    ) where
 | 
			
		||||
 | 
			
		||||
import qualified Data.Map as M
 | 
			
		||||
import Lens.Micro
 | 
			
		||||
import Lens.Micro.TH
 | 
			
		||||
import Prelude hiding (Left, Right)
 | 
			
		||||
 | 
			
		||||
-- | Tetris shape types
 | 
			
		||||
data Tetrimino =
 | 
			
		||||
    I
 | 
			
		||||
  | O
 | 
			
		||||
  | T
 | 
			
		||||
  | S
 | 
			
		||||
  | Z
 | 
			
		||||
  | J
 | 
			
		||||
  | L
 | 
			
		||||
  deriving (Eq, Show, Enum)
 | 
			
		||||
 | 
			
		||||
-- | Coordinates
 | 
			
		||||
type Coord = (Int, Int)
 | 
			
		||||
type CoordMap = (Int -> Int, Int -> Int)
 | 
			
		||||
 | 
			
		||||
-- | Tetris shape in coordinate context
 | 
			
		||||
data Block = Block
 | 
			
		||||
  { _shape  :: Tetrimino -- ^ block type
 | 
			
		||||
  , _origin :: Coord -- ^ origin (absolute)
 | 
			
		||||
  , _extra  :: [Coord] -- ^ extraneous cells (relative)
 | 
			
		||||
  } deriving (Eq, Show)
 | 
			
		||||
 | 
			
		||||
makeLenses ''Block
 | 
			
		||||
 | 
			
		||||
data Direction = Left | Right | Down
 | 
			
		||||
  deriving (Eq, Show)
 | 
			
		||||
 | 
			
		||||
-- | Cell state within a tetris board
 | 
			
		||||
data Cell = Filled Tetrimino | Empty
 | 
			
		||||
  deriving (Eq, Show)
 | 
			
		||||
 | 
			
		||||
-- | Board of cells
 | 
			
		||||
type Board = M.Map Coord Cell
 | 
			
		||||
 | 
			
		||||
-- | Game state
 | 
			
		||||
data Game = Game
 | 
			
		||||
  { _speed :: Int
 | 
			
		||||
  , _currBlock :: Block
 | 
			
		||||
  , _nextShape :: Tetrimino
 | 
			
		||||
  , _score :: Int
 | 
			
		||||
  , _board :: Board
 | 
			
		||||
  } deriving (Eq, Show)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
-- Translate class for direct translations, without concern for boundaries
 | 
			
		||||
-- Shiftable concerns safe translations with boundaries
 | 
			
		||||
class Translatable s where
 | 
			
		||||
  translate :: Direction -> s -> s
 | 
			
		||||
 | 
			
		||||
instance Translatable Coord where
 | 
			
		||||
  translate Left (x, y) = (x-1, y)
 | 
			
		||||
  translate Right (x, y) = (x+1, y)
 | 
			
		||||
  translate Down (x,y) = (x, y-1)
 | 
			
		||||
 | 
			
		||||
instance Translatable Block where
 | 
			
		||||
  translate d b = b & origin %~ translate d
 | 
			
		||||
 | 
			
		||||
initI, initO, initS, initZ, initL, initJ, initT :: Block
 | 
			
		||||
initI = Block I (0,0) [(-2,0), (-1,0), (1,0)]
 | 
			
		||||
initO = Block O (0,0) [(-1,0), (-1,-1), (0,-1)]
 | 
			
		||||
initS = Block S (0,0) [(-1,-1), (0,-1), (1,0)]
 | 
			
		||||
initZ = Block Z (0,0) [(-1,0), (0,-1), (1,-1)]
 | 
			
		||||
initL = Block L (0,0) [(-1,-1), (-1,0), (1,0)]
 | 
			
		||||
initJ = Block J (0,0) [(-1,0), (1,0), (1,-1)]
 | 
			
		||||
initT = Block T (0,0) [(-1,0), (0,-1), (1,0)]
 | 
			
		||||
 | 
			
		||||
-- | Rotate block counter clockwise about origin
 | 
			
		||||
-- *Note*: Strict unsafe rotation not respecting boundaries
 | 
			
		||||
-- Safety can only be assured within Game context
 | 
			
		||||
rotate' :: Block -> Block
 | 
			
		||||
rotate' = (& extra %~ fmap (\(x,y) -> (-y, x)))
 | 
			
		||||
 | 
			
		||||
-- | Get absolute coordinates of extraneous block cells
 | 
			
		||||
absExtra :: Block -> [Coord]
 | 
			
		||||
absExtra (Block _ (xo,yo) cs) = fmap (\(x,y) -> (x+xo, y+yo)) cs
 | 
			
		||||
 | 
			
		||||
-- | Get absolute coordinates of all block cells
 | 
			
		||||
absAll :: Block -> [Coord]
 | 
			
		||||
absAll (Block _ o@(xo,yo) cs) = o : fmap (\(x,y) -> (x+xo, y+yo)) cs
 | 
			
		||||
							
								
								
									
										66
									
								
								stack.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								stack.yaml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,66 @@
 | 
			
		|||
# This file was automatically generated by 'stack init'
 | 
			
		||||
#
 | 
			
		||||
# Some commonly used options have been documented as comments in this file.
 | 
			
		||||
# For advanced use and comprehensive documentation of the format, please see:
 | 
			
		||||
# http://docs.haskellstack.org/en/stable/yaml_configuration/
 | 
			
		||||
 | 
			
		||||
# Resolver to choose a 'specific' stackage snapshot or a compiler version.
 | 
			
		||||
# A snapshot resolver dictates the compiler version and the set of packages
 | 
			
		||||
# to be used for project dependencies. For example:
 | 
			
		||||
#
 | 
			
		||||
# resolver: lts-3.5
 | 
			
		||||
# resolver: nightly-2015-09-21
 | 
			
		||||
# resolver: ghc-7.10.2
 | 
			
		||||
# resolver: ghcjs-0.1.0_ghc-7.10.2
 | 
			
		||||
# resolver:
 | 
			
		||||
#  name: custom-snapshot
 | 
			
		||||
#  location: "./custom-snapshot.yaml"
 | 
			
		||||
resolver: lts-8.18
 | 
			
		||||
 | 
			
		||||
# User packages to be built.
 | 
			
		||||
# Various formats can be used as shown in the example below.
 | 
			
		||||
#
 | 
			
		||||
# packages:
 | 
			
		||||
# - some-directory
 | 
			
		||||
# - https://example.com/foo/bar/baz-0.0.2.tar.gz
 | 
			
		||||
# - location:
 | 
			
		||||
#    git: https://github.com/commercialhaskell/stack.git
 | 
			
		||||
#    commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
 | 
			
		||||
# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
 | 
			
		||||
#   extra-dep: true
 | 
			
		||||
#  subdirs:
 | 
			
		||||
#  - auto-update
 | 
			
		||||
#  - wai
 | 
			
		||||
#
 | 
			
		||||
# A package marked 'extra-dep: true' will only be built if demanded by a
 | 
			
		||||
# non-dependency (i.e. a user package), and its test suites and benchmarks
 | 
			
		||||
# will not be run. This is useful for tweaking upstream packages.
 | 
			
		||||
packages:
 | 
			
		||||
- '.'
 | 
			
		||||
# Dependency packages to be pulled from upstream that are not in the resolver
 | 
			
		||||
# (e.g., acme-missiles-0.3)
 | 
			
		||||
extra-deps: []
 | 
			
		||||
 | 
			
		||||
# Override default flag values for local packages and extra-deps
 | 
			
		||||
flags: {}
 | 
			
		||||
 | 
			
		||||
# Extra package databases containing global packages
 | 
			
		||||
extra-package-dbs: []
 | 
			
		||||
 | 
			
		||||
# Control whether we use the GHC we find on the path
 | 
			
		||||
# system-ghc: true
 | 
			
		||||
#
 | 
			
		||||
# Require a specific version of stack, using version ranges
 | 
			
		||||
# require-stack-version: -any # Default
 | 
			
		||||
# require-stack-version: ">=1.4"
 | 
			
		||||
#
 | 
			
		||||
# Override the architecture used by stack, especially useful on Windows
 | 
			
		||||
# arch: i386
 | 
			
		||||
# arch: x86_64
 | 
			
		||||
#
 | 
			
		||||
# Extra directories used by stack for building
 | 
			
		||||
# extra-include-dirs: [/path/to/dir]
 | 
			
		||||
# extra-lib-dirs: [/path/to/dir]
 | 
			
		||||
#
 | 
			
		||||
# Allow a newer minor version of GHC than the snapshot specifies
 | 
			
		||||
# compiler-check: newer-minor
 | 
			
		||||
							
								
								
									
										2
									
								
								test/Spec.hs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								test/Spec.hs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,2 @@
 | 
			
		|||
main :: IO ()
 | 
			
		||||
main = putStrLn "Test suite not yet implemented"
 | 
			
		||||
							
								
								
									
										45
									
								
								tetris.cabal
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								tetris.cabal
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,45 @@
 | 
			
		|||
name:                tetris
 | 
			
		||||
version:             0.1.0.0
 | 
			
		||||
-- synopsis:
 | 
			
		||||
-- description:
 | 
			
		||||
homepage:            https://github.com/SamTay/tetris#readme
 | 
			
		||||
license:             BSD3
 | 
			
		||||
license-file:        LICENSE
 | 
			
		||||
author:              Sam Tay
 | 
			
		||||
maintainer:          sam.chong.tay@gmail.com
 | 
			
		||||
copyright:           2017 Sam Tay
 | 
			
		||||
category:            Web
 | 
			
		||||
build-type:          Simple
 | 
			
		||||
extra-source-files:  README.md
 | 
			
		||||
cabal-version:       >=1.10
 | 
			
		||||
 | 
			
		||||
library
 | 
			
		||||
  hs-source-dirs:      src
 | 
			
		||||
  exposed-modules:     Tetris
 | 
			
		||||
  build-depends:       base >= 4.7 && < 5
 | 
			
		||||
                     , brick
 | 
			
		||||
                     , containers
 | 
			
		||||
                     , microlens
 | 
			
		||||
                     , microlens-th
 | 
			
		||||
  default-language:    Haskell2010
 | 
			
		||||
 | 
			
		||||
executable tetris
 | 
			
		||||
  hs-source-dirs:      app
 | 
			
		||||
  main-is:             Main.hs
 | 
			
		||||
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
 | 
			
		||||
  build-depends:       base
 | 
			
		||||
                     , tetris
 | 
			
		||||
  default-language:    Haskell2010
 | 
			
		||||
 | 
			
		||||
test-suite tetris-test
 | 
			
		||||
  type:                exitcode-stdio-1.0
 | 
			
		||||
  hs-source-dirs:      test
 | 
			
		||||
  main-is:             Spec.hs
 | 
			
		||||
  build-depends:       base
 | 
			
		||||
                     , tetris
 | 
			
		||||
  ghc-options:         -threaded -rtsopts -with-rtsopts=-N
 | 
			
		||||
  default-language:    Haskell2010
 | 
			
		||||
 | 
			
		||||
source-repository head
 | 
			
		||||
  type:     git
 | 
			
		||||
  location: https://github.com/SamTay/tetris
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue