前提准備條件:安裝gcc環境,可以百度也
可以安裝這個鏈接:https://pan.baidu.com/s/1BbXFcBZywK-k-eIkWqY3Ug
提取碼:04wp
復制這段內容后打開百度網盤手機App,操作更方便哦,直接解壓,然后放到環境變量中。
代碼:
主文件:
package main import ( "Clib" "fmt" "math/rand" "os" "time" ) //全局常量 界面大小 const WIDE int = 20 const HIGH int = 20 //存儲食物 var food Food //分數 var score = 0 //初始化父類 坐標 type Position struct { X int Y int } type Food struct { Position } //隨機食物 func RandomFood() { food.X = rand.Intn(WIDE) + 1 food.Y = rand.Intn(HIGH) //顯示食物位置 ShowUI(food.X, food.Y, '#') } func MapInit() { fmt.Fprintf(os.Stderr, ` #-----------------------------------------# | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | #-----------------------------------------# `) } func ShowUI(X int, Y int, ch byte) { //調用c語言代碼繪制光標 Clib.GotoPostion(X*2+2, Y+2) //將字符繪制在ui中 fmt.Fprintf(os.Stderr, "%c", ch) } func PrintScore() { //打印分數 Clib.GotoPostion(0, 23) fmt.Fprintln(os.Stderr, score) time.Sleep(time.Second * 2) } type Snake struct { size int dir int pos [WIDE * HIGH]Position } //初始化蛇信息 func (s *Snake) SnakeInit() { //初始化地圖 MapInit() //隨機食物 RandomFood() //蛇的長度 s.size = 2 s.pos[0].X = WIDE / 2 s.pos[0].Y = HIGH / 2 s.pos[1].Y = WIDE/2 - 1 s.pos[1].Y = HIGH / 2 //用U上L坐R右D下 s.dir = 'R' for i := 0; i < s.size; i++ { var ch byte //區分蛇頭和身體 if i == 0 { ch = '@' } else { ch = '*' } ShowUI(s.pos[i].X, s.pos[i].Y, ch) } //go 添加一個獨立函數 //接收鍵盤的信息 go func() { for { switch Clib.Direction() { case 72, 87, 119: if s.dir != 'D' { s.dir = 'U' } case 80, 83, 115: if s.dir != 'U' { s.dir = 'D' } case 65, 97, 75: if s.dir != 'R' { s.dir = 'L' } case 68, 77, 100: if s.dir != 'L' { s.dir = 'R' } case 32: s.dir = 'P' } } }() } func (s *Snake) PlayGame() { var dx, dy int = 0, 0 //游戲 的流程控制 for { FLAG: //延遲執行333s time.Sleep(time.Second / 3) //更新蛇的位置 if s.dir == 'P' { goto FLAG } 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 } //蛇頭和牆的碰撞 if s.pos[0].X < 1 || s.pos[0].X >= WIDE+1 || s.pos[0].Y < 0 || s.pos[0].Y >= HIGH { return } //蛇頭和身體的碰撞 for i := 1; i < s.size; i++ { if s.pos[0].X == s.pos[i].X && s.pos[0].Y == s.pos[i].Y { return } } //蛇頭的食物的碰撞 if s.pos[0].X == food.X && s.pos[0].Y == food.Y { s.size++ RandomFood() score++ } //記錄尾巴坐標 lx := s.pos[s.size-1].X ly := s.pos[s.size-1].Y //更新蛇的坐標 蛇身體的坐標 for i := s.size - 1; i > 0; i-- { s.pos[i].X = s.pos[i-1].X s.pos[i].Y = s.pos[i-1].Y } //蛇頭的坐標 s.pos[0].X += dx s.pos[0].Y += dy //繪制蛇的UI for i := 0; i < s.size; i++ { var ch byte //區分蛇頭和身體 if i == 0 { ch = '@' } else { ch = '*' } ShowUI(s.pos[i].X, s.pos[i].Y, ch) } //每次寫完將尾巴制空 ShowUI(lx, ly, ' ') } } func main() { //設置隨機數種子 用作於混淆 rand.Seed(time.Now().UnixNano()) //隱藏控制台光標 Clib.HideCursor() //創建蛇的對象 var s Snake //蛇的初始化 s.SnakeInit() s.PlayGame() PrintScore() }
引入的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.gotoxy(C.int(X), C.int(Y)) } //無顯示鍵盤輸入字符 func Direction() (key int) { key = int(C.direct()) return } func HideCursor() { C.hideCursor() }