golang ツタンカーメン机器人(TUTコンピュータクラブ2015年度夏合宿成果)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang ツタンカーメン机器人(TUTコンピュータクラブ2015年度夏合宿成果)相关的知识,希望对你有一定的参考价值。
package main
import "github.com/ChimeraCoder/anaconda"
import "fmt"
import "net/url"
import "strings"
import "strconv"
import "math/rand"
import "time"
type AhiruyakiPattern struct {
Pred func(*anaconda.TwitterApi, *anaconda.Tweet) bool
Apply func(*anaconda.TwitterApi, *anaconda.Tweet)
}
type GameEnvironment struct {
Game *GameStatus
WinCNT int64
LoseCNT int64
}
type GameStatus struct {
Usya Player
Mao Player
}
type Player struct {
Tame int64
Life int64
}
var gameEnv = GameEnvironment{}
var gameCommands = []string{"こうげき", "ため", "ぼうぎょ", "ひっさつ"}
var ahirus [15]AhiruyakiPattern
func isReply(tweet *anaconda.Tweet) bool {
return strings.Contains(tweet.Text, "@")
}
func isRT(tweet *anaconda.Tweet) bool {
return strings.HasPrefix(tweet.Text, "RT")
}
func isContains(tweet *anaconda.Tweet, strs []string) bool {
for _, e := range strs {
if strings.Contains(tweet.Text, e) {
return true
}
}
return false
}
func postReply(api *anaconda.TwitterApi, tweet *anaconda.Tweet, str string) {
id := tweet.Id
v := url.Values{}
v.Add("in_reply_to_status_id", strconv.FormatInt(id, 10))
api.PostTweet("@"+tweet.User.ScreenName+" "+str, v)
fmt.Println("POST")
}
func getRandElement(strs []string) string {
return strs[rand.Intn(len(strs))]
}
func getRandTweet() string {
var randTweets = []string{
"なんやねん",
"なるほど",
"わかる",
"うける",
"神",
"ヨイ",
"D棟の最上階に行きませんか?",
"F棟の最上階に行きませんか?",
"You must go to the future",
"Go to the feature",
"技科大生って感じ悪いよね",
"デスノートオススメ",
// "るろうに剣心見ろよ",
"カイジから学ぶことは多い",
// "友利奈緒友利奈緒",
"D進不可避",
"D進待ったなし",
// "院死不可避",
"やったぜ",
"天伯臭がヒドい",
"サカキパークに埋まってるから発掘して",
"天伯の塩",
"食堂より纏ずしイイね",
"あのさぁ…",
"えぇぇ…",
"ゆるして",
"ファッ",
"やめてよぉ…",
"くぅ疲",
"発掘してくれ頼む",
"寝てください",
"ツイートしてる暇があるなら、論文読もう",
"ヒエログリフ忘れたから教えて",
}
return getRandElement(randTweets)
}
func gameEnvInit() {
gameEnv.Game = new(GameStatus)
gameEnv.Game.Mao.Life = 3
gameEnv.Game.Mao.Tame = 0
gameEnv.Game.Usya.Life = 3
gameEnv.Game.Usya.Tame = 0
}
func gameNextCommand(game *GameStatus) string {
if game.Mao.Tame >= 3 {
if game.Usya.Life <= 2 {
return "こうげき"
} else if game.Mao.Life <= 1 {
return "こうげき"
} else {
return "ぼうぎょ"
}
} else if game.Usya.Tame >= 3 {
return "ひっさつ"
} else if game.Mao.Life <= 1 {
return "こうげき"
} else if game.Usya.Life <= 1 {
return "こうげき"
} else {
if game.Usya.Tame == 2 && game.Mao.Life == 3 {
return "ため"
} else if game.Usya.Life < game.Mao.Life {
return "こうげき"
} else {
return getRandElement(gameCommands[0:2])
}
}
}
func ahiruyaki(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
for _, pattern := range ahirus {
if tweet.User.ScreenName != "k3_tut" {
if pattern.Pred(api, tweet) {
pattern.Apply(api, tweet)
return
}
}
}
}
func main() {
anaconda.SetConsumerKey("****************")
anaconda.SetConsumerSecret("****************")
api := anaconda.NewTwitterApi("****************", "****************")
ahiruyakiInit()
rand.Seed(time.Now().UnixNano())
api.SetLogger(anaconda.BasicLogger)
v := url.Values{}
v.Add("replies", "all")
stream := api.UserStream(v)
for {
select {
case item := <-stream.C:
switch status := item.(type) {
case anaconda.Tweet:
if !isRT(&status) {
ahiruyaki(api, &status)
}
default:
}
}
}
}
func ahiruyakiInit() {
idx := 0
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && strings.Contains(tweet.Text, "@k3_tut") && (gameEnv.Game == nil) && tweet.User.ScreenName == "golang_bot" && strings.Contains(tweet.Text, "ゲームを始めます")
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
gameEnvInit()
postReply(api, tweet, gameNextCommand(gameEnv.Game))
}
idx += 1
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && strings.HasPrefix(tweet.Text, "@k3_tut") && (gameEnv.Game != nil) && tweet.User.ScreenName == "golang_bot" && (strings.Contains(tweet.Text, "勝ちです") || strings.Contains(tweet.Text, "負けです"))
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
gameEnv.Game = nil
if strings.Contains(tweet.Text, "あなたの勝ちです") {
postReply(api, tweet, getRandElement([]string{"余裕だった", "敗北を知りたい"}))
} else {
postReply(api, tweet, getRandElement([]string{"何がいけなかったんだ...", "キェェェェェエエエ"}))
}
}
idx += 1
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && strings.Contains(tweet.Text, "@k3_tut") && (gameEnv.Game != nil) && tweet.User.ScreenName == "golang_bot"
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
lines := strings.Split(tweet.Text, "\n")
var usyaAttack int64 = 0
var maoAttack int64 = 0
var usyaTame int64 = 0
var maoTame int64 = 0
var usyaAbsorb int64 = 0
var maoAbsorb int64 = 0
var attackP *int64
var tameP *int64
var absorbP *int64
for _, e := range lines {
if strings.Contains(e, "勇者は") {
attackP = &usyaAttack
tameP = &usyaTame
absorbP = &usyaAbsorb
} else {
attackP = &maoAttack
tameP = &maoTame
absorbP = &maoAbsorb
}
if strings.Contains(e, "こうげきをした") {
*attackP += 1
} else if strings.Contains(e, "ぼうぎょをした") {
*absorbP += 1
} else if strings.Contains(e, "ためをした") {
*tameP += 1
} else if strings.Contains(e, "ひっさつをした") {
*attackP += 3
}
}
gameEnv.Game.Usya.Life -= maoAttack - usyaAbsorb
gameEnv.Game.Mao.Life -= usyaAttack - maoAbsorb
gameEnv.Game.Usya.Tame += usyaTame
gameEnv.Game.Mao.Tame += maoTame
// return gameNextCommand(gameEnv.Game)
postReply(api, tweet, gameNextCommand(gameEnv.Game))
}
idx += 1
// "友利奈緒" -> "わかる"
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && strings.Contains(tweet.Text, "友利奈緒")
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "わかる")
}
idx += 1
// GoToTheFuture -> "Go to the デスノート"
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
str := strings.ToLower(strings.Join(strings.Split(tweet.Text, " "), ""))
return !isRT(tweet) && strings.Contains(str, "gotothefuture") || strings.Contains(str, "gttf")
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "GO TO THE デスノート")
}
idx += 1
// "天伯臭" -> "腐ってるからしかたない"
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && strings.Contains(tweet.Text, "天伯臭")
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "腐ってるからしかたない")
}
idx += 1
// サカキパーク
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && isContains(tweet, []string{"榊", "サカキ", "サカキ", "SKK", "Skk", "skk"}) && isContains(tweet, []string{"パーク", "Park", "パーク", "park", "PARK"})
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "技科大生の墓地")
}
idx += 1
// SKK
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && isContains(tweet, []string{"SKK", "skk", "Skk"})
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "現学長は ジムリーダー サカキ")
}
idx += 1
// 呼んだ?
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && isContains(tweet, []string{"ツタンカーメン", "つたんかーめん", "ツタンカーメン"})
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "呼んだ?")
}
idx += 1
// return reply
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
if isRT(tweet) {
return false
}
if (tweet.User.ScreenName == "hibari_ch" || tweet.User.ScreenName == "hujiwara_sisiza") && (rand.Intn(4) == 0) {
return false
}
return strings.Contains(tweet.Text, "@k3_tut") && (tweet.User.ScreenName != "k3_tut")
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, getRandTweet())
}
idx += 1
// ひばりチャンのリプライ以外の普通のツイートに対して返信
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && tweet.User.ScreenName == "hibari_ch" && !isReply(tweet) && rand.Intn(5) == 0
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, getRandTweet())
}
idx += 1
//
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && (!isReply(tweet)) && strings.Contains(tweet.Text, "論文")
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
postReply(api, tweet, "寝てください")
}
idx += 1
//
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return rand.Intn(20) == 0
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
v := url.Values{}
api.PostTweet(getRandTweet(), v)
}
idx += 1
//
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && !isReply(tweet) && rand.Intn(80) == 0 && gameEnv.Game == nil
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
v := url.Values{}
api.PostTweet("@golang_bot ゲームスタート", v)
}
idx += 1
//
ahirus[idx] = AhiruyakiPattern{}
ahirus[idx].Pred = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) bool {
return !isRT(tweet) && !isReply(tweet) && rand.Intn(80) == 0
}
ahirus[idx].Apply = func(api *anaconda.TwitterApi, tweet *anaconda.Tweet) {
v := url.Values{}
api.PostTweet("@hibari_ch "+getRandTweet(), v)
}
}
csharp 大量の立方体を回すコンピュートシェーダ
using UnityEngine;
/// <summary>
/// 毎フレーム1度ずつX軸回転するキューブ
/// </summary>
public class ComputeCubes : MonoBehaviour
{
/// <summary>
/// スレッド
/// </summary>
private const int ThreadBlockSize = 12;
/// <summary>
/// コンピュートシェーダ
/// </summary>
[SerializeField]
private ComputeShader _computeShader;
/// <summary>
/// コンピュートバッファ
/// </summary>
private ComputeBuffer _buffer;
/// <summary>
/// 生成個数
/// </summary>
private int _cubeCount = 10000;
/// <summary>
/// キューブ参照
/// </summary>
private GameObject[] _cubes;
/// <summary>
/// 各キュー部の角度を格納配列
/// </summary>
private float[] _angles;
/// <summary>
/// カーネルID
/// </summary>
private int _mainKernel = 0;
void Start()
{
// キューブGameObject作成
_cubes = new GameObject[_cubeCount];
_angles = new float[_cubeCount];
for (int i = 0; i < _cubeCount; i++)
{
var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
// キューブをランダムに初期配置
float len = 20f;
cube.transform.localPosition =
new Vector3(Random.Range(-len, len), Random.Range(-len, len), Random.Range(-len, len));
_cubes[i] = cube;
}
// カーネルID取得
_mainKernel = _computeShader.FindKernel("CSMain");
// コンピュートバッファの作成
_buffer = new ComputeBuffer(_cubeCount, sizeof(float));
// シェーダとバッファの関連付け
_computeShader.SetBuffer(_mainKernel, "Result", _buffer);
// バッファにデータをセット
_buffer.SetData(_angles);
}
void Update()
{
// GPU並列処理実行
int threadGroupX = (_cubeCount / ThreadBlockSize) + 1;
_computeShader.Dispatch(_mainKernel, threadGroupX, 1, 1);
var data = new float[_cubeCount];
// 更新結果を取得
_buffer.GetData(data);
for (int i = 0; i < _cubeCount; i++)
{
float result = data[i];
_angles[i] = result;
// キューブをぐるぐるさせる
_cubes[i].transform.localEulerAngles = new Vector3(_angles[i], 0, 0);
}
}
private void OnDestroy()
{
_buffer.Release();
}
}
以上是关于golang ツタンカーメン机器人(TUTコンピュータクラブ2015年度夏合宿成果)的主要内容,如果未能解决你的问题,请参考以下文章
python 「実践コンピュータビジョン」7章画像検索の読书会用コード
c_cpp [失败例]コンピュートシェーダで大量の立方体を回す
css よくるるコンポーネントの设计·実装パターン - ボタン编:http://qiita.com/usako/items/8b34838b1a15e062a122