ネットゲーム時計実験
2024年11月14日
20:43
G3004_ff11_cal_txt_get
概要
過去のプロジェクトからコードを調査
int[] vana_clk = new int[10];
DateTime dt = DateTime.Now;
getu_cst = cal_vana_get1(dt, vana_clk); // 呼び出し書式の事例
// ゲームカレンダーの再生
public static string cal_vana_get1(DateTime prm_time, int[] prm_vana_clk)
{
// vana_clk[10] 10件を定義します
string ans_cst;
int yy_all, mm, dd, th, tm, ts, yy;
long day_renban;
long gen_sec;
string youbi_cst = "";
string getu_cst = "";
long[] vday = new long[15];
int getu_th, getu_tm;
long vana_day_sec = 3456L;
long vana_th_sec = 144L;
double vana_sec;
yy_all = prm_time.Year;
mm = prm_time.Month;
dd = prm_time.Day;
th = prm_time.Hour;
tm = prm_time.Minute;
ts = prm_time.Second;
/////////////////////////////////////////////////
// 2015.8.4 00:00 1230.8.26 00:00 風曜日
// 三日月
// (24時間) 25日
// 日 3456sec (3600*24/25)
// 時 144sec
// 分 2.4sec
/////////////////////////////////////////////////
DateTime from_dt = new DateTime(2015, 8, 4);
DateTime to_dt = new DateTime(yy_all, mm, dd);
gen_sec = ((long)th * 3600L + (long)tm * 60L + (long)ts);
day_renban = (long)(to_dt - from_dt).TotalDays;
//msg2("day_renban", day_renban.ToString(), "");
///////////////////////////////////////////////////////
// 1232/8/26 (8/26 -> V日数 7*30+26-1=235L)
// 2015/8/24
// |----------------------|
// v[2] 年
// |------|
// 月
// |---|
///////////////////////////////////////////////////////
vday[0] = day_renban * 25L; // 起点からの日数
vday[1] = gen_sec / vana_day_sec; // 実日0時からの日数
vday[2] = vday[0] + vday[1]; // 合計日数
yy = (int)((vday[2] + 220L) / (long)(30 * 12)); // V年変換
//msg2(yy.ToString(), vday[2].ToString(), "");
vday[3] = (vday[2] + 220L) - (yy * 30 * 12); // V年からの日数
mm = (int)(vday[3] / 30) + 1; // V月変換
vday[4] = vday[3] - ((mm - 1) * 30); // 残り日数
dd = (int)vday[4] + 16;
if (30 < dd)
{
dd -= 30;
if (12 < mm) { mm = 1; ++yy; }
else { ++mm; }
}
//vday[5] = (gen_sec - (vday[1] * vana_day_sec)) - 0L; ;
//th = (int)(vday[5] / vana_th_sec);
//tm = (int)((vday[5] - ((long)th * vana_th_sec)) / 2.4);
vana_sec = (double)(gen_sec - (vday[1] * vana_day_sec)) - 0.0;
th = (int)(vana_sec / (double)vana_th_sec);
tm = (int)((vana_sec - (double)((long)th * vana_th_sec)) / 2.4);
//msg2(yy.ToString() + "/" + mm.ToString() + "/" + dd.ToString(), th.ToString() + ":" + tm.ToString(), "");
switch (vday[2] % 8)
{
case 0: youbi_cst = "風"; break;
case 1: youbi_cst = "氷"; break;
case 2: youbi_cst = "雷"; break;
case 3: youbi_cst = "光"; break;
case 4: youbi_cst = "闇"; break;
case 5: youbi_cst = "火"; break;
case 6: youbi_cst = "土"; break;
case 7: youbi_cst = "水"; break;
}
prm_vana_clk[0] = 0;
prm_vana_clk[1] = yy + 1230;
prm_vana_clk[2] = mm;
prm_vana_clk[3] = dd;
prm_vana_clk[4] = th;
prm_vana_clk[5] = tm;
prm_vana_clk[6] = 0;
prm_vana_clk[7] = (int)(((vday[2] / 7L)) % 12L); // 月齢コード
switch (prm_vana_clk[7])
{
case 0: getu_cst = "(o・・・・・)"; break; // 三日月
case 1: getu_cst = "(oo・・・・)"; break; // 七
case 2: getu_cst = "(ooo・・・)"; break; // 上弦
case 3: getu_cst = "(oooo・・)"; break; // 十
case 4: getu_cst = "(ooooo・)"; break; // 十三
case 5: getu_cst = "(oooooo)"; break; // 満月
case 6: getu_cst = "(・ooooo)"; break; // 十六
case 7: getu_cst = "(・・oooo)"; break; // 居
case 8: getu_cst = "(・・・ooo)"; break; // 下弦
case 9: getu_cst = "(・・・・oo)"; break; // 20
case 10: getu_cst = "(・・・・・o)"; break; // 26
case 11: getu_cst = "(・・・・・・)"; break; // 新月
}
///////////////////////////////////////////////////
// 2015.08.27 木曜 s-segawa 9586-3438
// 月変化残り計算が半日かかっても完成せず
// 実時間 00:00 でちょうど月変化するタイミングの
// カレンダーを計算の起点に変更することでやっと完成
///////////////////////////////////////////////////
getu_th = getu_tm = 0;
vday[6] = ((vday[2] / 7L) * 7L) + 7L; // 次の月変化ポイント計算
vday[7] = (vday[6] - vday[2]) * vana_day_sec; // 変化までの日数
vday[8] = vday[7] - (th * vana_th_sec) - tm * 2L; // 変化までのリアルタイム秒数
getu_th = (int)(vday[8] / 3600L);
getu_tm = (int)(((vday[8] - ((long)getu_th * 3600L))) / 60L);
//ans_cst = youbi_cst + " " + getu_cst + " " + getu_th.ToString("D2") + ":" + getu_tm.ToString("D2");
ans_cst = youbi_cst + " " + getu_cst;
return (ans_cst);
}
インターフェースの検討
グローバル領域に、関数コードをコピペします
ビルド成功
実験ボタンのイベントにコードを追加する
private void button1_Click(object sender, EventArgs e)
{
// ボタンをマウスでクリックしたら、ここを通ります
//msg("実験ボタンが押されたら表示されるモニタです");
//msg3("実験ボタンが押されました");
// 任意カレンダーデータを1週間作成し、ゲーム内時計を調査する
DateTime dt = DateTime.Now;
int cnt;
//dt.Second = 0; // 秒を初期化
// dt の部分初期化は成功しないので、放置し
// 60秒加算する方法を実験する
for(cnt=0;cnt< 24 * 60;cnt++)
{
dt = dt.AddSeconds(60);
listBox1.Items.Add(dt);
}
//getu_cst = cal_vana_get1(dt, vana_clk); // 呼び出し書式の事例
}
これでテストしてみる
成功 1分加算できている
これを踏まえて
for (cnt=0;cnt< 24 * 60;cnt++)
{
dt = dt.AddSeconds(60);
msg_cst = cal_vana_get1(dt, vana_clk);
msg_cst += " ";
msg_cst += vana_clk[1].ToString() + "/"; // 年
msg_cst += vana_clk[2].ToString() + "/"; // 月
msg_cst += vana_clk[3].ToString() + " "; // 日
msg_cst += vana_clk[4].ToString() + ":"; // 自
msg_cst += vana_clk[5].ToString() + " "; // 分
listBox1.Items.Add(msg_cst);
}
これでビルドする 成功
さらに、ゲーム内の月齢が変化したときだけリストに代入する
for (cnt=0;cnt< 7 * 24 * 60;cnt++)
{
dt = dt.AddSeconds(60);
dsp_cst = msg_cst = cal_vana_get1(dt, vana_clk);
if (old_msg_cst != msg_cst)
{
// 月齢の変化あり
dsp_cst += " ";
dsp_cst += vana_clk[1].ToString() + "/"; // 年
dsp_cst += vana_clk[2].ToString() + "/"; // 月
dsp_cst += vana_clk[3].ToString() + " "; // 日
dsp_cst += vana_clk[4].ToString() + ":"; // 自
dsp_cst += vana_clk[5].ToString() + " "; // 分
listBox1.Items.Add(dsp_cst);
old_msg_cst = msg_cst;
}
}
ビルドする 成功
これに地球時間を追加すれば成功です
for (cnt=0;cnt< 7 * 24 * 60;cnt++)
{
dt = dt.AddSeconds(60);
dsp_cst = msg_cst = cal_vana_get1(dt, vana_clk);
if (old_msg_cst != msg_cst)
{
// 月齢の変化あり
dsp_cst += " ";
dsp_cst += vana_clk[1].ToString() + "/"; // 年
dsp_cst += vana_clk[2].ToString() + "/"; // 月
dsp_cst += vana_clk[3].ToString() + " "; // 日
dsp_cst += vana_clk[4].ToString() + ":"; // 自
dsp_cst += vana_clk[5].ToString() + " "; // 分
dsp_cst += " 地球時間 ";
dsp_cst += dt.Year.ToString("d4") + "/";
dsp_cst += dt.Month.ToString("D2") + "/";
dsp_cst += dt.Day.ToString("D2") + " ";
dsp_cst += dt.Hour.ToString("D2") + ":";
dsp_cst += dt.Minute.ToString("D2");
listBox1.Items.Add(dsp_cst);
old_msg_cst = msg_cst;
}
}
満月が複数行表示され、失敗している
そこで、月齢は数値データで変化判定してみる
// 任意カレンダーデータを1週間作成し、ゲーム内時計を調査する
DateTime dt = DateTime.Now;
int cnt;
int[] vana_clk = new int[10];
string msg_cst,dsp_cst;
int old_moon_cod = -1;
//dt.Second = 0; // 秒を初期化
// dt の部分初期化は成功しないので、放置し
// 60秒加算する方法を実験する
for (cnt=0;cnt< 7 * 24 * 60;cnt++)
{
dt = dt.AddSeconds(60);
dsp_cst = msg_cst = cal_vana_get1(dt, vana_clk);
if (old_moon_cod != vana_clk[7])
{
// 月齢の変化あり
dsp_cst += " ";
dsp_cst += vana_clk[1].ToString() + "/"; // 年
dsp_cst += vana_clk[2].ToString() + "/"; // 月
dsp_cst += vana_clk[3].ToString() + " "; // 日
dsp_cst += vana_clk[4].ToString() + ":"; // 自
dsp_cst += vana_clk[5].ToString() + " "; // 分
dsp_cst += " 地球時間 ";
dsp_cst += dt.Year.ToString("d4") + "/";
dsp_cst += dt.Month.ToString("D2") + "/";
dsp_cst += dt.Day.ToString("D2") + " ";
dsp_cst += dt.Hour.ToString("D2") + ":";
dsp_cst += dt.Minute.ToString("D2");
listBox1.Items.Add(dsp_cst);
old_moon_cod = vana_clk[7]; // 月齢変化更新
}
}
長時間お疲れさまでした。
追記 ボタン内部処理の変更
private void button1_Click(object sender, EventArgs e)
{
// ボタンをマウスでクリックしたら、ここを通ります
//msg("実験ボタンが押されたら表示されるモニタです");
//msg3("実験ボタンが押されました");
// 任意カレンダーデータを1週間作成し、ゲーム内時計を調査する
DateTime dt = DateTime.Now;
int cnt;
int[] vana_clk = new int[10];
string msg_cst,dsp_cst;
int old_moon_cod = -1;
//dt.Second = 0; // 秒を初期化
// dt の部分初期化は成功しないので、放置し
// 60秒加算する方法を実験する
for (cnt=0;cnt< 7 * 24 * 60;cnt++)
{
dt = dt.AddSeconds(60);
dsp_cst = msg_cst = cal_vana_get1(dt, vana_clk);
if (old_moon_cod != vana_clk[7])
{
// 月齢の変化あり
dsp_cst += " ";
dsp_cst += vana_clk[1].ToString("d4") + "/"; // 年
dsp_cst += vana_clk[2].ToString("D2") + "/"; // 月
dsp_cst += vana_clk[3].ToString("D2") + " "; // 日
dsp_cst += vana_clk[4].ToString("D2") + ":"; // 時
dsp_cst += vana_clk[5].ToString("D2") + " "; // 分
dsp_cst += " 地球時間 ";
dsp_cst += dt.Year.ToString("d4") + "/";
dsp_cst += dt.Month.ToString("D2") + "/";
dsp_cst += dt.Day.ToString("D2") + " ";
dsp_cst += dt.Hour.ToString("D2") + ":";
dsp_cst += dt.Minute.ToString("D2");
listBox1.Items.Add(dsp_cst);
old_moon_cod = vana_clk[7]; // 月齢変化更新
}
}
}
追記
正しい月齢名称を反映しました
プロジェクトファイルも更新しています
switch (prm_vana_clk[7])
{
case 0: getu_cst = "(o・・・・・) 三日月"; break; // 三日月
case 1: getu_cst = "(oo・・・・) 七日月"; break; // 七
case 2: getu_cst = "(ooo・・・) 上弦月"; break; // 上弦
case 3: getu_cst = "(oooo・・) 十日夜"; break; //
case 4: getu_cst = "(ooooo・) 十三夜"; break; // 十三
case 5: getu_cst = "(oooooo) 満月"; break; // 満月
case 6: getu_cst = "(・ooooo) 十六夜"; break; // 十六
case 7: getu_cst = "(・・oooo) 居待月"; break; // 居
case 8: getu_cst = "(・・・ooo) 下弦の月"; break; // 下弦
case 9: getu_cst = "(・・・・oo) 二十日余月"; break; // 20
case 10: getu_cst = "(・・・・・o) 二十六夜"; break; // 26
case 11: getu_cst = "(・・・・・・) 新月"; break; // 新月
}