go語言程式設計小遊戲--貪吃蛇
阿新 • • 發佈:2018-11-23
前提準備條件:安裝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() }