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年度夏合宿成果)的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 的HelloWorldコンピュートシェーダ

csharp 大量の立方体を回すコンピュートシェーダ

[日文]中国語のコンピュータ用語を紹介する記事

python 「実践コンピュータビジョン」7章画像検索の読书会用コード

c_cpp [失败例]コンピュートシェーダで大量の立方体を回す

css よくるるコンポーネントの设计·実装パターン - ボタン编:http://qiita.com/usako/items/8b34838b1a15e062a122