|
Name: Libra ..入門者(4,388ポイント)
Date: 2009/01/10(土) 00:41
No:26692
|
|
Title: 【雑談】シューティングゲームの館でSTGを作ってみました
|
|
昨年、2008年の7月の夏時点でのverの作成したSTGです。
ttp://www.e-kuraberu.net/uploader/src/kuraberu7791.lzh.html
PASS:dxlib
仕様:大学祭用に作成したので、終了メニューはありません。終了するときはESCキーを押してください。
ゲーム中の細かい仕様は添付ファイルの中の「読んでね説明書」の中にあります。読まないと、恐らくショット関係で困ります。
参考にしたページ
・ゲームプログラミングの館
・シューティングゲームの館
(作成当時はまだ龍神録の館がありませんでした)
制作期間(アップロードしたゲームのverの時点):6ヶ月
当時のプログラミングの理解度:初心者基準(◎:完璧、○:大体OK、△:とりあえず使える、×:使えない)
ループ○、条件分岐○、関数△、構造体△、ファイル入出力×、マクロ△
ソース量:3万行くらい
失敗した部分
ファイル出入力が出来なかったため、敵出現データが全部ソースに記載されています。これだけで数千行になってしまった。また、キャラ会話部分の言葉もソースに全部記載。
ボスの技で「東方にない規格の大きな弾作ってみよう」と考え、作ったのが見事、東方地霊殿の6面スペルと丸かぶりしてしまった苦い思い出も^^;まさか弾幕の色まで被るとは・・・。
作成している方、これからする方の参考になれば幸いです。
408ポイント を落としてしまった。
|
|
|
|
Name: きらりん ..入門者(3,740ポイント)
Date: 2009/01/10(土) 01:19
No:26693
|
|
Title: Re:【雑談】シューティングゲームの館でSTGを作ってみました
|
|
楽しく遊ばせてもらいましたw
バグらしいバグも見当たらなかったです。
(でも、気のせいだったのかもしれませんが攻撃避けてたら最後のところが勝手に終っていたような・・・?ゲージを見ていなかったので勘違いだったのかもしれません><)
>>ボスの技で「東方にない規格の大きな弾作ってみよう」と考え
どの弾幕よりもあのガムが一番怖かったです・・・w
まだノーマルしかクリアしてないんでハードやってきますb
195ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..入門者(3,927ポイント)
Date: 2009/01/10(土) 01:37
No:26694
|
|
Title: Re:【雑談】シューティングゲームの館でSTGを作ってみました
|
|
>>(でも、気のせいだったのかもしれませんが攻撃避けてたら最後のところが勝手に終っていたような・・・?>>ゲージを見ていなかったので勘違いだったのかもしれません><)
右上にタイムでてますね・・・wきがつきませんでしたwサーセン><
あと、ハードモードをやっていて一度だけ起こったバグがあるんですが赤い中ボスみたいなのが出てくる直前にゲームオーバーして再度ハードをプレイしようとしたときにはじまってすぐに前の回の中ボスの弾幕が若干残ってました。ちなみに当たったら死にましたwしかし、その後意図的にそれを出そうとしても起きなかったのであまり気にするバグではないのかもです。
187ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..初心者(6,864ポイント)
Date: 2009/01/11(日) 03:20
No:26716
|
|
Title: Re:【雑談】シューティングゲームの館でSTGを作ってみました
|
|
大学祭ということで、締切もあったので、ゲームオーバー時の判定は2日しか時間をかけることが出来なかったので、動作チェックが甘かったです。
難易度ですが、普通と難しいの2種類がありますが、本当は「簡単」と「普通」のつもりで作ってました。難易度難しいという意見があったので、表示難易度の方を1段階上げました。
現在背景の3D化を行っており、このような関数を作りました
・仕様(まだ、無駄部分がありますが^^;)
ポリゴンの頂点情報を格納するための配列を用意する。ポリゴンで表示する3Dはポリゴンの数を2枚とした、四角形を毎回使うこととする。なので、用意する配列はポリゴンが2枚なので、頂点の数は6つ、x、y、z軸それぞれに対して、情報を入れる(表示する画像数×6×頂点情報数)。頂点座標情報はCSVファイルで読み込むこととする。
//変数(Img_t構造体内)
//3D背景用頂点座標
float vertexx[POLYGON_NUM][6],vertexy[POLYGON_NUM][6],vertexz[POLYGON_NUM][6];
float vertexu[POLYGON_NUM][6],vertexv[POLYGON_NUM][6];
int vertexb[POLYGON_NUM][6],vertexg[POLYGON_NUM][6],vertexr[POLYGON_NUM][6],vertexa[POLYGON_NUM][6];
int vertexflag[POLYGON_NUM],vertexvariety[POLYGON_NUM];
※POLYGON_NUM:define、ポリゴンで表示する画像数
void BackGroundDisplay(Img_t *img,VERTEX_3D *Vertex){
int i,j;
int val;
for( i=0 ; i < POLYGON_NUM ; i++ ){
if(img->vertexflag[i] == TRUE){
val=img->vertexvariety[i];
for(j=0;j<6;j++){
Vertex[j].pos.x = img->vertexx[i][j]; //構造体にポリゴンのxの値を代入
Vertex[j].pos.y = img->vertexy[i][j]; //構造体にポリゴンのyの値を代入
Vertex[j].pos.z = img->vertexz[i][j]; //構造体にポリゴンのzの値を代入
Vertex[j].u = img->vertexu[i][j]; //構造体に画像表示値uを代入
Vertex[j].v = img->vertexv[i][j]; //構造体に画像表示値vを代入
Vertex[j].r = img->vertexr[i][j]; //構造体にR値を代入
Vertex[j].g = img->vertexg[i][j]; //構造体にG値を代入
Vertex[j].b = img->vertexb[i][j]; //構造体にB値を代入
Vertex[j].a = img->vertexa[i][j]; //構造体にα値を代入
}
//読み込んだ情報を元に、3D画像を表示
DrawPolygon3D( Vertex, 2, img->gamebackground[val], FALSE ) ;
}
}
}
この方法ならVERTEX_3D構造体の宣言、この関数内で行ってもいいですね^^;;;;
これで、上から見下ろしたような視点にしたい時は、関数内でそれぞれの頂点座標を格納する変数を別に宣言し、頂点座標を引数にし、表示したい角度だけ数値を変化させる関数を作れば、視点変更も出来ます。また、スクロールさせる時は、頂点情報のz座標を減算(手前にスクロールする場合)し、一定位置まで座標が来たら一番後ろのポリゴン座標の位置に戻してやればスクロールする背景が実現出来ると考えてます。(只今作成中)完成のイメージ的には東方花映塚が近いと思われます。
今回アップロードしたゲームはスローの時の処理が上手くいってないです。ボスを倒したときにスローにするのを、毎秒60フレーム処理を毎秒20フレーム処理に変える、という方法でおこなったので、動きがカクカクになってしまってます。これを滑らかにするには、スロー処理フラグを作り、オブジェクトの動作する関数全てにスロー時の処理(距離5動くのをスロー時5分の1にする、弾の時間変数の加算を数フレームに1回にする)にしないといけないと考えました。
2倍のポイントを手に入れた! 2,476ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(950,628ポイント)
Date: 2009/01/11(日) 18:29
No:26739
|
|
Title: Re:【雑談】シューティングゲームの館でSTGを作ってみました
|
|
おぉ〜素晴らしい♪
遊ばせて頂きました^^
ステッキみたいな弾幕、早苗さん弾幕みたいできれいですねw
後、弾のバリエーションも多くていいなと思いました。
あと、確かに地霊殿の弾ソックリですねw
あれにあの効果音つけたらどうみても地霊殿にしか見えませんw
私もラスト弾幕の警告表示が、地霊殿の警告表示と似ているのを見て嬉しく思いました。
「全然知らない二人が同じ事を思いついた」
っていうのはなんだかシューティングゲーム制作の奥にある何か神秘的なもn・・(言い過ぎ
シューティング作っていると凝りたくなるのが背景ですよね。
3D関数は使い方がややこしいので、私も出来るだけ解り易い関数を作ろうと努力してるところです。
>3万行
コードが増えてくると大変ですよねw
私も龍神録のコードが数万行だったので、苦労しました。
わかりやすく、かつ短く書くって事も大事ですね^^;
>本当は「簡単」と「普通」のつもりで作ってました。難易度難しいという意見があったので、表示難易度の方を1段階上げました。
気持ちがホントよくわかりますw
製作者って何百回とプレイすることになるので、自分で作ってるとそのゲームがそこまで難しくない気がするんですよね^^;
自分が作ったゲームの難易度を適切に設定するってホント難しい事だと思いました。
龍神録のあの異常な難易度はその産物・・。
次回はその辺も考慮して作りたいと思ってます。
ではLibraさんの次回作期待してます〜♪
517ポイント を手に入れた。
|
|
|
|
|
Name: karasu ..ぴよぴよ(377ポイント)
Date: 2009/01/12(月) 01:10
No:26767
|
|
Title: Re:【雑談】シューティングゲームの館でSTGを作ってみました
|
|
遊ばせていただきました。
むずかしいがその名の通り難しかったです・・・
ガムのところはかなり被弾しました・゜・(つД`)・゜・
私がプレイした中ではバグは無かったと思います。
弾幕もとても綺麗でしたし、ショットタイプによってボムが変わったりととても楽しめました^^
次回作楽しみにしていますw
81ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..初心者(7,364ポイント)
Date: 2009/01/13(火) 22:14
No:26881
|
|
Title: Re:【雑談】シューティングゲームの館でSTGを作ってみました
|
|
今回アップしたものを改良して、ステージ数を増やしていく方向で作成しています。
現時点で実装
・グレイズ
・ハイスコア等保存
・キーコンフィグ
・メニュー画面
得点アイテムを取った時に、例えば100万点のアイテムを取った時に、スコアの数字がいきなり100万って表示させるのではなく、だらららららーと加算されて増えていくように表示するとか色々工夫してます。
・displayscoreとscoreの二つの変数を用意する。displayscoreは表示する時の得点、scoreが実際の得点。得点アイテムを取った時、scoreの値を取った分の値だけ加算します。次に、displayscoreの値ですが、以下のような例で加算します。
//スコアのずれが1000点以上
if( ( score - displayscore ) >= 1000 ){
dispscore += 1000 ;
}
//スコアのずれが100点以上
if( ( score - displayscore ) >= 100 ){
displayscore += 100 ;
}
//スコアのずれが10点以上
if( ( score - displayscore ) >= 10 ){
displayscore += 10 ;
}
このようにすることで、表示する時の得点の値が一気に加算されず、何フレームかかかって実際の得点になるため、仕様の通りの表示方法になります。
500ポイント を手に入れた。
|
|
|
|
Name: ぽにょ ..ぴよぴよ(428ポイント)
Date: 2009/01/12(月) 23:20
No:26814
|
|
Title: どこの処理が悪いのか
|
|
今、入力した一文字(半角文字)が配列内のデータに含まれる数を表示
入力した一文字を最初に検出した位置(先頭からの文字数)を表示
するというのをやってるんですけど
うまく表示できなくて困っています。
含まれる数はちゃんと表示できてるんですけど
入力した一文字を最初に検出した位置(先頭からの文字数)がうまく表示できません
例えば[e]と入力した場合検出した位置は先頭から2番目なので[2]とでるはずなのですが・・・・
printf("入力した一文字を最初に検出した位置は%d\n",data[i]);
ここの処理が原因なのでしょうか?
172ポイント を手に入れた。
|
|
|
|
Name: SCI ..初心者(5,830ポイント)
Date: 2009/01/12(月) 23:31
No:26815
|
|
Title: Re:どこの処理が悪いのか
|
|
「位置」なのに data[i] ってなってます。
data[i]って文字そのものですよね?ここを i + 1 にすればいいんじゃないですか?
なぜ+1なのかは考えてみてください。
45ポイント を手に入れた。
|
|
|
|
|
Name: ぽにょ ..ぴよぴよ(449ポイント)
Date: 2009/01/13(火) 21:41
No:26879
| 解決!
|
Title: Re:どこの処理が悪いのか
|
|
なるほど、そゆことだったんですね!
納得納得、ありがとうございました。
21ポイント を手に入れた。
|
|
|
|
Name: 雲居 ..ぴよぴよ(477ポイント)
Date: 2009/01/13(火) 02:35
No:26819
|
|
Title: Winsockでの受信量取得
|
|
夜遅くに申し訳ありません。
クライアントはDXライブラリ、サーバーはWinsock+コンソールにて通信プログラムを組んでいるのですが
実際に受信する前にきているパケットの量を得ることはできますでしょうか?
データタイプ毎に受信する量が異なるので、あらかじめ来ているデータ量を取得し、
recvにてそのデータ量分受信したいです。
// 受信
int DataLength;
DataLength = 来ているデータ量を得る
recv(sock, buff, DataLength, 0);
// データタイプ
enum DATA_TYPE
{
Type_A,
Type_B,
}
struct PacketHead
{
DATA_TYPE type;
char Data[256];
}
struct Type_A_Data
{
int a;
int b;
}
struct Type_B_Data
{
char msg[256];
}
それとも、データの頭2byteにデータタイプを入れておき、
受信 recv(socket, buff, RECV_MAX, 0) 、
その後頭2byteで判別したデータサイズを抜き取り処理、の方がよいのでしょうか?
個人的には上記の構造体を用いた方法を利用したいのですが・・・
極力通信に使うデータ量をへらしたいのです。
また、データタイプの判別に他になにか良い手があれば
お教えいただけるとありがたいです。
477ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(39,835ポイント)
Date: 2009/01/13(火) 10:02
No:26830
|
|
Title: Re:Winsockでの受信量取得
|
|
雲居さんが考えられている方法は無理です。
Winsockが現時点で何バイト受信しているかを知ることは出来ますが、それはチェックした時点での総合計でしかないのでどちらの構造体のデータであるかを判別することはできません。
例えばType_A_Dataを32個受信するとType_B_Dataと同じ長さになりますが、Winsockからはどちらも256バイト受信としか返らないので判別できないです。
> それとも、データの頭2byteにデータタイプを入れておき、
> 受信 recv(socket, buff, RECV_MAX, 0) 、
> その後頭2byteで判別したデータサイズを抜き取り処理、の方がよいのでしょうか?
このようなメッセージのヘッダにタイプなりメッセージ長なりをくっつけるのがスタンダードではないでしょうか。
1.ヘッダだけ受信
2.メッセージタイプを判別
3.データ部を受信
あと、通信データを構造体で記述する場合はアライメントに注意する必要があります。
202ポイント を落としてしまった。
|
|
|
|
|
Name: 雲居 ..ぴよぴよ(801ポイント)
Date: 2009/01/13(火) 17:37
No:26867
|
|
Title: Re:Winsockでの受信量取得
|
|
ヘッダを先に受信し、というと
//-------------------------------------------------------------------
/* 受信側 */
int length=0;
recv(sock, head, 2, 0); // 先頭2byteを取得
while(true)
{
// 先頭2byteと比較
if( strcmp(head, "00")==0 ) // DATA_TYPE_00
{
// ヘッダを除くデータ本体の受信
resv(sock, buff, DATA_TYPEごとの長さ-length, 0);
if(strlen(buff) == DATA_TYPEごとの長さ)
{
printf("head[%s], buff[%s]\n", head, buff);
break;
}
else
{
printf("受信しきれていないので再受信");
length = strlen(buff); // 現時点までのパケットサイズの取得
}
}
}
//-------------------------------------------------------------------
/* 送信側 */
// データのセット
strcpy(buff, "00"); // DATA_TYPE_00をセット
stacat(buff, "Hello."); // データ内容をセット
// 実際に送信
send(socket, buff, strlen(buff), 0);
//-------------------------------------------------------------------
ということで問題はなさそうですか?
また構造体での送受信、判別にはDXライブラリ本家の掲示板より
http://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=611&p=2
を参考にしていますが、これはDXライブラリの仕様上可能なだけなのでしょうか?
****備考****
DXライブラリは受信したものを一時記憶バッファに入れておき、
その長さをGetNetworkDataLengthで取得している、であってますでしょうか?
324ポイント を手に入れた。
|
|
|
|
|
Name: 雲居 ..ぴよぴよ(580ポイント)
Date: 2009/01/13(火) 20:30
No:26873
|
|
Title: Re:Winsockでの受信量取得
|
|
上記の掲示板の内容は、サイズ固定(256)での話でした^^;
追加で質問してもよろしいでしょうか?
構造体を送信するため、先に構造体のサイズを示すヘッダ(2byte)を送信、続いて本体の構造体の送信を行い、
サーバではまずヘッダ(2byte)を受信、判別し、続けて同ソケットから本体がきたらタイプ別サイズを受信して処理
という形をとることによって無事可変サイズの送受信に成功したのですが
この方法だと送信側、受信側共に1データに付き2の通信を行います。
これをどうにか1データにつき1通信にできないでしょうか?
221ポイント を落としてしまった。
|
|
|
|
|
Name: バグ ..ハッカー(141,309ポイント)
Date: 2009/01/13(火) 20:44
No:26874
|
|
Title: Re:Winsockでの受信量取得
|
|
普通に考えれば無理じゃないでしょうか?
あらかじめサイズを読み取っておかなければ、構造体部分を読み取る為の情報が無いんですから…
サイズを固定にすればヘッダが不要になりますが、可変だからヘッダが必要な訳で…
56ポイント を手に入れた。
|
|
|
|
|
Name: 雲居 ..ぴよぴよ(633ポイント)
Date: 2009/01/13(火) 21:13
No:26877
| 解決!
|
Title: Re:Winsockでの受信量取得
|
|
>>バグさん
返信ありがとうございます。
ややり無理ですか・・・
とりあえずパケと本体を別で送受信する方法でいこうかとおもいます。
ありがとうございました。
53ポイント を手に入れた。
|
|
|
|
Name: ポリ ..ぴよぴよ(207ポイント)
Date: 2009/01/08(木) 11:25
No:26619
|
|
Title: フォルダの読み込み
|
|
音楽ゲームを作成しているのですが、曲の追加をする時今はMP3までのパスを指定しメモリに読み込ませ
再生しています。
曲の追加をする際に、STEPMANIAのようにフォルダに曲を追加して曲一覧として表示、再生させる方法は
あるのでしょうか?
104ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(47,366ポイント)
Date: 2009/01/08(木) 12:19
No:26621
|
|
Title: Re:フォルダの読み込み
|
|
Windows 環境であれば、 Windows API の FindFirstFile と FindNextFile を使って
フォルダ内のファイルやフォルダを検索することが出来ます。
簡単ながらコードを書いてみました。
ANSI・UNICODE両ビルド可、クロスコンパイル(Windowsのみ)に対応してみました。
(これを書いたPC環境にチェックするためのコンパイラが無いので、正しくビルド・実行できるかは分かりません。あしからず^^;)
#include <windows.h>
#include <shlwapi.h>
// #include <tchar.h> // 必要かも。
// shlwapi.lib をリンクする必要あり
// tcsicmp の定義マクロ
#ifndef tcsicmp
#ifdef _tcsicmp
#define tcsicmp _tcsicmp
#else
#endif
#if defined(UNICODE) || defined(_UNICODE)
#ifdef _MSC_VER
#define tcsicmp(a,b) _wcsicmp(a,b)
#else
#define tcsicmp(a,b) wcsicmp(a,b)
#endif
#else
#ifdef _MSC_VER
#define tcsicmp(a,b) _stricmp(a,b)
#else
#define tcsicmp(a,b) stricmp(a,b)
#endif
#endif
#endif
#endif
// 検索処理関数
void SearchMP3File( LPCTSTR str ){
WIN32_FIND_DATA wfd;
HANDLE h = FindFirstFile(str,&wfd);
if(h == INVALID_HANDLE_VALUE){ // パスが存在しない
return;
}
do{
if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0 && // パスがフォルダでないもので、
tcsicmp(PathFindExtension(wfd.cFileName),TEXT(".mp3")) == 0) // 拡張子が".mp3"のファイル
{
TCHAR buf[PATH_MAX];
// 検索ディレクトリパスとファイルパスを結合
PathCombine(buf,str,wfd.cFileName);
// ここで buf には、MP3ファイルへのパスが入った状態。
// 後は何らかの処理をここに入れる
}
}while(FindNextFile(h,&wfd)); // 次のパスを検索
FindClose(h); // 検索ハンドルを閉じる
}
環境が限定的なら、
定義マクロはバッサリ切って直接書けば良いです。
756ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..中級者(14,885ポイント)
Date: 2009/01/08(木) 12:19
No:26622
|
|
Title: Re:フォルダの読み込み
|
|
うちの環境(WinXP,VC++2008EE)と仮定しています。
ディレクトリの選択 :SHBrowseForFolder、SHGetPathFromIDList、CoTaskMemFree
ディレクトリ内の検索:SetCurrentDirectory、GetCurrentDirectry、FindFirstFile、FindNextFile
MP3の再生? :Dxライブラリ or MCI
↑のあたりですかね。
121ポイント を手に入れた。
|
|
|
|
|
Name: ポリ ..ぴよぴよ(373ポイント)
Date: 2009/01/13(火) 14:00
No:26846
|
|
Title: Re:フォルダの読み込み
|
|
回答ありがとうございます。
環境はWindowsなのですが、DXライブラリのみでの作成で
WinAPIについては知識不足で・・・
せっかく回答をいただいたので、それを元にいろいろと調べてみます。
ちなみにDXライブラリとC言語だけでは実装は不可なのですか?
現在テキスト形式のデータに曲名を追加して読み込ませる方法も考えて
いるのですが・・・
できればフォルダの列挙をしてみたかったので><
166ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(27,195ポイント)
Date: 2009/01/13(火) 14:11
No:26847
|
|
Title: Re:フォルダの読み込み
|
|
すぐそばの「こ〜ふぃ」さんのスレッド
「複数のtxtファイルやcsvファイルを比較したいのですが。」
と同じことを実現したいのでは?
39ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(39,954ポイント)
Date: 2009/01/13(火) 14:13
No:26848
|
|
Title: Re:フォルダの読み込み
|
|
> ちなみにDXライブラリとC言語だけでは実装は不可なのですか?
無理です。
DXライブラリはDirectXを簡易に使えるようにするためのライブラリですからフォルダに関する機能は対象外です。
また、フォルダの管理はOSに依存するところになりますのでC言語にはそのような関数はありません。
44ポイント を手に入れた。
|
|
|
|
|
Name: ポリ ..ぴよぴよ(503ポイント)
Date: 2009/01/13(火) 14:19
No:26849
|
|
Title: Re:フォルダの読み込み
|
|
早い回答ありがとうございます。
やはりWinAPIを使わないとフォルダの列挙は無理ですか・・・
ゲームにコモンダイアログ等を出したくないので、
DXライブラリのFileRead等の関数を使ってテキストデータを一行ずつ
取り出してみようと思います。
回答してくださった皆様ありがとうございます。
130ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(27,231ポイント)
Date: 2009/01/13(火) 14:39
No:26850
|
|
Title: Re:フォルダの読み込み
|
|
_findfirstは環境には依存するけど(システムコール)
WindowsAPIではないと思ったんですが、違いますか?
36ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(40,052ポイント)
Date: 2009/01/13(火) 14:58
No:26851
|
|
Title: Re:フォルダの読み込み
|
|
_findfirstはCRTに含まれますのでWindowsAPIではないですね。
ポリさんの言うところのC言語を私は「ANSI C」と解釈しましたのでCRTは含んでいないです。
2倍のポイントを手に入れた! 98ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(27,328ポイント)
Date: 2009/01/13(火) 15:08
No:26852
|
|
Title: Re:フォルダの読み込み
|
|
ポリさんが何をしたいのか、理解出来ていないし、DXライブラリも使ったことがないので
わからないのですが、環境に依存してはいけないのですか。
windowsでもUnixでもマックでも動くソフトを作りたいのでしょうか?
97ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(141,253ポイント)
Date: 2009/01/13(火) 15:14
No:26853
|
|
Title: Re:フォルダの読み込み
|
|
っていうか、DXライブラリを使っている時点でWindowsネイティブじゃないの?
WIN32API使うのは全然問題ないのではないかと思うんですけどねぇ?
48ポイント を落としてしまった。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(40,197ポイント)
Date: 2009/01/13(火) 15:25
No:26855
|
|
Title: Re:フォルダの読み込み
|
|
ん〜、私の回答悪かったでしょうか?
ポリさんはWinAPIはわかんないからDXライブラリ+C言語だけで出来ないかどうかを質問されていましたので「無理(だから勉強してね)」と回答しただけですけど。
環境依存は使いたくないとは一言も言っておられないですね。
> ゲームにコモンダイアログ等を出したくないので、
この回答から察するに、「WinAPIを使用する」=「何かダイアログが出る」と勘違いされているのかな?
145ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(27,429ポイント)
Date: 2009/01/13(火) 15:36
No:26856
|
|
Title: Re:フォルダの読み込み
|
|
>この回答から察するに、「WinAPIを使用する」=「何かダイアログが出る」と勘違いされているのかな?
よく読めば、コモンダイアログがどうとかって書いてありますね。
それなら、コモンダイアログは出ません。ってことでいいでしょうか。
_findfirstを使えば、フォルダの一覧も作れるし、再帰呼び出しにすれば
フォルダの中の子フォルダのファイル中身もすべて表示できます。
101ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(48,331ポイント)
Date: 2009/01/13(火) 17:04
No:26858
|
|
Title: Re:フォルダの読み込み
|
|
> _findfirstを使えば、フォルダの一覧も作れるし、再帰呼び出しにすれば
> フォルダの中の子フォルダのファイル中身もすべて表示できます。
こちらの方が32/64bit環境に対応している分、良いかもしれませんね。
WinAPI とほぼ同じ使い方ですし。
せっかくなので、_findfirst 関数使用バージョンを書いてみました。
WinAPI を使用しないため、日本語対応のための処理が入っています。
#include <io.h>
#include <tchar.h>
// WinAPI PathFindExtension 関数の代替
static _TCHAR* GetPathExtension( _TCHAR* path ){
_TCHAR* i;
if(!path) return NULL;
for(i = path + _tcslen(path) - 1;i >= path;--i){
#ifdef _UNICODE
// UNICODE 用処理
if(*i == L'.'){
break; // こっちだと簡単
}
#else
// ANSI(ShiftJIS) 用処理
if(*i == '.'){
_TCHAR c = *(i-1);
if(*i == path || !((0x81 <= c && c <= 0x9F) || (0xE0 <= c && c <= 0xEF))){
break; // こちらだと一つ前のバイト文字をチェックする必要がある
}
}
#endif
}
if(i < path) return path + _tcslen(path);
return i;
}
// 検索処理関数
void SearchMP3File( const _TCHAR* str ){
_finddata_t fd;
intptr_t h = _tfindfirst(str,&fd);
if(h == -1){ // パスが存在しない
return;
}
do{
if((fd.attrib & _A_SUBDIR) == 0 && // パスがフォルダでないもので、
_tcsicmp(GetPathExtension(fd.name),_T(".mp3")) == 0) // 拡張子が".mp3"のファイル
{
_TCHAR buf[_MAX_PATH];
// 検索ディレクトリパスとファイルパスを結合
_tcscpy_s(buf,_MAX_PATH,str);
_tcscat_s(buf,_MAX_PATH,_T('\\'));
_tcscat_s(buf,_MAX_PATH,fd.name);
// ここで buf には、MP3ファイルへのパスが入った状態。
// 後は何らかの処理をここに入れる
}
}while(_findnext(h,&fd) == 0); // 次のパスを検索
_findclose(h); // 検索ハンドルを閉じる
}
上記で書いた WinAPI 版と比べるとコードが若干増えていますが、
こちらの方が WinAPI を使用しない分、余計なものを定義されずにすみますね。
(これも上記で書いた環境と同じところで書いたので以下略。)
703ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(57,104ポイント)
Date: 2009/01/13(火) 17:24
No:26864
|
|
Title: Re:フォルダの読み込み
|
|
とっても手抜き
#include <stdio.h>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
/*!
* @brief 指定したフォルダ内のmp3ファイル名をリストに出力
*
* @param outList 出力先を指定します。
* @param directory ディレクトリを指定します。
* @param tempListName 一時的なリストファイル名を指定します。
*
* @return true:正常終了 false:異常終了
*/
bool GetFileList(std::vector<std::string>& outList, const char* szDirectory, const char* tempListName)
{
char s[256];
sprintf(s, "dir /b %s\\*.mp3 > %s", szDirectory, tempListName);
system(s);
FILE* fp = fopen(tempListName, "r");
while (fgets(s, sizeof(s), fp) != NULL) {
s[strlen(s) - 1] = '\0';
outList.push_back(s);
}
fclose(fp);
sprintf(s, "del %s", tempListName);
system(s);
return true;
}
int main()
{
std::vector<std::string> fileList;
// カレントディレクトリを検索し、検索した結果を一時的にlist.txtに書き込む
GetFileList(fileList, ".c", "list.txt");
std::vector<std::string>::iterator it = fileList.begin();
for (; it != fileList.end(); ++it) {
std::cout << *it << std::endl;
}
}
335ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(56,987ポイント)
Date: 2009/01/13(火) 17:42
No:26868
|
|
Title: Re:フォルダの読み込み
|
|
>御津凪さん
素朴なことなんですが、S-JISで '.'(0x2e) が2バイト目にくる2バイト文字って存在しなくないですか?
int main()
{
unsigned char c = '.';
for (unsigned char i = 0x81; i <= 0x9F; ++i) {
printf("%c%c\n", i, c);
}
for (unsigned char i = 0xE0; i <= 0xEF; ++i) {
printf("%c%c\n", i, c);
}
return 0;
}
Windows XP、VS2008にて確認
117ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(48,462ポイント)
Date: 2009/01/13(火) 18:14
No:26870
|
|
Title: Re:フォルダの読み込み
|
|
> 素朴なことなんですが、S-JISで '.'(0x2e) が2バイト目にくる2バイト文字って存在しなくないですか?
そういえばそうですね。
2バイト目判定無くても確かに正常に動作しますね。
// WinAPI PathFindExtension 関数の代替
static _TCHAR* GetPathExtension( _TCHAR* path ){
_TCHAR* i;
if(!path) return NULL;
for(i = path + _tcslen(path) - 1;i >= path;--i){
if(*i == _T('.')) return i;
}
return path + _tcslen(path);
}
判定を省いたもの&省コード化しておきます。
131ポイント を手に入れた。
|
|
|
|
Name: POC ..ぴよぴよ(24ポイント)
Date: 2009/01/06(火) 12:01
No:26479
|
|
Title: ポケモンの属性の違いによるダメージ計算方法
|
|
はじめまして。
勉強ついでにゲームを作ってるPOCといいます。
この掲示板で、s-rushさんがポケモンのゲームを作っているようなのですが、
実は僕自身も同じ物を作ってるんです。
そこで、ダメージ計算時の弱点、効果はいまいち、効果なしといった
追加効果?の判別する関数を作ろうとしているのですが、できません。
本当にすいませんが、どなたか作ってもらえないでしょうか?
アルゴリズムとか今後の参考にしたいので。
開発環境は
VC++2008 EEです。
よろしくお願いします。
(1/6 18:30 管理人によりタイトル変更しました)
24ポイント を手に入れた。
|
|
|
|
Name: lbfuvab ..中級者(14,717ポイント)
Date: 2009/01/06(火) 15:57
No:26482
|
|
Title: Re:無題
|
|
ファイナルファンタジー等の攻略サイトによくダメージ計算式が載っていますので参考にされてはいかがでしょうか?
2倍のポイントを手に入れた! 50ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(10,612ポイント)
Date: 2009/01/06(火) 17:57
No:26483
|
|
Title: Re:無題
|
|
おっ、仲間発見。
と言いたいところですが、他の方がおっしゃる通り、仕様を考えるべきですよ。
いきなり
「教えてください」
と言われても、中にはポケモンのゲームを知らない方もいらっしゃるはずですよ。
私みたいにまんまパクリでよければ参考にどうぞ
/*==================================================
タイプの対応表
無し :0 ノーマル:1 ほのお :2
みず :3 でんき :4 くさ :5
こおり :6 かくとう:7 どく :8
じめん :9 ひこう :10 エスパー:11
むし :12 いわ :13 ゴースト:14
ドラゴン:15 あく :16 はがね :17
===================================================*/
/*==================================================
弱点の対応表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
---------------------------------------------
1| 2 2 2 2 2 2 2 2 2 2 2 2 1 0 2 2 1
2| 2 1 1 2 3 3 2 2 2 2 2 3 1 2 1 2 3
3| 2 3 1 2 1 2 2 2 3 2 2 2 3 2 1 2 2
4| 2 2 3 1 1 2 2 2 0 3 2 2 2 2 1 2 2
5| 2 1 3 2 1 2 2 1 3 1 2 1 3 2 1 2 1
6| 2 1 1 2 3 1 2 2 3 3 2 2 2 2 3 2 1
7| 3 2 2 2 2 3 2 1 2 1 1 1 3 0 2 3 3
8| 2 2 2 2 3 2 2 1 1 2 2 2 1 1 2 2 0
9| 2 3 2 3 1 2 2 3 2 0 2 1 3 2 2 2 3
10| 2 2 2 1 3 2 3 2 2 2 2 3 1 2 2 2 1
11| 2 2 2 2 2 2 3 3 2 2 1 2 2 2 2 0 1
12| 2 1 2 2 3 2 1 1 2 1 3 2 2 1 2 3 1
13| 2 3 2 2 2 3 1 2 1 3 2 3 2 2 2 2 1
14| 0 2 2 2 2 2 2 2 2 2 3 2 2 3 2 1 1
15| 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 2 1
16| 2 2 2 2 2 2 1 2 2 2 3 2 2 3 2 1 1
17| 2 1 1 1 2 3 2 2 2 2 2 2 3 2 2 2 1
効果は抜群 :3 普通 :2
効果はいまひとつ:1 効果が無い:0
===================================================*/
===================================================*/
ダメージ倍率
効果は抜群 ×2
普通 ×1
効果はいまひとつ ×0.5
効果がない ×0
===================================================*/
float relation(int attck_type1, int attck_type2, int deffenc_type1, int deffenc_type2)
{
float relation = 1; //ダメージ倍率
switch attak_type1{
cace 1: if(deffenc_type1 == 1)
relation = relation*1;
else if(deffenc_type1 == 2)
relation = relation*1;
else if(deffenc_type1 == 3)
relation = relation*1;
--------------以下省略-------------------
==========================================
同様にcace2〜cace17についても
==========================================
}
return relation;
}
まだコンパイルしてないので、エラーがあるかもしれませんが、考え方の1つとしては
こんなものでいいでしょう。
全部の関係を列挙するのが面倒であれば、ダメージ倍率が変わるものだけを書き出してあげて、
それ以外であれば倍率を変えないように制御してあげれば大丈夫です。
これくらいは自分で考えてみましょう。
かなり力技って感じですが、他の方ならどういう風にプログラム書きますか?
私はまだ未熟なものでこれくらいのアルゴリズムしか思い浮かびませんでしたorz
1,410ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(944,261ポイント)
Date: 2009/01/06(火) 18:23
No:26484
|
|
Title: Re:無題
|
|
ポケモンは小学校の時に遊んで以来なので、よく覚えていませんが、
確か属性管理がややこしいですよね!
ちと
http://pokemon-xd.info/pokexd_begin1.html
こちらのデータを使わせてもらってダメージ計算を行ってみましょう。
簡単にする為に、
なし→通常ダメージ
× →ダメージ0
△ →1/2のダメージ
◎ →2倍のダメージ
こんな感じで対応させて見ます。
リンク先の表を数字に置き換えたものがこちらです。
2,2,2,2,2,2,2,2,2,2,2,2,1,0,2,2,1
2,1,1,2,4,4,2,2,2,2,2,4,1,2,1,2,4
2,4,1,2,1,2,2,2,4,2,2,2,4,2,1,2,2
2,2,4,1,1,2,2,2,0,4,2,2,2,2,1,2,2
2,1,4,2,1,2,2,1,4,1,2,1,4,2,1,2,1
2,1,1,2,4,1,2,2,4,4,2,2,2,2,4,2,1
4,2,2,2,2,4,2,1,2,1,1,1,4,0,2,4,4
2,2,2,2,4,2,2,1,1,2,2,2,1,1,2,2,0
2,4,2,4,1,2,2,4,2,0,2,1,4,2,2,2,4
2,2,2,1,4,2,4,2,2,2,2,4,1,2,2,2,1
2,2,2,2,2,2,4,4,2,2,1,2,2,2,2,0,1
2,1,2,2,4,2,1,1,2,1,4,2,2,1,2,4,1
2,4,2,2,2,4,1,2,1,4,2,4,2,2,2,2,1
0,2,2,2,2,2,2,2,2,2,4,2,2,4,2,1,1
2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,1
2,2,2,2,2,2,1,2,2,2,4,2,2,4,2,1,1
2,1,1,1,2,4,2,2,2,2,2,2,4,2,2,2,1
こういうのはエクセルで表を作り、ファイルから読み取ってやるともっと楽だと思います。
2というのが通常ダメージです。
サンプルでは通常だと100のダメージを食らう計算にしてあります。
Zキーを押しながら上下キーを押すと攻撃側の属性が変更でき、
Xキーを押しながら上下キーを押すと受け側の属性が変更できます。
エンターを押すと計算結果を表示します。
→続く
941ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(942,037ポイント)
Date: 2009/01/06(火) 18:23
No:26485
|
|
Title: Re:無題
|
|
→続き
#include "DxLib.h"
typedef struct{
int 属性;
}キャラデータ_t;
int Key[256];
キャラデータ_t キャラデータ[2];
int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
else GetHitKeyStateAll_InputKey[i]=0;
}
return 0;
}
int 属性[17][17]=
{
{2,2,2,2,2,2,2,2,2,2,2,2,1,0,2,2,1},
{2,1,1,2,4,4,2,2,2,2,2,4,1,2,1,2,4},
{2,4,1,2,1,2,2,2,4,2,2,2,4,2,1,2,2},
{2,2,4,1,1,2,2,2,0,4,2,2,2,2,1,2,2},
{2,1,4,2,1,2,2,1,4,1,2,1,4,2,1,2,1},
{2,1,1,2,4,1,2,2,4,4,2,2,2,2,4,2,1},
{4,2,2,2,2,4,2,1,2,1,1,1,4,0,2,4,4},
{2,2,2,2,4,2,2,1,1,2,2,2,1,1,2,2,0},
{2,4,2,4,1,2,2,4,2,0,2,1,4,2,2,2,4},
{2,2,2,1,4,2,4,2,2,2,2,4,1,2,2,2,1},
{2,2,2,2,2,2,4,4,2,2,1,2,2,2,2,0,1},
{2,1,2,2,4,2,1,1,2,1,4,2,2,1,2,4,1},
{2,4,2,2,2,4,1,2,1,4,2,4,2,2,2,2,1},
{0,2,2,2,2,2,2,2,2,2,4,2,2,4,2,1,1},
{2,2,2,2,2,2,2,2,2,2,2,2,2,2,4,2,1},
{2,2,2,2,2,2,1,2,2,2,4,2,2,4,2,1,1},
{2,1,1,1,2,4,2,2,2,2,2,2,4,2,2,2,1}
};
char 属性の名前[17][32]={
{"ノーマル"},
{"炎 "},
{"水 "},
{"電気 "},
{"草 "},
{"氷 "},
{"格闘 "},
{"毒 "},
{"地面 "},
{"飛行 "},
{"エスパー"},
{"虫 "},
{"岩 "},
{"ゴースト"},
{"ドラゴン"},
{"悪 "},
{"ハガネ "}
};
int ダメージ計算(int 属性1, int 属性2){
return 50*属性[属性1][属性2];
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
if(Key[KEY_INPUT_Z]>0 && Key[KEY_INPUT_UP]==2){
キャラデータ[0].属性 = (++キャラデータ[0].属性)%17;
}
if(Key[KEY_INPUT_Z]>0 && Key[KEY_INPUT_DOWN]==2){
キャラデータ[0].属性 = --キャラデータ[0].属性;
if(キャラデータ[0].属性<0)
キャラデータ[0].属性=16;
}
if(Key[KEY_INPUT_X]>0 && Key[KEY_INPUT_UP]==2){
キャラデータ[1].属性 = (++キャラデータ[1].属性)%17;
}
if(Key[KEY_INPUT_X]>0 && Key[KEY_INPUT_DOWN]==2){
キャラデータ[1].属性 = --キャラデータ[1].属性;
if(キャラデータ[1].属性<0)
キャラデータ[1].属性=16;
}
if(Key[KEY_INPUT_RETURN]==2){
int ダメージ = ダメージ計算(キャラデータ[0].属性,キャラデータ[1].属性);
printfDx("%s から %s への攻撃!→%dのダメージ\n",属性の名前[キャラデータ[0].属性],属性の名前[キャラデータ[1].属性],ダメージ);
}
DrawFormatString(450, 0,GetColor(255,255,255),"攻撃側属性:%s",属性の名前[キャラデータ[0].属性]);
DrawFormatString(450,17,GetColor(255,255,255)," Zキー+上下キー");
DrawFormatString(450,40,GetColor(255,255,255),"受け側属性:%s",属性の名前[キャラデータ[1].属性]);
DrawFormatString(450,57,GetColor(255,255,255)," Xキー+上下キー");
DrawFormatString(450,80,GetColor(255,255,255),"エンターで攻撃!");
for(int i=0;i<17;i++){
DrawFormatString(450,150+17*i,GetColor(255,255,255),"%s",属性の名前[i]);
}
ScreenFlip();
}
DxLib_End();
return 0;
}
実行結果例
攻撃力や防御力はまぁ適当に計算してやって下さい。
2,224ポイント を落としてしまった。
|
|
|
|
|
Name: s-rush ..中級者(10,729ポイント)
Date: 2009/01/06(火) 18:39
No:26487
|
|
Title: Re:無題
|
|
うわっ!
すごい・・・
私の作ってみたサンプルとレベルが違いすぎる。
まだまだ勉強しないといけないなぁ・・・
やっぱりゲームを作るにはこれくらいのプログラムを理解できないと
厳しいですかね?
私も似たようなことやってるので、参考にさせていただきます^^
雑談の横槍すみませんでしたm(_ _)m
PS
管理人さんとアドバイス通り対応表もプレタブで囲んでおきました。
117ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(942,489ポイント)
Date: 2009/01/06(火) 18:52
No:26489
|
|
Title: Re:無題
|
|
>やっぱりゲームを作るにはこれくらいのプログラムを理解できないと厳しいですかね?
どこか解りにくいところありました?
極力解り易く書いたつもりなのですが・・><
解り易くする為にあえて全角で変数とかつけたんですが、逆にわかりにくかったですかね・・。
一応この全角のままコンパイル出来るんで、よければ実行してみて下さいm(_ _)m
プログラムは毎回書く骨格
http://dixq.net/g/#41
に必要な処理を付け足しただけです。
どの辺がわかりにくいかもしよかったら教えてもらえませんか?
かなり長くなってしまいましたけど、結局一番言いたかったのはこのように作ると
ダメージを計算する関数が
int ダメージ計算(int 属性1, int 属性2){
return 50*属性[属性1][属性2];
}
たったこれだけで済みそうです。ってことです。
ちなみに攻撃側と受け側が反対になるときは
属性[属性1][属性2] → 属性[属性2][属性1]
でいいと思います。
きっとホントはもっと複雑になるんでしょうけど・・。
対応表は出来れば外部ファイルから読み込んだ方がいいと思います。
エクセルで作って「csv」って拡張子で保存すれば、
プログラムで簡単に扱えるのでオススメです。
263ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(10,909ポイント)
Date: 2009/01/06(火) 20:46
No:26495
|
|
Title: Re:無題
|
|
全角はあえてそうしてたんですね^^;
プログラム中に何故全角表記があるのかなって思ったので。
全角のままコンパイルできるとは知りませんでした。
あと、エクセルもそうですが、外部ファイルからの読み込みもわからなかったので。
私自身DXライブラリの知識不足もあるのですが。
ともあれ私よりもスレ主であるPOCさんが理解できれば問題ないので気にしないでください。
180ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(945,195ポイント)
Date: 2009/01/07(水) 17:19
No:26576
|
|
Title: Re:無題
|
|
ありがとうございます。今後回答するときの参考にしますm(_ _)m
全角はパッと見わかりやすくていいんですが、コンパイル出来るかどうかは環境に依存しますし、
プロの現場では恐らく使われていないですし、「使えるけど使わない」ことが多いですよね。
それに単純には全てを全角には出来ないので、イチイチ全角と半角の入力状態を変えないといけないのも面倒です。
・・と言う事で、やはり使う意味無し・・ですね^^;
エクセルからの読み込みは簡単です。
エクセルで何か表を書き「cvs」形式で保存してみて下さい。
そしてテキストエディタで開いてみて下さい。
データがどのように入ってるか解ると思います。
セルの区切りがカンマになるんですね。
まずfopenでファイルをオープンします。
カンマか改行が現れるまで一文字ずつ取ってきて文字列に入れていきましょう。
カンマか改行が現れたらそこで文字列の格納をやめ、終端記号を入れてやります。
その文字列をatoiという文字列から数値に変換する関数を使ってint型の数値に変換してやります。
こうすることで、エクセルで作った整数を読み込むことが出来ます。
解らない事があればググりながらやってみると案外簡単に実装出来ると思います。
もし興味があればやってみて下さい。
540ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(11,002ポイント)
Date: 2009/01/08(木) 00:48
No:26594
|
|
Title: Re:無題
|
|
そんなやり方もあったんですね。
知りませんでした。
確かにエクセルを使用した方が、効率よく作業できますよね。
ちなみにワードでも同じようにできますよね。
拡張子は変わりそうですけど・・・
ちょっと調べてみます。
93ポイント を手に入れた。
|
|
|
|
|
Name: POC ..ぴよぴよ(123ポイント)
Date: 2009/01/10(土) 15:30
No:26705
|
|
Title: Re:無題
|
|
みなさんありがとうございます。
面倒ついでにもう1つお願いしたいのですが・・・
フィールドマップはどうやってつくればいいんでしょうか?
読み込みとかスクロールのやりかたも分からないのでよろしくお願いします。
99ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,268ポイント)
Date: 2009/01/10(土) 15:42
No:26706
|
|
Title: Re:無題
|
|
全角コンパイルについて補足。
2バイト文字で構成される識別子が許されているのはVC++固有だった気がします。
C#では言語でサポートされていた気がしますが・・・
少なくとも、BCC5.5.1は2バイト文字の識別子を認識してくれないので(笑)
69ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(47,628ポイント)
Date: 2009/01/10(土) 17:05
No:26709
|
|
Title: Re:無題
|
|
> フィールドマップはどうやってつくればいいんでしょうか?
> 読み込みとかスクロールのやりかたも分からないのでよろしくお願いします。
過去ログにも似た質問がありましたが、マップも上記のようなエクセルを利用した方法で
マップをエクセルに書いて作ることが出来ます。
とは言うものの、マップを作るのに番号とにらめっこでは無駄な時間がかかります。
汎用マップエディタのようなものがネット上でちらほら見かけるので、
そちらを使ってみるという手もあります。
詳しいことは過去ログを見るか、他の方の回答を待つか、検索してみてください。
146ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(14,066ポイント)
Date: 2009/01/13(火) 17:28
No:26866
|
|
Title: Re:無題
|
|
マップの作り方ですね。
以前私も同じ質問をさせていただきました。
まだマップそのものは制作中ですが、回答してくださった方々のアドバイスを参考にしてます。
過去ログで
”マップ” ”作り方”
あたりで検索していただければ引っかかると思います。
82ポイント を手に入れた。
|
|
|
|
Name: 吉原 ..ぴよぴよ(3ポイント)
Date: 2009/01/09(金) 15:58
No:26678
|
|
Title: 味方復活時の出現ポイントについて
|
|
龍神録で自機が死んだ時に、復活する場所を変えたいのですが
どこを変更すればいいのでしょうか?
お手数ですが教えてもらえないでしょうか?
よろしくお願いします
3ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(949,706ポイント)
Date: 2009/01/09(金) 16:08
No:26681
|
|
Title: Re:味方復活時の出現ポイントについて
|
|
キャラクタに関する計算はchar.cppで行っています。
具体的には
void calc_ch(){
if(ch.flag==1){//喰らいボム受付中
bright_set.brt=80;//暗く
if(ch.cnt>20){//0.33秒受け付ける
ch.flag =2; //1:喰らいボム受付中 2:死んで浮き上がり中
ch.cnt =0;
bright_set.brt=255;
}
}
if(ch.cnt==0 && ch.flag==2){//今の瞬間死んだら
enter_char_item();//キャラのアイテム登録(39章)
ch.x=FMX/2;//座標セット
ch.y=FMY+30;
ch.mutekicnt++;//無敵状態へ
}
if(ch.flag==2){//死んで浮上中なら
unsigned int push=CheckStatePad(configpad.left)+CheckStatePad(configpad.right)
+CheckStatePad(configpad.up)+CheckStatePad(configpad.down);
ch.y-=1.5;//キャラを上に上げる
//1秒以上か、キャラがある程度上にいて、何かおされたら
if(ch.cnt>60 || (ch.y<FMY-20 && push)){
ch.cnt=0;
ch.flag=0;//キャラステータスを元に戻す
}
}
上の黄色部分で初期座標をセットしています。
そして、その後は下の黄色部分で移動制御しています。
476ポイント を手に入れた。
|
|
|
|
|
Name: 吉原 ..ぴよぴよ(17ポイント)
Date: 2009/01/13(火) 13:44
No:26845
|
|
Title: Re:味方復活時の出現ポイントについて
|
|
ありがとうございます
変更できました。
14ポイント を手に入れた。
|
|
|
|
Name: あきひと ..ぴよぴよ(22ポイント)
Date: 2009/01/13(火) 10:39
No:26831
|
|
Title: 14歳からはじめる
|
|
触手ボスを反時計回りに動かすにはどこを変えればよいでしょうか??
17ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(39,871ポイント)
Date: 2009/01/13(火) 10:55
No:26832
|
|
Title: Re:14歳からはじめる
|
|
各プログラムがどういった処理を行っているかを理解できていますか?
理解すれば直すべきところはおのずと見えてくるでしょう。
36ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(21,434ポイント)
Date: 2009/01/13(火) 10:56
No:26833
|
|
Title: Re:14歳からはじめる
|
|
試してないけど、この変更でできるかと。
float rad = ToRadian( animcounter % 360 );
↓
float rad = -ToRadian( animcounter % 360 );
46ポイント を手に入れた。
|
|
|
|
Name: nayo ..入門者(4,270ポイント)
Date: 2009/01/10(土) 23:12
No:26713
|
|
Title: ボンバーマンにおけるCPの思考ルーチンについて
|
|
現在ボンバーマンもどきを作っているのですがCPの思考ルーチンで行き詰ってしまいました
一応対人戦はできるのですがさすがに2人以上集まらないとできないゲームは厳しいと思ったので
CPを作ろうと思った次第です
現在の考え方としては
マスの状態を通れるか通れないかのフラグ分けをし(爆発直前のマスも通れないとする)、それを利用して
・もしその場所が将来的に爆発する(通れないマス上)なら爆発しない位置まで移動
・そうでなければアイテムを探し、アイテムがあればその方向へ移動する
・アイテムが無ければ近くのプレイヤーを探し、プレイヤーが居たらプレイヤーの近くに移動し、
一定距離内に入ったら特定の攻撃パターン(?)でボムを置く
・プレイヤーも近くに居なければソフトブロックを探し、
ソフトブロックがあればソフトブロックの隣に移動し、ボムを置く
・これら以外ならフィールドの中央に向かって移動する
とすれば良いかな?と思っています
ここからが問題なのですが移動する方向を得る方法が分かりません
移動についてはこちらを参考に再帰を使って調べていこうと思ったのですが、
例えば、周りを調べて目的のマスが見付かったらその方向への探索は終了、
これを繰り返し、探索が終了した後、
最も近くの目的のマスへの最初の方向というものはどうやって得ればいいのでしょうか
と、非常に伝わりにくい文章で申し訳ないですがどなたかご回答お願いします
環境はVisual C++ 2008 Express Edition
DXライブラリ使用、です
393ポイント を手に入れた。
|
|
|
|
Name: たいちう ..上級者(20,233ポイント)
Date: 2009/01/11(日) 00:00
No:26714
|
|
Title: Re:ボンバーマンにおけるCPの思考ルーチンについて
|
|
> 最も近くの目的のマスへの最初の方向というものはどうやって得ればいいのでしょうか
あくまでも一例です。できるだけ理解しやすいアルゴリズムを考えてみました。
キャラの現在地から任意のマスまで、障害物を迂回して最短何歩で辿り着けるかは分かりますか?
全てのマスに対応する二次元配列を-1で初期化し現在地を0で初期化します。
効率をかなり無視したアルゴリズムですが、まず、全てのマスを調べ、
0と接した全ての-1のマスを1とします。
次に、全てのマスを調べ、1と接した全ての-1のマスを2とします。
これを繰り返すと、全てのマスについて現在位置からの最短歩数が分かります。
目的のマスが複数あるみたいですので、最短歩数の配列を元に、目的地を1つ選びましょう。
目的地が分かれば、そこまでの歩数が分かります。仮に5歩としましょう。
5歩のマスの上下左右には、少なくとも1つ4歩のマスがあるはずです。
そこを探してそこまで戻りましょう。
同様に、4歩のマスの上下左右には、少なくとも1つ3歩のマスがあるはずです。
このように、1歩のマス、つまり現在地の隣のマスまで戻ることができますので、
現在地からの最初の方向とすることができます。
より良い方法はあると思いますが、とりあえず、これで実装してみてはいかがでしょうか。実験的に。
効率面や、動きのバリエーションについて疑問があれば、その後で再度尋ねてください。
280ポイント を手に入れた。
|
|
|
|
|
Name: nayo ..入門者(4,642ポイント)
Date: 2009/01/12(月) 20:44
No:26809
| 解決!
|
Title: Re:ボンバーマンにおけるCPの思考ルーチンについて
|
|
返信遅れて申し訳ないです
素早い回答有難う御座います
自分なりにもう一度見直してCPを作ってみました
解決した方法としては
最初の4方向を調べる関数で調べる方向を保存しておき、
目的のマスが見付かった際にそこまでの移動距離と、向きを保存、
再度調べていないところを調べていき、また目的のマスが見付かったときは
前見付かった目的の場所と距離を比較し、近いなら更新、といった具合です
また、爆発する場所を通れないとすると全く動けないときなどもあるので、
現在のマスが爆発するなら爆発する場所でも通れるとし(ただし爆発直前は不可)、
安全な場所を探す、といった感じに変えました
まだ
・稀に自滅することがある
・ボムを同時に出す個数を制限(最大でも3個程度)
・再帰の検索距離を8以上にするとFPSが30以下まで落ちる
といった感じなのでここら辺を改良していきたいと思います
自分で作って改めてSFCのゲームでも凄いんだなと実感しました…
372ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(21,388ポイント)
Date: 2009/01/13(火) 08:18
No:26826
|
|
Title: Re:ボンバーマンにおけるCPの思考ルーチンについて
|
|
> ・再帰の検索距離を8以上にするとFPSが30以下まで落ちる
遅すぎますね。
その程度の検索がFPSに影響を及ぼすことは考えにくいので、
かなり無駄な処理が多いのでしょう。
もしご自身で解決できないようでしたらソースを載せてみてはどうかと。
76ポイント を手に入れた。
|
|
|
|
Name: こ〜ふぃ ..かけだし(1,072ポイント)
Date: 2009/01/13(火) 08:05
No:26823
|
|
Title: 複数のtxtファイルやcsvファイルを比較したいのですが。
|
|
#include <time.h>
main(){
....
clock_t start,end;
start = clock();
..../*ここに測定したい処理を入れる.*/
end = clock();
printf("%.2f秒かかりました\n",(double)(end-start)/CLOCKS_PER_SEC);
}
111ポイント を手に入れた。
|
|
|
|
Name: こ〜ふぃ ..かけだし(1,078ポイント)
Date: 2009/01/13(火) 08:07
No:26824
| 解決!
|
Title: Re:複数のtxtファイルやcsvファイルを比較したいのですが。
|
|
また立て直します。
すいません。
意図と違うものが出ます。
6ポイント を手に入れた。
|
|
|
|
Name: こ〜ふぃ ..ぴよぴよ(904ポイント)
Date: 2009/01/13(火) 07:46
No:26820
|
|
Title: txtyaファイルの中身を比較したい。
|
|
どうもこんにちわ、こ〜ふぃと申します。
早速なのですが、質問です。
現在、1ファイルあたり、小数が195個格納されているtxtファイルとcsvファイルを所持しています。
このファイルが、何十個かあり、その距離演算をして、
file01に総合的に一番距離の近いファイルを導き出すという
cプログラムを組みたいのです。
|file01|file02|・・・|file n|
-------+------+------+------+------+
第1項目| 1.13 | 2.58|・・・|
第2項目|-3.55 | 6.88|・・・|
・ ・ ・
・ ・ ・
・ ・ ・
第195項目
こんな感じのイメージで、file01の第1項目とfile02の第1項目と・・・と比較していきたいのです。
そして、第195項目まで、比較し、一番file01に距離が近いものを調べます。
#include <stdio.h>
int main(void)
{
FILE *fp;
int i;
double num;
fp = fopen( "test.txt", "r" );
for(i = 0; i <= 194; i++)
{
fscanf( fp, "%lf", &num );
printf( "%lf\n", num);
}
fclose( fp );
return 0;
}
このように、テキスト読み出しはでき、距離の計算も問題はないと思うのですが、
第1項は、file02がfile01に距離が近かった。
第2項は、file03がfile01に距離が近かったのように、
第195項までの区別は、どうやってすればよいのでしょうか?
自分の考えでは、
第1項は、file02がfile01に対して一番距離が近いので点数を付与して、
ということを第195項までして、最終的に一番点数の高いファイルを返せばできるのではないかと
思っているのですが、その点数のための引数をどうやって設定すればいいのかがわかりません。
ご指南のほどよろしくお願いします。
452ポイント を手に入れた。
|
|
|
|
Name: こ〜ふぃ ..ぴよぴよ(937ポイント)
Date: 2009/01/13(火) 07:47
No:26821
|
|
Title: Re:txtyaファイルの中身を比較したい。
|
|
すいません。
タイトル変になりました。
「txtファイルやcsvファイルの中身を比較したい」
です。
33ポイント を手に入れた。
|
|
|
|
|
Name: こ〜ふぃ ..ぴよぴよ(961ポイント)
Date: 2009/01/13(火) 08:05
No:26822
| 解決!
|
Title: Re:txtyaファイルの中身を比較したい。
|
|
ごめんなさい
質問立て直します
2倍のポイントを手に入れた! 24ポイント を手に入れた。
|
|
|
|
Name: じょん ..ぴよぴよ(18ポイント)
Date: 2009/01/12(月) 15:06
No:26781
|
|
Title: プログラムというよりは・・・
|
|
初めまして!じょんです。
こんな初歩の初歩?を聞くのははばかられましたが、何でも掲示板ということで投稿させてもらいました^^;
さっそく本題に入りますね。
僕が知りたいのはゲームの構築の仕方?です。
たとえば、僕はタクティカルシュミレーション物を作ろうと思っているんですが、
+------------------------------------------------------------------------------------------+
|【タイトル】→【メニュー】(初めから)→第1章開始 →戦闘マップ→クリアで次の章へ・・・|
| (続きから)→続きの章から開始→戦闘マップ→クリアで次の章へ・・・|
+------------------------------------------------------------------------------------------+
大まかな説明でいうとこんな風に進めて行きたいんですが、どういう風に分けたらいいんでしょうか、またつなげるにはどうすればいいんでしょうか?
流石に全部一つのプログラムの中に入れるわけにはいきませんよね?
添付してある画像の部分をどうすればいいのかってことと、フォルダの分け方?です。
基礎が分かっていなくてすみません。どうか教えて頂けたら幸いです。
※龍神録のプログラムのダウンロード等をして見て学ぼうと思ったんですが何故かダウンロードしようとすると
[フォルダエラー]:圧縮(zip形式)フォルダは無効であるか、または壊れています。
って出て保存できないんですよね^^;
18ポイント を手に入れた。
|
|
|
|
Name: SCI ..初心者(5,748ポイント)
Date: 2009/01/12(月) 16:13
No:26786
|
|
Title: Re:プログラムというよりは・・・
|
|
この場合、「章データ」を読み込んで実行する部分を作ればいいのではないでしょうか。
つまり、最初は「第一章」だけを(ソースに直接でもいいから)作るんです。
そしてら、「ストーリー」や「マップ」といった章固有のデータを別ファイルに分離して、そこからロードする、というように作り変えます。
同時に、章データを作るためのツールも作っていくとよいでしょう。
安定したシステムができあがったら、次々と章を作っていけばよさそうですね。
ちなみに、「データ」はバイナリでも、このサイトでやっているようにCSVでも、いろいろ考えられます。
私はまだここまでやったことがないので理想論に過ぎませんが、参考までにv
295ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(49,203ポイント)
Date: 2009/01/12(月) 16:15
No:26787
|
|
Title: Re:プログラムというよりは・・・
|
|
んん〜こればかりは規模のこともありますし、
じょんさんがどのようなものにしたいかが明確ではないので
はっきりしたことは言えませんが、
mainでは
オープニング
シナリオ
戦闘
...
などと分岐していって、シナリオでは
一章
二章
三章
...
などと分岐していくとかですかね。
「繋げる」→一章すべて(戦闘も含めた)→二章・・・
とつなげていこうとすると毎回戦闘のことなどを書いていたらものすごい行になり、
非効率であって、管理もとてもしにくいと思います。
「繋げる・分ける」一つとしてはフラグでモードを移行させてやることが挙げられます。
フラグが1なら一章シナリオ、2なら二章シナリオ・・・
>添付してある画像の部分をどうすればいいのかってことと、フォルダの分け方?です。
これは管理の問題ですので、
じゅんさんが一番やりやすいようにするのが一番だと思うのですが、
例えば、
初期化フォルダ(ゲーム開始時の初期化)
シナリオ用フォルダ(シナリオ文字描写等)
戦闘用フォルダ
ヘッダー用フォルダ
...
などですかね^^;これは自分で組み立てていったときに
やりやすいように整理していけばいかと思いますが。。
あと、やる気があれば何でもできると思いますが・・・
もし、ゲームプログラミングが初めてであれば
シュミレーション(なんでもそうかもしれませんが)
はまず小規模から始めたほうがいいかと思います^^;
596ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(21,273ポイント)
Date: 2009/01/12(月) 19:50
No:26807
|
|
Title: Re:プログラムというよりは・・・
|
|
上級者の洗練された方法で作りたいのでしょうが、
やりたいことに応じて最適な方法を選べるのが上級者なのです。
どんなケースもこれでOKというようなノウハウがあり、
それを出し惜しみしているわけではないですよ。
SCIさんの説明が分かりやすいと思います。試行錯誤しましょう。
作り始める前から理想的な形が分かることは上級者にも少ないので、
失敗を恐れずに作り始めるのがよいと思います。
126ポイント を手に入れた。
|
|
|
|
|
Name: じょん ..ぴよぴよ(214ポイント)
Date: 2009/01/13(火) 01:10
No:26817
|
|
Title: Re:プログラムというよりは・・・
|
|
皆さんありがとうございます!!C言語は基礎中の基礎しか知らないので^^;
でも、やる気だけならめちゃくちゃありますからbb
とりあえず一つの章だけで作成してみます♪それからドンドン追加していくようにしてみますね。
それで、形を一つのプログラムに作成して、中身(データ)を入れただけで動くような仕組みにすれば一番いいってことですよね?頑張ります!
あと、バイナリ?とかよく分かりませんが、データは確かC言語ならテキストでもできますよね?
2倍のポイントを手に入れた! 196ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,832ポイント)
Date: 2009/01/13(火) 01:55
No:26818
|
|
Title: Re:プログラムというよりは・・・
|
|
テキストでできますよ。
バイナリとかは、例えば、intの配列や構造体をそのままファイルに書き込む、とかです。
画像ファイルや音楽ファイルがこれに該当しますね。もちろん、プログラムそのものも。
メリットはもちろんありますが、やはり慣れているやり方でやるのが一番でしょう。
2ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(45,386ポイント)
Date: 2009/01/04(日) 02:43
No:26408
|
|
Title: [雑談]自作ツール公開
|
|
お邪魔します。
自作ツールの試作品ができましたので、ご報告します。
今回は前回のツールの延長なんですが^^;
前回のDOT_getterは静止画のみで、アニメーションが使えませんでした。
そこで、アニメーション再生ツールをまず作りました。
今回公開する「DOT_getter〜animation〜」に不都合がなければ、
二作を合体させて、+αをつけようと思っています。
まずは皆様に使用していただいて、不都合、バグがないか見てもらいたいです。
一枚アニメーション画像を用意していただかないといけないのですが・・・orz
キャラチップ、エフェクト画像・・・など有効です。
できるだけ日常使うようなアプリケーションに似せるために、
・入力フォーム
・クリックボタン
・センタリング
等々自作関数がんばりました。やっぱりAPIが使えると楽ですね。。
入力フォーム苦労しました。。
DLはURL→SOFT→DOT_getter〜animation〜
からできます。
よろしくお願いします。
長文失礼しました。
2倍のポイントを手に入れた! 896ポイント を手に入れた。
|
|
|
|
Name: Justy ..伝説なるハッカー(304,983ポイント)
Date: 2009/01/04(日) 16:10
No:26415
|
|
Title: Re:[雑談]自作ツール公開
|
|
>皆様に使用していただいて、不都合、バグがないか見てもらいたいです
面白そうなので、早速試してみました。
で、問題が幾つか見つかったので列挙します。
□ 画像ファイル登録画面
・ 画像ファイルを認識しない
ShiftJISにない Unicode文字が入ったパス(©とかヷ)にある
画像をドラッグ&ドロップしても画像を認識しません。
□ セル分割数設定画面
・ 数を増やしていくと、画像に対して引かれるラインの数が足りない事がある(e000)。
□ アニメセル登録画面
・ 2つ同時に登録される
アニメ登録画面でセルとセルの境界をクリックすると2つのセルが同時に登録されます
4つのセルの境をクリックすると4つ同時に登録することもできます。
尚、この方法で55個目になったとき次のページへ切り替わらないことがあります。
・ 73個目以降で文字が重なる(e001)
セルの分割数が X, Yそれぞれ 10以上で、73個目以上の登録を行うと、
55個目からの文字と重なることがあります。
・ アニメプレビュー画面から戻ってきたときに2ページ目が表示されない
セル登録画面で2ページまで登録してから、プレビュー画面に進み
再び戻ってくると2ページ目が表示されていません。
この状態で追加を行っても何を追加したか不明な状態となります。
□ アニメプレビュー画面
・ 再生速度を上げ下げすると落ちる
最大数までアニメを登録します。
プレビュー画面で連続再生状態で再生しながらスピードスライダーを上げていき
最大のところでゆっくり上げ下げをしたり、クリックを繰り返すと
時々0x0404427のところでアクセスエラーが発生し、アプリが落ちます。
多分スライダを動かしているときとカウンターのリセットのタイミングが
重なったタイミングで、アニメのセル分割数を決めたときにアロケートした領域を越えて
アクセスしていると思われます。
873ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(45,863ポイント)
Date: 2009/01/04(日) 17:20
No:26418
|
|
Title: Re:[雑談]自作ツール公開
|
|
Justyさん、ご協力ありがとうございます!!
うわぁ・・・。
これは問題作品ですね^^;
これほど不都合・バグがあったとは。。
>画像ファイルを認識しない
char file_path_buffer[1000];
GetDragFilePath(file_path_buffer);
LoadGraph(file_path_buffer);
これで-1が帰ってきたらエラーと認識させるようにいしているのですが、
ShiftJISにないUnicode文字が入った場合は本家に聞かないといけませんね。。
>数を増やしていくと、画像に対して引かれるラインの数が足りない事がある
自分でも認識していたのですが、計算方法が間違っていたのに今気が付きました。
除算の際に、小数をまったく考慮していなかったことが原因でした。
>2つ同時に登録される
ボタン判定ですべて指定座標-1ができていませんでした。
>アニメプレビュー画面から戻ってきたときに2ページ目が表示されないアニメプレビュー画面から戻ってきたときに2ページ目が表示されない
描写のタイミングによってカーソルが表示されていませんでした。。
今回は描写が多く、一つのモードを一つの関数で管理しようとすると
かなり入り組んでしまうと思ったため、
判定と描写は別の関数で処理しています。
そこで起きた描写のタイミングの違いがもたらしました。
あとなぜか2ページ目に無駄な番号が描写されていますね。。
>再生速度を上げ下げすると落ちる
なかなか確認できません。。
10回やって一回ヒットするぐらいなのですが。。
こんなの絶対に見つけられませんでした。
>画像ファイルを認識しない
の良い解決法がありましたご教授お願いします。
今日か明日にバージョンアップしておきます。
その時はまたよろしくお願いします。
477ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(305,513ポイント)
Date: 2009/01/04(日) 18:34
No:26421
|
|
Title: Re:[雑談]自作ツール公開
|
|
いや、でもよくここまで作りましたね。
入力のインターフェース周りに、結構時間かかったんじゃないですか?
>ShiftJISにないUnicode文字が入った場合は
多分自前で WM_DROPFILESメッセージを捉えて処理するしかないんじゃないかと
思います。
でもこれは無理に対応する必要はないかと思いますよ。
この制限で引っかかるようなところに画像は置くな、ということで。
あと、上のは主に不具合でしたが、不都合(?)というか要望の方を。
本当は実際に使う or 使いたい人からの要望の方がいいとは思うのですが、
多分誰からも出るんじゃないかなぁ的なものをピックアップしてみました。
□ アニメプレビュー画面
・ スライダーをドラッグ中にマウスカーソルが外れるとドラッグが解除されてしまう
一般的な挙動として、ドラッグ中は明示的にマウスのボタンを離さない限り
(動かなくても)ドラッグ状態を維持し続けて欲しいです。
・ 画像のリロードの機能の追加
画像サイズが変更されていないことを条件に、今の画像を一端破棄し再読込する機能です。
ここでプレビューしたときに、何か画像に不具合があれば別のツールで編集すると思いますが
そのとき再度プレビューするには、最初の画面まで戻って画像を読み込み直し、
分割数をセットして、アニメパターンを登録してという手順を再度行わなければなりません。
この手間を省く為のリロードです。
(或いは設定を保存できてもいいですね。設定を読み込めばすぐプレビュー画面になる、とか)
530ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(46,088ポイント)
Date: 2009/01/04(日) 19:08
No:26423
|
|
Title: Re:[雑談]自作ツール公開
|
|
あ、入力はフォームではなく、インターフェースというのですか^^;
DXライブラリにも入力をさせる関数KeyInputNumber()があるのですが、
これだと処理ESCキーのみ有効で、あとは何の入力も受け付けないんですよね。。
普段自分たちが使うのより自由度がかなり低かったので、
いっそのことすべて自作してしまえばっと思いまして^^;
ただ、
・数字入力のみ
・バックスペース・デリートキー使用
・カーソル動作
・欄クリック時の背景
など、やる事が山積みでした。
とにかく今後にも使えるように関数化したかったので、
かなり大変でした。(今回は3桁数字の動作までしか実現していませんが。。)
>スライダーをドラッグ中にマウスカーソルが外れるとドラッグが解除されてしまう
これは完全に頭にありませんでした。。
確かに動かしづらいですね。。
>画像のリロードの機能の追加
これは検討していたんですが、やはりあったほうがいいですね。
これなんですが、ドラッグして、サイズに間違いなければ、
プレビュー画面まで飛ぶで良いですかね?
あと先ほどの不具合の報告の中で、
>数を増やしていくと、画像に対して引かれるラインの数が足りない事がある(e000)。
とありました。
これなのですが、実際、セル化されるのは以下のようになっています
例
640×480のサイズの画像を17×1に分割した場合
1セルの大きさは37×480
となります。ゆえに、(630,480)〜(640,480)はカットされます。
ここを考慮していなかったので線描写がおかしかったのです。
解決策としてなのですが、このまま、線描写の際もカットするでよいでしょうか?
余りを最初のセルから順に+1していくということもできますが、
これだと1セルの大きさが変わってしまい、セルがずれていってしまいます。
これはアニメーションにおいてご法度だと思うのですが。。
115ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(45,969ポイント)
Date: 2009/01/04(日) 20:19
No:26425
|
|
Title: Re:[雑談]自作ツール公開
|
|
今よく調べたら、
DXライブラリ関数を使えばもうちょっと簡単に
入力欄はできましたねorz
次回からはそちらを使おうと思いますorz
ただ、MakeKeyInput等を使うとなると、
左からの描写は強そうですけど、
今回自分がやってるような右から描写にはちょっと弱そうですね。。
まぁ、今回自分が作った関数よりはるかに簡潔に書けそうですけど^^;
119ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(306,047ポイント)
Date: 2009/01/04(日) 21:44
No:26427
|
|
Title: Re:[雑談]自作ツール公開
|
|
>いっそのことすべて自作してしまえばっと思いまして
なるほど。
>これは検討していたんですが、やはりあったほうがいいですね。
>これなんですが、ドラッグして、サイズに間違いなければ、
>プレビュー画面まで飛ぶで良いですかね
ないよりは有った方がいいかな、と。
画像編集ツール側で有る程度プレビューができる機能があるなら、
要らないのですが、無い場合やはり「プレビュー -> 修正 -> プレビュー」のフローを
繰り返すのはなかなか大変かと思います(特に分割数やアニメ数が多いと)。
うーん、でもドラッグとリロード、どちらがいいんでしょうね。
想定していたのは、プレビュー画面上のリロードボタンを押したら
同じファイル名のものを、テクスチャサイズチェックだけして読み込み直す、
ものでした。
比較のために別のファイル名のも同じ設定ですぐプレビューしたいということなら
ドラッグの方がいいのかもしれません。
>セル化されるのは以下のようになっています
UV分割は整数で行っているわけですね。
なら、余った部分は表示しない、或いはグレー表示にして、
更にそういう表示されない部分が存在することをどこかに文字に出して
(それがどれぐらいあるのか、も)明確にする、というのがいいのでは
ないでしょうか。
>DXライブラリ関数を使えばもうちょっと簡単に入力欄はできましたねorz
あー、そういう関数もあるんですね。
でもこの一連の関数はヘッダみただけではちょっと判りづらいです……。
簡単に、ということなら私なら、別ウインドウに普通の Windowsのコントロールを
表示して、DXライブラリの表示と連動させる方法をとると思います。
1つのウインドウに通常の Windowsコントロールと DirectXの表示(ピクチャーボックス)を
まとめてしまってもいいかもしれませんが、それがDXライブラリで出来るかどうか……。
534ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(942,226ポイント)
Date: 2009/01/06(火) 18:39
No:26488
|
|
Title: Re:[雑談]自作ツール公開
|
|
遅くなりました。
おぉ!おもしろいですね^^
これだけのインターフェイスを考え、実装するの大変だったでしょうね。
ツール作りって面白いですよね。
私も普段ゲームばかりじゃなく、色々とツール作ったりしますが、
ゲームには無い面白さがありますよね。
いつかサンプルプログラミングの館に追加してみようかなっ。
>Justyさん
掲示板ランク昇進おめでとうございます(笑
173ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(307,355ポイント)
Date: 2009/01/07(水) 01:47
No:26508
|
|
Title: Re:[雑談]自作ツール公開
|
|
>掲示板ランク昇進おめでとうございます(笑
あ、ありがとうございます(w
管理人さんもあと3,4ヶ月くらいで次のランクに行きそうですね。
さすがに私にはそこまでは無理そうです……。
2倍のポイントを手に入れた! 238ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(46,454ポイント)
Date: 2009/01/07(水) 08:00
No:26513
|
|
Title: Re:[雑談]自作ツール公開
|
|
自分もかなり遅れました。。長い間放置で済みませんでした。。
やっと[一応]は完成はできました^^;
また自分のページの
SOFT→DOT_getter~animation_mode~(Ver1.1)
からDLできます。
Justyさんの指摘・アドバイスを受けたところはすべて実現したつもりです^^;が、
いかんせん、ファイル処理が全く慣れておらず、
本当に苦労しました。。こんなに難しいんですね。。
C言語しか手につけていないので分かりませんが、
あまりテキスト処理は向いていないのかなと^^;
そんなことないですかねw
特定の部分を同じテキストファイルに上書きするってすぐできるものだと思っていましたw(えっ
またバグ出そうです。。
>これだけのインターフェイスを考え、実装するの大変だったでしょうね
正月はこれで潰れましたww
一回やり始めちゃうと止まらないんですよね^^;
これでやっと心おきなく寝れますww
>いつかサンプルプログラミングの館に追加してみようかなっ。
ぜひ、自分のものも置いてください♪
またご指導のほど、よろしくお願いします。。
Justyさん、昇進おめでとうございますw
297ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(308,016ポイント)
Date: 2009/01/08(木) 01:23
No:26602
|
|
Title: Re:[雑談]自作ツール公開
|
|
>やっと[一応]は完成はできました^^;
ではちょっくらチェックでも。
と、心おきなく寝てるところ心苦しいですが、もうあと少し、気がします。
□ GUI全般
・ 「前に戻る」がない画面がある
プレビュー画面から遷移する「画像挿入画面」や「設定保存画面」に戻るがありませんが、
これはいいのでしょうか?
・ ボタンの挙動
このアプリでは画面上のボタンに対し、マウスカーソルを合わせてマウスの左ボタンを押した瞬間反応しますが、
通常一般的なボタンは、離した瞬間に動作します。
この違いは特に気にする必要はないでしょうか?
□ 画像表示全般
・ 透過色の設定がされている
画像に黒い部分があると、背景を白くしたときにその部分が抜けてしまいます。
□ セル画確認画面
・ 画像だけでなく、動画を読み込むことができる
動画(avi)をドラッグ&ドロップして、一端ウインドウを裏に(非アクティブ)して
からアクティブにすると動画の再生が始まります。
これはこれでいいのかもしれませんが。
再度、画像ドラッグ&ドロップ画面に戻ると、画像は表示されませんが
動画の音声部分が流れたままになります。
そこで更に別の動画をドラッグ&ドロップし、先ほどと同じく一度非アクティブにしてから
アクティブにすると、今回の動画(音声込み)で再生されますが、やっぱり前の動画の音も
再生されっぱなしになります。
>Justyさん、昇進おめでとうございますw
ありがとうございます。
661ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(47,726ポイント)
Date: 2009/01/08(木) 20:38
No:26643
|
|
Title: Re:[雑談]自作ツール公開
|
|
昨日は心おきなく寝てました^^;
>「前に戻る」がない画面がある
すっかり忘れていました。
>ボタンの挙動
確かに言われてみると違和感があります。
幸い、ボタンは関数化してあるので、すぐに修正はできました。
(まだUPしていませんが。。)
>透過色の設定がされている
これは画像を用いるソフトでは欠かせなかったですね。。
なんとか、ユーザーがマウスで指定(クリック)したところの色をドット単位で取得し、
透過色にセットできそうです。
>画像だけでなく、動画を読み込むことができる
申し訳ないのですが、これだけ確認ができません。
LoadGraphする際、-1が返ると認識エラーとなっています。
・・・mp3とか入れても正常に動きませんね。。
LoadGraphを呼び出すとなにも返ってこないみたいです。
こうなったら、ファイル名(パス)取得の際、拡張子を読み、BMP,JPEG,PNG,DDS,ARGB,TGAのみ認識させる
でないとうまくいかないですかね。。
もうちょっとしたら再度UPします。
本当にご迷惑をおかけして申し訳ありません。
424ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(308,673ポイント)
Date: 2009/01/08(木) 22:54
No:26653
|
|
Title: Re:[雑談]自作ツール公開
|
|
>これは画像を用いるソフトでは欠かせなかったですね。。
透過が必要なケースもありますが、要らないケースもあるんですよね。
>申し訳ないのですが、これだけ確認ができません。
>LoadGraphする際、-1が返ると認識エラーとなっています
そうですか。
うちで試したのは aviファイルでした。
LoadGraph()などは、ファイルが存在しているのに画像ファイルとして
読み込みに失敗すると動画ファイルかもしれないと想定して読み込む機能がありますが、
ひょっとすると何か環境的に何かあるのかもしれませんね。
失敗したときの Log.txtをみてみると、何かわかるかもしれません。
329ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(48,047ポイント)
Date: 2009/01/11(日) 08:44
No:26722
|
|
Title: Re:[雑談]自作ツール公開
|
|
修正やっと終了しました^^;
結局はボタンの修正に一番時間がかかりました^^;
うまくいったようで、ずっといきませんでした。。
透過色なんですが、
.bmpではもともと透過色が設定されていても、指定がなければ透過がされなく、
透過色を指定すればその色が透過色となる。
.png、.jpgではもともと透過色が設定されていれば、透過がされ、
透過色を指定してもその色が透過色とならない。
ようです。自分が実行して得た結果ですが。。
DXライブラリのフォルダに入っているtest4.bmpで透過されるのは確認しましたが、
それ以外はなんだかうまくいかないです。
ドット単位にアクセスして、RGBを、透過色を見てみたのですが、透過部分は
test4.bmpは(R,G,B,a)=(255,0,255,0)
でした。これだとあまり使用されないですかね^^;
うーん。本家相談が必要でしょうか?
実装の仕方がおかしいのでしょうか・・・?
例によって自分のサイトにUPしました。
またまたまたよろしくお願いします。
・・・成人式のスーツ、クリーニングに出したままだっ!!
286ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(21,737ポイント)
Date: 2009/01/11(日) 22:40
No:26751
|
|
Title: Re:[雑談]自作ツール公開
|
|
こんばんはっ!
知識が足りなくてkazuoniさんのツールを拝見させて頂いても
何もお役に立てなくて、ごめんなさい。(謝
こちらに初めてお邪魔した頃に、kazuoniさんにC言語の事でご意見頂いたものです。
その節は、ありがとう御座いました。<_ _>
(以降も、こちらでお世話になりっぱなしです。^^;)
成人式、おめでとうございます!w
98ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(48,350ポイント)
Date: 2009/01/11(日) 23:17
No:26756
|
|
Title: Re:[雑談]自作ツール公開
|
|
DLありがとうございます^^
アニメーション(主にRPGの画像だと思いますが・・・)動作を
これでチェックして、これからプログラム書いたらこんな風に動くのか→
よし、やるぞ!なんてやる気が出てくれればいいなってなツールですw
まぁ、実際は自分で動作確認がしたいがために作っただけなんです^^;
そんなにかしこまらないでいいですよ^^;
まだまだひよっ子ですけど、一応成人迎えました^^
ありがとうございます!
103ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(309,213ポイント)
Date: 2009/01/12(月) 01:18
No:26768
|
|
Title: Re:[雑談]自作ツール公開
|
|
kazuoniさん、ご成人おめでとうございます。
>結局はボタンの修正に一番時間がかかりました^^;
いろいろと余計なことばかり言ってしまってすみません。
1.2を DLしてみたのですが、なんかいろいろと挙動がおかしくなっているような。
真っ先におかしいのがスライダーで、非常に動かすのが難しくなっています。
他にも、ボタンのリリースタイミングでのイベント周りで問題が。
例えばプレビュー画面で、再生ボタンに対しマウスを押し、そのままの状態で
マウスオーバーした後、別のボタン……前に戻るボタンのところでマウスを離します。
すると、何故か前に戻るボタンが実行され、前の画面に戻ってしまいます。
>透過色なんですが、
何がどううまくいかないのか、何が想定と違うのか
少し状況を整理した方がいいですね。
443ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(48,607ポイント)
Date: 2009/01/12(月) 15:20
No:26783
|
|
Title: Re:[雑談]自作ツール公開
|
|
申し訳ありませんでした。。
安易にUPしてしまっていました。。
とりあえず、ボタンは修正してきました。(UP済み)
透過に関してですが、まずここから画像をDLしてみてください。
※ここで使っている画像は臼井の会の管理人様から許可をいただいて使わせてもらっています。
同じ画像で拡張子がすべて違うものです。
実行してみてもらえばわかるのですが、
結果は透過色を指定することによって透過されるのは.bmpだけでした。
自分の想像ではすべて透過されるのかなっと思っていたのですが。。
257ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(309,848ポイント)
Date: 2009/01/12(月) 16:58
No:26794
|
|
Title: Re:[雑談]自作ツール公開
|
|
ファイルの方、見てみました。
>結果は透過色を指定することによって透過されるのは.bmpだけでした。
>自分の想像ではすべて透過されるのかなっと思っていたのですが。。
まず前提として、テクスチャにアルファチャンネルがあるとカラーキーによる
透過設定は無視されます。
で、ファイルを1つ1つ見てみると、このBMPは 8bitで構成されており、
パレットの方にもアルファチャンネルが無いので透過設定が有効になります。
PNGの方はフォーマットの値を見ると 6となっており、これはアルファチャンネルが
設定されているのでカラーキーによる透過設定は無視されます。
(試しにアルファチャンネルを削除したら、透過されました)
JPGはその特性により画像が劣化しており、[255, 0, 0]の色が存在しないことに
起因して透過が行われないものだと思われます。
(試しに [252, 1, 0]で試したら微妙ですが一部透過していました)
434ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(49,357ポイント)
Date: 2009/01/12(月) 17:59
No:26797
|
|
Title: Re:[雑談]自作ツール公開
|
|
んん〜画像に関しての知識がないとちょっとうまく使いこなせなそうです。。
とりあえずgimpをDLして自分も試してみます。
今回搭載した透過色指定の機能はアルファチャンネルが削除されていることが前提となるのですね。
うーん・・・今回は透過色は中途半端な感じで終わりそうですね^^;
94ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(309,595ポイント)
Date: 2009/01/12(月) 18:32
No:26801
|
|
Title: Re:[雑談]自作ツール公開
|
|
>今回搭載した透過色指定の機能はアルファチャンネルが削除されていることが前提となるのですね。
無理矢理カラーキーで透過させたいのであれば、
SetUseTransColorGraphCreateFlag(TRUE);
を読み込み前に置いておくと、透過させることができるはずです。
ただ、これは個人的な意見ですが、色による透過ってどこまで需要があるのでしょうか?
いっそのことアルファチャンネルによる透過はするけど、カラーキーによる透過は無効にしても
いいのではないでしょうか。
253ポイント を落としてしまった。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(49,751ポイント)
Date: 2009/01/12(月) 18:49
No:26802
| 解決!
|
Title: Re:[雑談]自作ツール公開
|
|
>いっそのことアルファチャンネルによる透過はするけど、
>カラーキーによる透過は無効にしてもいいのではないでしょうか。
その通りですね。
その説明を加えて今回の制作は終了し、
正式版をUPしたいと思います。
最後にお尋ねしたいのですが、
Justyさんの名前をReadMe,私のサイトに挙げてもよろしいでしょうか?
(ご協力人の欄として)
今回の制作にあたって、ごく小さな規模でもちゃんとしたものを一つ作ることは
本当に根気のいることだと改めて実感しました。
この制作で学んだことを今後の開発に活かしていきたいと思います。
本当に最後の最後の最後までお付き合いいただき、
誠にありがとうございました。
おそらくまた次回何か作ったらここに来ると思いますので
(もちろん、できる限り自分の力で完成度を上げますが)
その時には、もし時間がありましたらご協力よろしくお願いします。
無力な自分ですが、もし何かお手伝いがあればぜひ協力させていただきます。
本当にありがとうございました^^
>kazuoniさん、ご成人おめでとうございます。
ありがとうございます!お酒のせいで頭が最高に痛いです・・・
394ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(309,703ポイント)
Date: 2009/01/12(月) 21:48
No:26813
|
|
Title: Re:[雑談]自作ツール公開
|
|
>最後にお尋ねしたいのですが、
>Justyさんの名前をReadMe,私のサイトに挙げてもよろしいでしょうか?
はい、構いませんよ。
ありがとうございます。とても光栄です。
>おそらくまた次回何か作ったらここに来ると思いますので
楽しみにしています。
108ポイント を手に入れた。
|
|
|
|
Name: ぽにょ ..ぴよぴよ(21ポイント)
Date: 2009/01/08(木) 21:48
No:26644
|
|
Title: Cのアルゴリズムで煮詰まっています
|
|
課題を解いているのですが考えが煮詰まってしまいました、助言の方、おろしくお願いします
環境 OS:WindowsXP
コンパイラ名とバージョン: visualc++2005
入力した0以上の整数値の2倍を計算して表示することを繰り返し行う。
負の整数値が2回連続入力されたらプログラムが終了する
ただし、無限ループ、breakを使用せずに、for文 while文で実現せよ
(数字以外は入力されないものとする)
(for文とwhile文をわけて実現と、一つの関数(main関数)にfor文とwhile文で実現せよ
#include <stdio.h> /*まずはwhile文から*/
int main()
{
int i;
int n;
int flag=0;
scanf("%d",&n) /*入力*/
while(flag==0) /*flagが0の間ループ
{
/*ループを抜けるフラグとマイナスの値が入力された場合のフラグを
立てたいと思っています*/
printf("%d",2*n) /*2倍を計算して表示*/
}
まだ全然なのでここまでしか考えれませんでした、他にどのような処理が
必要なのか教えて頂ければ嬉しいです。(文章変でスイマセン)
自分の中ではwhileのループを抜けるために
ループの中でflagに1を入れようかなと考えています。
21ポイント を手に入れた。
|
|
|
|
Name: toyo ..上級者(22,920ポイント)
Date: 2009/01/08(木) 22:01
No:26646
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
while(flag==0) /*flagが0の間ループ
{
/* 数値を入力 */
/* 入力値が負の場合もう一度入力 */
/* 入力値が0以上の場合2倍して表示 */
/* そうでない場合flag = 1 */
}
こんな感じでしょうか
2倍のポイントを手に入れた! 220ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(3,646ポイント)
Date: 2009/01/08(木) 22:21
No:26648
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
>toyoさん
負の整数を入力したとき、それが1回目なのか2回目なのかを
どこで判断していますか?
また、負の整数を1回入力した直後にゼロ以上の整数を入力したとき、
負の整数の入力回数をゼロにもどす必要はありませんか?
2倍のポイントを手に入れた! 116ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(12,686ポイント)
Date: 2009/01/08(木) 22:28
No:26649
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
</*ループを抜けるフラグとマイナスの値が入力された場合のフラグを
立てたいと思っています*/
この考えでいいと思いますよ。
あとは負の数かどうかを判定してあげればいいです。
if文を使いましょう。
できるだけ簡単に、基本に即してサンプルを作ってみたので、よければ参考にしてください。
#include <stdio.h>
int main()
{
int i=0;
int number;
int flag=0;
while(flag==0)
{
printf("Enter the number:");
scanf("%d", &number);
if(number < 0)
{
printf("Enter the number:"); //1度負の整数が入力された時の処理
scanf("%d", &number);
if(number < 0)
flag = 1; //2回連続で負の整数が入力されたのでフラグを立てる
}
printf("%d\n",2*number);
}
printf("Exit\n");
}
あとプログラムはプレタブで囲むと見やすくなりますよ^^
2倍のポイントを手に入れた! 840ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(3,670ポイント)
Date: 2009/01/08(木) 22:30
No:26650
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
別の人に質問することにより、あなたにヒントを出していることに気づいてくださいね。>ぽにょさん
24ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(12,826ポイント)
Date: 2009/01/08(木) 22:34
No:26651
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
ダッシュで作ったのにもう回答なさっている方がいる^^;
初級者さんのおっしゃる通り、ポイントはタイミングですかね。
負の数が1度入力されたときにどういった処理をしてあげればよいか、
もう一度よく考えてみてくださいね。
もうサンプルは提示してしまいましたが^^;
140ポイント を手に入れた。
|
|
|
|
|
Name: 初級者 ..入門者(3,753ポイント)
Date: 2009/01/08(木) 22:46
No:26652
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
ところで、「煮詰まる」の本来の意味は
「議論や検討などを重ねて、結論に近づく」です。
どうにもならなくなる(行き詰まる)の意味で
煮詰まるというのは、
本来は正しくありません。
俗語のような形で認めている場合はあるみたいですけれど。
83ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(140,583ポイント)
Date: 2009/01/09(金) 09:04
No:26656
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
whileとforを使用した両バージョンのサンプルです。
そんなに大きな違いはありませんが…(^_^;)
int main(void)
{
int flag = 0, number = 0;
while (flag < 2)
{
/* 値の入力 */
scanf("%d", &number);
if (number < 0)
{
/* 負数の場合はflagをインクリメントする */
++flag;
}
else
{
/* 正数の場合はflagをゼロクリアする */
flag = 0;
/* 入力値の2倍の値を表示する */
printf("%d * 2 = %d\n", number, number * 2);
}
}
/* プログラムの終了を表示する */
printf("Program End\n");
return 0;
}
int main(void)
{
int flag, number = 0;
for (flag = 0; flag < 2; )
{
/* 値の入力 */
scanf("%d", &number);
if (number < 0)
{
/* 負数の場合はflagをインクリメントする */
++flag;
}
else
{
/* 正数の場合はflagをゼロクリアする */
flag = 0;
/* 入力値の2倍の値を表示する */
printf("%d * 2 = %d\n", number, number * 2);
}
}
/* プログラムの終了を表示する */
printf("Program End\n");
return 0;
}
554ポイント を手に入れた。
|
|
|
|
|
Name: ぽにょ ..ぴよぴよ(206ポイント)
Date: 2009/01/12(月) 00:00
No:26760
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
みなさんありがとうございました
おかげさまでなんとか完成しました
サンプルやタイミング、「煮詰まる」の意味など貴重なご意見参考になりました
今回は一つの関数の中でwhile forを一緒に使いたいと思ったので
whileを使ったあと変数を初期化してfor文を使うこうとにしました。
一つ気になったのが
printf("入力して下さい\n");
scanf("%d",&n);
if(n<0)
{
printf("入力して下さい\n")
scanf("%d",&n);
if(n<0)
で、これを効率化できないのかなと思いまして・・・
考えてはみましたが思いつきませんでした
もし、何かあれば教えて下さい。そんな重要な事でもないので・・・。
185ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(141,301ポイント)
Date: 2009/01/12(月) 00:50
No:26766
|
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
こんな感じかな?
負の数が入力された際にフラグの値を1増やして、2になった時点でループを抜けるようになっています。
正の数が入力された場合にはフラグを0にリセットしてやることで、負の数が連続で入力場合の判定を行っています。
#include <stdio.h>
void inputNumber(int* flag, int* number)
{
printf("入力してください\n");
scanf("%d", number);
if (*number < 0)
{
/* 負数が入力されたので、flagの値を1増やす */
++(*flag);
}
else
{
/* 正数が入力されたので、flagの値をリセットする */
*flag = 0;
/* 入力値の2倍の値を表示する */
printf("%d * 2 = %d\n", *number, *number * 2);
}
}
int main(void)
{
int flag = 0, number = 0;
/* whileループバージョン */
while (flag < 2)
{
/* 数値の入力 */
inputNumber(&flag, &number);
}
/* whileループの終了を表示する */
printf("while loop end\n");
/* 変数の初期化 */
flag = 0;
number = 0;
/* forループバージョン */
for ( ; flag < 2 ; )
{
/* 数値の入力 */
inputNumber(&flag, &number);
}
/* forループの終了を表示する */
printf("for loop end\n");
return 0;
}
446ポイント を手に入れた。
|
|
|
|
|
Name: ぽにょ ..ぴよぴよ(256ポイント)
Date: 2009/01/12(月) 21:16
No:26811
| 解決!
|
Title: Re:Cのアルゴリズムで煮詰まっています
|
|
フラグの使い方でそのようなやり方があったとは・・・・
全然気づかなかった・・・・orz
バグさん、ありがとうございました、とてもわかりやすかったです
参考にさせてもらいますね。
50ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(13,254ポイント)
Date: 2009/01/12(月) 16:30
No:26789
|
|
Title: Dx.Lib
|
|
VisualC++ 2008 Express Edition を使用した場合のDXライブラリの使い方
の
#include <DxLib.h>
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
if( DxLib_Init() == -1 ) // DXライブラリ初期化処理
{
return -1 ; // エラーが起きたら直ちに終了
}
DrawPixel( 320 , 240 , 0xffff ) ; // 点を打つ
WaitKey() ; // キー入力待ち
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
実行するとfatal error C1083: include ファイルを開けません。'DxLib.h': No such file or directory
となるんですが何が原因でしょうか?手順通りにできてると思います。
236ポイント を手に入れた。
|
|
|
|
Name: SCI ..初心者(5,751ポイント)
Date: 2009/01/12(月) 16:32
No:26790
|
|
Title: Re:Dx.Lib
|
|
インクルード前処理指令
ヘッダ名を指定するときに「ダブルクォート("dxlib.h")」を使ってみてください。
26ポイント を落としてしまった。
|
|
|
|
|
Name: SCI ..初心者(5,785ポイント)
Date: 2009/01/12(月) 16:37
No:26793
|
|
Title: Re:Dx.Lib
|
|
#includeでは、「山括弧(っていうのかな)(<...>)」を使うと、パスの通ったディレクトリからヘッダを検索します。
対して、「二重引用符("...")」を使うと、ソースファイルのカレントディレクトリを検索し、見つからないようなら、パスの通ったディレクトリから検索します(だったような)。
なので、前者を使いたいのなら、dxlib.h(やその他のファイル)を、パスの通った(コンパイラ構成の一部の)ディレクトリに移しましょう。
後者は、毎回ソースと同じディレクトリにヘッダやライブラリをコピーしてくるといいよっ
34ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(13,283ポイント)
Date: 2009/01/12(月) 21:02
No:26810
|
|
Title: Re:Dx.Lib
|
|
" "を使ってみましたが同じ結果なので手順がおかしいのかもしれません。
もう一度やり直してみます。
29ポイント を手に入れた。
|
|
|
|
Name: しょしょしょしんしゃ ..中級者(13,437ポイント)
Date: 2009/01/12(月) 02:00
No:26769
|
|
Title: LU分解法 逆行列の計算
|
|
また同じような質問なので、すみません。
LU分解を用いて、3次正方行列の逆行列の計算をする問題なのですが、分かりませんでした。
まず、上手くLとUに分解できたのですか、その後のLの逆行列とUの逆行列を出すことができませんでした。
そして、問題の答えである、Lの逆行列とUの逆行列の掛算がうまくできませんでした。
LとUの逆行列ができないので、それはそうなのですが、すみません。
LとUの分解を以下に載せておきます。
#include <stdio.h>
#include <math.h>
#define N 3
float A[N][N]={{2.0,1.0,1.0},{1.0,5.0,-1.0},{-1.0,1.0,-3.0}};
int main(void){
int i,j,k,p,q;
float L[N][N]={0.0},U[N][N]={0.0};
float lu;
for(j=0;j<N;j++) L[j][j]=1.0;
for(j=0;j<N;j++) U[0][j]=A[0][j];
for(j=1;j<N;j++) L[j][0]=A[j][0]/U[0][0];
for(j=1;j<N-1;j++){
for(q=j;q<N;q++){
lu=0.0;
for(k=0;k<j;k++) lu+=L[j][k]*U[k][q];
U[j][q]=A[j][q]-lu;
}
for(p=j+1;p<N;p++){
lu=0.0;
for(k=0;k<j;k++) lu+=L[p][k]*U[k][j];
L[p][j]=(A[p][j]-lu)/U[j][j];
}
}
lu=0.0;
for(k=0;k<N-1;k++)lu+=L[N-1][k]*U[k][N-1];
U[N-1][N-1]=A[N-1][N-1]-lu;
for(i=0;i<N;i++){
printf("[ ");
for(j=0;j<N;j++)printf("%9f ",A[i][j]);
printf("]\n");
}
printf("のLU分解は\n");
for(i=0;i<N;i++){
printf("[ ");
for(j=0;j<N;j++)printf("%9f ",L[i][j]);
printf("]\n");
}
printf("\n");
for(i=0;i<N;i++){
printf("[ ");
for(j=0;j<N;j++)printf("%9f ",U[i][j]);
printf("]\n");
}
return(0);
}
同じような問題である、3次正方行列の方程式を解く問題は解けましたので、以下に載せておきます。
#include <stdio.h>
#include <math.h>
#define N 3
float A[N][N]={{2.0,1.0,1.0},{1.0,5.0,-1.0},{-1.0,1.0,-3.0}};
float B[N]={3.0,-6.0,-8.0};
int main(void){
int j,k,p,q;
float L[N][N]={0.0},U[N][N]={0.0};
float lu;
float x[N],y[N];
for(j=0;j<N;j++) L[j][j]=1.0;
for(j=0;j<N;j++) U[0][j]=A[0][j];
for(j=1;j<N;j++) L[j][0]=A[j][0]/U[0][0];
for(j=1;j<N-1;j++){
for(q=j;q<N;q++){
lu=0.0;
for(k=0;k<j;k++) lu+=L[j][k]*U[k][q];
U[j][q]=A[j][q]-lu;
}
for(p=j+1;p<N;p++){
lu=0.0;
for(k=0;k<j;k++) lu+=L[p][k]*U[k][j];
L[p][j]=(A[p][j]-lu)/U[j][j];
}
}
lu=0.0;
for(k=0;k<N-1;k++)lu+=L[N-1][k]*U[k][N-1];
U[N-1][N-1]=A[N-1][N-1]-lu;
y[0]=B[0];
for(k=1;k<N;k++){
lu=0.0;
for(j=0;j<k;j++)lu+=L[k][j]*y[j];
y[k]=B[k]-lu;
}
x[N-1]=y[N-1]/U[N-1][N-1];
for(k=N-2;k>=0;k--){
lu=0.0;
for(j=N-1;j>k;j--)lu+=U[k][j]*x[j];
x[k]=(y[k]-lu)/U[k][k];
}
printf("解:x=%f y=%f z=%f\n",x[0],x[1],x[2]);
return(0);
}
非常に長くなりましたが、暇のある人は挑戦してみてください。お願いします。
1,396ポイント を手に入れた。
|
|
|
Name: 774 ..入門者(4,271ポイント)
Date: 2009/01/12(月) 17:47
No:26795
|
|
Title: 出力データの文字コードについて
|
|
新年明けましておめでとうございます。
現在HTML出力に関して困っていることがありますので、
こちらにて質問させていただきます。
プログラムでHTMLデータを出力するようになっているのですが、
エンコードを"UTF-8"で出力したいのです。
ただそのままmetaタグにて指定し、出力すると、文字化けを起こしてしまいます。
TeraPadなどのエディタを使用し、文字コードを指定保存>UTF-8にて上書きすると
文字化けもなく観覧できるようです。
出力の際に文字コードを指定することは可能でしょうか?
130ポイント を落としてしまった。
|
|
|
|
Name: 774 ..ぴよぴよ(87ポイント)
Date: 2009/01/12(月) 17:59
No:26798
|
|
Title: Re:出力データの文字コードについて
|
|
早速の返信ありがとうございます。
出力はfopen,fclose,fputsを使用し、以下の形で行おうと考えています。
fp = fopen("w", "index.html");
fputs("<html>\n", fp)
〜略〜
fclose(fp);
87ポイント を手に入れた。
|
|
|
|
|
Name: 774 ..ぴよぴよ(801ポイント)
Date: 2009/01/12(月) 18:12
No:26800
| 解決!
|
Title: Re:出力データの文字コードについて
|
|
こちらに表記したfopenの順序が逆でしたorz
んー、16進数でいくしかないのですね。
回答ありがとうございました。
31ポイント を落としてしまった。
|
|
|
|
Name: まゆ ..ぴよぴよ(94ポイント)
Date: 2009/01/09(金) 10:16
No:26659
|
|
Title: c言語のクイズを作っているのですが...
|
|
c言語のクイズを作っているのですが、
do{
printf("番号を入力 >"); scanf("%d",&n);
if( 3!=n ) printf("ハズレ\n");
} while( 3!=n );
printf("当たり☆\n\n");
上のようにdo〜while文を使って作っているのですが、
正解数をカウントする方法がわかりません
すみません教えてください
お願いします
94ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(12,439ポイント)
Date: 2009/01/09(金) 10:23
No:26660
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
int countでも作って
正解の度にcount++;で
1ずつ増やしてやればいいのでは
35ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(948,763ポイント)
Date: 2009/01/09(金) 13:35
No:26672
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
普通に正解した時に数をカウントしてみたらいいですよ^^
ちとサンプル作ってみました。
#include <stdio.h>
typedef struct{
char Quest[128];
char Ans[3][128];
int AnsNum;
}Question_t;
Question_t Question[4]={
{
{"ここのHPの名前は何ですか?"},
{{"C言語何でも丸投げサイト"},{"C言語何でも回答サイト"},{"C言語何でも質問サイト"}},
3,
},
{
{"3つある館のうち最も後に出来た館は何ですか?"},
{{"ゲームプログラミングの館"},{"サンプルプログラミングの館"},{"龍神録プログラミングの館"}},
2,
},
{
{"管理人の昨日の晩飯は何だったでしょうか?"},
{{"特上寿司"},{"松坂牛サーロインステーキ"},{"鯖の缶詰"}},
3,
},
};
int main(void){
int i,j;
int AnsNum;
int CorrectAnsNum=0;
printf("以下の問題に対する答えを1〜3の数字を入力する事によって回答して下さい。\n\n");
for(i=0; i<3; i++){
printf("Q.%d: %s\n",i+1,Question[i].Quest);
for(j=0; j<3; j++){
printf("(%d):%s, ",j+1,Question[i].Ans[j]);
}
printf("\n");
scanf("%d",&AnsNum);
if(AnsNum == Question[i].AnsNum){
printf("正解です!\n\n");
CorrectAnsNum++;
}
else{
printf("ブー\n\n");
}
}
printf("\n\n");
printf("正解数は%d個でした!\n",CorrectAnsNum);
return 0;
}
実行結果例
以下の問題に対する答えを1〜3の数字を入力する事によって回答して下さい。
Q.1: ここのHPの名前は何ですか?
(1):C言語何でも丸投げサイト, (2):C言語何でも回答サイト, (3):C言語何でも質問サイト,
1
ブー
Q.2: 3つある館のうち最も後に出来た館は何ですか?
(1):ゲームプログラミングの館, (2):サンプルプログラミングの館, (3):龍神録プログラミングの館,
2
正解です!
Q.3: 管理人の昨日の晩飯は何だったでしょうか?
(1):特上寿司, (2):松坂牛サーロインステーキ, (3):鯖の缶詰,
1
ブー
正解数は1個でした!
色々と書きましたが、結局やってる事は
・問題文表示
・回答番号受け取り
・正解かどうかの判断と正解数の加算
だけです。構造体についてもしご存じなかったらいまいちわからないプログラムだったかもしれません。
何か解らない点があれば言って下さい^^
1,112ポイント を手に入れた。
|
|
|
|
|
Name: TOMONORI ..ぴよぴよ(220ポイント)
Date: 2009/01/11(日) 19:21
No:26743
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
正解数を数えるということは何種類か問題があって、何問中何問正解!みたいな感じですよね?
Dixqさんの仰るとおり構造体を使うのがいいです。
とはいえいきなりこんなに充実したプログラムでは畏怖の対象になりかねないので、
もっとレベルの低い人による、レベルの低いサンプルが役に立つかもしれません。
とりあえず構造体を実装すると・・・
#include <stdio.h>
/* 問題構造体 */
struct Quiz
{
/* 問題文 */
const char * quest; /* questを文字列として宣言 */
/* 答え */
int correctAns; /* 答えはint型に限定 */
};
int
main()
{
int ans; /* プレーヤーの解答 */
int correctAnsNum = 0; /* 正解数のカウンタ */
struct Quiz q1; /* 問題構造体"struct Quiz"が型名(intみたいな役割) */
/* 問題文の設定 */
q1.quest = "1+3は?";
/* 答えの設定 */
q1.correctAns = 4;
do{
printf(q1.quest);
scanf("%d", &ans);
if(ans != q1.correctAns)
{
printf("ハズレ\n");
}
++ correctAnsNum; /* 毎回1増やします */
}while(ans != q1.correctAns);
printf("当たり☆\n\n");
return 0;
}
このままだと問題数1で、正解数は必ず1回の変なプログラムになってしまうので改良します。
問題数が1のままだとまずいから、構造体を配列にして・・・
#include <stdio.h>
/* 問題構造体 */
struct Quiz
{
/* 問題文 */
const char * quest; /* questを文字列として宣言 */
/* 答え */
int correctAns; /* 答えはint型に限定 */
};
int
main()
{
int ans; /* プレーヤーの解答 */
int correctAnsNum = 0; /* 正解数のカウンタ */
int questNum; /* 問題番号 */
struct Quiz q[2]; /* 問題構造体配列*/
/* 問題の初期化 */
q[0].quest = "1+3は?";
q[0].correctAns = 4;
q[1].quest = "2+1は?";
q[1].correctAns = 3;
for(questNum = 0;
questNum < 2;
++ questNum)
{
printf(q[questNum].quest);
scanf("%d", &ans);
if(ans == q[questNum].correctAns)
{
++ correctAnsNum; /* 合ってたら正解数を増やす */
printf("当たり☆\n");
}
else
{
printf("どんまいヽ(´ー`)ノ\n");
}
}
printf("正解数:%d / 2", correctAnsNum);
return 0;
}
とりあえず追加で必要な知識は構造体だけだと思うのですぐに理解できると思います。
それと、今回はdo-whileの活躍場所はあんまりない気がします。
課題で指定されている場合は使うしかないですけどね。
220ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,429ポイント)
Date: 2009/01/11(日) 23:41
No:26757
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
TOMONORIさん、そのコードは翻訳確認・動作確認をしましたか?
17ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,453ポイント)
Date: 2009/01/11(日) 23:46
No:26759
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
と思ったらちゃんと動きますね。私の勘違いでした(笑
24ポイント を手に入れた。
|
|
|
|
|
Name: TOMONORI ..ぴよぴよ(371ポイント)
Date: 2009/01/12(月) 13:26
No:26775
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
>>SCIさん
びっくりさせないでください。自分は小心者なので心臓が止まりましたよ(嘘)。
でもあれですよ、『こりゃ動くけど普通そうは書かないだろー』みたいな箇所があったら
教えてくださるとうれしいです。この板の趣旨とは少しずれてしまうかもしれませんが、
標準的な書き方のほうが参考になると思いますし。
151ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,777ポイント)
Date: 2009/01/12(月) 16:26
No:26788
|
|
Title: Re:c言語のクイズを作っているのですが...
|
|
const char * quest;
と
char * const quest;
を見間違えてしまっただけです(笑)
29ポイント を手に入れた。
|
|
|
|
Name: ibis ..上級者(16,372ポイント)
Date: 2009/01/11(日) 15:53
No:26732
|
|
Title: IDE
|
|
まぁどちらかというと統合開発環境というよりもコンパイル補助環境という感じですね。
プロジェクトを介さずに、ソースファイルを直接コンパイルしたいんですよ。
それで調度良いIDEが見つからないので自作してみた訳です。
87ポイント を落としてしまった。
|
|
|
|
Name: ibis ..上級者(16,325ポイント)
Date: 2009/01/11(日) 15:55
No:26733
|
|
Title: Re:IDE
|
|
ミスって途中で投稿してしまった。
で、これに何か問題(バグとか、不都合とか)は無いですか、ということです。
47ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(309,414ポイント)
Date: 2009/01/12(月) 03:00
No:26771
|
|
Title: Re:IDE
|
|
>、これに何か問題(バグとか、不都合とか)は無いですか、ということです。
設定ファイルの読み込みは、空白の存在を考慮に入れないと失敗することがあります。
例えば、うちの Visual C++へのパスは
D:\Program Files\Microsoft Visual Studio 9.0\VC\bin\cl.exe
と空白がいくつか入っていますが、この設定ファイルの読み込みルーチンではこの指定を
正しく取得できません。
又、同様のことは std::systemによる実行時にも考慮しないと、正しく実行が行われない
可能性があります。
201ポイント を手に入れた。
|
|
|
|
|
Name: ibis ..上級者(16,397ポイント)
Date: 2009/01/12(月) 14:56
No:26779
|
|
Title: Re:IDE
|
|
ありがとうございます。
作り始めた頃は空白の処理も考えてましたが、途中から完全に忘れてました。
空白の処理も含めて、何箇所か改修しました。
72ポイント を手に入れた。
|
|
|
|
Name: 774 ..入門者(2,864ポイント)
Date: 2009/01/11(日) 22:57
No:26754
|
|
Title: 課題が・・・
|
|
こんばんわ、また課題でどうすればいいのかがわからなくなったので来ました。
今回の課題は1*2+3と式を文字列入力したらポーランド記法で表示して計算結果を取り出す、というプログラムです。
条件があって、()とマイナスの考慮で入れ方をツリー構造体で入れていくという条件です。
今、計算と()の判断とマイナス考慮はとりあえず置いておいて、表示ができるように使用としています。
プログラムの作り方は式を入力したら関数内に飛び、引地として持ってきた文字列を後ろからfor文とif文で+とーから検索、次に数字を*と/を検索という演算子の検索優先順位にして、それを抜けたら数字を入れていき、再帰プログラムでツリーができるまで続けるというようにます。
ですが、途中まで行くと無限ループになってしまいます。
よく見てみてもわからないのですが、どこをどう直せばいいのでしょう。
これが今のプログラムのソースの状態です。
関数内のスペースもtabスペースもしていないprintfのものは確認用のprintfです。
#include <stdio.h>
#include <string.h>
#define N 50
/*構造体の宣言*/
struct node
{
char str[N];
struct node *left;
struct node *right;
};
void print_tree(struct node *p);
struct node *kansu(char str[]);
int main(void)
{
struct node *root;
char d[N];
int i, j = 0;
/* ツリー作成 */
printf("文字列入力 ");
fgets(d, 100, stdin);
d[strlen(d) - 1] = '\0'; /* 余分な改行コードを削除 */
do
{
root = NULL; //ルートにNULLを入れる
root = kansu(d); //入力した値dをkansu関数の引値として入れてルートに入れる
print_tree(root); //rootをprint_tree関数の引地として入れる
printf("\n");
printf("文字列入力 ");
fgets(d, 100, stdin);
d[strlen(d) - 1] = '\0'; /* 余分な改行コードを削除 */
}
while(strcmp(d, "quit") != 0);
return 0;
}
//ツリー出力
void print_tree(struct node *p)
{
if(p!=NULL)
{
print_tree(p->left);
print_tree(p->right);
printf("%c", p->str[N]);
}
}
struct node *kansu(char str[])
{
int i;
char rstr[N], lstr[N];
struct node *p;
printf("い%s\n", str);
for(i=strlen(str)-1; str[i] != '+' && str[i] != '-' && i>=0; i--); //+とーを探索するループ
if(str[i] == '+' || str[i] == '-') //もしstr[i]が+かーだったら
{
printf("ろ%c\n", str[i]);
p->str[0] = str[i];
p->str[1] = '\0';
}
else //そうでなかったら
{
printf("は%s\n", str);
for(i=strlen(str)-1; str[i] != '*' && str[i] != '/' && i>=0 ; i--); //*と/を探索するループ
printf("に%c\n", str[i]);
if(str[i] == '*' || str[i] == '/')
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
printf("ほ%c\n", str[i]);
p->str[0] = str[i];
p->str[1] = '\0';
}
}
if(str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/') //もし数字だったら
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
printf("へ%c\n", str[i+1]);
str[i] = str[i+1];
p->str[0] = str[i];
p->str[1] = '\0';
}
else //そうでなかったら
{
strcpy(rstr, str+i+1);
printf("と%s\n", rstr);
strncpy(lstr, str, i);
lstr[i] = '\0';
printf("ち%s\n", lstr);
}
/* 再帰部分 */
p->right = kansu(rstr);
p->left = kansu(lstr);
return p;
}
以上がソースの内容です。
どうかよろしくお願いしますm( )m
1,646ポイント を手に入れた。
|
|
|
|
Name: たいちう ..上級者(20,983ポイント)
Date: 2009/01/12(月) 00:21
No:26761
|
|
Title: Re:課題が・・・
|
|
間違っている所が4-5箇所あったよ。まだ残っていたらすまん。
void print_tree(struct node *p)
{
if(p!=NULL)
{
print_tree(p->left);
print_tree(p->right);
printf("%c", p->str[0]);
}
}
struct node *kansu(char str[])
{
int i;
char rstr[N] = { '\0' }, lstr[N] = { '\0' };
struct node *p;
for(i=strlen(str)-1; str[i] != '+' && str[i] != '-' && i>=0; i--); //+とーを探索するループ
if(str[i] == '+' || str[i] == '-') //もしstr[i]が+かーだったら
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
p->str[0] = str[i];
p->str[1] = '\0';
}
else //そうでなかったら
{
for(i=strlen(str)-1; str[i] != '*' && str[i] != '/' && i>0 ; i--); //*と/を探索するループ
if(str[i] == '*' || str[i] == '/')
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
p->str[0] = str[i];
p->str[1] = '\0';
}
}
if(str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/') //もし数字だったら
{
p = malloc(sizeof(struct node));
p->right = NULL;
p->left = NULL;
p->str[0] = str[i];
p->str[1] = '\0';
}
else //そうでなかったら
{
strcpy(rstr, str+i+1);
strncpy(lstr, str, i);
lstr[i] = '\0';
}
/* 再帰部分 */
if (rstr[0])
p->right = kansu(rstr);
if (lstr[0])
p->left = kansu(lstr);
return p;
}
2倍のポイントを手に入れた! 680ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(21,046ポイント)
Date: 2009/01/12(月) 00:26
No:26762
|
|
Title: Re:課題が・・・
|
|
もう少しで自力で完成できたのでは?惜しかったね。
文字列"1*2+3"の入力は当然試したと思うけど、
"3"や"1*2"とかのみの入力は試しましたか?
最も簡単なケースでデバッグを始めると良いでしょう。
63ポイント を手に入れた。
|
|
|
|
|
Name: 774 ..入門者(2,956ポイント)
Date: 2009/01/12(月) 11:14
No:26774
| 解決!
|
Title: Re:課題が・・・
|
|
ミスの指摘ありがとうございます!
メモリの確保や判定等が色々忘れていたんですね・・・気をつけます。
3と1*2・・・それは試してませんでした。以後、気をつけます。
ご指摘ありがとうございました。
92ポイント を手に入れた。
|
|
|
|
Name: ひよこ ..初心者(7,586ポイント)
Date: 2009/01/11(日) 13:38
No:26729
|
|
Title: Dixqさん問題4,5の回答
|
|
4. Zキーが押された瞬間一度だけ「押されました」とprintfDxで表示するプログラムを書いて下さい。(裏画面処理使う)
5. Aキーが押された瞬間一度だけドの音が鳴るプログラムを書いて下さい。(裏画面処理使う)
4
#include "DxLib.h"
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int Key[256];
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
DrawFormatString(0,0,GetColor(255,255,255),"%d",Key[KEY_INPUT_Z]);//エンター入力カウント
if(Key[KEY_INPUT_Z]==1)//今の瞬間押されたら
printfDx( "押されました" ) ;
ScreenFlip();
}
DxLib_End();
return 0;
}
5
#include "DxLib.h"
int GetHitKeyStateAll_2(int KeyStateBuf[]){
char GetHitKeyStateAll_Key[256];
GetHitKeyStateAll( GetHitKeyStateAll_Key );
for(int i=0;i<256;i++){
if(GetHitKeyStateAll_Key[i]==1) KeyStateBuf[i]++;
else KeyStateBuf[i]=0;
}
return 0;
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
int Key[256];
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
int Sound;
Sound = LoadSoundMem("do.ogg");
while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
DrawFormatString(0,0,GetColor(255,255,255),"%d",Key[KEY_INPUT_Z]);//エンター入力カウント
if(Key[KEY_INPUT_A]==1)//今の瞬間押されたら
PlaySoundMem(Sound, DX_PLAYTYPE_BACK);
ScreenFlip();
}
DxLib_End();
return 0;
}
これでよろしいのでしょうか?
993ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(133,358ポイント)
Date: 2009/01/11(日) 14:45
No:26730
|
|
Title: Re:Dixqさん問題4,5の回答
|
|
> これでよろしいのでしょうか?
まず「ご自分で」テストしてみる、というわけにはいきませんか?
28ポイント を落としてしまった。
|
|
|
|
|
Name: ひよこ ..初心者(7,614ポイント)
Date: 2009/01/11(日) 15:24
No:26731
|
|
Title: Re:Dixqさん問題4,5の回答
|
|
>まず「ご自分で」テストしてみる、というわけにはいきませんか?
問題4で一瞬だけ表示するか?わからないので上のように質問しました。
問題5はいちおうテストしてあります。
28ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(949,934ポイント)
Date: 2009/01/11(日) 17:46
No:26735
|
|
Title: Re:Dixqさん問題4,5の回答
|
|
だいたいあってます。
ただ、少しおしいのが、Keyが初期化されていないので、おかしな値が出る場合があります。
館のサンプルではKeyがグローバル変数だったので、初期化の必要がありませんでしたが、
ローカル変数を使う時は初期化しないといけません。
int Key[256]={0,};
このように書くか、memset関数で0で初期化して下さい。
後はよさそうです。
ここまで出来たら最初できなかった問題が出来ると思いますが、どうでしょう?
112ポイント を手に入れた。
|
|
|
|
|
Name: ひよこ ..初心者(7,642ポイント)
Date: 2009/01/12(月) 09:20
No:26773
|
|
Title: Re:Dixqさん問題4,5の回答
|
|
Dixqさんありがとうございます。実は3の. Zキーが押されれいる間DrawStringで「押されています」と表示するプログラムを書いて下さい。(裏画面処理使う) がわからないのですが。
28ポイント を手に入れた。
|
|
|
|
Name: 海老天 ..入門者(3,102ポイント)
Date: 2009/01/11(日) 05:04
No:26717
|
|
Title: お勧めのゲームプログラミングの書籍について
|
|
最近ゲームプログラミングの書籍の猫でもわかるゲームプログラミングを買ったのですが説明が難解すぎて理解できませんでした
そこで他の書籍を買おうと思うのですがおススメを教えていただけないでしょうか
自分は大学に入って2年しかプログラムを勉強していないド素人なのできるだけ簡単なものを教えていただけると助かります
78ポイント を手に入れた。
|
|
|
|
Name: きらりん ..入門者(4,122ポイント)
Date: 2009/01/11(日) 05:30
No:26718
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
素人の僕の意見でしかないのですが、本で勉強するよりここのサイトで勉強する方が勉強しやすい気がします。
サンプルソースも多くとても勉強しやすいです。
Dxライブラリの機能は
ゲームプログラミングの館とヘルプを使えばほとんど理解できますし、
龍神録に関しては
書籍「シューティングアルゴリズムマニアックス」
よりも内容が濃いですし・・・。
自分の意見は、ゲームプログラミングの書籍よりも、CやC++、デザインパターン、DirectXなんかの本のほうが良いと思います。
195ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(140,827ポイント)
Date: 2009/01/11(日) 06:50
No:26720
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
ゲームプログラミングの本は、基本的にCやC++をある程度理解している事を前提に書かれていますので、敷居が高い物も少なくないですよね。
開発環境にもよると思いますが、DXライブラリを使用するのであれば、このサイトは分かりやすいと思います。
WIN32APIを使用するのであれば、Windowsゲームプログラミングという書籍がオススメですね。イベントドリブン形式のプログラミングや、マルチスレッドについても詳しく解説されてますので、取っ掛かりとしては使いやすいと思います。
28ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(48,228ポイント)
Date: 2009/01/11(日) 09:35
No:26723
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
自分もDXライブラリ使用ならこのサイト派ですねっw^^;
書籍は、今本屋にあるもの大体すべてに目を通しましたが(暇)
一年たった今でも、もし書籍どおりにすべてやるとしたら
「あ、これは途中で諦めるっぽいな」
って思います。(やる気次第なんですが^^;)
ある特定の章をがっつりやるって感じですかね。
やはり何を作るか決めたほうがいいかと思います。
今思ったんですが、もうちょっと頑張れば、
管理人さんとarrayさんのページ合わせて本作れるんじゃ?^^;
181ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(950,091ポイント)
Date: 2009/01/11(日) 18:03
No:26737
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
なんか、恐縮です^^;
>管理人さんとarrayさんのページ合わせて本作れるんじゃ?
いいですね〜、私も書いてみたいですよ本。
でも、私のような人間が出版するのは恐れ多いのと、DXライブラリを使ったゲームとなると、
DXライブラリ製作者の山田様の権利的な話も絡んでくる可能性があり・・。
ただDXライブラリを使ったゲーム制作についての本は既に出版されているので、
出版出来る可能性はあるかもしれません。
まぁどのみちいつか出版を夢見るとしても、今はまだそんな身分じゃないので、スキルを磨く事に専念します^^;
色々頭の中で構想描いたりはしてるんですけどねw
ゲームプログラム解説本はいくつかありますが、ゲームプログラムの基本や特定の部分について掘り下げたものは書いてあれど、
ゲームの中身だけじゃなく、メニュー画面についてや、エンディングの作り方、セーブデータの作り方・読み込み方など、
「一つの作品」となるまで解説してる本は見かけないんですよね。
私がもし作るなら「一つの作品」となるまで解説書きたいなぁと思ってます。
>海老天さん
海老天さんは確か以前ゲームプログラミングの館を参考にしてくださってましたよね?
もし「ゲームが作りたいけど、この辺の解説が無いから作り方がよくわからない」ってことあれば教えてもらえませんか?
ゲームプログラミングの館制作の参考にさせていただきたいのでm(_ _)m
75ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(43,693ポイント)
Date: 2009/01/11(日) 19:03
No:26742
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
「龍神録を作ろう」みたいな本・・・とは言いませんが
Dixqさんの言う様な「一つの作品」となるまで解説してる本があったら欲しいですね。
前にも、龍神録を解説する本を書かないんですか?みたいなスレッドがあったと思うのですが
期待してますよ。Dixqさんw
実際の所、本でなくても龍神録のプログラムコードってお金になるレベルだと思うんですよね。
就職の面接時にまで龍神録の事を考えてるqさんなら余裕余裕w
146ポイント を手に入れた。
|
|
|
|
|
Name: 海老天 ..入門者(3,216ポイント)
Date: 2009/01/11(日) 19:27
No:26744
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
>管理人様
個別の機能の実装はなんとかできるのですが
やはりおっしゃられているように
一つのゲームとして完成するまでの解説で
SLGやRPGのものをしていただけると非常にありがたいです
2倍のポイントを手に入れた! 114ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(951,292ポイント)
Date: 2009/01/11(日) 19:57
No:26745
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
「猫でもわかるプログラミング」のサイトは、その高い人気から、
出版社から出版の依頼が来て、出版した・・みたいな感じですかね?
それとも、自費出版なんでしょうかね。
自費出版ってすごいお金がかかるイメージが^^;
・・それにここの回答常連の方の中では管理人でありながらスキル的に最低レベルに位置すると思うので、
そんな人間が出版なんかしたら黒歴史にしかならないと思うんですよね^^;
ゲームのVerUPみたいに、簡単に間違いとか修正して更新出来たらいいですが、
本だとそうもいかないんでしょうし・・。
・・・そう思う反面、もう数年したら、2Dシューティングなんて興味の対象にならないようになりそうなんで、
今のうちに何か行動したいと思う気持ちもあります・・・難しいですねw
>>海老天さん
あぁ、やはりそこでしたか。
そうなるとゲームの館のような部分的な解説じゃ間に合わないですね^^;
龍神録の館を早く完成させてしまうのが当面の目標かな・・。
ただSLGは簡単だと思います。
SLGの館なら頑張ったら10日位で作れるかも・・?
2月後半になったら少し時間が出来るので、その辺の時間使って作ってみようと思います^^
517ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..入門者(4,549ポイント)
Date: 2009/01/11(日) 19:58
No:26746
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
array様
>>実際の所、本でなくても龍神録のプログラムコードってお金になるレベルだと思うんですよね。
そうですよねー何処のシューティングの本より弾幕に関しては勝っていると思いますw
管理人様
>>この辺の解説が無いから作り方がよくわからない」ってことあれば教えてもらえませんか?
自分もいいですか?w(マテ)
管理人さまも言ってたようにメニューなんかのがあると嬉しいなーっとか思ってました。
作れるっちゃ作れるんですが・・・フラグ使いまくったり、なんかとっても汚いコードでしか作れないんですよね・・・何に関してもですけど。(これは何度も練習するしかないわけですが・・・w)
お手本があるとやりやすいなーっとか思ってました。
力技ならできるけど、綺麗に書こうとしても描けない→設計ができてないってことなのかな・・・。
ということはプログラミングとは直接関係ないですが、設計に関しての助言みたいな?のがあったら嬉しいかなって今思いました。
427ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(140,855ポイント)
Date: 2009/01/11(日) 20:30
No:26749
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
メニュー、ゲーム、エンディングなど、パーツごとにクラス化すると、管理が楽ですよ(^-^)
28ポイント を手に入れた。
|
|
|
|
|
Name: 意見 ..ぴよぴよ(104ポイント)
Date: 2009/01/11(日) 22:42
No:26752
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
本家東方が存在するということを認識すべきです。
書籍化とか、弾幕に関して勝っているとか、言うものではないですよ。
一応、ここには本家東方プレイヤーもいるので・・・
言い方がきついと思われるでしょうが、管理人さんが東方好きであるからこそ、こういった流れが出来てしまうのは少々残念なのです。
104ポイント を手に入れた。
|
|
|
|
|
Name: 海老天 ..入門者(3,257ポイント)
Date: 2009/01/11(日) 22:43
No:26753
| 解決!
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
>管理人様
お忙しい中本当にありがとうございます
それまでに少しでも技術を磨くためにこのサイトのお世話になります
41ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(21,788ポイント)
Date: 2009/01/11(日) 22:59
No:26755
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
解決ボタンを押された後の投稿、申し訳ないです。(謝
>SLGやRPGのものをしていただけると非常にありがたいです
RPGのものをしていただけると非常にありがたいです。(笑
51ポイント を手に入れた。
|
|
|
|
|
Name: ななし ..かけだし(1,517ポイント)
Date: 2009/01/11(日) 23:44
No:26758
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
東方厨ってこんな所にまで出現するんですね。
弾幕への愛だけはどの本にも負けないとか、発言するなとわざわざ忠告するほどの事?
こんな流れになるのが残念なら自ら流れを作らないで下さい。
2倍のポイントを手に入れた! 98ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..入門者(4,895ポイント)
Date: 2009/01/12(月) 02:25
No:26770
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
管理人様
>>「猫でもわかるプログラミング」のサイトは、その高い人気から、
>>出版社から出版の依頼が来て、出版した・・みたいな感じですかね?
ロベールのC++もサイトからですよね。
サイトからできた本は良本と考えると正解なのかもしれませんねw
>>メニューの作り方・・とは少し違うかもしれませんが、選択項目とその制御のサンプルこちらに書いたことが>>あるのでよければご覧下さいm(_ _)m
こんなところに・・・w
また時間があるときに拝見させて頂きます。
現在テストに殺されかけているので・・・w
>>本格的なメニューの作り方についてはやはり龍神録の館で紹介するのがよさそうですね。
楽しみにしていますwでも無理はしないでくださいねー。
バグ様
>>メニュー、ゲーム、エンディングなど、パーツごとにクラス化すると、管理が楽ですよ(^-^)
クラスの使い方はわかってるんですが、まだ覚えたばかりなのでうまくできないんですよね・・・。
逆に一つの物を作るのがカオスな状態になってしまいます・・・w精進あるのみですねぇ。
どこまでをそのクラスに入れていいのかの判断がとても難しいです。
意見様
東方をイメージしているとはいえ東方とは関係がありません。
龍神録のソースは管理人様独自で考えたソースです。
プログラマーならわかるはずです。意味不明な発言は控えましょう。
346ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(951,562ポイント)
Date: 2009/01/12(月) 04:40
No:26772
|
|
Title: Re:お勧めのゲームプログラミングの書籍について
|
|
>意見さん
ご意見ありがとうございます。
確かに龍神録はZUNさんが時間をかけて苦労して作られた東方を利用した、いわばずるいゲームですよね。
私はZUNさんを尊敬してますし、そのサークル活動を軽視するつもりは毛頭ございません。
書籍化などの話が出ましたが、上にも書いたとおり、出版するつもりもないですし、仮に後々することになったとしても、龍神録の館をそのまま利用する事はありません。
ただ2D弾幕ゲーとなるとどうしても似る部分はあります。
また、これだけ東方ファンが多いと「自分も東方みたいなゲームが作りたい」と思っている人の参考になる活動をしたい気持ちがあります。
しかし、もちろんキャラや画像、世界感といったものは利用しません。
二次創作は許可されてるとは言え、その範疇を越える可能性もありますしね。それに自分としても、それはオリジナルじゃないと自分の本ではないので似せる事はしたくありません。
現在、オリジナルゲームである龍神録2(仮)を作っていますので、元にするならそちらを元にします。
よって、東方人気にあやかって、儲けようとか、東方を利用してあたかもオリジナルであるかのように装って出版してやろうなどという気は全くありませんので。
龍神録関連のページには東方とそのサークルの紹介や謝辞をいつも付けているつもりで、これからも感謝と敬意の気持ちは忘れずに持ち続けるつもりです。
今回はご指摘ありがとうございました。しんしに受け取り、今後の参考にさせていただきます。
205ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(12,848ポイント)
Date: 2009/01/11(日) 12:28
No:26725
|
|
Title: Dx.Lib
|
|
2.VisualC++ 2008 Express Edition でDXライブラリを使うための設定を行う
24ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(12,969ポイント)
Date: 2009/01/11(日) 12:33
No:26726
|
|
Title: Re:Dx.Lib
|
|
すいません。何かミスって投稿してしまったようです。質問内容はこちらに書きます。(編集できないため)
ゲームプログラミングの館にある
2.VisualC++ 2008 Express Edition でDXライブラリを使うための設定を行う
のBからCに行く方法がわかりません。Bのインクルードファイルってのは見つかったんですが
それからのやり方がわかりません。
121ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..上級者(20,303ポイント)
Date: 2009/01/11(日) 13:04
No:26727
|
|
Title: Re:Dx.Lib
|
|
「インクルードファイル」を選択したコンボボックスの下に、
ツールボタンが並んでますよね?左から二番目の「新しい行」を押してください。
70ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(950,016ポイント)
Date: 2009/01/11(日) 17:49
No:26736
|
|
Title: Re:Dx.Lib
|
|
@←こういうのは機種依存文字なので、使わない方がいいかもしれません。
回答している対象が明らかにwindowsユーザーである場合や、その人にしか関係のない話なら使っても大丈夫かもしれませんが、
質問する場合は、MacやLinuxユーザーの方もいらっしゃいますので@→(1)のように書いたほうがいいかもしれません。
82ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(13,018ポイント)
Date: 2009/01/12(月) 00:43
No:26765
| 解決!
|
Title: Re:Dx.Lib
|
|
知らなかったとはいえ軽率でした。以後気をつけます。ちょっと今試せる環境にないのですが
でき次第試してみます。ありがとうございました。
49ポイント を手に入れた。
|
|
|
|
Name: kouki ..ぴよぴよ(82ポイント)
Date: 2009/01/10(土) 16:07
No:26707
|
|
Title: 画面のかくつきについて
|
|
はじめまして。
シューティングゲームの館に書いてあるとおりに、ゲームを製作しているのですが、
シューティングゲームの館の最終的なソースとプロジェクトのダウンロードを行ってコンパイルし、実行してみたところ
背景がスクロールしていないので、かなりわかり難いですが
不定期に画面のかくつきが発生しているように思います。
(1秒に大体一度位の頻度で、一画面が止まる)
試しに龍神録のサンプルも試してみたところ、こちらでは画面のかくつきは発生しませんでした。
前者で画面のかくつきが発生する理由が、(というより、画面描画の方法の違いが、どこにあるのかが)どうにもわからないので、
どなたか、良ければ教えていただけると幸いです。
よろしくお願いします。
環境は
OSにwindowsXP pro sp3
コンパイラに、VC++ 2008EEを使用しています。
82ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(949,822ポイント)
Date: 2009/01/10(土) 16:47
No:26708
|
|
Title: Re:画面のかくつきについて
|
|
携帯で見ているので、今実際に見れませんが、
>背景がスクロールしていないので
という背景がスクロールしていない事となにか関係があるのでしょうか?
また、かくつきとは、一瞬画面が止まるってことでしょうか?
原因はよくわかりませんが、どこで処理が止まっているか、龍神録の館のように各関数ごとに計算時間を表示、またはファイルに書き出してみてはいかがでしょうか?
116ポイント を手に入れた。
|
|
|
|
|
Name: kouki ..ぴよぴよ(488ポイント)
Date: 2009/01/11(日) 01:57
No:26715
|
|
Title: Re:画面のかくつきについて
|
|
ああ、なんだかわかりにくい言葉を使ってすみませんでした。
>かくつきとは、一瞬画面が止まるってことでしょうか?
はい、そうです。
>背景がスクロールしていない事となにか関係があるのでしょうか?
常に一定速度で動いているものが無いと、画面が一瞬止まったか判別しにくかったので、
このように書いたものの、直接関係があるわけではないです。
なんだか余計なことを書いてしまって、すみませんでした。
Dixqさんに言われたとおり、どこで処理を止まっているかを調べるために、
シューティングゲームの館に書いてあった、基本処理のループ
main関数の
while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){
の初めから、
while(GetNowCount() - RefreshTime < 17);
に行くまでの時間を計算させて表示させて見たのですが、
全て0〜1ミリ秒程度の時間しかかかっておらず、処理が止まっているのが原因というわけでは無さそうです。
406ポイント を手に入れた。
|
|
|
|
|
Name: kouki ..ぴよぴよ(838ポイント)
Date: 2009/01/11(日) 21:06
No:26750
|
|
Title: Re:画面のかくつきについて
|
|
while(GetNowCount() - RefreshTime < 17);
を
while(GetNowCount() - RefreshTime < 16);
に変更したり、この構文そのものを削除することで安定化させることはできました。
DXライブラリそのものにFPSを制御する構文が入っていたりするのでしょうか?
ただ、この場合、シューティングゲームの館に書いてあるFPS表示を使うと、
FPS61.2という値を表示させ続けており、違う意味で問題があるようにも思えますが……
FPSの値に関して気になったのことなのですが、1/60秒=1.6666ミリ秒であるのに、
while(GetNowCount() - RefreshTime < 17);
でFPSが60になるものなのでしょうか?
VGAの影響は……わかりません。
とりあえず、ドライバを最新のものに更新して試したところ、同様の現象を確認しました。
350ポイント を手に入れた。
|
|
|
|
Name: array [URL] ..熟練のプログラマー(43,394ポイント)
Date: 2009/01/09(金) 12:37
No:26665
|
|
Title: 〔龍神録の館〕C言語の文法について
|
|
多分C言語の基本的な文法についてだと思います。
龍神録の館を見ていて、疑問に思っていた内容についての質問です。
1.「->」について
参照:--- ini.ccp ---
void input_bullet_info(bullet_info_t *binfo,int size_x,int size_y,int col_num,double range,int kaiten){
binfo->size_x =size_x;←ピックアップ binfo->size_y =size_y;
binfo->col_num=col_num; binfo->range =range;
binfo->kaiten=kaiten;
}
弾幕情報を初期定義する関数です(だと思います)
・binfo->size_x =size_x;
「->」って何だ?と疑問に思ってます。
今の今までこんな演算子知らないよ、とググったのですが「->」で検索しても全くヒットしない。
--- 自分の解釈 ---
PHPを勉強して(多分)メソッドと呼ばれるものではないかと最近知ったのですが、メソッドでググるとオブジェクト指向が(ry
とりあえず、実行結果から
input_bullet_info(&bullet_info[0],76, 76, 5,17.0,0);
で関数を呼び出せば「binfo->size_x =size_x;」とする事で
bullet_info[0].size_x = 76;
となる事は分かります。
長々と書きましたが、結局は「->」何ですか?という感じです。解説しているサイトなどを紹介してもらえると嬉しいです^^;
2.「num=(++num);」について
http://dixq.net/rp/35.html の一番下にある文法です。
「num=(++num);」→「++num;」でも等価ですよね。
しかし、あえて「num=(++num);」としている様に見えるので疑問に思っています。
559ポイント を手に入れた。
|
|
|
|
Name: 初級者 ..入門者(3,786ポイント)
Date: 2009/01/09(金) 12:44
No:26668
|
|
Title: Re:〔龍神録の館〕C言語の文法について
|
|
ptr->member
は
(*ptr).member
と同値です。
num = ++num;
は、なぜそう書かねばならないかがわかりません。
33ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(43,492ポイント)
Date: 2009/01/09(金) 12:49
No:26669
|
|
Title: Re:〔龍神録の館〕C言語の文法について
|
|
早いw
アロー演算子というんですね。
ググって一番上のサイトを見てみましたが、かなり分かりやすく書いてありました。
この関数の公開当時から疑問に思ってたのが馬鹿みたいです・・・・
バグさん、初級者さんありがとございます^^
98ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(947,651ポイント)
Date: 2009/01/09(金) 13:14
No:26671
|
|
Title: Re:〔龍神録の館〕C言語の文法について
|
|
構造体を使うとき
・ポインタを使わないで構造体を使う時は .
・ポインタを使って構造体を使う時は ->
と覚えておくといいですよb
ちなみに、最後の括弧は特に必要無いです。
こっちの方が見易いかなと思って残したんですが、スペースあけたら済む話です^^;
多分最初は
num = (++num) % 3;
みたいに書いてて、後半消したんじゃ無いかと思います・・。
2倍のポイントを手に入れた! 234ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(43,547ポイント)
Date: 2009/01/09(金) 18:50
No:26687
| 解決!
|
Title: Re:〔龍神録の館〕C言語の文法について
|
|
> num = (++num) % 3;
>
> みたいに書いてて、後半消したんじゃ無いかと思います・・。
それなら納得です。
ちょっと特殊な形だったので、こう書けば処理速度が上がるよってのを期待してましたけどw
55ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(22,967ポイント)
Date: 2009/01/10(土) 07:08
No:26697
|
|
Title: Re:〔龍神録の館〕C言語の文法について
|
|
num = (++num);
も
num = (++num) % 3;
も未定義動作なので間違いではないでしょうか
副作用のあるnumを副作用完了点前に参照しています。
47ポイント を手に入れた。
|
|
|
|
Name: トルク ..ぴよぴよ(261ポイント)
Date: 2009/01/11(日) 06:27
No:26719
|
|
Title: バグ?
|
|
はじめまして、こんにちは、
分からない所があるのでテンプレで質問します。
[1] 質問文
[1.1] ゲームの製作
[1.2] 龍神録プログラミングの館のコードをベースにいろいろ追加
ファイルの場所:ttp://tikuwa.net/file/up7680.zip.html
パスワード:dx
[1.3] a,s,d,wのキーで移動なのですが、そのキーを押すとフリーズ
[1.4] task.cppの241行目〜282行目でループしている様なのですが原因がわかりません。
[2] 環境
[2.1] OS : WindowsXP
[2.2] コンパイラ名 : VC++ 2008EE
原因、対策等ありましたら教えて下さい。
よろしくお願いします。
261ポイント を手に入れた。
|
|
|
|
Name: トルク ..ぴよぴよ(298ポイント)
Date: 2009/01/11(日) 17:21
No:26734
| 解決!
|
Title: Re:バグ?
|
|
kazuoni様ありがとうございます。
初歩的なことに全く気付いてなかったです。
とても助かりました感謝!
37ポイント を手に入れた。
|
|
|
|
Name: しょしょしょしんしゃ ..中級者(11,959ポイント)
Date: 2009/01/09(金) 23:46
No:26690
|
|
Title: C言語 行列式
|
|
C言語で行列式の問題を解く宿題が出まして、
3次正方行列式Aに対して、Aのそれぞれの行から、成分の絶対値の和の最大値||A||を
計算するプログラムの作成というものですが、
それなりに考えたものを載せておきますが どうも違うような気もします。
#include <stdio.h>
#include <math.h>
#define N 3
int main(void){
float A[N][N]={{-1.0,2.0,-1.0},{-5.0,-4.0,0.0},{-5.0,2.0,-5.0}};
float x,y,z;
printf("[ %f %f %f ]\n",A[0][0],A[0][1],A[0][2]);
printf("[ %f %f %f ]\n",A[1][0],A[1][1],A[1][2]);
printf("[ %f %f %f ]\n",A[2][0],A[2][1],A[2][2]);
x=abs(A[0][0])+abs(A[0][1])+abs(A[0][2]);
y=abs(A[1][0])+abs(A[1][1])+abs(A[1][2]);
z=abs(A[2][0])+abs(A[2][1])+abs(A[2][2]);
if(y<x&&z<x){
printf("対してnorm_inf=%f\n",x);
}if(x<y&&z<y){
printf("対してnorm_inf=%f\n",y);
}if(x<z&&y<z){
printf("対してnorm_inf=%f\n",z);
}
return 0;
}
//実行結果 12.0000
ここを直した方が良い、この場所がおかしいというところがあれば
お願いします。
551ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(133,386ポイント)
Date: 2009/01/10(土) 00:15
No:26691
|
|
Title: Re:C言語 行列式
|
|
それは本当に行列式の問題なのでしょうか。
簡単のために2次正方行列
a b
c d
で考えると、行列式は ad-bc である、
というのが私の知っている行列式の定義です。
それとも、今は行列式の定義が新しくなっているのでしょうか。
|
|
|
|
|
Name: SCI ..初心者(5,262ポイント)
Date: 2009/01/10(土) 02:55
No:26696
|
|
Title: Re:C言語 行列式
|
|
厳密には、行列式は置換写像とその符号を用いて定義されます。
が、せいぜい2次や3次なら公式で考えたほうが速いでしょう。
3次の正方行列なら余因子展開やサラス法で行列式を求めることができます。
「行列式の問題を解く」のが「行列式の値を求める」に一致するなら、これでいいでしょう。
ただし、
>Aのそれぞれの行から、成分の絶対値の和の最大値||A||を計算する
これは最大値ノルムでは。
101ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..中級者(11,973ポイント)
Date: 2009/01/10(土) 09:22
No:26699
|
|
Title: Re:C言語 行列式
|
|
>これは最大値ノルムでは。
たぶん そうかもしれませんが、この最大値ノルムを調べたところ
定義がよく分からず、C言語のプログラムで作ることができませんでした。
わかる人がいれば教えてください。
14ポイント を手に入れた。
|
|
|
|
|
Name: しょしょしょしんしゃ ..中級者(12,023ポイント)
Date: 2009/01/10(土) 20:47
No:26712
|
|
Title: Re:C言語 行列式
|
|
>問題文はもっていないのですか?
3次正方行列式Aに対して、Aのそれぞれの行から、成分の絶対値の和の最大値||A||を
計算するプログラムの作成という問題文です。
50ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,412ポイント)
Date: 2009/01/11(日) 09:36
No:26724
|
|
Title: Re:C言語 行列式
|
|
>3次正方行列式Aに対して
3次正方行列A、ではなくて?
まぁ意味するところは分かりますが、不正確な問題文ですね・・・
問題文の通り組めばいいので、最初のソースで合っているのではないですか?
もちろんリファクタリングの余地はあるでしょうが、結果は合っているような気がしますけど・・・
144ポイント を手に入れた。
|
|
|
|
Name: ざこ ..中級者(12,316ポイント)
Date: 2009/01/08(木) 18:29
No:26626
|
|
Title: プログラム
|
|
C++について勉強していますが下記のプログラムがうまくいきません。
char rev_str(char *s1)
{
char *s="water";
int i,j;
for(i=0;i<strlen(s);i++){
*s++;
}
for(j=strlen(s);j=0;j--){
*s1++=*s++;
}
return *s1;
}
int main()
{
char s1[80];
cout<<"waterを逆にすると"<<rev_str(s1)<<"です\n";
return 0;
}
ある文字列を逆にして出力するプログラムをC++で書いています。
エラーはでませんがs1の中身がフフフフフフになってます。
原因と対策を教えて下さい。
180ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(47,482ポイント)
Date: 2009/01/08(木) 18:39
No:26628
|
|
Title: Re:プログラム
|
|
> s1の中身がフフフフフフになってます。
たかぎさんと同意見です。凡ミスです。
> 原因と対策を教えて下さい。
原因はもう一つあり、 for 文の条件が j=0 となっているところです。
正しくは j != 0 ですよね?
対策として、こういう凡ミスは、条件文は左辺に定数が置かれるように書くと発見しやすいですよ。
(癖つけないと難しいですが)
0 = j はコンパイルエラーになりますから。
116ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(12,347ポイント)
Date: 2009/01/08(木) 18:51
No:26629
|
|
Title: Re:プログラム
|
|
char s1[80]; の所初期化してchar s1[80]="";にしてもさっぱり・・
31ポイント を手に入れた。
|
|
|
|
|
Name: non ..プログラマー(26,588ポイント)
Date: 2009/01/08(木) 19:05
No:26630
|
|
Title: Re:プログラム
|
|
初期化という問題ではなく、考え方に問題があるのでは?
>char rev_str(char *s1)
s1に答えを入れたいのなら、returnの必要ないし、
returnで返したいなら、
char *rev_str(void)
です。
でも、元の文字列を関数内で定義するなら、関数を作った
意味がないですよね。
99ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(22,686ポイント)
Date: 2009/01/08(木) 19:18
No:26632
|
|
Title: Re:プログラム
|
|
for(i=0;i<strlen(s);i++){
*s++;
}
で
*s++;
は
s++;
でも同じですしむしろ
s += strlen(s);
ですみます。
そしてsを文字数分インクリメントした後にstrlen(s)を使ってますがこの値は不定になります。
107ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(22,561ポイント)
Date: 2009/01/08(木) 19:24
No:26633
|
|
Title: Re:プログラム
|
|
for(i=0;i<strlen(s);i++){
*s++;
}
あー
これだとループのたびにstrlen(s)が変化しますね
どうしてもループでやるなら
int len = strlen(s);
for(i=0 ;i < len; i++){
s++;
}
のようにしないと
125ポイント を落としてしまった。
|
|
|
|
|
Name: non ..プログラマー(26,622ポイント)
Date: 2009/01/08(木) 19:28
No:26635
|
|
Title: Re:プログラム
|
|
>char *rev_str(void)
ごめん。間違えたので訂正。
char *rev_str(char *s1)
でした。
34ポイント を手に入れた。
|
|
|
|
|
Name: dic ..中級者(10,614ポイント)
Date: 2009/01/08(木) 19:40
No:26636
|
|
Title: Re:プログラム
|
|
独自にはできますが色々アルゴリズムが難解なやり方をやってらしているので
シンプルなのをひとつ
#include <iostream>
using namespace std;
char* rev_str(char *s)
{
unsigned int len, i;
char temp[80];
len = strlen(s);
for( i=0; i<strlen(s); i++ ) {
temp[len] = s[i];
len--;
}
return s;
}
int main()
{
char s[80] = "water";
cout<<"waterを逆にすると"<<rev_str(s)<<"です\n";
return 0;
}
4ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(38,882ポイント)
Date: 2009/01/08(木) 19:50
No:26637
|
|
Title: Re:プログラム
|
|
正しいソース書いてみましたのでどこが違うか確認してみてください。
ポインタと文字列の扱いに対する理解が足りていないと思います。
#include <iostream>
using namespace std;
char *rev_str(char *s1)
{
char *s = "water";
unsigned long length, loop;
char *ptmp = s1;
length = strlen(s);
s += (length - 1);
for(loop = length; loop > 0; loop--, s1++, s--) {
*s1 = *s;
}
return ptmp;
}
int main()
{
char s1[80];
memset(s1, 0, sizeof(s1));
cout << "waterを逆にすると" << rev_str(s1) << "です" << endl;
return 0;
}
329ポイント を手に入れた。
|
|
|
|
|
Name: dic ..中級者(10,877ポイント)
Date: 2009/01/08(木) 19:51
No:26639
|
|
Title: Re:プログラム
|
|
すいません
文字転換しただけで後処理してませんでした
#include <iostream>
using namespace std;
char* rev_str(char *s)
{
unsigned int len, i;
char temp[80];
memset( temp, 0, sizeof(temp) ); // 忘れ物
len = strlen(s) - 1;
for( i=0; i<strlen(s); i++ ) {
temp[len] = s[i];
len--;
}
strcpy( s, temp ); // 忘れ物
return s;
}
int main()
{
char s[80] = "water";
cout<<"waterを逆にすると"<<rev_str(s)<<"です\n";
return 0;
}
になります
263ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(12,404ポイント)
Date: 2009/01/08(木) 22:08
No:26647
| 解決!
|
Title: Re:プログラム
|
|
うーん今「独習C++」って参考書で勉強してるんですが「独習C」の方も
買った方がいいかもしれませんね。質問したときに結構ボロボロかなとは思ってたのですが
何が悪いのかがわかりませんでした。ありがとうございました。
57ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(140,726ポイント)
Date: 2009/01/09(金) 09:52
No:26657
|
|
Title: Re:プログラム
|
|
せっかくなので、STL使ってみました。
#include <iostream>
#include <string>
std::string reverse(std::string str)
{
std::string buf;
for (std::string::reverse_iterator it = str.rbegin(); it != str.rend(); ++it)
{
buf += *it;
}
return buf;
}
int main(void)
{
std::string str = "water";
std::cout << str << " を逆にすると " << reverse(str) << " です" << std::endl;
return 0;
}
143ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(39,062ポイント)
Date: 2009/01/09(金) 10:09
No:26658
|
|
Title: Re:プログラム
|
|
本を読むのもいいですが、ステップ実行ができる環境(VC++)とかがあるのであれば一行ずつステップ実行して各変数の値がどのように変わっていくのか、ポインタは文字列のどの部分を指しているか等を順番に確認していくほうが本なんか読むよりも理解が早まると思いますけどね。
> 何が悪いのかがわかりませんでした。
正解見ても自分の間違いがわからなかったって意味じゃないですよね(^^;?
それだったら、具体的にどこが間違っているか書きますけど。
178ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(12,591ポイント)
Date: 2009/01/09(金) 10:31
No:26661
|
|
Title: Re:プログラム
|
|
参考書に従い勉強していく→練習問題があった→自分なりに解く→一応作れた・・エラーはでない(エラーが出る場合サイトなどで調べまくる。どうしても直せない場合質問へ)→正常に稼動しない・・→デバッグで確かめる→それでも直せない→質問する→納得する→練習問題の解答をみて
納得する。
これの繰り返しです。デバックに関してはブレークポイント指定してやる方法だとわかるんですけど
ステップインの方がまだイマイチなんですよね。ステップインすると変なとこに飛ばされたりで、さっぱりです。
他にも関数の中の変数見れないとか色々理解不足が多いです。
VC++のデバッグの使い方に関してわかりやすく載ってるサイトか参考書あれば是非教えて下さい。
152ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(39,208ポイント)
Date: 2009/01/09(金) 10:55
No:26663
|
|
Title: Re:プログラム
|
|
「VC++ デバッグ」等のキーワードでググればいくらでもヒットしますので使用されているバージョンにあったページを探してみてください。
●ステップ実行についてのアドバイス
ステップイン、ステップオーバー、ステップアウトの違いは理解されていますか?
ステップイン:一行実行する。関数がある場合は関数の中に入る。
ステップオーバー:一行実行する。関数がある場合は関数の中には入らないですべて実行する。
通常はこれを使用し関数の中に入りたい場合だけステップインする。
標準関数を使用している行でステップインすると標準関数の中に入ってしまうのでこちらを使用する。
ステップアウト:現在の関数から抜けるまで実行する。
そのほかに、ステップ実行中の右クリックメニューに「カーソル行まで実行」というのもあります。
その名の通り、カーソルのある行まで実行していくれるものです。
146ポイント を手に入れた。
|
|
|
|
|
Name: ざこ ..中級者(12,824ポイント)
Date: 2009/01/09(金) 11:28
No:26664
|
|
Title: Re:プログラム
|
|
本屋とかでデバッグの本探しまくったんですがやり方について載ってる本はなかったのですが・・
サイトで調べればよかったんですね。わかりやすく載ってるサイト見つけました。
ただステップインしてると
「STRCAT.ASMのパスを入力してください」と出た後に変な所に飛ばされます。プログラム自体は正常に稼動できます。
サイトによるとこの場所は混合モードとかいうそうですが、その辺がさっぱりです。
どういうものかはわかるんですが混合モードにならずにステップインする方法とかありますか?
233ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(39,386ポイント)
Date: 2009/01/09(金) 14:36
No:26675
|
|
Title: Re:プログラム
|
|
基本的にソースコードのない部分については無理です。
(他の人が作ったLIBやDLLの中など)
ソースコードがあるのであれば「xxxxxxのパスを入力してください」と要求されたときに該当するソースファイルを選択すれば実行できます。
ただし、最適化されているとソース通りには動作しない場合もありますが。
標準関数(CRT)についてはCRTのソースコードをインストールすることで出来るようになったと思いますが、VC++EEはソースコードが付いてこないので無理っぽいです。
178ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(140,799ポイント)
Date: 2009/01/09(金) 21:02
No:26689
|
|
Title: Re:プログラム
|
|
>>Naohiro19さん
一応、STLを使用したサンプルをあげておいたのですが、皆さんに華麗にスルーされて、ちょっと悲しかったりしています(笑)
52ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(308,770ポイント)
Date: 2009/01/10(土) 02:14
No:26695
|
|
Title: Re:プログラム
|
|
>皆さんに華麗にスルーされて、ちょっと悲しかったりしています
では寂しい思いをさせいないために、ツッコミでも(w
std::iter_swapを使えばループは半分で済みませんか?
或いは std::reverse系を使えば……。
97ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 [URL] ..比類無きプログラマー(93,153ポイント)
Date: 2009/01/10(土) 17:38
No:26710
|
|
Title: Re:プログラム
|
|
>一応、STLを使用したサンプルをあげておいたのですが、皆さんに華麗にスルーされて、ちょっと悲しかったりしています(笑)
僕も書いてみました。
#include<iostream>
#include<string>
int main()
{
std::string str="water";
std::cout<<str<<"を逆にすると"<<std::string(str.rbegin(),str.rend())<<std::endl;
return 0;
}
高速かどうかは別の問題としてください。
4ポイント を落としてしまった。
|
|
|
|
|
Name: たかぎ [URL] ..比類無きプログラマー(79,025ポイント)
Date: 2009/01/10(土) 17:48
No:26711
|
|
Title: Re:プログラム
|
|
>一応、STLを使用したサンプルをあげておいたのですが、皆さんに華麗にスルーされて、ちょっと悲しかったりしています(笑)
というか、reverseを自分で実装する必要はありません。
#include <iostream>
#include <string>
#include <algorithm>
int main()
{
std::string str("water");
std::cout << str << "を逆にすると";
std::reverse(str.begin(), str.end());
std::cout << str << std::endl;
}
結果を返却値で返した方が使い勝手はよい気もしますが、一時オブジェクトが生成される問題もあるので、どっちもどっちですね。
54ポイント を手に入れた。
|
|
|
|
Name: suga@ ..ぴよぴよ(285ポイント)
Date: 2009/01/10(土) 11:15
No:26701
|
|
Title: 覆面算のプログラム
|
|
授業の課題で以下の覆面算のプログラムを作ることになりまして、頑張って自分なりにやったのですがコンパイルできなくて困っています。どこが間違っているのかわかりません。助けてください!お願いします。
↓↓見づらくてすみません。
/*base+ball=games*/
#include <stdio.h>
int main(void){
int b,a,s,e,l,g,m,X,Y;
for(b= 1; b < 10; b++){
for(a = 0; a < 10; a++){
if(b != a){
for(s = 0; s < 10; s++){
if(s != b && s != a){
for(l = 0; l < 10; l++){
if(l != b && l != a && l != s){
for(e = 0; e < 10; e++){
if(e != b && e != a && e != s && e != l){
for(g = 1; g < 10; g++){
if(g != b && g != a && g != s && g != e && g != l){
for(m = 0; m < 10; m++){
if(m != b && m != a && m != s && m != e && m != l && m != g){
X=1000*b + 100*a + 10*s + e + 1000*b + 100*a + 10*l + l;
Y=10000*g + 1000*a 100*m + 10*e + s;
if(X == Y)
printf("base=%d%d%d%d\tball=%d%d%d%d\tgames=%d%d%d%d%d\n",b,a,s,e,b,a,l,l,g,a,m,e,s);
}
}
}
}
}
}
}
}
}
}
}
}
}
return 0;
}
285ポイント を手に入れた。
|
|
|
|
Name: SCI ..初心者(5,337ポイント)
Date: 2009/01/10(土) 12:12
No:26703
|
|
Title: Re:覆面算のプログラム
|
|
> Y=10000*g + 1000*a 100*m + 10*e + s;
ここですね。
Y=10000*g + 1000*a + 100*m + 10*e + s;
38ポイント を手に入れた。
|
|
|
|
|
Name: suga@ ..ぴよぴよ(286ポイント)
Date: 2009/01/10(土) 15:21
No:26704
| 解決!
|
Title: Re:覆面算のプログラム
|
|
皆さんありがとうございます!助かりました。今度からはタグを使うよう気をつけます。
1ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(21,338ポイント)
Date: 2009/01/09(金) 15:37
No:26676
|
|
Title: 住所録
|
|
現在、VC++で住所録を作成中なのですが、
新規に登録名を追加する際に同じ名前の人のデータがあった場合
追加できない。と言うようにしたいのですが、
現在の方法では、同名のデータが発見できるところまでは出来るているのですが、
今のままだと、登録が2重になってしまったりなど、問題点が多く残っています。
また、初めてC++/CLI(で、良いのでしょうか?)で作成しているので
非常に見にくいソースだとは思いますが、ご容赦願います。
129ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(21,385ポイント)
Date: 2009/01/09(金) 15:41
No:26677
|
|
Title: Re:住所録
|
|
失礼しました。
追加ボタンの関数が、
button_Tuika_Click
同名を探す関数が、
SearchName
と、なっています。
47ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(39,502ポイント)
Date: 2009/01/09(金) 16:02
No:26679
|
|
Title: Re:住所録
|
|
SearchNameには戻り値があるのに使っていないのには何か理由があるんですか?
ザっとしか読めてないけど以下じゃダメなんでしょうか?
if (SearchName(this->fileName) == FALSE) {
MessageBox::Show("既に登録済みです");
return;
}
116ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(39,686ポイント)
Date: 2009/01/09(金) 16:05
No:26680
|
|
Title: Re:住所録
|
|
SearchNameの戻り値の条件がよくわからないですね。
SearchNameという関数名からすると、同名があればtrue、それ以外はfalseかと思ったけどそうじゃないみたいだし。
関数の仕様詳細コメントみたいなものは書かないのでしょうか?
2倍のポイントを手に入れた! 184ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(21,535ポイント)
Date: 2009/01/09(金) 16:18
No:26682
|
|
Title: Re:住所録
|
|
>>SearchNameの戻り値の条件がよくわからないですね
はい。もともと本か何かで調べたものを、
少しだけ変えて更に使いまわしてたりしてるうちに私もよくわからなくなってしましました。
>>関数の仕様詳細コメントみたいなものは書かないのでしょうか?
なるほど・・・。そのようなコメントも書いたほうが良いですね。
これから、少しずつでも、身に付くように努力します!!
150ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..熟練のプログラマー(40,021ポイント)
Date: 2009/01/09(金) 16:31
No:26683
|
|
Title: Re:住所録
|
|
SearchNameを見直して同名があるときはtrue、それ以外はfalseを返すように作り変えてみてはいかがでしょうか。
私がコーディングする時は関数の最初に以下のようなコメント付けて、ソース読まなくても関数の処理内容が大まかにわかるようにしています。
//**********************************************************************************************************************
//
// FunctionName : (関数名)
// Abstract : (関数の処理内容)
// Inputs : (入力引数)
// Outputs : (出力引数)
// Return : (戻り値)
// Notes : (留意事項)
//
//**********************************************************************************************************************
//
// Procedure(関数の処理内容詳細)
// ..1
// ..2
// ..3
// ..4
//
//**********************************************************************************************************************
335ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(21,907ポイント)
Date: 2009/01/09(金) 16:40
No:26685
| 解決!
|
Title: Re:住所録
|
|
>>SearchNameを見直して同名があるときはtrue、
>>それ以外はfalseを返すように作り変えてみてはいかがでしょうか。
はい!!まず、それが近道ですね!!
>>私がコーディングする時は関数の最初に以下のようなコメント付けて、ソース読まなくても関数の処理内容が>>大まかにわかるようにしています。
参考になりますね・・・。
これなら確かにわかりやすそうですね!
>>熟練プログラマーに昇格したヽ(*゜▽゜)ノ バンザーイ♪
おめでとうございます!!
私はこんなレベルで上級者の称号が付いてしまっているので、
ハンドルの変更をしようか、考えていたのですが。。。
面倒なんでやめました!
名前を全て大文字にする程度なら混乱もしないし良いかなぁ。。。
#恐らく、今日から連休明けまで来れないので解決にします!!
372ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(21,984ポイント)
Date: 2009/01/09(金) 16:50
No:26686
| 解決!
|
Title: Re:住所録
|
|
>>#恐らく、今日から連休明けまで来れないので解決にします!!
完全に解決しました!!
ありがとうございました!!
Mistさんに指摘していただいた部分と、
this->report->Clear();
この1行を消すことでほぼ、完成しました!!
77ポイント を手に入れた。
|
|
|
|
Name: マンマン ..ぴよぴよ(34ポイント)
Date: 2009/01/08(木) 09:59
No:26612
|
|
Title: 質問です
|
|
第二章でウィンドウをビルドして開いてもその画面をクリックすると消えちゃうんですけど・・・バグですか?
34ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(38,438ポイント)
Date: 2009/01/08(木) 10:22
No:26615
|
|
Title: Re:質問です
|
|
> 画像を貼り付けようとしたら
どこに?どうやって?
・どのサンプルプログラムを使用しているのか
・サンプルのままなのか、自分で変更したのか
・何をしたら、どうなったのか
・自分はどうしたいのか
を具体的に書いてもらえませんか。
その内容では答えようがありません。
「規約と注意事項」は読まれましたか?
94ポイント を手に入れた。
|
|
|
|
|
Name: マンマン ..ぴよぴよ(71ポイント)
Date: 2009/01/08(木) 10:43
No:26616
|
|
Title: Re:質問です
|
|
すみません
ええっと、自分は初心者で、今説明どおりに操作してて、ビルドで開いて画像を表示しようとしててそこで詰まっているわけです。どうやって画像を表示するのですか?
9ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(38,553ポイント)
Date: 2009/01/08(木) 11:02
No:26617
|
|
Title: Re:質問です
|
|
> 今説明どおりに操作してて
どこまで進んでいるのかを明確にしてもらわないと答えられません。
最初に書かれている「第二章」というのがゲームプログラミングの館の二章であるならばそこでの画像表示はありません。
もう一度言いますが、規約をしっかり読んであなたの環境(OS、コンパイラ)を明記してください。
Vista環境では正常に動作しないこともあるようです。
115ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..中級者(11,846ポイント)
Date: 2009/01/08(木) 11:03
No:26618
|
|
Title: Re:質問です
|
|
Mistさんのおっしゃる通り、もうちょっと具体的に書いていただかないと答えづらいです。
> 画像を貼り付けようとしたら
画像をドラッグとかコピーして貼り付けようとしたのですか?
当たり前の話ですが通常コピペして貼り付ける、といったことはできないですよ。
”コピペして貼り付ける”というプログラムを書いているのであれば話は別ですが。
(私にはできるのかわかりませんが^^;)
画像を表示させるのも当然プログラムで制御します。
マンマンさんはどこまで勉強されているのかわかりませんが、
ちゃんと書いてありましたよ。(第3章になるんですかね?)
LoadGraphScreen関数を使うんです。
189ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(302,969ポイント)
Date: 2009/01/01(木) 01:56
No:26306
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
おっと、新しいロゴに!
管理人さん、皆様、明けましておめでとうございます。
去年は給料泥棒に近い勢いで仕事が暇でしたが、
今年は忙しくなりそうな予感がするので出没する機会も
減るかもしれませんが、今年もよろしくお願いします。
82ポイント を落としてしまった。
|
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(43,911ポイント)
Date: 2009/01/01(木) 02:38
No:26319
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
明けましておめでとうございます!!
今年もよろしくお願いします。(お世話になります・・・)
この掲示板(管理人さんサイト)にきて早一年が過ぎました・・・。
早いですね。
・・・プログラミングの力成長してない!?orz
名だけの肩書「熟練のプログラマ」
・・・
「プログラマ」ってどの程度のクラスですか?w自分からしたら天上人ですw
今年はもうちょっとできる人に成れるよう、日々精進します^^
144ポイント を手に入れた。
|
|
|
|
|
Name: karasu ..ぴよぴよ(157ポイント)
Date: 2009/01/01(木) 05:15
No:26320
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
あけましておめでとうございます。
このサイトのおかげでゲーム作りをしようと思い、昨年後半は楽しかったですw
今年は本格的なゲーム一本でも作りたいと思っているのでがんばりたいです。
今年もよろしくお願いします。
89ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..上級者(21,020ポイント)
Date: 2009/01/01(木) 13:24
No:26330
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
明けましておめでとうございます。
昨年は色々とお世話になりありがとうございました。
処女作の「じゃんけんゲーム」ほぼ完成しました。
皆さん、ご指導ありがとうございました。(謝
今年も皆さんにとって良い年でありますように!
本年も宜しくお願い致します。
55ポイント を手に入れた。
|
|
|
|
|
Name: s-rush ..初心者(7,793ポイント)
Date: 2009/01/01(木) 13:25
No:26331
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
あけましておめでとうございます。
かなりの低スピードですが、ゲーム作りも進めています。
分からないことだらけなのでまた質問をさせてもらうと思いますが、
そのときはよろしくお願いします。
年末までには(カントー地方を)完成させたいと思います。
今年大学4回生になるので出現頻度が極端に減るかもしれませんが、
今年も何卒よろしくお願いします。
92ポイント を手に入れた。
|
|
|
|
|
Name: yu ..初心者(5,114ポイント)
Date: 2009/01/01(木) 19:18
No:26337
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
明けましておめでとうございます。
昨年はこのサイトでかなりお世話になりました。
どうやら今年もかなりお世話になりそうですが・・・
学校の予習程度に始めたゲーム作成ですが(まだ学校ではプログラムを打っていません
今ではかなり楽しく作成しています。
このサイトと皆さんのおかげです。
今年もよろしくお願いします m(_ _)m
114ポイント を手に入れた。
|
|
|
|
|
Name: dic ..初心者(8,798ポイント)
Date: 2009/01/01(木) 19:55
No:26338
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
あけましておめでとうございます
私の独学での質問に答えていただき大変おせわになりました。
レベルは低いですが、私なりにできるだけのことはやろうかと思っていますし、
壁にぶつかったら質問など どしどししようかと思っています
おかげさまでシューティングの基礎ができました
今年もよろしくお願いします
103ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..入門者(2,635ポイント)
Date: 2009/01/02(金) 00:24
No:26348
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
遅れましたが、あけましておめでとうございます☆
今年は去年以上に充実した1年になりますように!
せっかくなので、さっき10分程度で描いた年賀落書き貼っていきます・・・w
超下手な上に超ラフですごめんなさーい><
今年もよろしくお願いします^^
94ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..熟練のプログラマー(42,683ポイント)
Date: 2009/01/02(金) 02:19
No:26353
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
あけましておめでとうございます。
昨年はお世話になりました。
今年もよろしくお願いします。
今年は、(プチ)プログラマ目指して頑張ります!
と思ってプログラマの定義について調べたら
コンピュータのプログラムを作成する人全般を指す。プログラマーとも表記される(wiki)
と書いてありましたよ
って事は、掲示板に質問をしに来る方なんかは皆プログラマに当てはまるんですね。
意外と広い定義に新年早々目標を見失いましたよw
といっても、kazuoniさんのいうような、天井しらずのこの業界。
これからも、知りたい事、分からない事たくさんあると思うのでよろしくお願いします。
184ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..熟練のプログラマー(46,938ポイント)
Date: 2009/01/02(金) 11:26
No:26364
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
一日遅れましたが、
皆様、あけましておめでとうございます。
今年もよろしくお願いいたしますね。
> といっても、kazuoniさんのいうような、天井しらずのこの業界。
まさに天井しらずですね。
プログラマの技術は先が見えないほど現在進行形で、常に進歩していますからね。
だからといって先の技術に触れなければいけないわけではなく、
今までの技術のほうが重要だったりするので、
何も身構えることなく、自分のペースで覚えていけばいいんですよね。
# 偉そうな事言ってますが、私もしがない一人のプログラマです^^;
10ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(942,892ポイント)
Date: 2009/01/06(火) 19:57
No:26493
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
皆様、カキコありがとうございます^^
>>>Justyさん
さすが目の付け所が違うっ!
もうちょっと凝った背景にしたかったんですけどね^^;
次回はもうちょっと凝った・・、
って次の行事時っていつかな〜・・^^;
>>>kazuoniさん
おこしくださってありがとうございます♪
素人の解説ばかりのサイトではありますが、・・・ゆっくりしていってね!(ぇ
>名だけの肩書「熟練のプログラマ」
そんな事いったら私は伝説のh・・(ry
しかももうすぐ、ポイントが絶対ならないだろうと思っていたミリオンの大台に・・・^^;
今までどれだけ文字数書いてきたんでしょうこの掲示板にw
>>>karasuさん
ブログとかにも来てくださってありがとうございます^^
ゲーム制作はやっぱ楽しいですよね!
私もDXライブラリに出会ってからプログラムの楽しさを知りました!
karasuさんがお作りになったゲーム、公開されるの楽しみにしています!
>>>ムンバさん
やはり最初はジャンケンから始まりますよね!
私もジャンケンが最初に作ったゲームでした。
DXライブラリを使うと画像や音声ファイルが簡単に扱えるのでより一層面白くなりますよね。
>>>s-rushさん
卒論ですか〜、私も今月修士論文の締め切りで、大慌てな今日この頃です^^;
指ばっかり運動して体は鈍ってますw
少しは体動かさなければ・・。
今ポケモン作っていらっしゃるんでしたっけ?
頑張って下さいね^^
>>>yuさん
私もプログラムなんて学校の宿題をする位にしか使っていませんでした。
真っ黒のコンソール画面に計算結果表示するようなものに魅力持てなかったんですよね。
でもOpenGLやDXライブラリに出会って、プログラムの楽しさを知りました。
やっぱ子どもの頃楽しんだゲームを今度は自分が作れるんだと思うと嬉しいし、楽しいですよね。
もし完成されたらよければ紹介して下さい^^
>>>dicさん
また気軽に質問してくださいね^^
シューティングを作っていらっしゃるそうで、完成したらよければ遊ばせて下さい☆
製作頑張ってくださいねっ。
>>>きらりんさん
おぉ!
添付ファイルではすぐに消えてしまうので、データをサーバーに移させていただきました。
絵がヘタクソな私からするとこんな上手な絵が10分で書けるとか神としか思えません・・。
私の友達もよく隣でノートに絵書いてましたが、絵がかける人はうらやましいです(´〜`;)
>>>lbfuvabさん
今年もよろしくお願いします!
>>>arrayさん
昨年は支館を作成して頂いたりとありがとうございました^^
私はプログラマというと、プログラムを組むことを仕事としている人の事かと思ってました。
まぁこれはスキルを表す言葉じゃ無いですし、プログラムかくことを仕事としている人の中でも
ものすごい差があるでしょうしね^^;
・・ということで目指せウィザードですよ♪
>>>御津凪さん
昨年は色々とお世話になりました! 今年もお世話になります^^
プログラマーは常に勉強していくことになるんでしょうねぇ。
プログラムにおいて「もう勉強する事がない」って段階は多分ないんじゃないかと・・。
まぁそれをいったら学業的な部分はみんなそうでしょうけど^^;
まずは公開しても恥ずかしくない程度のプログラムがかけるように頑張りますw
403ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(944,655ポイント)
Date: 2009/01/07(水) 17:06
No:26574
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>>>tkさん
今年もよろしくです☆
そういえばそろそろtkさんのハンドルネームも15ではなくなるのでは・・?(w
次の行事は・・節分・・、あまりキレイな背景が作れそうに無いな・・。
その次はバレンタイン・・・。
93%男が集まっているこの掲示板でまさかのすごくかわいらしい背景を見ることになりそうです・・w
ん〜やっぱ元旦とクリスマス位ですかね〜^^;
数少ない行事、なんでこんなに近いんだ・・。
143ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(139,927ポイント)
Date: 2009/01/07(水) 17:17
No:26575
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>>管理人さん
バレンタインの次はプロレスの日(2月19日)ですね(笑)
期待してますよ♪
34ポイント を落としてしまった。
|
|
|
|
|
Name: tkmakwins15 [URL] ..比類無きプログラマー(92,833ポイント)
Date: 2009/01/08(木) 01:37
No:26603
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>そういえばそろそろtkさんのハンドルネームも15ではなくなるのでは・・?(w
すでに16ですね…、かといって、わざわざハンドル変えるのは面倒なので…そのままいきます。
ホームページのほうでは書き換えてはいますので…
命名時の年齢ということにでもしておいてください…
88ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,136ポイント)
Date: 2009/01/08(木) 02:10
No:26605
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
> 93%男が集まっているこの掲示板
私は残りの7%に含まれていますよ(笑)
17ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(947,415ポイント)
Date: 2009/01/08(木) 02:25
No:26608
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>>tkさん
毎年名前変えないといけないことになりますもんねw
私もDixqなんて読めない!とかDixpとかよく間違われたりとかするので、今の名前にしてちと後悔してます^_^;
しかしハンドルネームが星の数ほどあるこのネット上で自分しかない名前付けようとするとどうしてもイビツな名前になるんですよね;
>>SCIさん
マジですか!女プログラマーってカッコイイっすね♪
私は女ライダーとか好きでs(誰も聞いてない
丁寧語で話してると性別ってわからないですもんね。
ってもここでバリバリのギャル語使う人がいても困るけど^_^;
259ポイント を手に入れた。
|
|
|
|
|
Name: きらりん ..入門者(3,545ポイント)
Date: 2009/01/08(木) 02:38
No:26610
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>>Dixq (管理人) 様
いつのまにやら画像保存されちゃってたんですね・・・w
これはまちがいなく黒歴史となりますwww
2倍のポイントを手に入れた! 98ポイント を手に入れた。
|
|
|
|
|
Name: SCI ..初心者(5,161ポイント)
Date: 2009/01/08(木) 08:16
No:26611
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
私はギャル語を使うようなタイプではないですよ(汗
25ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 [URL] ..比類無きプログラマー(93,157ポイント)
Date: 2009/01/09(金) 01:10
No:26654
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>私もDixqなんて読めない!とかDixpとかよく間違われたりとかするので、今の名前にしてちと後悔してます^_^;
「ディックスキュー」さんですよね、というよりも、掲示板の中では発音することがないですから、読めなくてもあまり問題ないのでは…
うーん、Webページ作成には便利だな〜とIMEに文字参照を登録したのですが、>と打つと>と変換されてしまう。
何か優先度を下げる方法ってないのかな…
2倍のポイントを手に入れた! 324ポイント を手に入れた。
|
|
|
|
|
Name: O.N ..かけだし(1,172ポイント)
Date: 2009/01/09(金) 12:42
No:26667
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
あけましておめでとうございます。
今年一念の皆々様のご健康をお祈りするとともに、
これでも飲んで、テンション上げていきましょう。
※SAIで書きました。ちゃんと表示されるかな?
65ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(21,209ポイント)
Date: 2009/01/09(金) 13:02
No:26670
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
皆さん、遅れましたが、あけましておめでとうございます!!
Haruです!!
後、数ヶ月で、私がCの勉強を始めてから1年が過ぎようとしています。
初めのころはまったくわからない私でしたが、ここの掲示板の皆さんのおかげで、
・・・・
まぁ、始めたころと比べれば確実に進歩していると思っています。
時間があれば、他言語も学んでみよう。。。と考えているHaruですが、
考えてるだけで、終わりそうです。
とにかく、まだまだ、勉強中の私ですがこれからもどうぞ宜しくお願いいたします。
209ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(949,172ポイント)
Date: 2009/01/09(金) 13:54
No:26673
|
|
Title: Re:☆あけましておめでとうございます☆ (雑談トピ
|
|
>>きらりんさん
ばっちり保存しましたっ!
・・でも、消した方がよかったら言って下さい^^;
その時はマイピクチャフォルダ保存で我慢します(ノ▽`)ノ
>>SCIさん
ここの掲示板でバリバリに使う人がいても困りますよねw
mixiみたいに絵文字使えるようにしたらそういう個性的な人もあらわれるんでしょうかw
>>tkさん
コミュニティサイトやチャットやオンラインゲームとかで名前を呼ばれる時なかなか呼んで貰えないのと、
読めないと覚えられないから、名前覚えてもらえないんですよね^^;
>>O.N.さん
おぉ〜写真だ( ̄▽ ̄)
・・・ってこれ描いたんですか?!
普通に写真に見えました^^;
リアルにかけるんですね〜、すごいです!
早速またサーバーに移動させていただきました〜♪
>>Haruさん
あけおめです^^
私もC歴浅いのですが、プログラムが面白いと思うようになってから変わってきたと思います。
興味持って勉強する事って大事ですね☆
他の言語の勉強も頑張って下さい^^
409ポイント を手に入れた。
|
|
|
|
Name: wakimo ..かけだし(1,106ポイント)
Date: 2009/01/08(木) 12:00
No:26620
|
|
Title: 課題
|
|
はじめまして、学校の課題について質問させていただきます。
C言語のプログラミングの授業でqueueを実装しろという課題が出されました。そこで以下のようなプログラムを組みました。
#include <stdio.h>
#define SIZE 5
int head = 1;
int tail = 1;
double queue[SIZE]={0};
void enqueue(double z)
{
if ((tail%SIZE+1) == head%SIZE)
printf("データがいっぱいです\n");
else if (tail%SIZE+1 != head%SIZE) {
queue[tail-1 % SIZE] = z;
tail++;
}
}
double dequeue(void)
{
int i,k = queue[0];
if ((head % SIZE) != (tail % SIZE)) {
for (i = 1; i <= tail; i++) {
queue[i-1] = queue[i];
queue[i] = 0;
}
tail--;
}
else
printf("データがありません\n");
return k;
}
void print(void)
{
int j;
printf("queue[] = |");
for(j = 0; j < SIZE-1; j++)
{
printf("%2.1f | ", queue[j]);
}
printf("\n");
}
int main()
{
enqueue(100);
print();
enqueue(30);
print();
enqueue(50);
print();
enqueue(40);
print();
enqueue(60);
print();
enqueue(6);
print();
enqueue(60);
print();
enqueue(7);
print();
dequeue();
print();
dequeue();
print();
dequeue();
print();
dequeue();
print();
dequeue();
print();
dequeue();
print();
return 0;
}
これを実行すると
queue[] = |100.0 | 0.0 | 0.0 | 0.0 |
queue[] = |100.0 | 30.0 | 0.0 | 0.0 |
queue[] = |100.0 | 30.0 | 50.0 | 0.0 |
queue[] = |100.0 | 30.0 | 50.0 | 40.0 |
データがいっぱいです
queue[] = |100.0 | 30.0 | 50.0 | 40.0 |
データがいっぱいです
queue[] = |100.0 | 30.0 | 50.0 | 40.0 |
データがいっぱいです
queue[] = |100.0 | 30.0 | 50.0 | 40.0 |
データがいっぱいです
queue[] = |100.0 | 30.0 | 50.0 | 40.0 |
queue[] = |30.0 | 50.0 | 40.0 | 0.0 |
queue[] = |50.0 | 40.0 | 0.0 | 0.0 |
queue[] = |40.0 | 0.0 | 0.0 | 0.0 |
queue[] = |0.0 | 0.0 | 0.0 | 0.0 |
データがありません
queue[] = |0.0 | 0.0 | 0.0 | 0.0 |
データがありません
queue[] = |0.0 | 0.0 | 0.0 | 0.0 |
と表示されるのですが、これに対して教員から「deqで戻値を使ってデータを取り出しているか?」という返答があり、受理されませんでした。dequeue関数でqueue[0]であるkを戻値として返しているので条件は満たしていると思うのですがどこがいけないのでしょうか。
UNIXを使用しており、Cに関しては基礎部分だけでありポインタは未学習であり、使用可能なライブラリは標準ライブラリのみとなっております。
どうかよろしくお願いします。
1,106ポイント を手に入れた。
|
|
|
|
Name: non ..プログラマー(26,489ポイント)
Date: 2009/01/08(木) 12:27
No:26623
|
|
Title: Re:課題
|
|
プログラムは無駄が多いけど、間違ってないようです。
リングバッファが次の課題にでるのかな?
>「deqで戻値を使ってデータを取り出しているか?」
戻り値を表示しなさいってことじゃないでしょうか。
55ポイント を手に入れた。
|
|
|
|
Name: libra ..ぴよぴよ(387ポイント)
Date: 2009/01/04(日) 16:51
No:26416
|
|
Title: 変数の扱いについて
|
|
雑談と質問、どちらともつかずですが(^^);
画像ハンドルを変数に格納する時なのですが、
int image[100]
それぞれ対応した画像データを列挙体などで入れる方法と、
int playerdot[8]
int enemyshot[40]
というように、対応した画像データの数だけ変数を用意してやる方式のどちらの方がいいのでしょうか?
今自分はステージ毎異なる画像は前者、共通部画像(プレイヤー画像等)後者の方を使っています。
前者の方法を全部に適応させると、ループで画像を表示させるのが、非常に難しくなる、わかりずらいというのがあり、後者の方法を全部に適応するとメニュー画面等でゲームの画像を使わないときはゲーム画面の画像のために用意した変数を全く使わない状態になってしまいます。(使わない画像はInit関数でメモリを開放してますが)
龍神録は多分後者のやり方だと思うのですが・・・。
279ポイント を手に入れた。
|
|
|
|
Name: kazuoni [URL] ..熟練のプログラマー(45,973ポイント)
Date: 2009/01/04(日) 17:32
No:26419
|
|
Title: Re:変数の扱いについて
|
|
ゲームの規模がわからないのでなんとも言えませんが、
前者はゲーム画像が多い場合には厳しい気がします。
添え字計算に突っ掛かってしまうこともありそうです。
やはり後者でしょうか。
ただ、画像数がものすごく多いなら、
必要に応じて動的確保を用いてもいい気がします。
が、基本的には、
int playerdot[8]
int enemyshot[40]
で良いと思います。
110ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..伝説なるハッカー(943,320ポイント)
Date: 2009/01/05(月) 17:19
No:26457
|
|
Title: Re:変数の扱いについて
|
|
私は画像に関するデータには全て最初にImageとかimg_とか付けています。
int ImageChara[10];
int ImageEnemy[10];
など・・。SE系なら
int SoundShot[10];
int SoundEffect[10];
みたいに、決まった単語を前につけたら解り易いと思います。
もし仰っている前者の方法でやりたいなら仕様書を作ることオススメします。
>後者の方法を全部に適応するとメニュー画面等でゲームの画像を使わないときはゲーム画面の画像のために用意した変数を全く使わない状態になってしまいます。
int型の変数を10個や100個使用しなくても全く問題ないと思いますが、どうでしょう?
画像を使用しないに読み込むのは非効率ですが、変数が存在しているだけなら特に支障ないと思います。
仰っている意味の理解が違っていたらすみません。
201ポイント を手に入れた。
|
|
|
|
|
Name: dic ..中級者(10,228ポイント)
Date: 2009/01/05(月) 17:28
No:26458
|
|
Title: Re:変数の扱いについて
|
|
私も悩んだことがありますが
構造体を使いました
この構造体で使用中フラグ変数を作りこれがアクティブな場合のみ処理するという方法です
ソースにすると以下のようになります
#include <stdio.h>
typedef struct
{
bool active;
double x, y;
} Obj_t;
void Printf( Obj_t *obj )
{
if( obj->active )
{
printf( "x:%f y:%f\n", obj->x, obj->y );
}
}
void main()
{
Obj_t obj;
obj.x = 200.0;
obj.y = 300.0;
obj.active = true;
Printf( &obj );
// 100個のイメージを用意し、未初期化状態にする
Obj_t img[100];
int i;
for( i=0; i<100; i++ )
img[i].active = false;
}
194ポイント を手に入れた。
|
|
|
|
|
Name: dic ..中級者(10,366ポイント)
Date: 2009/01/05(月) 17:36
No:26459
|
|
Title: Re:変数の扱いについて
|
|
続き
// 50個初期化する
for( i=0; i<50; i++ ) {
img[i].x = rand()%3000;
img[i].y = rand()%5000;
img[i].active = true;
}
// 全部呼び出すが未初期化されていないものは
// 呼び出し先関数では実行されない
for( i=0; i<100; i++ )
Printf( &img[i] );
138ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..入門者(3,350ポイント)
Date: 2009/01/05(月) 19:48
No:26460
|
|
Title: Re:変数の扱いについて
|
|
皆様、丁寧な回答ありがとうございます。
>>kazuoni様
ゲームの規模・・・結構大きい物になってると思います。
画像数だけで分割してロードしたのを1つと数えると300以上使ってます。
>>管理人様
今回説明を省略してたのですが、宣言している変数は全て構造体に入れています。
typedef struct{
float player_x,player_y;
.
.
.
}Player_t;
typedef struct{
int playerdot[8];
int enemyshot[40];
.
.
.
}Img_t;
>>dic様
このソースの考え方は、シューティングの弾を出す時と同じアルゴリズムですよね。弾のフラグを管理するのであれば、今弾が発射されてない状態の変数があるのはいいのですが、"画像を使うとき"のフラグ変数がfalseのときのx,yの変数は全く使われません。
自分のソースを引き合いに出すと、menu[100] とメニュー画面で使うために宣言した変数がメニューでは使ってもゲームプレイ中では全く使われない、ということです。
ここで、これに関連した問題を提起します。
管理人様の回答より、int型変数が100個使用しなくても全く問題ないとのことですが、これが5000個、10000個となるとどうでしょうか?
敵の弾の情報で shot_flag(弾を出現させるフラグ) shot_x,shot_y(表示する座標位置)shot_time等は弾を出すときに絶対に使う変数ですが、それ以外の弾の動かし方によって使ったり使わなかったりする変数もあります。例えば、角速度を一定にして回転運動をさせたい時は、回転の中心座標と角度の変数が必要ですが、(多分^^;)ミシャグジ様弾幕はベクトルとかの考え方を使っていると思うので、中心座標の変数は使わない事になります。弾の個数を5000宣言したとき、中心座標の変数だけで10000個の変数が使われない状態になります。
自分が今考えているのは、常に使う変数以外で、ショットを出すときに同時に使う型の最大種類分だけ変数の種類を宣言するという方法です。
float f_shot1,f_shot2,f_shot3;
そして、制御する関数毎に「○型変数1は速度、○型変数2は角度・・・」というようにコメントを細かくつければ変数の無駄が一番少なくなると考えているのですが、この宣言の仕方はどうでしょう?shot_speed等、変数名で使用方法が判るのもいいのですが、色々な種類のショットを作ると使わない変数がどうしても大量に出てきてしまいます。
※弾の変数の扱いをリスト構造等で動的確保・・・とかはまだ上手く組み込む事が出来ないので最初に宣言をする形を取ってます。
587ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(37,354ポイント)
Date: 2009/01/05(月) 20:09
No:26461
|
|
Title: Re:変数の扱いについて
|
|
> 管理人様の回答より、int型変数が100個使用しなくても全く問題ないとのことですが、これが5000個、10000個となるとどうでしょうか?
int型10000個でも約40KBですよ?
メモリに制限のあるマイコンならいざ知らず、ロースペックノートPCでも500MBオーバーのメモリを搭載しているWindows環境なら微々たるものです。
MByteクラスの画像ファイルをバンバンロードできる環境でそういったことにこだわるのはナンセンスです。
97ポイント を手に入れた。
|
|
|
|
|
Name: dic ..中級者(10,231ポイント)
Date: 2009/01/05(月) 20:55
No:26463
|
|
Title: Re:変数の扱いについて
|
|
int img[100]
と宣言し
ゲーム内では50しか使わないので残りの50の未使用領域が問題だ
ということでしょうか?
それでしたら Mist さんもおっしゃるとおり
最近のパソコンのスペックを考えるとナンセンスですね
また、別の問題で、一度作ってしまってアップグレードする時など
保守的な面からみて、サイズに多少の余裕があった方が
変更箇所も減り、効率もアップするかと思います
135ポイント を落としてしまった。
|
|
|
|
|
Name: Mist ..プログラマー(37,618ポイント)
Date: 2009/01/05(月) 21:21
No:26465
|
|
Title: Re:変数の扱いについて
|
|
追記ですが
こういう問題を解決する場合、アプリケーション全体を見てメリットとデメリットのトレードオフを考えなければなりません。
問題を局地的に考えると後日思わぬところで落とし穴にはまることがあります。
あるポイントでしか使わない変数を静的変数として確保しておくのはもったいないというのはそのとおりなのですが、それを解決するために
・余分な処理が増えて実行速度が落ちる・・・微々たるものでしょうが
・ソースコードが複雑になりメンテナンス性(デバッグのしやすさ)が落ちる・・・こちらは重要
・対策自体が不具合の元になる・・・これも重要
動的確保した場合の開放忘れとか
といったデメリットは少なくとも考慮する必要があると思います。
例えば、それらの余分なメモリを何とかしなければアプリケーションの実行に問題が出ると判明しているのであれば対策を打つのは当然ですが、現時点の問題もないのになんとなくもったいないという感じで取り組むのは私には労多くして益少なしと思います。
264ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..入門者(3,965ポイント)
Date: 2009/01/06(火) 21:22
No:26496
|
|
Title: Re:変数の扱いについて
|
|
メモリに関して⇒
パソコンのスペックを考えるとそうですね。プログラムの見易さ、デバックのしやすさを優先すると、その点に関しては変数を静的変数として確保するのが無難ですね。
変数の種類に関して⇒
プログラムを作成しているときに変数が必要になるたびに、変数どんどん追加していったのですが、今までやっていく中で、全体仕様が5回ほど変わってしまい、そのたびにプログラムを書き換えるということになってしまいました。今まで、数百〜千くらいのプログラムの経験しか無いのが、万単位のプログラムに挑戦するとなるとどうしても仕様書の作り等も甘くなってしまいます。「この変数追加したらこの変数必要なくなったな」等・・・。
どうすれば、仕様変更にも柔軟に対応出来るか、と考えた結果が上で述べた
float f_shot1,f_shot2,f_shot3; ←コレ
なのですが、この点に関してはこの方法どうでしょうか?
追加して別の質問なのですが、構造体の中に変数を入れ、関数でその変数を扱いたいときに、その構造体のポインタを渡したのですが、プレイヤーに関する変数はプレイヤーの構造体、敵に関する変数なら敵の構造体という様にすると、関数にいくつものポインタを渡さなくてはなりません。最大8つとなりました。結局は構造体の中身の変数を使うなら、1個の構造体を作り、その中に全ての変数を入れてしまい、変数の名前の方を工夫すれば良いと考えたのですが、この方法に関してはどうでしょうか?
615ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(306,499ポイント)
Date: 2009/01/07(水) 00:33
No:26504
|
|
Title: Re:変数の扱いについて
|
|
>float f_shot1,f_shot2,f_shot3; ←コレ
>なのですが、この点に関してはこの方法どうでしょうか?
前提として、構造体の配列で大量に確保する場合、種類によって常に使われたり
使われなかったりする変数があり、きちんと命名して変数を追加していくと
無駄にふくれあがっていってしまう、と。
で、そのように書けば、どの種類でも汎用的に使えていい、とそういうことでしょうか?
根本的に異なる種類なのに1つの構造体で賄おうとすることにはちょっと疑義を感じますが、
無理矢理1つに押し込めるにはそういう手段も仕方がないかとは思います。
でも、どうせその方式でいくなら、例えば
enum TypeA
{
TypeA_CenterPosX,
TypeA_CenterPosY,
TypeA_Angle、
TypeA_Max
};
enum TypeB
{
TypeB_VectorX,
TypeB_VectorY,
TypeB_Max
};
float hogehoge[10]
と種類毎に enum定数を定義し、変数は配列にして、アクセスする時は必ず
hogehoge[TypeA_CenterPosX] とか hogehoge[TypeB_VectorY] とかのように
enumを使うようにすればいいのでしょうか。
見た目何の役割を持った変数なのか判りやすくなりますし、
TypeA_Angleが要らなくなったら、enumから消すだけで済みます。
>追加して別の質問なのですが
>〜
>1個の構造体を作り、その中に全ての変数を入れてしまい、
>変数の名前の方を工夫すれば良いと考えたのですが
どうでしょう、と訊かれてもそれだけでは判断はちょっと難しいのですが、
結局は状況次第でその方がやりやすいというのであれば別にいいと思いますよ。
ところで、ちょっと疑問なのですがその8つの情報とは何で、
それを必要とする関数って何なのでしょうか?
452ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..入門者(4,296ポイント)
Date: 2009/01/07(水) 02:48
No:26509
|
|
Title: Re:変数の扱いについて
|
|
変数に関しては列挙体を使う方式で進めていきたいと思います。
あと、判りにくい説明ですみません。
プログラムの構造は画像のような感じになっています。(結構省略してます)
WinMain関数内で構造体を宣言、そのポインタをそれぞれのゲーム関数に渡し、さらにゲーム関数内にあるそれぞれの処理、ショットの操作、キーの扱い等含めポインタを渡す形にしています。
龍神録サンプルを少し見た感じでは、構造体宣言部がグローバル領域にあるので、画像のように引数を渡さず構造体内のメンバにアクセスできるようになってると読み取りました。
龍神録はグローバル変数を使用し、自分はローカル変数を使っているわけですが、自分の場合も演算するときに、引数を指定して渡すのではなく、関数に構造体のポインタを渡しているので、龍神録と同じような変数の使い方が出来るようにしています。
>>根本的に異なる種類なのに1つの構造体で賄おうとすること
多分このグローバル変数のような使い方が影響していると思います・・・。
C言語を学びながら作成しているので、その時点での覚えたことのみで仕様書を作って作成、新たに覚えては作成、を繰り返していたので、色々ちぐはぐな事になっている部分が多々出来てしまいました。確かに仕様通り動くのですが。。。書き方的には間違ってないし、ちゃんと動くけど、この書き方実際どうなんだろう・・・という疑念も。
>>根本的に異なる種類なのに1つの構造体で賄おうとすることにはちょっと疑義を感じますが
のレスの通りです。
>>ところで、ちょっと疑問なのですがその8つの情報とは何で、 それを必要とする関数って何なのでしょうか?
⇒構造体のポインタでした。あと7つでした^^;プレイヤー、敵、ボス、画像、音、キー、3D背景使用時ポリゴン情報
331ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..伝説なるハッカー(308,344ポイント)
Date: 2009/01/08(木) 02:23
No:26606
|
|
Title: Re:変数の扱いについて
|
|
>プログラムの構造は画像のような感じになっています。(結構省略してます)
なるほど、こうなっているわけですね。
この状況では、確かに全部ポインタで渡すしかないですね。
又今の規模はそれほど大きくないようなので、それらの構造体を1つの構造体に
まとめてしまってそのポインタを渡すのも有りです。
ちなみにまとめ方にも2通りあり、複数の構造体をそのまま1つの構造体にしてしまう方法と、
複数の構造体のそれぞれのポインタを持った構造体を作ることです。
後者の場合は、ただ GameStage1の関数を呼びやすくする為にだけに存在するようなものですが、
GameStage2、GameStage3と続くようなら効果的かもしれません。
>ちゃんと動くけど、この書き方実際どうなんだろう・・・という疑念も
規模が十分に小さければ(図の通りエネミー1匹とか)、この書き方で全然問題ないです。
逆に言えば、規模が大きくなるに連れ、この書き方では辛くなってくるかもしれない、
ということでもあります。
今はまだ学習中とのことで、状況に合った書き方を模索してみると、
それぞれのメリット・デメリットが見えてくると思うので、いろいろ
試してみるのがいいかと思います。
328ポイント を手に入れた。
|
|
|
|
|
Name: Libra ..入門者(4,796ポイント)
Date: 2009/01/09(金) 02:18
No:26655
| 解決!
|
Title: Re:変数の扱いについて
|
|
回答して下さった皆様、ありがとうございます。
一応、今のプログラムの規模が2万行くらいです。
D○COMOの携帯電話のF○MAのプログラムが32万行というのを聞いたことがあるので、大規模なプログラムとはいかなくても、1年経つか経たないかの初心者プログラマーが作るプログラムとしては一応中規模のプログラムになるのでしょうか。
以前はファイル出入力が出来なかったので、敵の出現データ、キャラクターの会話部分など全てプログラム内に打ち込んでいました。勉強してファイル出入力が出来るようになったので、全てそれに対応するよう書き換えたところ、プログラム量がかなり減った、といった感じに自分なりにプログラムの書き方を模索している最中です。
変数の構造体ポインタによる渡し方等は根本的なプログラムの構造なので、状況に合った書き方を模索するにしても万単位のプログラムになってしまったので、なかなか直せないのが現状です・・・。直すなら手遅れにならない早いうちにと思い、掲示板にスレ立てた次第です。
独習Cを2〜3周したので、初歩的な部分の一通りの書き方は覚えました。ただ、やはり
「ちゃんと動くけど、この書き方実際どうなんだろう・・・」というのがあります。ここら辺の問題は文法や基本的な書き方ではなく、データの構造やら、アルゴリズムの話になってくるので、独習Cだけでは・・・・。他のゲーム作成の参考書のプログラムを参考にしようとしても、まだ勉強していないC++で書いてあったりでなかなか参考に出来ません。C++だとクラスとかがあるので、また構造が根本的に変わってしまうのでまたなんとも・・・。
明日あたり、去年の夏の時点でのゲームアップロードしてみたいと思います。(^^);
その時点でのソース、無駄が多く、機能も今よりもっと少ないくせに多分3万行位ありますが・・・。
500ポイント を手に入れた。
|
|
|
|
|