ROT13というものがあるらしい(Python)
ROT13とは、
"Rotate by 13 places"
の略らしい。
英語を丁度13文字ずらしてくれる。
import codecsをして、
codecs.encode('変換したい文字', 'rot-13')で
変換してくれる。スゴイ。
import codecs print(codecs.encode(input(), 'rot-13')) #print(codecs.decode(input(), 'rot13'))この書き方でもいけた #Gunax lbhと入力 #Thank youと出力!
ということで、上にもある通りencodeとdecodeでの違いがよくわからん、
というのが今後理解したいところ。
今回はこういうのあるんだーと知った話でした。
Unicodeを少し(Python)
ord(c)とは
1 文字の Unicode 文字を表す文字列に対し、その文字の Unicode コードポイントを表す整数を返します。
例えば、 ord('a') は整数 97 を返し、 ord('€') (ユーロ記号) は 8364 を返します。これは chr() の逆です。
(Python標準ライブラリの説明より)
使ってみる
>>>ord('宴') 23476
chr(i)とは
Unicode コードポイントが整数 i である文字を表す文字列を返します。
例えば chr(97) は文字列 'a' を、 chr(8364) は文字列 '€' を返します。 ord() の逆です。
引数の有効な範囲は 0 から 1,114,111 (16 進数で 0x10FFFF) です。 i が範囲外の場合 ValueError が送出されます。
(Python標準ライブラリの説明より)
先程の整数を入れてみる
>>>chr(23476) '宴'
文字をずらしてみる
moji = input() #文字を入力 shift = int(input()) #いくつ後ろにずらすか result = "" for act in moji: num = ord(act) #文字コード shifted = chr(num + shift) #文字にする result += shifted print(result) >>>Khoor >>>-3 'Hello'
chr()の中に色々な数字入れたくなるよね
Staticしたい(C)
staticについて
書こうと思ったんですが最後まで書けなかった。
でもとりあえずの途中経過として公開はする。
使ってみた
#include <stdio.h> void show(); int main(void){ int i; for(i=0; i<3; i++){ show(); } return 0; } void show(){ static int a; //指定しない場合0で初期化 int b = 3; a++; b++; printf("%d回目:", a); printf("%d\n", b); return; } /* 1回目:4 2回目:4 3回目:4 */
staticを付けると、初期化が最初に呼び出されたときだけ行われて、
その後値が保持される
char型配列をreturn
することがstaticを使う方法でもできると聞いたのでやってみようとしたら、
上手くできなかった。
検索にも疲れたので後日検索して追記。
別のファイルから使用できないように関数や変数を修飾
これについてはヘッダーファイルの扱いがよくわからなかったので、
ヘッダーファイルが使えるようになった時に追記します
戦ってみたかった(C)
最初はポインタを使ってなにかしたいなーーと思った。
特に文字コードで何かやりたかった。
しかし気がついたら黒い画面の上で戦ってた。
構造体とかswitchとか色々と詰め込みたいものを詰め込んでいた。
途中で設定に飽きた。
色々とやりたかったことはある。
そのうち気力がでたら綺麗にしたい。
というわけで体力、攻撃力、防御力、回復力というステータスを設定して、
敵と戦っている気になれるものをつくった。
なお途中で疲れたため能力値の調整が不十分、よってたまにマイナスが出る。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <time.h> typedef struct{ char name[20]; int life; //体力 int attack; //攻撃力 int defense; //防御力 int cure; //回復力 }status; status cha(); //自分のステータス status ene(); //敵のステータス void battle(status *prof, char*); //戦う int main(void){ status profile; char name[20]; int command; printf("▶名前を入力してください\n"); scanf("%s", name); printf("あなたの名前は%sです\n",name); profile = cha(); battle(&profile, name); //この辺りを綺麗にしたいと if (profile.life <= 0){ printf("%sの体力が0になった\nYou lose\n", name); } else{ printf("You win\n"); } return 0; } void battle(status *prof, char *player_name){ int command; int damage; int attack; double power; status enemy; enemy = ene(); while(prof->life > 0 && enemy.life >0){ damage = 0; printf("現在の体力:%d\n", prof->life); printf("敵の体力:%d\n", enemy.life); printf("▶どうする?\n攻撃:1,突進:2,全力を出す:3,休む:4\n"); scanf("%d", &command); switch(command){ case 1: printf("%sの攻撃!\n", player_name); srand((unsigned int)time(NULL)); power = 0.8 + (rand()*(2.2)/(1.0+RAND_MAX)); attack = (int)prof->attack*power*0.6-(int)enemy.defense*0.1; enemy.life -= attack; printf("敵に%dのダメージ\n", attack); break; case 2: attack = (int)prof->attack*1.2-(int)enemy.defense*0.1; enemy.life -= attack; printf("敵に%dのダメージ\n", attack); prof->life -= (int)attack / 2; printf("反動で%dのダメージを受けた!\n", (int)enemy.attack/2); break; case 3: prof->attack *= 1.5; prof->defense *= 1.5; prof->cure *= 1.5; printf("%sは本気を出した\n", player_name); break; case 4: prof->life += (int)prof->cure*0.8; printf("体力が%d回復した\n", (int)(prof->cure*0.8)); break; default: continue; } if(enemy.life>0){ int act; srand((unsigned int)time(NULL)); act = 1+(int)(rand()*4.0/(1.0+RAND_MAX)); switch(act){ case 1: power=0.8+(rand()*(1.4)/(1.0+ RAND_MAX)); damage += (int)enemy.attack*power-(int)prof->defense*0.1; prof->life -= damage; printf("敵の攻撃!!\n%sは%dのダメージを受けた\n", player_name,damage); break; case 2: enemy.defense *= 1.2; printf("敵が固くなった!!\n敵の防御力が上がった\n"); break; case 3: enemy.life += (int)enemy.cure * 0.8; printf("敵の休息!!\n敵の体力が%d回復した\n", (int)(enemy.cure * 0.8)); break; case 4: printf("敵は様子を見ている\n"); break; } } else{ printf("敵の体力が0になった\n"); } } } status cha(){ int character; int i=0; while(i==0){ printf("▶どのキャラクターにしますか?\natacker:1,shielder:2,priest:3\n"); scanf("%d", &character); status chara; switch(character){ case 1: strcpy(chara.name, "power"); chara.life = 120; chara.attack = 65; chara.defense = 36; chara.cure = 40; i++; break; case 2: strcpy(chara.name, "shielder"); chara.life = 150; chara.attack = 30; chara.defense = 80; chara.cure = 50; i++; break; case 3: strcpy(chara.name, "priest"); chara.life = 200; chara.attack = 30; chara.defense = 40; chara.cure = 60; i++; break; default: printf("誤った入力です\n"); continue; } return chara; } } status ene(){ double power; static int flag; if (flag == 0){ srand((unsigned int)time(NULL)); flag = 1; } power = 0.8+(rand()*2.0/(1.0+RAND_MAX)); status enemy; strcpy(enemy.name, "enemy"); enemy.life = 140*power; enemy.attack = 30*power; enemy.defense = 30*power; enemy.cure = 10*power; return enemy; }
入力する文字を指定する(C)
今回はスキャン集合を確認。
この文字以外入力させたくない
scanf("%[abcdefg]", moji) //abcdefgのみ入力できる
入力する範囲を選択
1.
scanf("%[a-z]", moji) //aからz以外が入力されると終了
2.
scanf("%[^\n]" moji) //改行以外の入力を受け付ける
これをするとホワイトスペースを含んだ文字列を入力できる
構造体を配列にする(C)
構造体は配列にもできる
#include <stdio.h> #include <string.h> typedef struct{ int age; char animal[10]; }animals; int main(void){ int i; animals data[3];//配列として宣言 data[0].age = 3; strcpy(data[0].animal, "いぬ"); data[1].age = 4; strcpy(data[1].animal, "ねこ"); data[2].age = 5; strcpy(data[2].animal, "インコ"); for(i=0; i<3; i++){ printf("年齢:%d\n", data[i].age); printf("種類:%s\n", data[i].animal); } return 0; } /*出力結果 年齢:3 種類:いぬ 年齢:4 種類:ねこ 年齢:5 種類:インコ */
勿論引数にも入れられる
#include <stdio.h> #include <string.h> typedef struct{ char animal[64]; int age; } animals; void animals_print(animals data[]); int main(void) { animals data[3]; data[0].age = 3; strcpy(data[0].animal, "いぬ"); data[1].age = 4; strcpy(data[1].animal, "ねこ"); data[2].age = 5; strcpy(data[2].animal, "インコ"); animals_print(data); return 0; } void animals_print(animals data[]){ int i; for(i=0;i<3;i++){ printf("種類:%s\n", data[i].animal); printf("年齢:%d歳\n", data[i].age); } } /*出力結果 種類:いぬ 年齢:3歳 種類:ねこ 年齢:4歳 種類:インコ 年齢:5歳 */
構造体でポインタ
構造体型のポインタ変数
書き方
(*変数名).要素名
変数名->要素名
変数名[0].要素名
実際に使ってみる
#include <stdio.h> #include <string.h> typedef struct { char animal[64]; char name[64]; int old; int weight; } animals; int main(void){ animals data; animals *p_data; p_data = &data; (*p_data).old = 2; //p_data->old strcpy(p_data->animal, "ねこ"); //(*p_data).animal printf("%d\n", data.old); printf("%s\n", data.animal); return 0; }
勿論引数にも入れられる
#include <stdio.h> #include <string.h> typedef struct { char animal[64]; char name[64]; int old; int weight; } animals; void animals_print(animals *data); int main(void){ animals data; strcpy(data.animal,"ねこ"); strcpy(data.name, "きなこ"); data.old = 2; data.weight = 5; animals_print(&data); return 0; } void animals_print(animals *data){ data->weight = 6;//勿論元の値も書き換わる printf("種類:%s\n", data->animal); printf("名前:%s\n", data->name); printf("年齢:%d歳\n", data->old); printf("体重:%dkg\n", data->weight); return; }