摘要:本文主要向大家介绍了C/C++知识点之go语言贪PC蛋蛋搭建一条龙食蛇与C语言的区别,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
本文主要向大家介绍了C/C++知识点之go语言贪PC蛋蛋搭建一条龙食蛇与C语言的区别,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。
利用goPC蛋蛋搭建一条龙,需要请搜索dsluntan.com ,语言写贪食蛇游戏那么就会利用面向对象的思想来写一下,创造蛇身体对象,然后写出来,/go语言写的时候我们需要调用一个c语言写的一个包/,go语言可以直接调用调用c语言的函数,很方便简洁,我们先来看一下我自己写的C语言的一个包package Clib
/*#include
// 使用了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()}1234567891011121314151617181920212223242526272829303132333435363738394041424344这个包把一些需要用到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 = 20const high int = 20
var key int64 = 1 //关卡var food1 food //定义一个全局食物结构体//var size int = 2 //定义一个全局蛇的长度var score int = 0 //定义一个全局分数var dx int = 0var dy int = 0 //蛇的偏移量var barr1 barrier //障碍物结构体var c cake //定义一个蛋糕var FLAG bool=truetype postion struct {x inty int //父类坐标}type cake struct{ca [5]postion} //定义一个蛋糕type snake struct {p [wide high]postionsize intdir byte}type barrier struct {barr [6]postion} //障碍物结构体func (c cake)setcake(){x:=rand.Intn(wide-6)+3y:=rand.Intn(high-6)+3c.ca[0].x,c.ca[0].y=x,yc.ca[1].x,c.ca[1].y=x-1,yc.ca[2].x,c.ca[2].y= x-2,yc.ca[3].x,c.ca[3].y=x-1,y-1c.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)+1b.barr[1].x,b.barr[1].y=rand.Intn(wide-1)+1,rand.Intn(high-3)+1b.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) {Clib.GotoPostion(p.x2+4, p.y+2+2)fmt.Fprintf(os.Stderr, "%c", ch)}func (s *snake) initsnake() { //蛇初始化s.p[0].x = wide / 2s.p[0].y = high / 2s.p[1].x = wide/2 - 1s.p[1].y = high / 2 //蛇头和第一个蛇结点初始化s.dir = ‘R‘s.size=2fmt.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秒
}
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号