关闭

go语言版的猜数字游戏

标签: go语言猜数字游戏
432人阅读 评论(0) 收藏 举报
分类:

猜数字(Bulls and Cows)是一个经典的小游戏.
程序先产生4位各不相同的随机数,然后用户输入0-9四位各不相同的数字,程序将输入的数字与随机数进行对比,位置和数字对应相同者提示为xA,数字相同而位置不同者提示为xB,共15次机会.如随机数为1543,输入5134将提示0A4B,输入1534将提示2A2B,输入1543将提示4A0B(此时用户获胜).
这个游戏逻辑简单但代码实现富有挑战性,非常适合编程练手使用.最近学习go语言中,下面是go语言版的Bulls and Cows:

package main
import (
    "fmt"
    "time"
    "math/rand"
    "os"
)
func gen_num(length int)[]int32{
    a:=[]int32{1,2,3,4,5,6,7,8,9,0}
    b:=make([]int32,length,length)
    if length>10 || length<0{
        fmt.Println("invalid length:",length)
        os.Exit(-1)
    }
    r:=rand.New(rand.NewSource(time.Now().UnixNano()))
    for i:=0;i<length;i++{
        tmp:=r.Intn(len(a)-i)
        b[i]=a[tmp]
        a[tmp],a[len(a)-1-i]=a[len(a)-1-i],a[tmp]
    }
    return b
}

func check_num(a,b []int32)bool{
    var aa,bb int
    if len(a)!=len(b){
        return false
    }
    dict:=make(map[int32]int)
    for i:=0;i<len(a);i++{
        dict[a[i]]=0
    }
    for i:=0;i<len(a);i++{
        if _,ok:=dict[b[i]];ok{
            bb++
        }
    }
    for i:=0;i<len(a);i++{
        if a[i]==b[i]{
            aa++
        }
    }
    bb=bb-aa
    fmt.Printf("%dA%dB\n",aa,bb)
    if aa==len(a){
        fmt.Println("OK!")
        return true
    }else{
        return false
    }
}

func main(){
    var ipu int32
    var i int
    status:=false
    length:=4
    src:=gen_num(length)
    tmp:=make([]int32,length,length)
    for j:=0;j<15 && !status;j++{
        fmt.Printf("Please input %d numbers\n",length)
        fmt.Scanf("%d",&ipu)
        for i=0;ipu>0;i++{
            tmp[i]=ipu%10
            ipu=ipu/10
        }
        if i<length{
            tmp[i]=0
        }
        dest:=make([]int32,length,length)
        for i:=0;i<len(tmp);i++{
            dest[length-1-i]=tmp[i]
        }
        status=check_num(src,dest)
    }
}

运行截图:
这里写图片描述

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6910次
    • 积分:194
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条