go语言贪PC蛋蛋搭建一条龙食蛇与C语言的区别

栏目: C · 发布时间: 6年前

内容简介:利用goPC蛋蛋搭建一条龙,需要请搜索package Clib/*

利用goPC蛋蛋搭建一条龙,需要请搜索 dsluntan.com ,语言写贪食蛇游戏那么就会利用面向对象的思想来写一下,创造蛇身体对象,然后写出来,/go语言写的时候我们需要调用一个 c语言 写的一个包/,go语言可以直接调用调用c语言的函数,很方便简洁,我们先来看一下我自己写的C语言的一个包

package Clib

/*

#include <windows.h>

#include <conio.h>

// 使用了WinAPI来移动控制台的光标

void gotoxy(int x,int y)

{

COORD c;

c.X=x,c.Y=y;

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);

}

// 从键盘获取一次按键,但不显示到控制台

int direct()

{

return _getch();

}

//去掉控制台光标

void hideCursor()

{

CONSOLE_CURSOR_INFO cci;

cci.bVisible = FALSE;

cci.dwSize = sizeof(cci);

SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cci);

}

*/

import "C" // go中可以嵌入C语言的函数

//设置控制台光标位置

func GotoPostion(X int, Y int) {

//调用C语言函数

C.gotoxy(C.int(X), C.int(Y))

}

//无显获取键盘输入的字符

func Direction() (key int) {

key = int(C.direct())

return

}

//设置控制台光标隐藏

func HideCursor() {

C.hideCursor()

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

这个包把一些需要用到c语言的函数写进来,调用c语言的函数需要用到c语言的环境,别忘记自己电脑上要装c语言的环境奥,我们来看一下这个目录结构

这里写图片描述

首先我们的代码是放在GoCode里面下面的src目录下面,Clib里面是自己写的C语言的一个包,贪食蛇和Clib是同级别目录,在这里我们用的是goland编译器,编译器这里可以自己选择,我们编译的时候就不能单个文件编译了,因为需要调用自己的包,所以要选择多文件编译如图

这里写图片描述

我自己用的goland编译的时候需要改一下改成Directory 然后目录选到所在目录的src目录,然后设置好后就可以直接编译运行啦,当然也可以直接命令行编译运行

这里写图片描述

如图,我们可以在所在目录下面直接go build ./这样就是生成可执行文件.exe的,也可以直接使用go run命令直接编译运行,

感兴趣的小伙伴可以自己去试试啦

下面来看一下 go 语言写的代码,(可以自己去完善一下奥,比如加入等级,加入障碍物,蛇的速度都是自己可以调节的奥)

package main

import (

"Clib"

"fmt"

"os"

"math/rand"

"time"

)

const wide int = 20

const high int = 20

var key int64 = 1 //关卡

var food1 food //定义一个全局食物结构体

//var size int = 2 //定义一个全局蛇的长度

var score int = 0 //定义一个全局分数

var dx int = 0

var dy int = 0 //蛇的偏移量

var barr1 barrier //障碍物结构体

var c cake //定义一个蛋糕

var FLAG bool=true

type postion struct {

x int

y int //父类坐标

}

type cake struct{

ca [5]postion

} //定义一个蛋糕

type snake struct {

p [wide

high]postion

size int

dir byte

}

type barrier struct {

barr [6]postion

} //障碍物结构体

cake)setcake(){

x:=rand.Intn(wide-6)+3

y:=rand.Intn(high-6)+3

c.ca[0].x,c.ca[0].y=x,y

c.ca[1].x,c.ca[1].y=x-1,y

c.ca[2].x,c.ca[2].y= x-2,y

c.ca[3].x,c.ca[3].y=x-1,y-1

c.ca[4].x,c.ca[4].y=x-1,y+1

}

func (b

barrier)setbarrier(){ //定义一些随机障碍物

b.barr[0].x,b.barr[0].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1

b.barr[1].x,b.barr[1].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1

b.barr[2].x,b.barr[2].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1

//b.barr[3].x,b.barr[3].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1

//b.barr[4].x,b.barr[4].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1

//b.barr[5].x,b.barr[5].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1

}

type food struct {

postion

} //食物

func drawui(p postion, ch byte) {

2+4, p.y+2+2)

fmt.Fprintf(os.Stderr, "%c", ch)

}

func (s *snake) initsnake() { //蛇初始化

s.p[0].x = wide / 2

s.p[0].y = high / 2

s.p[1].x = wide/2 - 1

s.p[1].y = high / 2 //蛇头和第一个蛇结点初始化

s.dir = 'R'

s.size=2

fmt.Fprintln(os.Stderr,

`

#-----------------------------------------#

#-----------------------------------------#

`)

food1 = food{postion{rand.Intn(wide), rand.Intn(high) - 2}} //食物初始化

drawui(food1.postion, 'o') //画出食物

//go func(){
 Clib.GotoPostion(46,19)
 fmt.Printf("正在进行第%d关,小心障碍物",key)
//}()
go func(){
    for{
        time.Sleep(time.Second)
        num:=rand.Intn(10)
        if num==6{
            c.setcake()
            break
        }
    }
    for i:=0;i<len(c.ca);i++{
        drawui(c.ca[i],'#')
    }
}()                  //吃蛋糕的作用
go func(){
    for i:=0;i<len(barr1.barr);i++{
        Clib.GotoPostion(barr1.barr[i].x,barr1.barr[i].y)
        drawui(barr1.barr[i],'!')
    }
}()             //打印出障碍物
go func() {
    for {
        switch Clib.Direction() {
        case 72, 87, 119:
            if s.dir == 'D' {
                break
            }
            s.dir = 'U'
        case 65, 97, 75:
            if s.dir == 'R' {
                break
            }
            s.dir = 'L'
        case 100, 68, 77:
            if s.dir == 'L' {
                break
            }
            s.dir = 'R'
        case 83, 115, 80:
            if s.dir == 'U' {
                break
            }
            s.dir = 'D'
        case 32:
            s.dir = 'P'
        }
    }
}()   //获取蛇跑的方向

}

func (s *snake) playgame() {

//barr:=barrier{postion{rand.Intn(wide-5)+5,rand.Intn(high-5)+3}

//drawui(barr.postion,'p')

for {

switch key {

case 1: time.Sleep(time.Second / 3)

case 2:time.Sleep(time.Second / 5)

case 3:time.Sleep(time.Second / 6)

case 4:time.Sleep(time.Second / 7)

case 5:time.Sleep(time.Second / 8)

case 6:time.Sleep(time.Second / 9) //用来每增加一关蛇的速度加快

}

if s.dir == 'P' {
        continue
    }
    if s.p[0].x < 0 || s.p[0].x >= wide || s.p[0].y+2 < 0 || s.p[0].y >= high-2 {
        Clib.GotoPostion(wide*3, high-3)
        FLAG=false
        return //如果蛇头碰墙就死亡
    }
    //if s.p[0].x==barr.postion.x&&s.p[0].y==barr.postion.y{
    //  Clib.GotoPostion(wide*3, high-3)
    //  return //如果蛇头碰障碍物就死亡
    //}

    for i := 1; i <s.size; i++ {
        if s.p[0].x == s.p[i].x && s.p[0].y == s.p[i].y {
            Clib.GotoPostion(wide*3, high-3)
            FLAG=false
            return
        }
    }
    for j:=0;j<len(barr1.barr);j++{
        if s.p[0].x==barr1.barr[j].x&&s.p[0].y==barr1.barr[j].y{
            Clib.GotoPostion(wide*3, high-3)
            FLAG=false
            return
        }                //碰到障碍物死亡
    }
    for m:=0;m<len(c.ca);m++{
        if s.p[0].x==c.ca[m].x&&s.p[0].y==c.ca[m].y{
            s.size++
            score++
        }
        if score >= int(6+key*2) {
            key++
            return
        }
    }
    if s.p[0].x == food1.x && s.p[0].y == food1.y {
        s.size++
        score++
        if score >= int(6+key*2) {
            key++
            return
        }
        //画蛇
        //food1 = food{postion{rand.Intn(wide), rand.Intn(high) - 2}}
        for {
            flag := true
            temp := food{postion{rand.Intn(wide), rand.Intn(high) - 2}}
            for i := 1; i < s.size; i++ {
                if (temp.postion.x == s.p[i].x && temp.postion.y == s.p[i].y)  {
                    flag = false
                    break
                }
            }
            for i:=0;i<len(barr1.barr);i++{
                if temp.postion.x==barr1.barr[i].x&&temp.postion.y==barr1.barr[i].y{
                    flag=false
                    break
                }
            }
            if flag == true {
                food1 = temp
                break
            }

        }
        drawui(food1.postion, 'o')
    }

    switch s.dir {
    case 'U':
        dx = 0
        dy = -1
    case 'D':
        dx = 0
        dy = 1
    case 'L':
        dx = -1
        dy = 0
    case 'R':
        dx = 1
        dy = 0
    }
    lp := s.p[s.size-1] //蛇尾位置
    for i := s.size - 1; i > 0; i-- {
        s.p[i] = s.p[i-1]
        drawui(s.p[i], '*')
    }
    drawui(lp, ' ') //蛇尾画空格

    s.p[0].x += dx
    s.p[0].y += dy      //更新蛇头
    drawui(s.p[0], 'O') //画蛇头
}

}

func main() {

rand.Seed(time.Now().UnixNano())

var s snake

for k:=1;k<=6;k++{    //用来循环6次代表6个关卡,这里可以自己设置多少关卡
    s.initsnake()        //初始化
    barr1.setbarrier()  //障碍物
    s.playgame()       //玩游戏开始
    if FLAG==false{        //这个代表蛇死亡返回的,所以这样就退出了
        Clib.GotoPostion(46,21)
        fmt.Printf("你已死亡,第%d关总分:%d分",k, score)
        break
    }
    Clib.GotoPostion(46,21)
    fmt.Printf("第%d关总分:%d分,稍等进入下一关",k, score)
    //key++
    time.Sleep(time.Second * 5)  //延时5秒
    Clib.Cls()                  //每一关清屏一下
    //size=2
    score=0                   //每一关分数置为0
}

time.Sleep(time.Second * 5)   //延时5秒

}


以上所述就是小编给大家介绍的《go语言贪PC蛋蛋搭建一条龙食蛇与C语言的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Design for ROI

Web Design for ROI

Lance Loveday、Sandra Niehaus / New Riders Press / 2007-10-27 / USD 39.99

Your web site is a business--design it like one. Billions of dollars in spending decisions are influenced by web sites. So why aren't businesses laser-focused on designing their sites to maximize thei......一起来看看 《Web Design for ROI》 这本书的介绍吧!

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具