情報系音ゲーマーの手記

Python2.7.xとかDDRとか

【DDR】SP激ENDYMIONクリアするだけの攻略法

今回はSP足18でも割と難しめ(だと著者が勝手に思ってる)のENDYMIONの攻略記事です。譜面画像はDDR SP総合Wikiさんより拝借してます。

https://www21.atwiki.jp/asigami/pages/2760.html

f:id:eiki1253:20181125093031j:image

 

記事中に「第?高速/低速」みたいなワードが出ますが下の画像に対応してます。(PCじゃないと見えにくいかも…)

f:id:eiki1253:20181125100602j:image

今回は前編ということで第3高速までを攻略していきます。

 

 

対象はSP足18を10譜面くらいクリアできる人。

使うオプションはハイスピ1.25倍とSUDDEN+(以下、サドプラ)、譜面が始まるまでに画面の半分より少し下あたりまで出して消しておく。

 

まずはイントロ〜第1高速の入りまで。

難しいところは特にないですが、第1低速の最後が少し忙しいので配置を覚えておくと吉。

f:id:eiki1253:20181125093826j:image

 

次に第1高速〜第2低速の入り。

本記事の目的はクリアするだけなので、体力の消費が大きく体勢も崩れやすい同時押しは全スルーします。(JUMP OFFでやってみると恩恵を感じられるかも(?))

そして第1高速の最後、ここがゲージの削られポイント。

f:id:eiki1253:20181125094752j:image

体が、右向き→左向き→右向きという動きをするので非常に難しい&崩れやすいです。一瞬左向きになる44小節の「↑」と「↓」を無視すると少しだけ楽になるのでオススメです。

そして第2低速に入るところのフリーズでサドプラをオンに。

 

次に第2低速から第2高速の終わりまで。

アフロ踏みが入り乱れる配置なので、(僕みたいにアフロ踏みが苦手な人は)無理に交互踏みを意識すると逆にゲージが溶けます、溶けました。

なので、バリバリスライドで処理していきます。ここのアフロ踏みですが実質BPMが同じNEPHILIM DELTA激に似たような配置があるので、そこで慣らしておくといいと思います。アフロ踏み後の16分の5連打は地団駄なので、しっかりと取りこぼさないようにしていきます。

そして第2高速ですが、配置が簡単なのでサドプラは外さずに抜けます。

f:id:eiki1253:20181125103151j:image

 

次に第3低速から第3高速まで。

サドプラはかかったままです。第3低速の59小節目から65小節目までは縦連をスイッチで踏むことにより、だいたい交互踏みできます。16分7連打がありますが、足を大きく動かす配置ではないので、ミスを増やさないように踏んでいきます。

68小節目から79小節目(第3高速の手前)までは、交互踏みにこだわらずスライドで処理します。16分は少ないので無視してもそこまでゲージは減りません。

そして第3高速に入ります。ここもサドプラは外しません。第2高速より長めの滝なので暗記推奨です。

f:id:eiki1253:20181125105251j:image

f:id:eiki1253:20181125105255j:image

また、この滝終わりのフリーズアローでサドプラを外します。

 

 

今回はここまで。多分後で加筆します。

ゲームパッドが壊れたので買い換えた話

タイトルの通りです.

 

前使ってたやつ↓

f:id:eiki1253:20180917191643j:plain

12ボタン 高耐久USBゲームパッド - JC-U3312Sシリーズ

約5~6年使い続けてたんですけど,とうとうガタがきました.

画像から分かるかもしれませんが,十字キーと1~4ボタンを酷使していたところ,3と4のボタンが死にました.

Amazonさんでレビューを見ると「すぐ死んだ」とか「初期不良」とか書き込まれてることがあるんですけど,全然そんなことはないと(個人的には)思います.

 

てわけで買い換えです.今まではPS配置のやつを使ってたんですけど,Steamでロケットリーグとかベヨネッタとか積みゲーしてるんで,心機一転Xbox配置のやつにしてみました.

store.steampowered.com

store.steampowered.com

 

 新しいやつ↓

f:id:eiki1253:20180917191629j:plain

Xinput対応ゲームパッド - JC-U3613MBK

Amazonのレビューにも書いてありましたが, L2とR2が気持ち重めです.ですが,使ってたらそんなに気になりませんでした.

 

久しぶりに記事書いたのでとりあえずこんなもんで.

 

さーて,積みゲーを消化するぞーーーー(新しいゲームを購入しながら)

KizunaAI land建国の一員になった話

お久しぶりですeiki1253です。

 

今回は少しばかり自慢話を…

 

 

ことの発端はとある動画


【Minecraft】#0 キズナアイランド建国の仲間急募しちゃいます!!!

 

キズナアイちゃんの大ファンである私は「応募しなきゃ…(使命感)」という気持ちになり、気づいたら応募ツイートをしていました。

 

 

まあ、バーチャルYouTuberの草分け的な存在であるキズナアイちゃんの企画なので、どうせ当たらないだろうと思っていました。

 

 

 

クッソ多忙で死にかかってたとある日

 

私「なんかめっちゃTwitterの通知きてる。なんやろ。」

 

私「ちょっと何起こってるかわかんないですね(思考放棄)」

 

 

 

てなわけでKizunaAI landを建国する一員となり、壁埋めたり道作ったり建物作ったりしてました。

 

 

 

そして投稿されるキズナアイちゃんの動画!


【Minecraft】#1 感謝感激・・・KizunaAI Land初公開!

 

「私ともう一人で作った建物も映ってる!」

f:id:eiki1253:20180524222920p:plain

※原案はもう一人の方であり、私は少しばかりお手伝いさせてもらっただけです(^∇^)

 

とか考えながら観てたら…

f:id:eiki1253:20180524182330j:image

 

 

 

f:id:eiki1253:20180524182341j:image

 

 

 

f:id:eiki1253:20180524182345j:image

 

「出てるやんけ、私の名前出てるやんけ」

ってな感じで予期せぬ形でキズナアイちゃんの動画にデビューしました。

 

 

この頃はスプラトゥーン2やってて忙しくてMinecraftできてなかったけど、久しぶりにログインしてみようかなって思います。

 

これからも建国の一員として頑張ります。

 

eiki1253でした。

【バルス】tweepyを用いたバルス連投プログラム

放送中に執筆したため動くかは保証できません。

あとで確認します。

tweepyが使えるPython2系を想定しています。

 

# -*- coding:utf-8 -*-

import tweepy

consumer_key = "自分のconsumer_key"
consumer_secret = "自分のconsumer_secret"
access_key = "自分のaccess_key"
access_secret = "自分のaccess_secret"

CK=consumer_key
CS=consumer_secret
AT=access_key
AS=access_secret

auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

for i in range(10):
 api.update_status("バルス")

取り急ぎ。

【DDR】DP激アラビをクリアするための攻略法を書いてみる

お久しぶりです。

いや、ほんとにお久しぶりです。

 

唐突なんですが、今回はDance Dance Revolutionきっての左右振り曲"Arrabbiata"のDP激譜面クリアのための記事を書いていきます。

 

(もちろん私なりの攻略法なので、合う合わないはあると思います。)

 

今回の記事で対象としてるのは以下のようなプレイヤーさんです。

  • バー持ち
  • DP足14〜15を(安定ではないが)クリアできる
  • DP激アラビの最初の方は踏める
  • 中盤の発狂で閉店する
  • とりあえずこの譜面をクリアしたい(スコアは気にしない)

 

また、譜面画像はArrabbiata(激) - Dance Dance Revolution DP攻略 Wiki @ ウィキ - アットウィキより借りさせていただきました。

 

 

それでは早速いきます。

最初の方はホームポジション(左足:1P→、右足:2P←)を意識していればそこまで削られることはありません。

 

縦連がちょいちょい出てきますが、後々に体力を残すことを考えて少し軽く踏むようにします。

 

あと、同→単→同→単の配置は全て同時押しで踏んじゃった方が下手に考えなくていいので楽な気がします。

 

 

そして、中盤の発狂…の直前に少しだけ厄介な配置があります。

f:id:eiki1253:20170928143330j:image

上の画像の配置と、それを鏡写しにした配置がそれぞれ1回ずつ出てきます。

 

この配置の場合、右足(赤いノーツに対応)の移動量はそこまで多くありませんが、左足(青いノーツに対応)は2P↑から1P→を経由して2P↓を踏むため、左足を大きく左回りに回すような動きになります。

また、最後の5連打は体を捻りながら取らねばならず、割とよく取りこぼします。

 

なので、捨てノーツを考えます。

f:id:eiki1253:20170928144831j:image

上の画像のように、1P→を捨て、最後の5連打を左始動で踏むことによりゲージを残しつつ楽に踏むことが出来るようになります。

 

次の鏡写しの配置になっている部分も同様にして抜けます。

 

 

ここから中盤発狂です。

とりあえず譜面だけ見ることとします。

f:id:eiki1253:20170928145333j:image

「…なんすかコレ?」

 

と言いたくなる譜面ですがここはガチ踏みで抜けることを考えます。

 

最重要事項として、1P←→と2P↑↓は左足、1P↑↓と2P←→は右足で踏むということ、ミスしてもとりあえずリズム通りに足だけは動かすことを念頭に置いておいてください。

 

まずは前半、薄い赤丸がついているノーツに注目します。

f:id:eiki1253:20170928150635j:image

赤丸のノーツは1P側から2P側(またはその逆)に渡った直後の↑か↓のノーツです。

これらのノーツを見極めることによりホームポジションから次の足を前に出すか後ろに出すかを見定めます。

また、渡り直後を踏み外してもその次のノーツは1P←か2P→なので、修正をきかせることも容易です。

 

 

そして中盤発狂の後半です。ここで厄介なのは次の箇所です。

f:id:eiki1253:20170928230602j:image

赤丸で示したノーツは「移動距離が多い+そこで一気に切返さなければならない」ので、予想以上に難しいです。

 

なので、そこのノーツだけ少し力を入れて逆側に蹴り返すイメージでやるといいと思います。(力みすぎないように注意です)

 

 

ここまでで中盤発狂は終わりですが次も厄介な配置です。個人的にはここがクリアを目指すうえでの最難関です。

 

「タンッ タタタタタンッ」の様なリズムの繰り返しなのですが、同時が絡んでくる+捌きにくい配置なので踏んでるつもりでもポロポロ抜けます。なので、思い切ってバツ印のノーツを捨てます。

 f:id:eiki1253:20170928234032j:image

 また、wikiにも書いてある通りですが、ここの同時押し3回は体が外を向いてないと次がかなり踏みづらくなります。

 

 

次の部分は1個前と大体同じなので解説は省きますが、同時押しは内側を向いて踏まないと次が踏みづらくなります。

f:id:eiki1253:20170928234724j:image

 

長い発狂攻略も次で最後ですが、ここで注意すべきは先ほどと同様に、同時押しは内側を向いて踏むということくらいです。

f:id:eiki1253:20170928234933j:image

 

同時押しで外3回、内5回が終わればあとはほぼウィニングランです。

雰囲気としては曲開始〜中盤発狂寸前レベルの左右振りが流れてくるくらいです。

 

 

そして最後、同時押しが見える様な気がしますが気のせいだと信じましょう。

f:id:eiki1253:20170928235732j:image

 (一応真面目な解説としては同時押しの2P←を捨てて踏むと、ミスはでますが楽に踏める感じです。)

 

 

長くなってしまいましたが、少しでも参考になればと思います。

 

それではみなさん楽しいDDRライフを!

【プログラミング超初心者向け】C言語の入門みたいな話 前編

はじめに

今回の内容は、大学でプログラミングに初めて触れるような"プログラミング超初心者向け"となっています。すでに予備知識のある方は特に得られるものはないと思います。

大学に入学したての頃は、死ぬほどプログラミングが苦手でした。その経験をもとに、初めて触れたときの感覚を思い出しながら書いていきます。

また、記憶を頼りにしながら書いてるので、たまに間違ってる部分があるかもしれません。もし、そういうのを発見されたら、コメントでお教えしていただけると助かります。


C言語でのプログラミングの前に

プログラミングに用いる構文の前に、重要なワードを3つ紹介しておきます。それは、「2進数」と「0オリジン」と「コンパイル」というものです。

2進数

普段、わたしたちの身の回りに存在する数字のほとんどが"10進数"です。
"2進数"はコンピュータ内部で利用されており、情報系の生徒であれば嫌でも耳にする言葉です。

簡単に言ってしまえば、0と1のみを用いて数字を表現する方法が2進法で、それによって表される数字のことを2進数といいます。
詳しくはこちらがわかりやすかったので参考にしてみてください。(リンク先を読むのがめんどくさければすっとばしてもらってもOKです。)
2進数、16進数と10進数 - CyberLibrarian

また、次の図に示す値はよくでてくるので頭の片すみに入れておくことを推奨します。上が10進数(decimal)での表示、下が2進数(binary)での表示となります。
f:id:eiki1253:20170413014339p:plain

0オリジン

2進数は、人によっては聞いたことあるかもしれませんが、こちらのワードを聞いたことがある人は比較的少ないのではないでしょうか。
簡単に言うと、1から数え始めるのではなく、0から数え始めるということです。
イメージを↓の図に示します。
f:id:eiki1253:20170413015157p:plain

プログラムを書く際は、0オリジンが基本なんだなと覚えておいていただければ結構です。

コンパイル

英語で書くとcompile、意味は"編集する"とか"機械語に翻訳する"などがあります。今回はもちろん後者の意味で用います。
プログラミング言語(C言語javaPython...)は、あくまで人が理解しやすいように設計された言語であり、そのままではコンピュータが処理を行うことができません。そこでプログラミング言語をコンピュータが理解できるように翻訳する必要があります。
さすがに人の手で変換するのはキツいので、コンパイラと呼ばれるものを使ってプログラムをコンパイル--つまり機械語に翻訳--してあげます。

また、プログラムの構文に間違いがあればコンパイルエラーとなり、正しく実行ができません。ここで必要になるのが、プログラムの間違いを見つける作業、いわゆるデバッグです。かなり細かいミスなどでもプログラムは動かないですが、自分の書いたプログラムは間違いが見つけづらいので、少し探してバグが見つからなければ、ほかの人に助けを求めてみるのが吉です。


C言語のプログラムを書くにあたって

どんなC言語のプログラムを書くときも、大体必要になる枠組みがあります。それがinclude文とmain関数です。

include文

どの参考書のどんな簡単なプログラムでも、一番初めに次の1文が書かれてることがほとんどです。

#include <stdio.h>

よく、プログラムを書くための「おまじない」と説明されることがあるのですが、その正体はstandard input/output のヘッダファイルです。
standard input/outputなので、標準入力(キーボード使って文字を入力したりすること)や、標準出力(文字をパソコンの画面に表示すること)をするためのファイルを読み込んでるということになります。
これがないと後述のprintf文(画面上に文字を表示する文)が使えなくなってしまうので、画面上に何も表示できなくなります。

他にも文字を扱うのに特化したstring.hや、数学に特化したmath.hなとがありますが、今回は別に必要ないので触れません。興味がある方は調べてみるといいかもしれません。

main関数

C言語でプログラムを動かす際にかならず1つだけ必要になる関数がこのmain関数となります。
また、main関数以外の関数(後述)を使いたくても、main関数を経由しなければいけないので、言ってみれば関数の親玉みたいな存在です。

基本的な枠組みは次のようになります。

int main(){
 /* なんらかの処理 */
 return 0;
}

上のプログラムを読んで初心者の方は「そもそも関数ってなんだよ」とか「intって何だよ」とか「return 0;って何だよ」とか思ったことだと思います。

では、これらの3つについて解説を少し挟みます。(説明の関係上順番が前後しています。)

int型

簡単に言っちゃえば「この数字は整数です!!」っていう宣言です。例えば次のような文があったとします。

int x;

この文では、xは整数だということを示しています。

ここで注意していただきたいのは、われわれは賢いのですが、コンピュータはアホなので、intで宣言された変数(今回はx)は、"絶対に整数しか扱えない"ということです。

例えば次のようにしたとします。

int x;
x=0.9;

この場合、コンパイルはできるのですが、コンピュータ内部では小数点以下が切り捨てられてx=0として扱われてしまいます。(四捨五入なんていうめんどくさい処理は行われないので注意です。)

「じゃあ小数扱うにはどないせぇっちゅうねん」という方、double型やfloat型とかありますが、今回の説明範囲を超えてしまうので割愛です。自分で検索してみてください。わかりやすいサイトがたくさんあります。

関数

関数というと、数学の授業で習ったf(x)=x^2のようなものを想像すると思います。
実は大体あってます。結構似てます。

試しに上記の式をプログラムにしてみます。(main関数以外の関数にあたります)

int f(int x){
 int kotae;
 kotae=x*x;
 return kotae;
}

プログラムの解説をしていきます。
まず1行目から、"int f(int x)"。たぶん「なんでintが2つもあるんや???」ってなると思います。
一番初めのintは、「答え(正式名称:返り値)が整数になるよ!!」ということを示しており、2番目のカッコの中にあるintは、f(x)=x^2でいうところの「代入する数(正式名称:引数)が整数だよ!!」ということを示しています。
また、fは関数の名前、xは引数の名前です。名前は好きなように変えられます。

2行目、"int kotae;"、これは前の章で書いた通り、「kotaeには整数が入るよ!!」ということを示しています。

3行目、kotaeに計算結果を入れます。イメージ図を置いておきます。
f:id:eiki1253:20170414175247p:plain

そして4行目ですが、次の節で解説になります。

return文

さきほどのプログラムでは"return kotae;"となっていました。
returnという単語から、勘のいい方はもう気づいてるかと思います。

2つ出てきたint型のうちの1つ目、「答え(正式名称:返り値)が整数になるよ!!」の返り値が"kotae"となるのです。

実はさっきの関数、以下の通り、もっと短く書くことができます。

int f(int x){
 return x*x;
}

返り値に直接計算をぶち込む形です。どっちかというと、こっちのほうが分かりやすいかもしれない(?)


main関数は"int main()"という部分だけで「mainという名前関数は、返り値がint型(整数)であり、引数は無し」、ということがわかります。


まとめ

長くなってきたので今回の記事で解説してきたものを組み合わせて、2乗を計算させるプログラムを作って、うまく実行できているか確認します。
また、プログラム中に出てくる /* 文章 */ みたいなものは、コメントアウトといいます。
これは、コンパイラに「これで囲われている部分は無視してOK」ということを伝えるものなので、プログラム自体に影響は与えません。

結果の画面に表示するためにprintf関数を用いています。今回の記事では説明していませんが、これがないと結果の確認ができないので、やむを得ず使用しました。ご了承ください。

#include <stdio.h>

int f(int x){ /* main関数以外の関数 */
	int kotae;
	kotae=x*x;
	return kotae;
}

int main(){ /* main関数 */
	int ans;
	ans=f(3); /* f(3)=3*3 の結果、9をansに入れる */
	printf("%d\n",ans); /* 結果を画面に出す */
	return 0;
}

プログラムの実行はオンラインの実行環境(つまり、自分はプログラムを書くだけよい)である"codepad"様で行わせていただきました。
codepad

結果
f:id:eiki1253:20170414183726p:plain
しっかり結果(output)が9になっていることから、処理は成功しているようです。

以上で今回の記事は終了になります。ありがとうございました。



以下、おまけの参考書コーナーです。




おまけ:参考書

私が初心者のときに利用していたのは「かんたんC言語

かんたんC言語 (プログラミングの教科書)

かんたんC言語 (プログラミングの教科書)

友人が利用していたのはで覚えているのは「猫C(通称)」と「苦C(通称)」

苦しんで覚えるC言語

苦しんで覚えるC言語

紹介はしておきましたが、いろいろな参考書があるので、実際に書店に行って自分の学び方に合うものを購入するのがいいと思います。

それでは、また次回。

【Python】tweepyを用いてbot的な何かを作成した話

ハセ学を通したエイプリルフールネタを書こうかと思ってたんですが、いつのまにかエイプリルフールが終了してたので、趣味で書いたPythonbot的なやつの話になります。"若干の"不適切な表現があるので閲覧には少しご注意を...
 



~~ことの発端~~
Twitterで「致すか」ってツイートしてから「致した」ってツイートするまでめっちゃ早いやつおるな。」

「せや!何秒かかってるのか自動で計測できるようにしたろ!」

てな感じでこういう頭悪い感じのbotを作成することに。
f:id:eiki1253:20170412000947p:plain


TwitterAPI(consumer_keyとか)に関してはこちらを
webnaut.jp


プログラムの基本的な部分はこちらを参考にさせていただきました。
net.univ-q.com


それでは早速プログラムの全文なんですが、プログラムが横に広いのに気を付けてください。(あとシングルクオテーションとダブルクオテーションがところどころごっちゃになってますが、気にしないでください。)
プログラムの解説は後ろに書いてあります。

# -*- coding:utf-8 -*-

import tweepy
import datetime

consumer_key = "自分のconsumer_key"
consumer_secret = "自分のconsumer_secret"
access_key = "自分のaccess_key"
access_secret = "自分のaccess_secret"

CK=consumer_key
CS=consumer_secret
AT=access_key
AS=access_secret

itasiname="hoge"
status1="hoge"
d1=datetime.datetime.today()

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)
api = tweepy.API(auth)

class Listener(tweepy.StreamListener):
	def on_status(self, status):
		status.created_at += datetime.timedelta(hours=9)
		# 致すか
		if  u'致すか' in status.text:
			global d1
			global status1
			global itasiname
			itasiname=str(status.author.screen_name)
			d1 = datetime.datetime.today()
			micro1='%s' % d1.microsecond
			microsecond1 = micro1.rjust(6,'0')
			s1=u'%s時%s分%s秒%s\n' % (d1.hour, d1.minute, d1.second, microsecond1)
			itasuka=u"致しはじめ\n"
			status1=itasuka+s1
			print status1
		# 致した
		if (str(status.author.screen_name)==itasiname) and (u'致した' in status.text):
			tweetid=status.id
			d2 = datetime.datetime.today()
			micro2='%s' % d2.microsecond
			microsecond2 = micro2.rjust(6,'0')
			s2=u'%s時%s分%s秒%s\n' % (d2.hour, d2.minute, d2.second, microsecond2)
			itasita=u"致し終わり\n"
			status2=itasita+s2
			print status2
			itasi_microsecond=d2.microsecond-d1.microsecond
			itasi_second=d2.second-d1.second
			if itasi_microsecond<0:
				itasi_microsecond=itasi_microsecond+1000000
				itasi_second=itasi_second-1
			if itasi_second<0:
				itasi_second=itasi_second+60
			if itasi_second==0:
				tweet=u'.@'+itasiname+u' の射精早すぎィ!!!!!自分、不正認定いいすか?'+ \
				      u'淫夢知ってそうだから淫夢のリストにぶち込んでやるぜー!'+ \
				      u'いきなりツイートしてすみません!許してください!なんでもしますから!'+ \
				      u'(なんでもするとは言ってない)'
				print u'早すぎィ!\n'
			else :
				itasi_microsecond_final = str(itasi_microsecond).rjust(6,'0')
				status3=u'致しスピード %s秒%s\n' % (itasi_second,itasi_microsecond_final)
				print status3
				tweet=u'.@'+itasiname+u" の記録\n"+status1+status2+status3
			api.update_status(status=tweet, in_reply_to_status_id=tweetid)
			itasiname="hoge"
		return True

	def on_error(self, status_code):
		print('Got an error with status code: ' + str(status_code))
		return True

	def on_timeout(self):
		print('Timeout...')
		return True

# Twitterオブジェクトの生成
auth = tweepy.OAuthHandler(CK, CS)
auth.set_access_token(AT, AS)

listener = Listener()
stream = tweepy.Stream(auth, listener)
stream.userstream()


自分で書き換えた部分は主に16~18行目と、28~71行目の処理なので、そちらについて解説をおこなっていきます。

まずは16~18行目について、次のようになっています。

16:
itasiname="hoge"
status1="hoge"
d1=datetime.datetime.today()

簡単に言えば、プログラムのどこからでもアクセスできるグローバル変数のようなものを作っています。なぜグローバル変数を用いているのかは後述とします。


次に、28~40行目です。

28:
# 致すか
if  u'致すか' in status.text:
	global d1
	global status1
	global itasiname
	itasiname=str(status.author.screen_name)
	d1 = datetime.datetime.today()
	micro1='%s' % d1.microsecond
	microsecond1 = micro1.rjust(6,'0')
	s1=u'%s時%s分%s秒%s\n' % (d1.hour, d1.minute, d1.second, microsecond1)
	itasuka=u"致しはじめ\n"
	status1=itasuka+s1
	print status1

status.text(ツイートの本文)に"致すか"という文字列が含まれていればここの処理に入ります。
変数の前にglobalをつけることにより、d1などの変数がグローバル変数であることを示しています。これがないと、次の処理でこのツイートが行われた時刻などを得ることができません。(前述のグローバル変数が必要な理由となります。)

33行目では変数itasinameにstatus.author.screenname(ツイートした人のスクリーンネーム、@の後ろに続いてる文字列)を格納しています。後にこれを使うことにより、異なったアカウントの致し時間を計測してしまうことを防ぎます。

34行目ではツイートされた時刻をtoday関数を用いて取得しています。もちろん、時間の差をとるために使いますが、そのまま用いると、1秒004000と表示したいところを1秒4000と表示されてしまいます。なので、rjust関数を用いて0パディング(0埋め)を36行目でおこなっています。

あとは文字列の結合をおこなって、コマンドライン上に確認用に出力するだけです。



後半部分(41~71行目)の処理も似たようなものです。

41:
# 致した
if (str(status.author.screen_name)==itasiname) and (u'致した' in status.text):
	tweetid=status.id
	d2 = datetime.datetime.today()
	micro2='%s' % d2.microsecond
	microsecond2 = micro2.rjust(6,'0')
	s2=u'%s時%s分%s秒%s\n' % (d2.hour, d2.minute, d2.second, microsecond2)
	itasita=u"致し終わり\n"
	status2=itasita+s2
	print status2
	itasi_microsecond=d2.microsecond-d1.microsecond
	itasi_second=d2.second-d1.second
	if itasi_microsecond<0:
		itasi_microsecond=itasi_microsecond+1000000
		itasi_second=itasi_second-1
	if itasi_second<0:
		itasi_second=itasi_second+60
	if itasi_second==0:
		tweet=u'.@'+itasiname+u' の射精早すぎィ!!!!!自分、不正認定いいすか?'+ \
		      u'淫夢知ってそうだから淫夢のリストにぶち込んでやるぜー!'+ \
		      u'いきなりツイートしてすみません!許してください!なんでもしますから!'+ \
		      u'(なんでもするとは言ってない)'
		print u'早すぎィ!\n'
	else :
		itasi_microsecond_final = str(itasi_microsecond).rjust(6,'0')
		status3=u'致しスピード %s秒%s\n' % (itasi_second,itasi_microsecond_final)
		print status3
		tweet=u'.@'+itasiname+u" の記録\n"+status1+status2+status3
	api.update_status(status=tweet, in_reply_to_status_id=tweetid)
	itasiname="hoge"
return True

まずは42行目、先ほどと似ていますが少し条件が違います。"致した"の文字列が含まれてる、かつ、先ほどツイートしたアカウントと同じならこの処理に入ります。ここで変数itasinameを用いています。
43~50行目について、リプライ用にtweer.idをとっていますが、それ以外は先ほどの33~40行目の処理とほぼ同じです。

51~57行目では、"致すか"とツイートしてから"致した"とツイートするまでの時間の差分をとっています。繰り下がりに少し注意です。

58~63行目の処理は、複数クライアントや、プログラムなどを用いた不正の防止用の分岐となります。2つのツイートの時間差が1秒未満であればこの処理に入ります。処理とはいってもクソリプ送るだけですが。

そんで最後、64~71行目ですが、文章や計測結果をのせてツイートするだけです。
少し解説を挟むと、68行目までにツイートの本文を作成してます。69行目のstatusには作成した本文を突っ込み、in_reply_to_status_idという「どのツイートに対して返信するか」という変数には変数tweetid("致した"と書かれたツイートのid)を突っ込んでます。
70行目でitasiname="hoge"としたのは、「致すか」→「致した」→「致した」の順でツイートすると、始めの致すかから、最後の致したまでの差分をとってツイートしてしまうからです。

これで2つのツイートの時間差をとって、勝手にリプライしてくれるbotの完成となります。
お疲れさまでした。

最後に実行結果を次の図に示しておきます。
f:id:eiki1253:20170412013458p:plain


以下、Q&Aコーナー

Q,何の役に立つんですか

  • 何の役にも立ちません。


Q,もっと詳しく説明して

  • コメント等でどこの説明してほしいか言ってくだされば。


Q,変数の命名センスなさすぎ

  • うっせぇ!!!!!!!!