go語言貪PC蛋蛋搭建一條龍食蛇與C語言的區別

來源:互聯網
上載者:User

利用goPC蛋蛋搭建一條龍,需要請搜尋dsluntan.com ,語言寫貪食蛇遊戲那麼就會利用物件導向的思想來寫一下,創造蛇身體對象,然後寫出來,/go語言寫的時候我們需要調用一個c語言寫的一個包/,go語言可以直接調用調用c語言的函數,很方便簡潔,我們先來看一下我自己寫的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.x
2+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秒

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.