C++へ移行

C言語は書きづらい。という事実が実感できるようになってきたので、

C++を学ぶことにします。

まずはIOストリームと若干のstringを使ってみました。

DeleteMe

↑exeを実行すると、input.txtに書かれた内容を勝手にoutput .txtに出力します。

string便利。

せっかくC++やるならクラスを早く学んでみたいところですが、

テストが近づきつつあるのでプログラムはしばらく休みます。

ソース↓

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

void main(){
	char _in[] = "input.txt";	//←擬似引数
	char buf[512];
	string txt;
	ifstream ifs( _in );
	cout << "以下の内容をoutput.txtに書き込みます。" << endl;

	while( ifs.getline( buf , sizeof(buf) ) )
		txt += buf;
	cout << txt << endl;
	ofstream ofs( "output.txt" );
	ofs << txt << endl;
}

歩く主人公

歩いた。

FarEastTest01実行ファイルとソース

素材は「グラフィック合成器」より。

特徴を選ぶだけでキャラチップを作れる優れものです。

http://www.silversecond.com/WolfRPGEditor/Download.html ←ここからダウンロードできます。

この素材を組み合わせて歩かせるプログラムを作りました。

ソースではcharatip.cppが該当します。

しかしですね、その素材は「ウディター」規格になっているのですが、「ツクール」規格とは異なっていた!

作ってから気づきました。何と。

実用にはまだ微調整が必要です。

RPGとかパズルっぽい画面が出来た。

CuboidMazeTest02 ←ソースと実行ファイル

やっとでキター!!( ゚∀゚ )

今回したこと:

何もないマス = 0 , 青 = 1 , 壁 = 2 , ……

というふうに、簡単な数字の羅列でRPGのマップとかパズル風の画面を作る機能を付加しました。

ソースをダウンロードして map = { 2,4,2,2, ……. } の部分を変えると違った画面が出てくると思います。

これで思いついたパズルをガンガン書けるってもんです。

でも「壁って何」「青の役割は何」みたいな部分はまだ書いてないのでゲームになるのはまだ先。

描画部分とマスの配置管理は結局分けることにしました。field.cpp と stage.cpp が該当します。

ファイルを分けてC書いた。

初めて複数のファイルに渡ってCを書きました。

結果↓

CuboidMazeTest01

field.cpp , field.h , main.cpp の3ファイルと、

ネットで取ってきたツクール用のRPGタイル素材、それとDxLibから出来てます。

マス目を集めて作った「フィールド」という概念を考えて以下の関数をfieldファイル上に記述しました。

FieldInit() ・・・初期化

FieldSet( フィールド番号 , マス目の初期画像 , 列数 , 行数 , 位置座標x , y , 1マスの大きさx ,y ); ・・・フィールド作成

FieldDraw(フィールド番号 ) ・・・フィールド描画

FieldChangeCell(マス番号 , マス画像 ,列数 , 行数 , 位置座標x , y , 1マスの大きさx ,y ); ・・・指定マス目の情報を変更

FieldLocToNum( フィールド番号 ,  左からxマス , 上からyマス ); ・・・マスの位置からマス番号を返す

FieldGetHandle( マス番号 ); ・・・指定マスの画像ハンドルを返す

で、これらを扱うのがmain関数です。

上手く役割分担できたかなー

 

過去に書いたのココに移動

Blogが増えたりWikiが消えたりするので、

今まで書いた記事は一括ここに置いておきます。

下の方ほど新しい。

——————————————————–

二分法

前書き

二分法は、f(x)=なんちゃらかんちゃら=0 の解を求める方法です。
それを使ったプログラムを書いてみました。
原理はWikipediaで知ることができます。
下のプログラムには e^x をテイラー展開で求める関数が付いてますが、
どうにも精度が良くならないので結局math.hに頼ってます。

プログラム

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//問
//  f(x) = e^x -5sinx +2x = 0 の解を1つ示せ。
//  作:Linoal    2011/5/6
#include <stdio.h>
#include <math.h>
#define F(x) (exp(x)-5*sin(x)+2*x)
#define FXs "expo(x)-5*sin(x)+2*x"
double expo(double);
double solve_fx(double,double);
void main(){
double solve;
char s[50] = FXs;
solve = solve_fx(-100,100); //fx=0を解いてみよう
printf("%s=0の解はnx=%lfだよ",s,solve);
scanf("%s",s);
}
double expo(double x){ //テーラー展開でe^xの値を得るよ
long n;
double sum = 1;
double An = 1;
for(n=1 ; An>0.0000001 ; n++){
An = An*x/n; //Σの中身を漸化式にして足していくよ
sum += An;
}
return sum;
}
double solve_fx(double x1,double x2){ //f(x)=0の解を x1からx2の間で調べるよ   (x1 < x2)
double fx1;
double fx2;
double fxm;
double x;
double xm;
int i;
for(i=1 ; (x2-x1) > 0.0000001 ; i++){ //二分法を使おう
xm = (x1+x2)/2;
fx1 = F(x1);
fx2 = F(x2);
fxm = F(xm);
if(fx1*fxm > 0)
x1 = xm;
else
x2 = xm;
if(i>10000000){
x2=x1; //暴走中!緊急停止!
printf("解が求まらないため緊急停止したよn");
}
};
return xm;
}
  • 二分法の弱点は解の大体の位置がわかってないと使えないこと。上のだとx1とx2を解があるはずの範囲の両端に持ってこなくてなならない。 – 肉 (2011年05月07日 10時04分14秒)
  • そうですね。x1とx2をいくつにするか迷うところです。
    広い範囲にすれば大丈夫と思ったのですが – Linoal (2011年05月07日 10時22分34秒)

—————————————————————————

C言語DxLibをいじってみた

2011.05.12 21:51linoalコメントなし »

DxLibで組んだプログラムとしては初作品です。

200を超えたら負けなゲーム

200

————————————————————-

DxLib2作目/時計

2011.05.18 15:42linoalコメントなし »

DxLibの2作目を作りました。時計です。

時間を取得する部分はサンプルほぼパクリで良く分かってません。

clock

————————————————————————-

終わり。