猫史档案馆


【Go语言作品分享】二进制游戏

用户:wrmdcxywrmdcxy查看:3 回复:4 评论:3 创建时间:2020-05-04T20:57:39


【作品展示】

               没什么好展示的,跟以前的二进制游戏(https://shequ.codemao.cn/community/238429)一样

【作品介绍】

    这是Go语言版的二进制游戏。和以前的功能一样。但是以前的是顺序编程,这个是函数式编程。作为一个初学者,途中也踩了不少的坑。。。。。。。但是最后还是成功了!

【作品源代码】

package main
import(
	"fmt"
	"strconv"
	"os"
	"io"
	"bufio"
	"os/user"
	"strings"
	"time"
	"math/rand"
)
func DecBin(n int喵)int {
	if n == 0 {
		return 0
	}
	s := ""
	for q := n; q > 0; q = q / 2 {
		m := q % 2
		s = fmt.Sprintf("%v%v", m, s)
	}
	num,_:=strconv.Atoi(s)
	return num
}

type Infos struct{
	Questions int
	name string
	scores int
	newUser bool
	CurrentQuestions int
	keepRun bool
	ddir string
}

func(info *Infos)getUserScores(){
	u,_:=user.Current()
	_=os.MkdirAll(u.HomeDir+"\\AppData\\Local\\binaryGames",os.ModePerm)
	info.ddir=u.HomeDir+"\\AppData\\Local\\binaryGames\\"
	fpath:=info.ddir+"userScores.pkg"
	file,_:=os.OpenFile(fpath,os.O_CREATE|os.O_RDONLY,0666)
	defer file.Close()
	buf:=bufio.NewReader(file)
	for{
		line,err:=buf.ReadString('\n')
		line=strings.TrimSpace(line)
		if err != nil && err == io.EOF{
			info.scores=0
			info.newUser=true
			return
		}else if a:=strings.Split(line,";");a[0]==info.name{
			info.scores,_=strconv.Atoi(a[1])
			info.newUser=false
			return
		}else{}
	}
}

func(info *Infos)getName(){
	fmt.Print("请输入您的名字:")
	fmt.Scanln(&info.name)
}

func(info *Infos)sayHello(){
	if info.newUser{
		fmt.Println("欢迎加入这个游戏!")
		time.Sleep(time.Second/2)
		fmt.Println("二进制游戏规则:\n\t在这个游戏中,你会得到一个十进制的数\n\t你的任务是将这个数转换为二进制的数\n\t答对一题加一分,答错一题不扣分。")
		time.Sleep(time.Second*1)
		fmt.Println("现在开始吧!")
	}else{
		fmt.Printf("你好,%v,欢迎回来。您当前的分数是:%v。",info.name,info.scores)
		fmt.Print("需要再讲一遍游戏规则吗?(1.要  2.不要):")
		var ifnds string
		fmt.Scanln(&ifnds)
		switch ifnds{
		case "1":
			fmt.Println("好的")
			time.Sleep(time.Second/2)
			fmt.Println("二进制游戏规则:\n\t在这个游戏中,你会得到一个十进制的数\n\t你的任务是将这个数转换为二进制的数\n\t答对一题加一分,答错一题不扣分。")
		case "2":
			fmt.Println("好的,现在开始吧")
		default:
			fmt.Println("......\n好吧,现在开始")
		}
	}
}

func(info *Infos)ScannumofGame(){
	time.Sleep(time.Second/2)
	var qesnum string
	for{
		fmt.Print("问题数(1~15):")
		fmt.Scanln(&qesnum)
		if numberoq,err:=strconv.Atoi(qesnum);err!=nil{
			fmt.Println("请输入正确的数字\n")
		}else if numberoq<1{
			fmt.Println("问题数不能小于1。\n因此,问题数将设置为1。")
			info.Questions=1
			break
		}else if numberoq>15{
			fmt.Println("问题数不能大于15。\n因此,问题数将设置为15。")
			info.Questions=15
			break
		}else{
			info.Questions=numberoq
			break
		}
	}

}

func(info *Infos)playGame(){
	info.keepRun=true
	for info.keepRun{
		info.ScannumofGame()
		info.CurrentQuestions=info.Questions
		var answer string
		rand.Seed(time.Now().Unix())
		for i:=0;i<info.Questions;i++{
			QuestionNum:=rand.Intn(28)+2
			TrueAnswer:=DecBin(int喵(QuestionNum))
			for{
				fmt.Print(QuestionNum,"=")
				fmt.Scanln(&answer)
				if n,err:=strconv.Atoi(answer);err!=nil && answer==""{
					fmt.Println("请输入正确的数字\n\n")
				}else if n==TrueAnswer{
					fmt.Println("回答正确!\n\n")
					info.scores+=1
					break
				}else{
					fmt.Printf("回答错误,正确答案是%v\n\n\n",TrueAnswer)
					info.CurrentQuestions-=1
					break
				}
			}
			answer=""
		}
		var i string
		fmt.Printf("游戏结束,您答了%v题,答对了%v题。还想玩吗?继续按Enter键,不想玩可以输入\"-1\"退出哦。",info.Questions,info.CurrentQuestions)
		fmt.Scanln(&i)
		switch i{
		case "-1":
			fmt.Printf("您当前的分数是%v分。拜拜,欢迎下次来玩!\n",info.scores)
			info.writeDatas()
			info.keepRun=false
		default:
			info.keepRun=true
		}
	}
}

func(info *Infos)writeDatas(){
	if info.newUser{
		file,_:=os.OpenFile(info.ddir+"userScores.pkg",os.O_APPEND,0666)
		defer file.Close()
		wt:=bufio.NewWriter(file)
		wt.WriteString(fmt.Sprintf("%v;%v\n",info.name,info.scores))
		wt.Flush()
	}else{
		f,_:=os.Create(info.ddir+"nuss.t")
		f.Close()
		files,_:=os.Open(info.ddir+"userScores.pkg")
		filen,_:=os.OpenFile(info.ddir+"nuss.t",os.O_WRONLY,0666)
		sf:=bufio.NewReader(files)
		nf:=bufio.NewWriter(filen)
		for{
			line,err:=sf.ReadString('\n')
			line=strings.TrimSpace(line)
			if err != nil && err==io.EOF{
				break
			}
			if content:=strings.Split(line,";");content[0]==info.name{
				nf.WriteString(fmt.Sprintf("%v;%v\n",info.name,info.scores))
				nf.Flush()
			}else{
				nf.WriteString(fmt.Sprintf("%v\n",line))
				nf.Flush()
			}
		}
		files.Close()
		filen.Close()
		os.Remove(info.ddir+"userScores.pkg")
		os.Rename(info.ddir+"nuss.t",info.ddir+"userScores.pkg")
	}
}

func main(){
	var game *Infos=&Infos{}
	game.getName()
	game.getUserScores()
	game.sayHello()
	game.playGame()
}

【提示】

别问我为什么发Python专区


回复

上一页1 页 / 共 1下一页
wrmdcxywrmdcxy

center_image

center_image

center_image

center_image

center_image

center_image

点赞0


评论


wrmdcxywrmdcxy

d'd'd'd'd

点赞0


评论


ZH-Y-QZH-Y-Q

大佬……Go语言也会……%%%

点赞0


评论


wrmdcxywrmdcxy

https://gitee.com/wrm­dcxy/codes/9u61bwagvcd87f2q0slio76

点赞0


评论