ブログに書かれている内容は、リアルで喋っちゃ駄目だぞっ!
×
[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
Youtube経由で外人にポケモン対戦を申し込まれました。
明らかに翻訳機を使った日本語の文章だったので「It's OK in English」とか書いちゃったんですが、
対戦ルールと接続時間の確認に出したメールの英文が滅茶苦茶でした。
for、on、inみたいな前置詞が使い分けられず、相手側から言わせれば
「英語でおkwwww」な状態です。 ちゃんと勉強しなきゃ駄目ね。
ちなみに、対戦時刻は日曜23時になりました。 マイナーポケモン使いの女子大生らしいですが、手加減しないつもりです。
■ポケモンダメージ計算ツール
以前書いたString型とChar型の文字列変換でトラブった件なんですが、
2次元配列を3次元配列にし、1文字ずつ格納する事にしました。
String std = "あいうえお";
こう書くとstring型の変数に「あいうえお」という文字が格納されるので、char型の配列でも同じように
char std[1,3];
std[0,0] = "あいうえお" , std[0,1] = "かきくけこ", std[0,2] = "さしすせそ";
こんな事が出来るのかと思い込んでたんだけど、違うらしいですね。
そもそも、char型の変数には1文字しか格納出来ないという事実が!
ぶっちゃけ知らなかったです。
char型配列で文字列を扱うときに1文字ずつ格納するのは授業でやった記憶が有るような無いような状態ですが、
授業で教える都合上とかプログラミングの効率性だとか、そんな理由だと思ってました。
そうじゃなくて、char型には1文字ずつしか入れられないから、そうせざる終えなかっただけでした(笑)
それならstring型からchar型への文字変換で「1文字しか変換できません」のエラーも納得です。
ポインタ配列を使えば出来そうかもしれないけど、ポインタは未だによく理解できないんで……
∧_∧
<丶`∀´> ポインタなんて意地でも使わないニダ!
怖ろしいほどスローペースですが、今は指定したポケモンの種族値を取得する関数を作ってました。
例えば、サンダースの攻撃の種族値を調べたい場合、
関数名("サンダース", 2 );
こうすると値の60が返って来るようにしたいです。
今回もCSVにコピペしたポケモン種族値の表をプログラムで読み込み、その中から該当する部分を抜き取ります。
↑のCSVで一番左列のポケモン名を調べ、サンダースと一致する行を探します。
攻撃の値が格納された列をさらに指定し、値を取得します。
ポケモンの技名から威力を求める関数を少し書き換えてチョチョイと作ったんですが、
いざ実行してみると、取得した値は「6590」でした。
なんでやねん。
デバックしてじっくり見ると、名前の検索条件が悪かったため
サンダースのデータを調べているのにサンダーのデータも同時に検索されてしまったみたいです。
サンダースの攻撃種族値「65」と、サンダーの攻撃種族値「90」が連結されて「6590」。
サンダースを調べている時にサンダーが検索に引っかからず、逆も出来ないと駄目ですね。
public int search_val(string pokeName,int num)
{//ポケモンの名前から種族値を求める
//引数num=1 => HP ,num=2 => 攻撃 ,num=3 => 防御
// num=4 => 特攻 ,num=5 => 特防 ,num=6 => 素早
System.IO.StreamReader sr = new System.IO.StreamReader(@"pokeData.csv", Encoding.Default);
char s;
char[, ,] poke = new char[502, 7, 15];
int i = 0, j = 0, k = 0;
while (sr.Peek() > -1)
{
s = Convert.ToChar(sr.Read());
if (s != ',' && s != '\r' && s != '\n')
{
poke[i, j, k] = s;
++k;
}
if (s == ',')
{
k = 0;
++j;
}
if (s == '\r')
{
j = k = 0;
++i;
}
}
sr.Close();
int m = 1, n = 0, o = 0, val = 0;
for (; m < 500; m++)
{
while (pokeName.Substring(n, 1) == char.ToString(poke[m, 0, n])
&& n < pokeName.Length -1)
{
n++;
if (n == pokeName.Length - 1)
{
for (o = 0; poke[m, num, o] != '\0' && poke[m, num, o+1] != null; o++)
{
val = val * 10 + int.Parse(char.ToString(poke[m, num, o]));
}
}
}
n = 0;
}
return val;
}
サンダーとサンダース、リザードとリザードン、サンドとサンドパン、ゴースとゴースト、ミュウとミュウツー、ムウマとムウマージ
パッと考えただけでもエラー候補がこんなに出てきますが、その問題を認識した上で
選んだポケモンからLv50の攻撃と特攻を出力するボタンを作りました。
どう対処すれば良いか分らない事も無いんだけど、頭がちっとも働かない。
while文の条件で、探しているポケモン名の最初の1文字目で配列を検索し、
1文字ずつ比較して一致し続ければ攻撃or特攻の値を取得。
この動作に足りないのは、文字列の長さ確認だと分っている。
分っている。 分かっ…
以前書いたString型とChar型の文字列変換でトラブった件なんですが、
2次元配列を3次元配列にし、1文字ずつ格納する事にしました。
String std = "あいうえお";
こう書くとstring型の変数に「あいうえお」という文字が格納されるので、char型の配列でも同じように
char std[1,3];
std[0,0] = "あいうえお" , std[0,1] = "かきくけこ", std[0,2] = "さしすせそ";
こんな事が出来るのかと思い込んでたんだけど、違うらしいですね。
そもそも、char型の変数には1文字しか格納出来ないという事実が!
ぶっちゃけ知らなかったです。
char型配列で文字列を扱うときに1文字ずつ格納するのは授業でやった記憶が有るような無いような状態ですが、
授業で教える都合上とかプログラミングの効率性だとか、そんな理由だと思ってました。
そうじゃなくて、char型には1文字ずつしか入れられないから、そうせざる終えなかっただけでした(笑)
それならstring型からchar型への文字変換で「1文字しか変換できません」のエラーも納得です。
ポインタ配列を使えば出来そうかもしれないけど、ポインタは未だによく理解できないんで……
∧_∧
<丶`∀´> ポインタなんて意地でも使わないニダ!
怖ろしいほどスローペースですが、今は指定したポケモンの種族値を取得する関数を作ってました。
例えば、サンダースの攻撃の種族値を調べたい場合、
関数名("サンダース", 2 );
こうすると値の60が返って来るようにしたいです。
今回もCSVにコピペしたポケモン種族値の表をプログラムで読み込み、その中から該当する部分を抜き取ります。
↑のCSVで一番左列のポケモン名を調べ、サンダースと一致する行を探します。
攻撃の値が格納された列をさらに指定し、値を取得します。
ポケモンの技名から威力を求める関数を少し書き換えてチョチョイと作ったんですが、
いざ実行してみると、取得した値は「6590」でした。
なんでやねん。
デバックしてじっくり見ると、名前の検索条件が悪かったため
サンダースのデータを調べているのにサンダーのデータも同時に検索されてしまったみたいです。
サンダースの攻撃種族値「65」と、サンダーの攻撃種族値「90」が連結されて「6590」。
サンダースを調べている時にサンダーが検索に引っかからず、逆も出来ないと駄目ですね。
public int search_val(string pokeName,int num)
{//ポケモンの名前から種族値を求める
//引数num=1 => HP ,num=2 => 攻撃 ,num=3 => 防御
// num=4 => 特攻 ,num=5 => 特防 ,num=6 => 素早
System.IO.StreamReader sr = new System.IO.StreamReader(@"pokeData.csv", Encoding.Default);
char s;
char[, ,] poke = new char[502, 7, 15];
int i = 0, j = 0, k = 0;
while (sr.Peek() > -1)
{
s = Convert.ToChar(sr.Read());
if (s != ',' && s != '\r' && s != '\n')
{
poke[i, j, k] = s;
++k;
}
if (s == ',')
{
k = 0;
++j;
}
if (s == '\r')
{
j = k = 0;
++i;
}
}
sr.Close();
int m = 1, n = 0, o = 0, val = 0;
for (; m < 500; m++)
{
while (pokeName.Substring(n, 1) == char.ToString(poke[m, 0, n])
&& n < pokeName.Length -1)
{
n++;
if (n == pokeName.Length - 1)
{
for (o = 0; poke[m, num, o] != '\0' && poke[m, num, o+1] != null; o++)
{
val = val * 10 + int.Parse(char.ToString(poke[m, num, o]));
}
}
}
n = 0;
}
return val;
}
サンダーとサンダース、リザードとリザードン、サンドとサンドパン、ゴースとゴースト、ミュウとミュウツー、ムウマとムウマージ
パッと考えただけでもエラー候補がこんなに出てきますが、その問題を認識した上で
選んだポケモンからLv50の攻撃と特攻を出力するボタンを作りました。
どう対処すれば良いか分らない事も無いんだけど、頭がちっとも働かない。
while文の条件で、探しているポケモン名の最初の1文字目で配列を検索し、
1文字ずつ比較して一致し続ければ攻撃or特攻の値を取得。
この動作に足りないのは、文字列の長さ確認だと分っている。
分っている。 分かっ…
PR
KKK(きっときっと楓ちゃん)
当ブログは、shuffle!に登場する楓ちゃんを応援しています。
ブログ内検索
アーカイブ
名雪かわいいよ、名雪