main函数
package main
import (
"Clib"
"Game"
"fmt"
"time"
)
func init(){
Clib.HideCursor()
}
func main() {
// 1.1创建地图细节
/*
temp := [][]byte{
{'#','#','#','#','#','#','#','#','#','#','#','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#','#','#','#','#','#','#','#','#','#','#','#'},
}
*/
temp := "############\n"+
"# #\n"+
"# #\n"+
"# #\n"+
"# #\n"+
"# #\n"+
"############\n"
// 1.2 创建地图的对象
mp := Game.CreatGameMap(7,12,temp)
// 1.3 打印地图
mp.PrintMap()
// 2 创建蛇的对象
/*
//2.1 初始化蛇头的位置
headPosition := Game.Position{mp.GetCol()/2,mp.GetRow()/2}
//2.1.2 初始化蛇身的位置
bodyPosition := Game.Position{(mp.GetCol()/2)-1,mp.GetRow()/2}
//2.2 将蛇头和蛇身放入到蛇类的对象中的切片里
pos := []Game.Position{headPosition,bodyPosition}
//2.3 创建蛇的对象
sk := Game.CreatGameSnake(pos,len(pos),"d")
*/
sk := Game.DefaultGameSnake(mp)
// 3. 创建食物的对象
fd := Game.DefaultGameFood(mp)
// 4. 将蛇画到地图
mp.DrawSnake(sk)
// 5. 将食物画到地图
mp.DrawFood(fd)
// 6. 控制方向
go mp.GetCommand(&sk)
// 7. 让蛇移动
mp.MoveSnake(&sk,&fd)
// 8. 游戏结束
//光标移到最后
Clib.GotoPosition(0,mp.GetRow())
fmt.Println("Game Over")
time.Sleep(time.Minute)
}
Game包--GameMap
package Game
import (
"Clib"
"fmt"
"time"
)
// 定义地图的类
type GameMap struct {
//行数
row int
//列数
col int
//信息
details string
}
//提供设置地图的方法
func (mp *GameMap)SetRow(row int){
mp.row = row
}
func (mp *GameMap)SetCol(col int){
mp.col = col
}
func (mp *GameMap)SetDetail(detail string){
mp.details = detail
}
//func (mp *GameMap)SetDetail(detail [][]byte){
// mp.details = detail
//}
// 提供获取地图属性的方法
func (mp *GameMap)GetRow() int{
return mp.row
}
func (mp *GameMap)GetCol() int{
return mp.col
}
func (mp *GameMap)GetDetail()(string){
return mp.details
}
//func (mp *GameMap)GetDetail()([][]byte){
// return mp.details
//}
// 创建对象的方法
func CreatGameMap(row,col int,detail string)(mp GameMap){
mp = GameMap{row,col,detail}
return
}
//遍历打印地图类的details
func (mp *GameMap)PrintMap(){
fmt.Println(mp.details)
}
// 绘制蛇的方法
func (mp *GameMap)DrawSnake(sk GameSnake){
for i:=sk.length-1;i>0;i--{
Clib.GotoPosition(sk.pos[i].X,sk.pos[i].Y)
fmt.Print("*")
}
Clib.GotoPosition(sk.pos[0].X,sk.pos[0].Y)
fmt.Print("@")
}
// 绘制食物的方法
func (mp *GameMap)DrawFood(fd GameFood){
Clib.GotoPosition(fd.X,fd.Y)
fmt.Print("O")
}
// 让蛇移动的方法
func (mp *GameMap)MoveSnake(sk *GameSnake,fd *GameFood){
//判断移动的偏移量
for{
// 移动后停留的时间
time.Sleep(time.Second/2)
// 根据方向判断偏移
switch sk.direction {
case DirectionTop:
sk.SetOffset(0,-1)
case DirectionBottom:
sk.SetOffset(0,1)
case DirectionLeft:
sk.SetOffset(-1,0)
case DirectionRight:
sk.SetOffset(1,0)
}
// 清除最后一节蛇身
lastBodyPosition := sk.pos[sk.length-1]
Clib.GotoPosition(lastBodyPosition.X,lastBodyPosition.Y)
fmt.Print(" ")
// 蛇身移动
for i:=sk.length-1;i>0;i--{
sk.pos[i] = sk.pos[i-1] // 让蛇身位置等于蛇头的位置
}
// 蛇头移动
sk.pos[0].X += sk.GetOffset().X
sk.pos[0].Y += sk.GetOffset().Y
//将蛇再次绘制到地图中
mp.DrawSnake(*sk)
//做其他逻辑判断
res := mp.Control(sk, fd)
if res {
return
}
}
}
// 控制判断的函数
func (mp *GameMap)Control(sk *GameSnake,fd *GameFood) bool {
//1. 检测有没有碰到墙壁
//1.1 蛇头来判断 是否碰到墙壁
headPos := sk.pos[0]
if headPos.X <=0 || headPos.X>=mp.GetCol()-1 || headPos.Y<=0 || headPos.Y>=mp.GetRow()-1 {
return true
}
//2. 检测有没有碰到食物
if headPos.X == fd.X && headPos.Y == fd.Y{
// 重新生成新的食物
fd.AgainFood(mp)
// 重新绘制食物
mp.DrawFood(*fd)
// 增加一个蛇身
sk.newSnake()
// 重新绘制蛇
mp.DrawSnake(*sk)
return false
}
//3. 检测有没有碰到身体
for i:=1;i>sk.length;i--{
if sk.pos[0].X == sk.pos[i].X && sk.pos[0].Y == sk.pos[i].Y{
return true
}
}
return false
}
// 接受控制指令
func (mp *GameMap)GetCommand(sk *GameSnake){
for{
// 调用C语言无显示接受输入指令判断方向
switch Clib.Direction() {
case 119,87:
sk.direction = DirectionTop
case 115,83:
sk.direction = DirectionBottom
case 97,65:
sk.direction = DirectionLeft
case 100,68:
sk.direction = DirectionRight
}
}
}
Game包---GameSnake
package Game
// 定义常量保存蛇的方向
const (
DirectionTop = iota
DirectionBottom = iota
DirectionLeft = iota
DirectionRight = iota
)
//定义结构体保存蛇的位置
type Position struct {
X int // 表示第几行
Y int // 表示第几列
}
// 定义一个蛇的类
type GameSnake struct {
pos []Position // 用于保存蛇的所有位置 用切片保存
length int // 用于保存蛇的长度
direction int //蛇的运动方向
offset Position // 偏移位
}
//提供对外设置蛇类属性的方法
func (sk *GameSnake)SetPos(position Position){
sk.pos = append(sk.pos,position)
}
func (sk *GameSnake)SetLength(len int){
sk.length = len
}
func (sk *GameSnake)SetDirection(direc int){
sk.direction = direc
}
func (sk *GameSnake)SetOffset(x,y int){
sk.offset = Position{x,y}
}
// 提供对外获取蛇类属性的方法
func (sk *GameSnake)GetPos() []Position {
return sk.pos
}
func (sk *GameSnake)GetLength() int {
return sk.length
}
func (sk *GameSnake)GetDirection() int {
return sk.direction
}
func (sk *GameSnake)GetOffset() Position{
return sk.offset
}
//提供快速创建对象的方法
func CreatGameSnake(pos []Position ,len int , direc int) GameSnake {
return GameSnake{pos,len,direc,Position{}}
}
// 默认创建蛇的对象的方法
func DefaultGameSnake(mp GameMap) GameSnake{
// 初始化蛇头的位置
headPosition := Position{mp.GetCol()/2,mp.GetRow()/2}
// 初始化蛇身的位置
bodyPosition := Position{mp.GetCol()/2 -1,mp.GetRow()/2}
// 将蛇头和蛇身放入到蛇类的对象中的切片里
pos := []Position{headPosition,bodyPosition}
// 创建蛇的对象
return CreatGameSnake(pos,len(pos),DirectionRight)
}
// 新增加蛇身方法
func (sk *GameSnake)newSnake(){
//先获取最后一节舍身
lastPos := sk.pos[sk.length-1]
// 创建一个新蛇身
newPos := Position{}
switch sk.direction {
case DirectionTop : //向上走 x不变 y+1
newPos.X = lastPos.X
newPos.Y = lastPos.Y+1
case DirectionBottom : //向下走 x不变 y-1
newPos.X = lastPos.X
newPos.Y = lastPos.Y-1
case DirectionLeft : //向左走 x+1 Y不变
newPos.X = lastPos.X+1
newPos.Y = lastPos.Y
case DirectionRight : //向右走 x-1 Y不变
newPos.X = lastPos.X-1
newPos.Y = lastPos.Y
}
//将新的蛇身增加到蛇尾
sk.pos = append(sk.pos,newPos)
// 蛇的长度加1
sk.length +=1
}
Game包----GameFood
package Game
import (
"math/rand"
"time"
)
//设计随机因子 此步骤是因为 需要重新创建食物的位置 againFood函数
func init(){
rand.Seed(time.Now().UnixNano())
}
// 创建食物的类
type GameFood struct {
Position
}
//提供对外设置食物XY的方法
func (fd *GameFood)SetX(x int){
fd.X = x
}
func (fd *GameFood)SetY(y int){
fd.Y = y
}
//提供对外获得食物xy的方法
func (fd *GameFood)GetX() int {
return fd.X
}
func (fd *GameFood)GetY() int {
return fd.Y
}
// 提供创建对象的方法
func CreatGameFood(x,y int) GameFood {
return GameFood{Position{x,y}}
}
//默认创建食物的方法
func DefaultGameFood(mp GameMap) GameFood {
//设计随机种子
rand.Seed(time.Now().UnixNano())
//设置随机食物的位置
foodPositionX := rand.Intn(mp.GetCol()-2)+1
foodPositionY := rand.Intn(mp.GetRow()-2)+1
return GameFood{Position{foodPositionX,foodPositionY}}
}
// 重新创建食物的函数方法
func (fd *GameFood)AgainFood(mp *GameMap){
fd.X = rand.Intn(mp.GetCol()-2)+1
fd.Y = rand.Intn(mp.GetRow()-2)+1
}
网友评论