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