1. 程式人生 > >go語言程式設計小遊戲--貪吃蛇

go語言程式設計小遊戲--貪吃蛇

前提準備條件:安裝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()
}