内容简介:利用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语言的区别》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- 编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别
- 计算机语言发展的三个阶段:机器语言、汇编语言与高级语言
- 凹 (“Wa”) 语言:可以嵌入 Go 语言环境的脚本语言
- Rust语言恰巧是一门解决了Go语言所有问题的语言
- 获取系统语言/当前 App支持语言
- 【Go 语言教程】Go 语言简介
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Design Patterns
Elisabeth Freeman、Eric Freeman、Bert Bates、Kathy Sierra、Elisabeth Robson / O'Reilly Media / 2004-11-1 / USD 49.99
You're not alone. At any given moment, somewhere in the world someone struggles with the same software design problems you have. You know you don't want to reinvent the wheel (or worse, a flat tire),......一起来看看 《Head First Design Patterns》 这本书的介绍吧!