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语言的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

看见未来

看见未来

余晨 / 浙江大学出版社 / 2015-4-15 / 59.00元

【内容简介】 这是互联网群星闪耀的时代,巨人们用最尖端的技术和自成体系的哲学改变着我们的生活,甚至影响了整个世界和人类的历史进程。在这个时代,没有人可以避开互联网的渗透。互联网早已不是简单的技术变革,人们正试图赋予其精神和内涵,以期互联网能更好地为人类所用。 本书中作者 面对面地采访了包括马克·扎克伯格、埃隆·马斯克、杨致远、凯文·凯利、克里斯·安德森、罗伯特·希勒、迈克尔·莫瑞茨、凯......一起来看看 《看见未来》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具