在学习golang的这几天在玩一个手机游戏叫《生命线》,觉得挺有趣,想想能不能用golang 做一个小雏形出来。
顺便学习一下 golang对mysql的操作。
首先,进入mysql 操作
```
#首先创建一个数据库
CREATE DATABASE `test` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
#表结构是这样,像‘树’,当你做出选择的时候,就根据 left_event_id 查找下一个事件
CREATE TABLE `events` (
`event_id` INT(10) NOT NULL PRIMARY KEY auto_increment,
`event_detail` VARCHAR(1000) NULL,
`left_event_id` INT(10),
`right_event_id` INT(10),
`left_option` VARCHAR(25),
`right_option` VARCHAR(25)
)
#先插入几条数据试试看
INSERT INTO events SET event_id=1,
event_detail="这里是ECUST219号,呼叫指挥部,收到请回复,OVER。\n这里是ECUST219号,呼叫指挥……哦,天哪,终于有人回应我了,是指挥部吗?",
left_event_id=2,
right_event_id=3,
left_option="是的,发生了什么事?",
right_option="不是,发生了什么事?"
INSERT INTO events SET event_id=2,
event_detail="哦,天哪。指挥部,我现在正在site-768,探险队全……除了我,全员牺牲,希望能尽快派来救援。",
left_event_id=4,
right_event_id=5,
left_option="没有救援",
right_option="对不起"
INSERT INTO events SET event_id=3,
event_detail="哦,天哪。别挂断!求你了,别掐断信号,你是这几天里唯一回应我的人了。",
left_event_id=6,
right_event_id=7,
left_option="发生啥事?",
right_option="你怎么了?"
```
哈哈,随便写了点东西在里面。
然后开始golang 代码,总共不超过100行
```
package main
//导入包
import (
"bufio"
"database/sql"
"fmt"
"net"
_ "github.com/go-sql-driver/mysql"
)
var (
event_id int //事件id
event_detail string //事件内容
left_event_id int //左子事件id
right_event_id int //右子事件id
left_option string //左子事件选项
right_option string //右子事件选项其实就是a or b
)
func checkErr(err error) {
if err != nil {
panic(err)
}
}
/*
将得到的信息输出到终端
*/
func echo(c net.Conn, db *sql.DB, id int) {
row := db.QueryRow("SELECT * FROM events WHERE event_id=?", id)
err := row.Scan(&event_id, &event_detail, &left_event_id, &right_event_id, &left_option, &right_option)
if err == sql.ErrNoRows {
fmt.Fprintf(c, "游戏结束")
c.Close()
return
}
fmt.Fprintf(c, "\n\033[1;37m%s\n\n\033[0;31ma)%s\n\nb)%s\n", event_detail, left_option, right_option)
}
/*
获取终端输入并处理
*/
func handleConn(db *sql.DB, c net.Conn) {
event_id = 1
echo(c, db, event_id)
input := bufio.NewScanner(c)
for input.Scan() {
switch input.Text() {
case "a":
event_id = left_event_id
echo(c, db, event_id)
case "b":
event_id = right_event_id
echo(c, db, event_id)
case "exit":
c.Close()
return
default:
continue
}
}
}
func main() {
db, err := sql.Open("mysql", "root:root@tcp(127.0.0.1:3306)/test?charset=utf8")
defer db.Close()
checkErr(err)
//echo(db, event_id)
listener, err := net.Listen("tcp", "localhost:8888")
checkErr(err)
for {
conn, err := listener.Accept()
checkErr(err)
go handleConn(db, conn)
}
}
```
效果图,惨不忍睹
![a.jpg](https://static.studygolang.com/171201/07156b2c57ab9e6eb1759dcdf3d17cca.jpg)
有疑问加站长微信联系(非本文作者))