美文网首页
Go语言小练习 贪吃蛇动态版

Go语言小练习 贪吃蛇动态版

作者: 超级皮波9 | 来源:发表于2018-10-07 22:56 被阅读0次

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
}

相关文章

网友评论

      本文标题:Go语言小练习 贪吃蛇动态版

      本文链接:https://www.haomeiwen.com/subject/sqwraftx.html