美文网首页
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