go語言貪PC蛋蛋搭建一條龍食蛇與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 } //障礙物結構體 func (c 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) { Clib.GotoPostion(p.x2+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語言的區別