NaaN日記

やったこと、覚えたことを発信する場

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;
}