|
Name: abaruku ..ぴよぴよ(246ポイント)
Date: 2008/10/25(土) 00:39
No:23027
|
|
Title: 課題なんですが;;
|
|
皆様はじめまして、こんばんわ。
C言語でプログラムの課題をやっているのですが、どうにもできなくて困っています;;
どうか、皆様の知恵を貸してください!
課題の内容は、
a[5]={1,2,3,4,5}
b[5]={5,4,3,2,1}
上記のaとbを
(a[1]*b[1])+(a[2]*b[2])+(a[3]*b[3])+(a[4]*b[4])+(a[5]*b[5])
という風に足し算をします。
出た値をz1に格納します。
そして次に、もう1度(a[1]*b[1])〜(a[5]*b[5])をして、
出た値をz1に足したものをz2とします。
更にもう1度(a[1]*b[1])〜(a[5]*b[5])を繰り返し、
z2に出た値を足して、z3を出します。
その後、出力するんですが、
a[5]={1,2,3,4,5}
b[5]={5,4,3,2,1}
z1=???
z2=???
z3=???
このように表示しないといけません;;
更に、for文を使って二重ループにしないとだめなのです。
一応、自分なりに頑張って作ったのですが、未完成で、明らかに違うのも分かります。
しかしどこをどうすればいいのか分からないので、皆様にお聞きした次第です。
#include <stdio.h>
int main(void){
int a[5]={1,2,3,4,5};
int b[5]={5,4,3,2,1};
int z=0;
int i,j;
int sum;
for(i=1; i<=3; i++){
for(j=0; j<=4; j++){
sum+=a[1+j]*b[1+j];
}
z+=sum;
}
printf("は%dになります。\n",a[5]);
printf("は%dになります。\n",b[5]);
printf("は%dになります。\n",z);
return(0);
;
}
246ポイント を手に入れた。
|
|
|
|
Name: kazuoni ..プログラマー(35,136ポイント)
Date: 2008/10/25(土) 00:48
No:23028
|
|
Title: Re:課題なんですが;;
|
|
a[0]=1
a[1]=2
...
a[4]=5
ですので、計算時の配列の添え字を変えるか、配列の中身を変えるかどちらかを変えてください。
(おそらく前者のほうがいいかと思われます)
あとsumの使い方ですが、必ず初期化をしましょう。
sum=sum+〜〜
を行いますので、最初sum=(不定値)+〜〜
になってしまいます。
130ポイント を手に入れた。
|
|
|
|
|
Name: 組木紙織 [URL] ..熟練のプログラマー(64,218ポイント)
Date: 2008/10/25(土) 00:57
No:23030
|
|
Title: Re:課題なんですが;;
|
|
まずは規約を読みましょう、まずはそれからです。
/********以下規約の一部抜粋****************/
学校の課題の質問は大いに結構です。気軽に質問してください。
ただし
「どこがわからないのか」
「自分はどこまでやったのか」
「結局何が行いたいのか」
「自分のC言語の知識はどの程度なのか」
を明確にしてください。
・自分は何を使ってコンパイルしているのか、OSは何かを必要に応じて書きましょう。
・ソースコードを投稿するときは、コードをと で囲んでください。
(字下げされます)
/***********ここまで**************************/
問題を解くため&&回答を書く助けとするためにいくつか質問をします。
1:もともとの課題文があると思いますが、そのとおりに質問をしていますか?
(C言語に慣れていない人だと必要な部分を不必要とみなして省くことがあるのでその確認です)
2:z1,z2,z3はどのように定義される変数ですか?
3:質問文の???の部分は自分で計算できますか?
4:C言語の変数の特徴をしっていますか?
5:C言語の配列に関してどれだけ理解できていますか?
2倍のポイントを手に入れた! 592ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(835,244ポイント)
Date: 2008/10/25(土) 01:09
No:23032
|
|
Title: Re:課題なんですが;;
|
|
私も問題文が違うと思います。
int a[5];
と宣言すると
a[0],a[1],a[2],a[3],a[4]
の5つの要素を持つ配列が用意されます。
すなわち6番目であるa[5]はありません。
(a[1]*b[1])+(a[2]*b[2])+(a[3]*b[3])+(a[4]*b[4])+(a[5]*b[5])
じゃなくて
(a[0]*b[0])+(a[1]*b[1])+(a[2]*b[2])+(a[3]*b[3])+(a[4]*b[4]) … (1)
ではないですか?
それから
>そして次に、もう1度(a[1]*b[1])〜(a[5]*b[5])をして、
>出た値をz1に足したものをz2とします。
この計算ってさっきと同じ(1)ですか?
それならまた計算しなくても同じ計算なら何回やっても答えは同じですから
z1を2倍したらいいんじゃないですか?
2重ループ使わないといけないんですか?
2重ループつかって配列でもない変数に周ごとにわけていれるのは面倒だし、
する必要もない気がするんですが・・。
まぁ問題文がそういう仕様なら仕方ない・・。
意味不明な問題出されたら問題文を満たす先生の意図しないプログラムを書きたくなるのは
根性が曲がってるんでしょうか・・w
それはいいとして
先ほど言ったように[0]から始まるので
sum+=a[1+j]*b[1+j];//←ここ"1+"いらない
です。
80ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(855,573ポイント)
Date: 2008/10/25(土) 02:20
No:23040
|
|
Title: Re:課題なんですが;;
|
|
問題文をこうじゃないかなと勝手に解釈し、
かつ先生が意図しているんじゃないかと思われるようなプログラムを想像して
プログラムをなおし、アドバイスを書き込んでみるとこんな感じでしょうか。
#include <stdio.h>
int main(void){
int z1,z2,z3,i,j,sum;
int a[5]={1,2,3,4,5},b[5]={5,4,3,2,1};
z1=z2=z3=0;
for(/*0以上3未満*/){
//sumを初期化
for(j=0; j<=4; j++){
sum+=a[1+j]*b[1+j];//←"1+"いらない
}
//もし1周目ならz1にsum を代入
//もし2周目ならz2にsum+z1を代入
//もし3周目ならz3にsum+z2を代入
}
//結果を表示する
return(0);
}
注釈やコメント部分の処理を追加して下さい。
そうすれば出来上がりです。
299ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(855,727ポイント)
Date: 2008/10/25(土) 02:28
No:23041
|
|
Title: Re:課題なんですが;;
|
|
ただ二重ループ使うんならこっちの方法じゃないと効率悪いですよね〜・・。
#include <stdio.h>
int main(void){
int z=0,z1=0,z2=0,i,j,sum=0;
int a[5]={1,2,3,4,5},b[5]={5,4,3,2,1};
int *p[3];
p[0]=&z; p[1]=&z1; p[2]=&z2;
for(i=0;i<3;i++){
for(j=0; j<5; j++)
sum+=a[j]*b[j];
*p[i]+=sum;
}
printf("%d %d %d\n",*p[0],*p[1],*p[2]);
return(0);
}
とりあえず上に書いたプログラムの注釈をプログラムの処理に置き換えてみて下さい。
154ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(35,204ポイント)
Date: 2008/10/25(土) 02:57
No:23042
|
|
Title: Re:課題なんですが;;
|
|
それかz1,z2,z3をつかわずに
printf("z %d = %d",i+1,sum)
的な感じじゃだめですかねっ^^;
まぁ問題文が正確にわからないと何とも言えないですが。。
68ポイント を手に入れた。
|
|
|
|
|
Name: abaruku ..ぴよぴよ(937ポイント)
Date: 2008/10/25(土) 11:23
No:23048
|
|
Title: Re:課題なんですが;;
|
|
・kazuoniさん
あああ、そうですよね、a[4]ですよね・・・・。
ついつい1〜5まであると、a[5]にするんだって思い込んでました;;
それとsumを初期化するのを忘れてました、ご指導ありがとうございます!
・組木紙織さん
すいません、規約を読むのを忘れてました;;
とりあえず回答として、私はC言語についてはほぼ初心者と同レベルだと思います・・・。
自分のプログラムでコンパイルと実行はできたのですが、数値は明らかに違いました。
最終的に、出力するとz1=35,z2=70,z3=105と出したいです。
最初と最後はともかく、forループになると混乱してきてしまって、自分のプログラムみたいに・・・。
OSはVista、何を使ってコンパイルというのは、ちょっと学校に行かないとわかりません;;
次から気をつけます!
・管理人さん
すいません、a[5]は完全に私の勘違いでした;;
それとz1に足したものをz2に入れるという部分は、
次はもう一回(a[0]*b[0])〜(a[4]*b[4])をして、それとz2を足すので2倍じゃダメなんじゃないかなって思いました。
最後に、sum+=a[1+j]*b[1+j];の部分は1はいりませんでしたね;;
それに、ソースを2個も作ってくださるとは、感激です!
今はまだ実行できないけど、学校に行ったら試してみたいと思います。
見ていて、ああ・・・ここはこうなるのかってすごい勉強になります!
本当にありがとうございます!
・kazuoniさん
問題文はこんな感じなんです、先生が早口&すごく見づらい文字で書いたんですが。
for文を2重ループさせて、z1〜z3までの値を出力することが重要らしいです。
・たかぎさん
すいません、本当にすいません;;
その部分は私の勘違いでした、正確には(a[0]*b[0])〜(a[4]*b[4])でした;;
691ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 [URL] ..ぴよぴよ(285ポイント)
Date: 2008/10/25(土) 14:47
No:23052
|
|
Title: Re:課題なんですが;;
|
|
C言語の勉強は自分のPCにコンパイラを入れることから始まります。
紙の上の勉強、問題集を読むだけの勉強、授業中・休憩中だけ学校にあるパソコンで勉強、というスタンスでは身につかないです。
大学受験は高校で習う範囲のことが出るといっても、授業だけ出てたら難関大学に受かるわけじゃないと言う感じでしょうか。
プログラムは数学と同じです。演習で身につきます。本を読んだだけでは身につかないです。
・・ということで、まずコンパイラを導入しましょう。
windowsを使っていてコンパイラは何を使っていいかわからないときはVC++がおススメです。
http://www.microsoft.com/japan/msdn/vstudio/express/
VidualC++2008
というやつをインストールしてみてください。
調べることも勉強なので、まずはコンパイル出来る環境を作るところまでがんばってみてください。
285ポイント を手に入れた。
|
|
|
|
|
Name: conio ..かけだし(1,447ポイント)
Date: 2008/10/26(日) 23:25
No:23112
|
|
Title: Re:課題なんですが;;
|
|
もしかすると、これは某大学の、高速フーリエ変換プログラムを作るための練習課題でしょうか。
(自分も課題として出されたので)
要するに、これは
@2つの配列(例えばa[5]、b[5]等)の各要素の積の計算をする。
Aそして、計算して出た積(全部で5つ)を足す。
B @〜Aの計算を繰り替えす。(但し、1回目以降は前回の計算結果を足す)
C出力結果は、
-------------------------------
test[5] = {1,2,3,4,5}
test2[5] = {5,4,3,2,1}
Z1 = 35
Z2 = 70
Z3 = 105
-------------------------------
というように表示する、という課題です。
先生はZ1、Z2、Z3と書いていましたが、for文で実装しようとするとめんどくさいので、
自分は、Z[3]という風に、答えを入れる部分は配列で実装しました。
--------------------------------------------------------------------------------
#include<stdio.h>
int main(void){
int i,j;
int Z[3]={0};
int test[5]={1,2,3,4,5};
int test2[5]={5,4,3,2,1};
for(i=0;i<3;i++){
for(j=0;j<5;j++)
Z[i] += test[j]*test2[j];
【一回目以降の計算ならば、前回の計算結果を足す(Z[i] + Z[i-1])】
}
printf("test = {%d,%d,%d,%d,%d}\n",test[0],test[1],test[2],test[3],test[4]);
printf("test2 = {%d,%d,%d,%d,%d}\n",test2[0],test2[1],test2[2],test2[3],test2[4]);
for(i=0;i<3;i++)
printf("Z[%d] = %d\n",i,Z[i]);
return(0);
}
---------------------------------------------------------------------------------
丸々解答するとよろしく無いので、一部は未記入です。
【】内の、日本語で書いてある部分をif文で実装出来たら完成です。
Dixq (管理人) さんへ
>>それならまた計算しなくても同じ計算なら何回やっても答えは同じですから
>>z1を2倍したらいいんじゃないですか?
これは、"毎回異なる計算結果を順次足していくプログラム"を作る為の練習課題なので、
単純に2倍してはダメなのです。
251ポイント を手に入れた。
|
|
|
|
|
Name: abaruku ..ぴよぴよ(963ポイント)
Date: 2008/10/26(日) 23:40
No:23113
| 解決!
|
Title: Re:課題なんですが;;
|
|
・管理人さん
そうですよね、まずは土台を作らないとダメですよね。
わざわざURLまで張っていただいて、ありがとうございます!
しっかりと勉強して、完成させます!
・かけだしさん
すごい・・・、よく見ただけでフーリエ変換の練習課題とわかりましたね・・・w
素人目から見たら、どのプログラムも同じに見えるもので(@@;
さまざまなやり方のプログラムを教えていただき、本当にありがとうございます;;
おかげで、理解が悪い私でもなんとか解けるようになってきました!
皆様、またお聞きにくるかもしれませんが、その時は何卒、よろしくお願いします(-人-)
26ポイント を手に入れた。
|
|
|
|
Name: 白 [URL] ..入門者(2,644ポイント)
Date: 2008/10/26(日) 18:10
No:23093
|
|
Title: ライフゲームの絶滅
|
|
数日前からライフゲームを作っているのですが、
初期の生物数をいくら増やしても絶対に絶滅してしまいます。
条件が厳しすぎるのか、あるいは、コードが
間違っているのかもわかりませんが、
その点についてのご指摘のほどを
お願いします。
サンプルにもライフゲームがありましたが、
api?を使わずに作成したいので、
その点を考慮してくださると嬉しいです。
試行錯誤中のソースのため見ずらいです。
コメントでどうにか理解してもらえたら
よいのですが…
//Aの周囲には2つのセルがある場合
//Aにセルがあるなら次の世代もセルがあり、ないなら次の世代もない。
//Aの周囲には3つのセルがある場合
//Aにセルがあってもなくても次の世代にはセルが発生する。
//それ以外の場合
//次の世代にはセルが消滅する。
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#define AT_FIRST 30//初期数
#define TATE 15 //縦のマス数
#define YOKO 15 //横のマス数
int hantei(int x,int y);//周囲の数判定関数
int sleep(unsigned long x);//時間経過を待つ
void cpu(int x,int y,int kosuu);//書き換え処理中枢
void write0(int x,int y);//0に書き換え
void write1(int x,int y);//1に書き換え
void output(void);//画面への表示
int field[TATE + 2][YOKO + 2];
int fieldnow[TATE + 2][YOKO + 2];
int main(void)
{
int k,j;
int i = 0;
int kakuninT,kakuninY;
srand((unsigned)time(NULL));
/*
//2の枠設定
for(k = 0;k <= YOKO;k++){
fieldnow[0][k] = 2;
fieldnow[k][0] = 2;
}
for(k = 0;k <= TATE;k++){
fieldnow[TATE][k] = 2;
fieldnow[k][YOKO] = 2;
}
*/
//初期の表示
do{
kakuninT = ((rand() + (TATE)) % (TATE) + 1);
kakuninY = ((rand() + (YOKO)) % (YOKO) + 1);
//同一のがないか確認
if(fieldnow[kakuninT][kakuninY] == 0){
fieldnow[kakuninT][kakuninY] = 1;
i++;
}
}while(i != AT_FIRST);
//ここから繰り返す
do{
output();
//コピー
for(i = 0;i <= TATE + 2;i++){
for(j = 0;j <= YOKO + 2;j++){
field[i][j] = fieldnow[i][j];
}
}
for(i = 1;i < TATE + 2;i++){
for(j = 1;j < YOKO + 2;j++){
cpu(i,j,hantei(i,j));
}
}
printf("\n");
sleep(1000);
system("cls");
}while(1);
return 0;
}
int hantei(int x,int y)
{
int kosuu = 0;
//処理
if(field[x][y] != 2){
if(field[x--][y--] == 1)
kosuu++;
if(field[x][y--] == 1)
kosuu++;
if(field[x++][y--] == 1)
kosuu++;
if(field[x--][y] == 1)
kosuu++;
if(field[x][y] == 1)
kosuu++;
if(field[x++][y] == 1)
kosuu++;
if(field[x--][y++] == 1)
kosuu++;
if(field[x][y++] == 1)
kosuu++;
if(field[x++][y++] == 1)
kosuu++;
}
return kosuu;
}
void cpu(int x,int y,int kosuu)
{
if(kosuu == 3){
write1(x,y);
}else{
if(kosuu != 2){
write0(x,y);
}
}
return;
}
void write0(int x,int y)
{
fieldnow[x][y] = 0;
}
void write1(int x,int y)
{
fieldnow[x][y] = 1;
}
int sleep(unsigned long x)
{
clock_t c,s = clock();
do{
if((c = clock()) == (clock_t)-1)//エラー判定
return 0;
}while(1000UL * (c - s) / CLOCKS_PER_SEC < x);
return 1;
}
void output(void)
{
int x,y;//座標
for(x = 0;x <= TATE + 2;x++){
for(y = 0;y <= YOKO + 2;y++){
switch(fieldnow[x][y]){
case 0:
printf("□");
break;
case 1:
printf("■");
break;
case 2:
printf("◆");
break;
}
}
printf("\n");
}
}
2倍のポイントを手に入れた! 2,406ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(128,096ポイント)
Date: 2008/10/26(日) 19:38
No:23095
|
|
Title: Re:ライフゲームの絶滅
|
|
> if(kosuu == 3){
> write1(x,y);
> }else{
> if(kosuu != 2){
> write0(x,y);
> }
> }
このコードでは
> //Aの周囲には2つのセルがある場合
> //Aにセルがあるなら次の世代もセルがあり、ないなら次の世代もない。
この部分を実装できてないように見えます。
2倍のポイントを手に入れた! 86ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(128,198ポイント)
Date: 2008/10/26(日) 21:06
No:23104
|
|
Title: Re:ライフゲームの絶滅
|
|
それから、hantei関数で、x座標・y座標を
インクリメントしたりデクリメントしたりしているのは
まずいです。
x, yの値は変えずに、周囲を判定する必要があります。
つまり、
・インクリメントの代わりに+1
・デクリメントの代わりに-1
です。
102ポイント を手に入れた。
|
|
|
|
|
Name: 白 [URL] ..入門者(2,826ポイント)
Date: 2008/10/26(日) 22:11
No:23109
| 解決!
|
Title: Re:ライフゲームの絶滅
|
|
インクリメントとデクリメントを直してみたところ、
今度は絶滅しませんでした。これでどうにか
進めそうです。
>この部分を実装できてないように見えます。
こちらのご指摘については、まだ検証できていないのですが、
すぐに確かめてみたいと思います。
大変わかりやすい御説明ありがとうございました。
今後もまた、質問を出すと思いますが、その時も
どうぞよろしくお願いします。
182ポイント を手に入れた。
|
|
|
|
|
Name: mats ..ぴよぴよ(582ポイント)
Date: 2008/10/27(月) 00:17
No:23116
|
|
Title: Re:ライフゲームの絶滅
|
|
boxさんの補足のような感じになりますが
「Aの周囲」なのでA自身を数えるのはまずいんじゃないですかね?
(8近傍の話だと思うので)
A自身のカウントを無くせば問題の部分も正しく動くかと…
45ポイント を手に入れた。
|
|
|
|
Name: mi ..初心者(5,765ポイント)
Date: 2008/10/26(日) 20:06
No:23097
|
|
Title: 処理が重くなるのはなぜですか
|
|
ゲームを作っていて簡単なタイトル画面を作ってみようと思ったのですが、
処理がとても重く、fpsを表示させてみると4.0とかそれくらいしかありませんでした。
switch(func_state)で分けてやったのですが、ゲームのメインではfpsは60近くあるのですが、
タイトル画面になるとぐっと減ってしまいます。
処理していることは
int title_g,sentaku_g,yajirusi_g,yaji_x=0;
void title_load(){
title_g=LoadGraph("img/taitoru.png");
sentaku_g=LoadGraph("img/sentaku.png");
yajirusi_g=LoadGraph("img/yajirusi.png");
}
void title_graph(){
DrawGraph(0,0,title_g,FALSE);
DrawGraph(0,0,sentaku_g,TRUE);
DrawGraph(yaji_x,420,yajirusi_g,TRUE);
}
void yajirusi_ido(){
if(CheckStatePad(configpad.right)==1)
yaji_x+=380;
if(CheckStatePad(configpad.left)==1)
yaji_x-=380;
if(yaji_x==760)
yaji_x=0;
if(yaji_x==-380)
yaji_x=380;
if(CheckStatePad(configpad.jump)==1)
func_state=100;
}
void title_main(){
title_load();
title_graph();
yajirusi_ido();
}
のtitle_main();
とdraw_fps(0,465);
だけだと思うのですが。
重くなるのはどうしてでしょうか?
こことは違う場所が関係してるのでしょうか?
505ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(250,936ポイント)
Date: 2008/10/26(日) 20:15
No:23098
|
|
Title: Re:処理が重くなるのはなぜですか
|
|
title_load()が原因ではないでしょうか?
title_main()が毎フレーム呼ばれるのだとしたら、
title_load()によって毎回テクスチャをファイルから
ロードしているように見えます。
39ポイント を手に入れた。
|
|
|
|
|
Name: mi ..初心者(5,784ポイント)
Date: 2008/10/26(日) 21:30
No:23106
| 解決!
|
Title: Re:処理が重くなるのはなぜですか
|
|
>>Justyさん
全くそのとおりでした。
ありがとうございます。
19ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(53,300ポイント)
Date: 2008/10/26(日) 11:19
No:23081
|
|
Title: Re:カラーパレットの操作について
|
|
BMPの説明はWeb上に大量にあるので、それらを参考にしたほうが良いと思います。
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi
とりあえず、DXライブラリ置き場で提示したGetPaletteとSetPaletteのBMP版の
ソースを書いておきますが、解説はしません。
上記のサイトの参考にして、何をやっているかを考えてみてください。
その上で、まだわからなければ、どこからどこまでがわかっていて
どこがわからなかったかを明記して再度質問してください。
#include <vector>
/*!
* @brief BMPのパレットを取得
*
* @param pBuffer BMP画像の先頭のアドレスを指定します。
* @param palette 取得するパレットバッファを指定します。
*
* @return 正常に取得した場合は true を返します。
*/
bool GetPalette(const char* pBuffer, std::vector<unsigned char>& palette)
{
BITMAPFILEHEADER header;
BITMAPINFOHEADER info;
std::memcpy(&header, pBuffer, sizeof(header));
pBuffer += sizeof(header);
if (header.bfType != 0x4d42) {
// ビットマップではない
return false;
}
std::memcpy(&info, pBuffer, sizeof(info));
pBuffer += sizeof(info);
if (info.biBitCount != 8) {
// 256色ではない
return false;
}
palette.resize(256 * 3);
for (int i = 0; i < 256; ++i) {
const int bmpidx = i * sizeof(RGBQUAD);
const int palidx = i * 3;
palette[palidx + 0] = pBuffer[bmpidx + 2]; // 赤
palette[palidx + 1] = pBuffer[bmpidx + 1]; // 緑
palette[palidx + 2] = pBuffer[bmpidx + 0]; // 青
}
return true;
}
/*!
* @brief BMPのパレットを設定
*
* @param pBuffer BMP画像の先頭のアドレスを指定します。
* @param palette 設定するパレットバッファを指定します。
*
* @return 正常に設定した場合は true を返します。
*/
bool SetPalette(char* pBuffer, const std::vector<unsigned char>& palette)
{
BITMAPFILEHEADER header;
BITMAPINFOHEADER info;
std::memcpy(&header, pBuffer, sizeof(header));
pBuffer += sizeof(header);
if (header.bfType != 0x4d42) {
// ビットマップではない
return false;
}
std::memcpy(&info, pBuffer, sizeof(info));
pBuffer += sizeof(info);
if (info.biBitCount != 8) {
// 256色ではない
return false;
}
for (int i = 0; i < 256; ++i) {
const int bmpidx = i * sizeof(RGBQUAD);
const int palidx = i * 3;
pBuffer[bmpidx + 2] = palette[palidx + 0]; // 赤
pBuffer[bmpidx + 1] = palette[palidx + 1]; // 緑
pBuffer[bmpidx + 0] = palette[palidx + 2]; // 青
}
return true;
}
610ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..ぴよぴよ(741ポイント)
Date: 2008/10/26(日) 16:33
No:23091
|
|
Title: Re:カラーパレットの操作について
|
|
ソースありがとうございます
まさか同じ人が来てくれるとは思いませんでした
BITMAPFILEHEADER header;
BITMAPINFOHEADER info;
によってファイルヘッダと情報ヘッダを参照しているのは分かるのですが、
for (int i = 0; i < 256; ++i) {
const int bmpidx = i * sizeof(RGBQUAD);
const int palidx = i * 3;
pBuffer[palidx + 2] = palette[bmpidx + 0]; // 赤
pBuffer[palidx + 1] = palette[bmpidx + 1]; // 緑
pBuffer[palidx + 0] = palette[bmpidx + 2]; // 青
}
からよく分からないです(GetPallete,SetPallete同様
BMPのパレットデータが青、緑、赤という順番にあわせて読んでパレット用データに入れてるのだと思いますけど
いまいち自身がないです
あとpBufferとpalletteによりどのように色が変換されているのかも良く分かりません
このままだと
・BMPからパレットデータを読み取り
・パレットデータをBMPへ
という作業であって
特定の色を検索→その色を変換
という作業ではないと思います
初心者のような質問ですいませんm(_ _)m
282ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..ぴよぴよ(774ポイント)
Date: 2008/10/26(日) 16:44
No:23092
|
|
Title: Re:カラーパレットの操作について
|
|
すいません少し理解できてきました;
ちょっと上のを使って実際に特定の色を変換するプログラムを作ってみます
33ポイント を手に入れた。
|
|
|
|
|
Name: けんたろうちゃん ..かけだし(1,869ポイント)
Date: 2008/10/26(日) 20:32
No:23102
| 解決!
|
Title: Re:カラーパレットの操作について
|
|
GPGAさんのコードを参考にして、パレット変更のプログラムを作成しました
以下ソースコードです
#include "DxLib.h"
#include <vector>
bool GetPalette(const char* pBuffer, std::vector<unsigned char>& palette);
bool SetPalette(char* pBuffer, const std::vector<unsigned char>& palette);
bool ConvertPalette(std::vector<unsigned char>& palette);
int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
// 初期化
ChangeWindowMode(TRUE);
if (DxLib_Init() == -1) {
return 1;
}
SetDrawScreen(DX_SCREEN_BACK);
// 画像読み込み
std::vector<char> bmpbuf;
{
int fh = FileRead_open("test.bmp");
bmpbuf.resize(FileRead_size("test.bmp"));
FileRead_read(&bmpbuf[0], bmpbuf.size(), fh);
FileRead_close(fh);
}
// 画像初期化
int iHandle[2];
std::vector<unsigned char> palette;
GetPalette(&bmpbuf[0], palette);
iHandle[0] = CreateGraphFromMem(&bmpbuf[0], bmpbuf.size());
ConvertPalette(palette);
SetPalette(&bmpbuf[0], palette);
iHandle[1] = CreateGraphFromMem(&bmpbuf[0], bmpbuf.size());
// 表示
DrawGraph(0, 0, iHandle[0], 0);
DrawGraph(64, 0, iHandle[1], 0);
ScreenFlip();
WaitKey();
DxLib_End();
return 0;
}
/*!
* @brief BMPのパレットを取得
*
* @param pBuffer BMP画像の先頭のアドレスを指定します。
* @param palette 取得するパレットバッファを指定します。
*
* @return 正常に取得した場合は true を返します。
*/
bool GetPalette(const char* pBuffer, std::vector<unsigned char>& palette)
{
BITMAPFILEHEADER header;
BITMAPINFOHEADER info;
std::memcpy(&header, pBuffer, sizeof(header));
pBuffer += sizeof(header);
if (header.bfType != 0x4d42) {
// ビットマップではない
return false;
}
std::memcpy(&info, pBuffer, sizeof(info));
pBuffer += sizeof(info);
if (info.biBitCount != 8) {
// 256色ではない
return false;
}
palette.resize(256 * 3);
for (int i = 0; i < 256; ++i) {
const int bmpidx = i * sizeof(RGBQUAD);
const int palidx = i * 3;
palette[palidx + 0] = pBuffer[bmpidx + 2]; // 赤
palette[palidx + 1] = pBuffer[bmpidx + 1]; // 緑
palette[palidx + 2] = pBuffer[bmpidx + 0]; // 青
}
return true;
}
/*!
* @brief BMPのパレットを設定
*
* @param pBuffer BMP画像の先頭のアドレスを指定します。
* @param palette 設定するパレットバッファを指定します。
*
* @return 正常に設定した場合は true を返します。
*/
bool SetPalette(char* pBuffer, const std::vector<unsigned char>& palette)
{
BITMAPFILEHEADER header;
BITMAPINFOHEADER info;
std::memcpy(&header, pBuffer, sizeof(header));
pBuffer += sizeof(header);
if (header.bfType != 0x4d42) {
// ビットマップではない
return false;
}
std::memcpy(&info, pBuffer, sizeof(info));
pBuffer += sizeof(info);
if (info.biBitCount != 8) {
// 256色ではない
return false;
}
for (int i = 0; i < 256; ++i) {
const int bmpidx = i * sizeof(RGBQUAD);
const int palidx = i * 3;
pBuffer[bmpidx + 2] = palette[palidx + 0]; // 赤
pBuffer[bmpidx + 1] = palette[palidx + 1]; // 緑
pBuffer[bmpidx + 0] = palette[palidx + 2]; // 青
}
return true;
}
bool ConvertPalette(std::vector<unsigned char>& palette)
{
int ph;
char palBuf[1024];
ph = FileRead_open("palette1.txt");
while(FileRead_eof(ph) == 0)
{
FileRead_gets(palBuf, 1023, ph);
int original_R, original_G, original_B;
int convert_R, convert_G, convert_B;
sscanf_s(palBuf, "%d,%d,%d=%d,%d,%d;", &original_R, &original_G, &original_B, &convert_R, &convert_G, &convert_B);
for(int i=0; i<256; i++){
if(palette[i * 3 + 0]==original_R && palette[i * 3 + 1]==original_G && palette[i * 3 + 2]==original_B){
palette[i * 3 + 0]=convert_R;
palette[i * 3 + 1]=convert_G;
palette[i * 3 + 2]=convert_B;
}
}
}
return true;
}
そのうち、ConvertPalette関数を指定したファイル名により読み取るパレットファイルを変更できるように直したいです
1,095ポイント を手に入れた。
|
|
|
|
Name: ぐっちょん ..ぴよぴよ(283ポイント)
Date: 2008/10/24(金) 14:59
No:22997
|
|
Title: メニュー選択後について
|
|
はじめまして。初めて投稿させていただきます。
現在、私はDXライブラリでシュミレーションRPGを制作しております。
さて、本題なのですが、タイトル後のメニュー選択でつまずいております。
こちらのサイトにて選択のサンプルが合ったのでそれを元に制作しました。
Zキーが決定キーになっているのですが、Zキーを押してもうまく関数が反応してくれません。
何かアドバイスがあれば、ご返答のほど宜しくお願い致します。
添付したファイルは こんな感じかな という感覚で打ち込んだソースなので
詳しくはtxtファイルをご覧ください。
制作環境
制作ソフト : Microsoft Visual Studio Academic Edition 2005
OS : XP
283ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(836,206ポイント)
Date: 2008/10/24(金) 15:35
No:23002
|
|
Title: Re:メニュー選択後について
|
|
if( CheckHitKey( KEY_INPUT_Z ) != 0 && y == 360 ) { //メニュー(NEW GAME)を選択したとき
Method[ y ]() ;
ここおかしくないですか?
yは360ですよね。
配列要素360個目に・・はないですよね。つまり関数を360個も登録してないのでエラーになってます。
今関数1つしか登録していないのだから
Method[0]();
しか呼ぶ事はで来ません。
後、あちこちにScreenFlip() ;などを書くのは非効率ですので、
メインループはメイン関数の中に一つだけかいて、switch文などでどの関数を呼ぶか変更してあげて下さい。
http://dixq.net/g/#34
184ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(34,664ポイント)
Date: 2008/10/24(金) 15:36
No:23003
|
|
Title: Re:メニュー選択後について
|
|
ひとつ思ったんですが、なぜキー監査(GetHitKeyStateAll_2)があるのに
CheckHitKey()を使っているのでしょうか?
しっかりコード見てないので分かりませんが、ブレイクポイントを使ってみてはどうでしょうか?
62ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,932ポイント)
Date: 2008/10/24(金) 15:46
No:23005
|
|
Title: Re:メニュー選択後について
|
|
> else if( Key[KEY_INPUT_UP]==1 ||( Key[KEY_INPUT_UP]%5==0 && Key[KEY_INPUT_UP]>30)){
最初に押したときはいいとして、カウントが5の倍数のときかつ30以上のとき
押している処理しているのがまずいのかな。
↓をチョン押し(0.5秒以下ぐらい)しないと、後ろの条件が満たされてy-=20が実行されて
Zを押したときにyが440でなくなっていると思う。
違ってたらごめんなさい。
16ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..ぴよぴよ(474ポイント)
Date: 2008/10/24(金) 15:47
No:23006
|
|
Title: Re:メニュー選択後について
|
|
CheckHitKey()もそうですが、
LoadGraphScreen
は使わない方がいいです。
LoadGraphで一度画像を最初に取り込んでから
DrawGraphなどで表示して下さい。
それから
else if( CheckHitKey( KEY_INPUT_Z ) != 0 && y == 440 ) { //メニュー(EXIT)を選択したとき
break ; // ループから抜ける
}
こういうメニュー項目の座標で判定するプログラムは、メニューをずらそうとしたら
機能しなくなるので、書かないほうがいいと思います。
メニューの項目番号識別変数でも作って
今上から何番が選択されているかを確認して判定した方がいいと思います。
277ポイント を手に入れた。
|
|
|
|
|
Name: ぐっちょん ..ぴよぴよ(360ポイント)
Date: 2008/10/24(金) 16:02
No:23008
|
|
Title: Re:メニュー選択後について
|
|
>>GPGA様
はい、間違えました。以後気をつけます。
>>管理人様
やっと Method の適切な使い方がわかりました。
ScreenFlip() ; については後々関数等にする予定です。
>>kazuoni様
CheckHitKey() を使わないといけないのかと思っていたのですが・・・
確認してみたいと思います。
アドバイスありがとうございました。
まだ、DXライブラリで制作して一カ月半の初心者なので
今度とも宜しくお願いします。
77ポイント を手に入れた。
|
|
|
|
|
Name: ぐっちょん ..ぴよぴよ(431ポイント)
Date: 2008/10/26(日) 15:42
No:23089
| 解決!
|
Title: Re:メニュー選択後について
|
|
Dixq(管理人)様
ご指摘ありがとうございます。
今後はLoadGraph等で画像を読み込みしたいと思います。
皆様のおかげで問題を解決することが出来ました。
ありがとうございました。
今後、わからないことが出ると思いますが、
その時はまた宜しくお願いします。
71ポイント を手に入れた。
|
|
|
|
Name: ivas ..ぴよぴよ(627ポイント)
Date: 2008/10/26(日) 00:18
No:23059
|
|
Title: ソースコード問題点指摘をお願いします
|
|
C言語を初めて間もない初心者です
0〜100の範囲で入力された複数の数値の中から、
最大値と最小値を求めて表示するプログラムを作成せよ。
-1が入力された場合は入力の終わりと判定する。
ただし、最大値と最小値はmain関数以外の一つの関数の中で求める。
また、入力された数値を記憶する配列の要素数は10とし、
それ以上入力された場合はエラーが起きても仕方ないこととする。
という問題に対し、
#include <stdio.h>
int maxi(int*,int*);
int main(void){
int o,c;
maxi(&o,&c);
printf("%d,%d",o,c);
return 0;
}
void maxi(int *po,int *pc){
int max,min,i,array[10];
printf("type 10 number between 0 and 100\n");
for(i=0;i<10;i++){
scanf("%d",&array[i]);
if(array[i]==-1){break;
}else if(i==0){
max=array[i],min=array[i];
}else if(array[i-1]<=array[i]){
max=array[i],min=array[i-1];
}
else max=array[i-1],min=array[i];
;
printf("\n");
}
po=&max,pc=&min;
;
}
というコードを書いてコンパイルしたところ、どんな値を打ち込んでもでたらめな
値が最大値及び最小値として返されてしまいます。
ソースコードの問題点指摘をお願いします。
コンパイラはLSI C−86で、OSはWindows Vistaです
627ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(127,947ポイント)
Date: 2008/10/26(日) 00:45
No:23060
|
|
Title: Re:ソースコード問題点指摘をお願いします
|
|
0〜100のいずれかの数字が書いてある10枚のカードから、
最大値が書いてあるカードと最小値が書いてあるカードを
手で選ぶときにどういう手順を踏むかを想像してみてください。
カードに書いてある数字を1枚ずつ見ていくとき、
> }else if(i==0){
> max=array[i],min=array[i];
先頭(0枚目)のカードに書いてある数字を
仮の最大値・仮の最小値としていますので、ここはいいですね。
さて、次のカード以降は、どうしますか?
カードに書いてある数字(array[i])をその時点での最大値(max)と比べて大きければ、
そのカードに書いてある数字を新たな最大値とするのではありませんか?
最小値の場合もおなじですね。
そして、すべてのカードの数字を見終わったとき、
その時点の最大値・最小値が求める答えです。
また、main関数の変数o, cに、最大値・最小値を入れたいのですよね。
変数名の意味がつかみきれませんが…。
だとすると、maxi関数のmax, minは不要で、*po, *pcと書けばよいです。
> po=&max,pc=&min;
この行も不要です。
それから、セミコロンだけの行も不要です。どういう意味で書かれましたか?
247ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 ..比類無きプログラマー(89,977ポイント)
Date: 2008/10/26(日) 01:39
No:23062
|
|
Title: Re:ソースコード問題点指摘をお願いします
|
|
ポインタ変数に格納されている値を読み書きするには、こうします。
*po=max;
po=&max;
とした場合、引数の格納されている変数を書き換えることになります。つまりpoに入っているアドレスを書き換えてしまうのです。
C言語では引数は値で渡されているので、poそのものを書き換えても呼び出した関数(main()関数)には影響しません。ですから、main関数の中の o や c は変化しません。
変数名の意味は、「大きい(oki)」と「小さい(chisai)」という事ですよね? 読みやすさのところからも、ローマ字でもいいので、もうちょっと長めの名前を付けたほうがいいと思います。
2倍のポイントを手に入れた! 20ポイント を手に入れた。
|
|
|
|
|
Name: ivas ..ぴよぴよ(732ポイント)
Date: 2008/10/26(日) 15:16
No:23087
| 解決!
|
Title: Re:ソースコード問題点指摘をお願いします
|
|
boxさん、tkmakwins15さん助言ありがとうございます。
指摘に基づきソースコードを修正したところ、良い結果が得られました。
どうも自分はまだポインタについて正しく理解をできていないように思います。
ただ精進あるのみです。
105ポイント を手に入れた。
|
|
|
|
Name: 独学初心者 ..かけだし(2,048ポイント)
Date: 2008/10/26(日) 02:19
No:23064
|
|
Title: ばらまきショットが点滅;
|
|
こんにちは。
先日はありがとうございました。
大分進んで、ばらまきショットを実装してみようと思ったのですが、これがどうにもうまくいきません;
どうも自分で打ち込んで、うまくいかないものだから管理人様のソースをコピペしてみても駄目でした;
症状としては、ばらまきショットが発生して、しばらくばらまいていると、点滅が始まってしまいます。
弾の進み具合もコマ送りな感じで、消えている最中も当たり判定はある…みたいです。単発のものは普通に撃てています。
いったいぜんたいどうしてこんなことになってるんだろうか見当がつきません;
思いつく限りの改変はしてみたのですが、まだ知識が浅いもので、お力を借りれないかと思い、質問させていただきました。
ショットのパターンは、シューティングゲームの館のコピペですので、あとは行動パターンの組み込みに対するバグなのかなとも思ってはいるのですが…
なので、敵パターンへの組み込み方の方を書いておこうと思います。
void BossPattern1 (){
int j;
if(boss.counter<100)
boss.y+=1.5f;
if(boss.counter==100){
for(j=0;j<ENEMY_TOTAL_NUM;j++)
if(EnemyShot[j].flag==0)
break;
EnemyShot[j].mem_ex=boss.x;
EnemyShot[j].mem_ey=boss.y;
EnemyShot[j].mem_px=Player.x;
EnemyShot[j].mem_py=Player.y;
EnemyShot[j].counter=0;
EnemyShot[j].flag=1;
EnemyShot[j].pattern=2;
EnemyShot[j].img=0;
}
}
何卒、よろしくお願いいたします。
483ポイント を手に入れた。
|
|
|
|
Name: 独学初心者 ..かけだし(2,144ポイント)
Date: 2008/10/26(日) 02:52
No:23066
|
|
Title: Re:ばらまきショットが点滅;
|
|
すみません;
なにかの考えの一助になるかわかりませんが追加の状態です。
どうやら、ばらまきに関わらず、連続発射するようなショット全部がそうなってしまってるみたいです;
少し進んで、消えて(でも弾の当たり判定はそこでストップされている状態)
です;
よろしくお願いします;
96ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(36,848ポイント)
Date: 2008/10/26(日) 03:28
No:23069
|
|
Title: Re:ばらまきショットが点滅;
|
|
ショットが原因だとすると、敵パターンに間違いがある可能性は低いと思います。
> 症状としては、ばらまきショットが発生して、しばらくばらまいていると、点滅が始まってしまいます。
> 弾の進み具合もコマ送りな感じで、消えている最中も当たり判定はある…みたいです。単発のものは普通に撃てています。
考えられるのはシューティングの館でいう18章参照のvoid EnemyShotCalcDisp()で描画してるので
ここで正常に描画してない可能性もありますが・・・解説通りに書いてあれば大丈夫だと思います・・・が可能性として見なおしてもらっても良いと思います。
一番怪しいのが、シューティングの館では、敵弾と自機の当り判定は解説されてませんので、多分自分で考えて、判定を行ってると思うのですが、そこに間違いがあると思います。
敵弾と自機の当り判定はどのようにしてますか?
252ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(856,238ポイント)
Date: 2008/10/26(日) 03:48
No:23070
|
|
Title: Re:ばらまきショットが点滅;
|
|
う〜ん、とりあえずブレイクポイントでバグの場所を限定していくしかなさそうです。
描画しているところにブレイクポイントをおき、
コマ送り状態で、いつ点滅するのか調べてみて下さい。
その時の値はどうなっているのか、何故描画処理がおこなわれていないのか、
(例えばフラグがオフになったりオンになったりしているなど)
関数自体がその時呼ばれていない可能性もありますし。
とりあえずバグの原因を少しずつ突き止めていきましょう。
201ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..入門者(2,735ポイント)
Date: 2008/10/26(日) 03:51
No:23071
|
|
Title: Re:ばらまきショットが点滅;
|
|
array様
ご返答ありがとうございます。
void EnemyShotCalcDisp()ですか…ちょっとそこを重点的にもう一度調べてみます。
えっと、敵弾と自機…ってことは…
そっちは自分のほうでは
void CollisionDetection2(){
for(int i=0;i<ENEMY_TOTAL_NUM;i++){//敵の最大数100体分ループ
for(int j=0;j<ENEMY_TOTAL_SHOT_NUM;j++){//1組200個分のループ
if(EnemyShot[i].EnemyShots[j].flag==1){//1個でも発射中の弾があれば
if(Player.flag==1){//プレイヤーの表示中なら
double x,y;
int range;
x=(double)(EnemyShot[i].EnemyShots[j].x-Player.x);//x=(弾のx位置-プレイヤーのx位置)
y=(double)(EnemyShot[i].EnemyShots[j].y-Player.y);//x=(弾のy位置-プレイヤーのy位置)
range=9;//(弾の当たり判定)
if((int)sqrt(x*x+y*y) < range+Player.range){
EnemyShot[i].EnemyShots[j].flag=0;
Player.num-=1;
if(Player.num<0){
Player.flag=0;
break;
}
}
}
}
}
}
}
と、してあります。
このへんの関係関係でしょうか?
591ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..入門者(2,824ポイント)
Date: 2008/10/26(日) 03:59
No:23072
|
|
Title: Re:ばらまきショットが点滅;
|
|
管理人様
ご返答、ありがとうございます。
デバック、今のところ地味にちまちまやってるんですが、いったいどこでおこってるのやら…
まだばらまきのほうだけしかやってなかったので、直線連続発射のほうもちょっとコマ送りしてみます。
ばらまきの方は、あちこちコマ送ってみたんですが、なかなか消える瞬間とかで自動変数とかの画面にならなくって;
ちょっと、範囲も増やしてみますです。
89ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..入門者(2,968ポイント)
Date: 2008/10/26(日) 04:21
No:23073
| 解決!
|
Title: Re:ばらまきショットが点滅;
|
|
あ!!
わ、わかりましたぁ;
画面外に玉が出たときにフラグを戻すプログラムが悪さしてたみたいです;
デバックかけると発射した瞬間で関数の表示がされてたので気がつかなかったです;
最後にフラグ戻すところが、弾が画面外に出たときに弾一発ではなくて一組丸まるフラグ戻してました。
ヒントいただいてやっとわかりました;
凡ミスでしたが、多分自分じゃ気がつかなかったです;
お答えいただきありがとうございました。
144ポイント を手に入れた。
|
|
|
|
Name: dic ..かけだし(2,079ポイント)
Date: 2008/10/25(土) 21:16
No:23057
|
|
Title: リンクエラーが出る
|
|
管理人さんが作られたサンプルをいじろうと思い
ソースをコンパイルしたのですが、リンクがうまくいきません
コード生成もマルチスレッド(DLL)にしたのですが それでも リンカができません
Visual C++ 6.0 です
どこが悪いのでしょうか?
コンパイル中...
boss_shot.cpp
boss_shotH.cpp
...
...
...
...
shotH.cpp
リンク中...
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jtransform_execute_transformation" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jcopy_markers_execute" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jtransform_adjust_parameters" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jtransform_request_workspace" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_jcopy_markers_setup" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_write_stdout" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_read_stdin" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_read_scan_script" は未解決です
libjpeg_d.lib(jpegtran.obj) : error LNK2001: 外部シンボル "_keymatch" は未解決です
Debug/hogehoge.exe : fatal error LNK1120: 外部参照 9 が未解決です。
link.exe の実行エラー
643ポイント を手に入れた。
|
|
|
|
Name: dic ..かけだし(2,034ポイント)
Date: 2008/10/25(土) 21:50
No:23058
| 解決!
|
Title: 解決
|
|
すいません
もう一度プロジェクトごと作り直したところ
コンパイル、リンカができました
45ポイント を落としてしまった。
|
|
|
|
Name: 山崎 ..かけだし(1,017ポイント)
Date: 2008/10/25(土) 07:14
No:23045
|
|
Title: 3次元の空間の作成方法について
|
|
再度お世話になります、山崎と申します。
この度は、皆様の意見をお伺いに参りました。
現在、3次元の空間を用いたアクションゲームを作っております。
しかしまだDirectXやポリゴンといった技術が私に無いので、
DXライブラリを用いて「3次元に見える」空間を表現しようと思ってます。
例を挙げるとすれば、ちょっと古いですが
スーパーマリオRPGのフィールドのような空間を表現したいと思ってます。
横幅、縦幅、高さがあって、主人公の前に壁があればもちろん主人公はその後ろに隠れて見えません。
ただ、あのくらいのグラフィックの見栄えは真似できませんが・・・。
そこで皆様の意見をお伺いしたいのが、
どうやってこの3次元の空間を表現するか、ということなのです。
どのようなデータ構造を用いるか、と言った方がいいかもしれません。
「こういう構造にするのが定石だ」「一般的にはこうだ」
「飽くまで自分ならこうする」「こういう方法はどうか」
といった案があれば、どうか教えて頂きたいと思います。
私はchar型の3次元配列を用いて、空間を小さな立方体の集まりとして表現しようと考えました。
たとえば、3次元空間の情報としてchar field[100][110][120]と宣言し、
'b'がブロックの意味であるとし、field[3][4][5]='b'だとしたら、
この空間は横幅が100マス、縦幅が110マス、高さが120マス分あり、
X=3,Y=4,Z=5に位置する場所にはブロックがある、という感じです。
この方法は有効なのでしょうか?
また、3次元の空間に限らず、皆様はアクションゲームでもRPGでも、
キャラが動き回るマップをどのようにして作っているのでしょうか。
マップデータが記入されたファイルを前もって作り、それを読み込む、といった手法でしょうか。
広いマップになると手打ちでマップを記入するのも大変だと思うのですが、
皆様はどうしているのでしょうか。
3つも質問があって誠に申し訳ないのですが、
皆様の意見が聞ければ幸いです。
526ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,876ポイント)
Date: 2008/10/25(土) 14:23
No:23051
|
|
Title: Re:3次元の空間の作成方法について
|
|
> スーパーマリオRPGのフィールドのような空間を表現したいと思ってます。
あれは、セミ3D、いわゆるクォータービューと呼ばれるものですね。
3次元配列を持てば、簡単に3次元プロック座標をもてますが、
1ブロック単位のサイズが1バイトだった場合、
100 * 110 * 120 = 1320000(約1.25MB)
と配列の容量が大きくなり、
余り広大なマップを用意すると、メモリ領域を圧迫してしまいます。
(現在のPC環境では問題ないかもしれませんが)
私の考えた構造では、
typedef struct SCellData{
char mHeight; // 高度(-128〜127)
unsigned char mTip; // チップ番号(0〜255)
unsigned short mAttr; // ブロックの属性フラグ(16bit)
struct SCellData* mNext; // このブロックに一番近い次の上のブロック情報
} SCellData;
を、2次元配列(横と奥行き)として用意して、
壁や空中に浮いているブロック(高さ)は、 mNext にデータを追加するといった形で表現します。
この3次元タイプのマップを手作業で作成するのは、
まず無理でしょう。
この場合、自分でマップ作成を行うツールを用意する必要がありますね。
(二次元マップでは、汎用マップ作成ツールが配布されたりしていますが、3次元タイプ用はみたことが無いです)
あと、先日、管理人さんが開館したサンプルプログラミングの館に、
いくつかのマップ構造を表現したサンプルがあるので、
そちらも参考に見てみてはいかがでしょうか。
それとは別に参考になるようなものを一つ。
http://www.biwako.ne.jp/~hiroharu/queek.html
Queek
これはクオータービューのゲームを作成できるツールです。
これのマップ作成ツールの部分がツール製作の参考になると思います。
345ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..かけだし(1,182ポイント)
Date: 2008/10/25(土) 19:44
No:23056
|
|
Title: Re:3次元の空間の作成方法について
|
|
御津凪さん
ご返信、誠にありがとうございます!
先日に続き再度いろいろお教えいただき、感謝の言葉もございません。
なかなかコーディングするのが大変ですぐに試すことができず申し訳ないのですが、
ぜひとも参考にさせて頂きたいと思います。
また、便利なツールを教えしていただき本当にありがとうございます!
早速ダウンロードして試してみようと思います。
サンプルコードまで例示してもらって、いつも親切で本当に助かります。
ありがとうございました。
165ポイント を手に入れた。
|
|
|
|
Name: non ..かけだし(1,405ポイント)
Date: 2008/10/24(金) 11:22
No:22986
|
|
Title: volatile修飾子の必要なとき
|
|
「ITRONプログラミング入門」の74ページに
void MonitorTask(VP_INT exinf)
{
volatile unsigned char old=PADR & 0x0f;
volatile unsigned char new;
while(1)
{
new=PADR & 0x0f;
if(old & (~new))
wup_tsk(TSKID_ALERT);
old=new;
dly_tsk(100);
}
}
というサンプルがあります。この場合volatileは必要なのでしょうか?
私の認識では、whileの中で、oldやnewは常に代入されているので最適化されず、(PADRはヘッダファイルでvolatileがついているので)必要ないと思いますが、最適化されて、volatileをつけないとまずいコンパイラはあるのでしょうか?
ご教授をよろしく。
88ポイント を手に入れた。
|
|
|
|
Name: non ..かけだし(1,424ポイント)
Date: 2008/10/25(土) 19:26
No:23054
|
|
Title: Re:volatile修飾子の必要なとき
|
|
RESどうも。私の認識どおりで良いということですね。ありがとうございます。
19ポイント を手に入れた。
|
|
|
|
Name: 藍 ..初心者(6,111ポイント)
Date: 2008/10/22(水) 16:26
No:22828
|
|
Title: 東方弾幕作ってみた
|
|
【ニコニコ動画】「正直者の死」作ってみた
弾幕製作の練習がてら正直者の死を作ってみました。本当はレーザーがあるのですがまだ作り方を理解していないので未実装です。
プログラム的には龍神録プログラミングの館30章の応用で製作しました。
画質がとことん悪いのは仕様・・・orz もう少し綺麗にとりたいなぁ
本家の正直者の死避けれないのでチートでよけてます(汗) 回れるわけが無い\(^o^)/
84ポイント を手に入れた。
|
|
|
|
Name: 藍 ..初心者(6,151ポイント)
Date: 2008/10/22(水) 16:44
No:22832
|
|
Title: Re:東方弾幕作ってみた
|
|
あーエンコードしてませんわw wmvのまま上げちゃいました。
初めて上げたのでドキドキですw
URLの内容参考にして高画質にしてみます!
40ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(831,343ポイント)
Date: 2008/10/22(水) 17:47
No:22836
|
|
Title: Re:東方弾幕作ってみた
|
|
初めは何かとドキドキしますよねw
ニコニコの高画質化は結構面倒なんですよね^^;
フリーソフトで高画質に出来るんですが、あれこれやらないといけないので。
高画質にするには
flvのOn2VP6かmp4
にする必要があります。
ただmp4はプレミアム会員だけだったと思います。
前者の方が後者より若干キレイですが、とんでもなくエンコードに時間かかります。
10分の動画に2時間とか。
mp4へのエンコードは上のリンク先の動画位なら4〜5分で出来ます。
FlashCS3ってアドビのソフトありますよね。
あの体験版でもエンコード出来るので、もし環境そろえるのが面倒ならその体験版で
エンコードしてしまうという手もあります。
30日しか使えませんが。
2倍のポイントを手に入れた! 548ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(36,314ポイント)
Date: 2008/10/22(水) 18:51
No:22839
|
|
Title: Re:東方弾幕作ってみた
|
|
おぉーwテンション上がりますねw
弾幕にあまり関係ないですけど、ステージ背景とかも自作だったりしますか?
結構クオリティー高いので羨ましいです^^
39ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(831,460ポイント)
Date: 2008/10/22(水) 18:58
No:22840
|
|
Title: Re:東方弾幕作ってみた
|
|
そういえば背景に継ぎ目見えますね。
画像のキャンパスサイズを縦に2倍し、
元の画像をコピーして上下に反転後、下にくっつけると
継ぎ目がそこまで目立たなくループできますよ。
上下のある画像だとおかしなことになりますが^^;
117ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..中級者(9,233ポイント)
Date: 2008/10/22(水) 20:13
No:22849
|
|
Title: Re:東方弾幕作ってみた
|
|
名前の「藍」に釣られた私は、ちょっと隙間まで行ってきます。
冗談はさておき、素晴らしいですね。
クオリティ高く、いい弾幕です^^
ちなみに・・・・・「正直者の死」は、名の通り、正直者は死ぬようにできてます。
回って避けるのは無謀過ぎますよ・・・・^^;
正直者の死のよけ方は、最小限の動きでいいです。
弾幕は、自機を囲むように出ますよね。
そして、自機狙いの弾が来ますね。
更に、レーザーが、左右から交互に出現します。
そのレーザーなんですが、出始めは当り判定はないです。
よけ方は、動かず、自機狙いの弾が来たら、横にチョン避け(レーザーが右から左へ流れるときは、右のほうに)
そして、レーザーが出たら、少し大きく、右横にチョン避け。
実質、レーザーにあたってるように見えますが、言ったとおり、出始めは当たり判定ありません。
よって、レーザーはぶつからず通り過ぎます。
そして、次はレーザーが、左から右に流れるので、左側にチョン避け。
レーザーが出たら少し大きく、チョンよけ。
これの繰り返しだけで、とれるスペカになってます。
考えられた弾幕ですよね〜。
何気に「正直者の死」という、名前にあってる弾幕だと思います。
・・・・・余計な話だったかもしれませんが、本家はそういうよけ方になっております^^;
351ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..中級者(9,465ポイント)
Date: 2008/10/22(水) 21:44
No:22864
|
|
Title: Re:東方弾幕作ってみた
|
|
やっぱり、あえてそっちの方のことをしたんですかね?
私は、正規避けに対し、ネタ避けって呼んでますが。
>本家の正直者の死避けれないのでチートでよけてます(汗) 回れるわけが無い\(^o^)/
ってあったので、何も回らなくても・・・・ってちょっと思ったので^^;
2倍のポイントを手に入れた! 232ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..中級者(9,689ポイント)
Date: 2008/10/22(水) 22:40
No:22866
|
|
Title: Re:東方弾幕作ってみた
|
|
さっき、アリスでグルグル回りながら気づいたんですが、たぶん、どれだけ本物に近いかって証明するためにあえて、回ったのかな〜と思いました。
自機に反応して動くよーっていう証明のために。
確かに、あれは無理ですねw
よく思いついたし、よくできるなーって思いました。
あれはチートなしには回れません(ごく一部を除くw
>・・・・・余計な話だったかもしれませんが、本家はそういうよけ方になっております^^;
本当に、余計な話でしたね^^;
申し訳ありませんでした。
224ポイント を手に入れた。
|
|
|
|
|
Name: 藍 ..初心者(6,578ポイント)
Date: 2008/10/23(木) 02:28
No:22885
|
|
Title: Re:東方弾幕作ってみた
|
|
今の今までバイトで帰ってきてみてみたらびっくりです!こんなにレスしてもらえてるとは(^^;
>>arrayさん
ステージ背景はフリー素材のマップチップをつなげて作りました。私には絵をかける技術がないのでw
>>管理人さん
継ぎ目・・・ ばれた!\(^o^)/なるほどそんなやり方があるとは明日やってみよう。
>>究極の初心者さん
藍 スキマに先に入って藍様のところにいくのは私です!
>クオリティ高く、いい弾幕です^^
いや〜ここで勉強して作っただけなのでクオリティはまだまだです(汗)
>そのレーザーなんですが、出始めは当り判定はないです。
そうなんです!その遅れるあたり判定が曲者でレーザーを実装するのを渋っている理由ですw
さてさて、本題のなぜこの避け方をしているのか?
1ネタ 2本物の再現度 の以上2つの要素からできあがっています
やっぱり正直者の死を再現したら回らないとね!というわけでした
レスをしてくださった皆さんありがとうございました。m(_ _)m創作意欲が湧き上がってきます!
おまけ
実はレーザーを抜けばそこまで難しくなかったりします。ケロちゃん風雨に負けずの上のウネウネ弾幕の計算の
応用でいけると思いますというか、私はそこから応用したので・・・
気が向いた方は一度チャレンジしてみてわ・・・?
427ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(832,599ポイント)
Date: 2008/10/23(木) 11:45
No:22904
|
|
Title: Re:東方弾幕作ってみた
|
|
動画アップしました。どうぞ^^
どれ位再現できているか解りませんが、とりあえずまわろうと努力してみました・・w
レーザーの初期位置は動画ではわかりにくいですが、この辺はわりかしリプレイを見ながら
忠実にやったつもりです。
>>こめかみさん
是非回れる弾幕作って下さいw
88ポイント を手に入れた。
|
|
|
|
|
Name: 藍 ..初心者(6,659ポイント)
Date: 2008/10/23(木) 12:26
No:22906
|
|
Title: Re:東方弾幕作ってみた
|
|
/(^o^)\ナンテコッタ おきたら完成版ができてる!!!
高画質で投稿しなおそうかと思ったけどこれは別の弾幕を作ろう そうしよう^p^
次はアレにしようw アレを言うと管理人さんなら先に作れそうなのでアレは内緒ですw
81ポイント を手に入れた。
|
|
|
|
|
Name: 藍 ..初心者(6,754ポイント)
Date: 2008/10/23(木) 13:39
No:22909
|
|
Title: Re:東方弾幕作ってみた
|
|
>>初心者さん
私のレーザー無しで単純に弾幕だけ作るなら3〜4時間ほどで作りました。
管理人さんは2時間ほどで作ってそうですねー
キャラやら音楽やらあわせるのにもう少し時間を使ってます。
95ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(833,103ポイント)
Date: 2008/10/23(木) 14:22
No:22914
|
|
Title: Re:東方弾幕作ってみた
|
|
う〜んと、私は20分位ですかね^^;
自分の作ったプログラムですし、このプログラムで数百種類も作ったのでさすがに慣れました^^;
今回は忠実にする為に座標や時間の調整に10分位それからかけたかもしれません。
問題なのはエンコードで、うちのムービーメーカーが言う事聞いてくれずに朝方ずっと悩んでました・・。
windows mediaのプロファイルエディタで設定作ってもムービーメーカーに項目が出てこないのでずっと悩んでました。
今も出てきません・・。謎です・・。
なのでニコニコはピンボケな動画になってます;
>lbfuvabさん
あ〜それは丁度同じ理論を御津凪さんと話していたところでした。
ゲーム自体にそういうリプレイキャプチャ機能つけたらいいんじゃないかって。
でもフレームレートを遅らせて後で早くすると効果音などの音声がおかしなことになるんですよね;
ユーザーが自分でする分には動画とって、次にもう一度通常速度で音声をとって動画は2倍にして音声とくっつけるって方法で出来そうですが途中微妙に処理オチとかしたら困りますね;
う〜ん、良い方法は無いものか・・。
AVIのデータをプログラムで作ってしまえばいいのかも・・。
504ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,124ポイント)
Date: 2008/10/23(木) 15:51
No:22917
|
|
Title: Re:東方弾幕作ってみた
|
|
> AVIのデータをプログラムで作ってしまえばいいのかも・・。
リプレイ情報を利用して、
・録画は毎フレーム必ず撮る
・録音は敵や弾の移動・描画を行わないようにして極力処理落ちを無くして、その状態で録音する
とすれば可能…なのですが、
録音時の移動・描画処理を切り落とす処理を組み込むのが、
完成版から修正する場合、これは現実的ではないですね。
89ポイント を手に入れた。
|
|
|
|
|
Name: 藍 ..初心者(6,840ポイント)
Date: 2008/10/23(木) 16:49
No:22920
|
|
Title: Re:東方弾幕作ってみた
|
|
新作できた!けどバイトで録画までできなかった\(^o^)/オワタ
そのうちに今度は高画質にしてあげたいと思います。
今回は紅魔から〜 まだまだ時間かかるけど弾幕作るのは楽しいですね!
86ポイント を手に入れた。
|
|
|
|
|
Name: 初心者 ..初心者(8,322ポイント)
Date: 2008/10/23(木) 16:59
No:22921
|
|
Title: Re:東方弾幕作ってみた
|
|
20分!
そんな簡単なもんだったんですか。
それなら作ってみたいな
26ポイント を手に入れた。
|
|
|
|
|
Name: 究極の初心者 ..中級者(9,372ポイント)
Date: 2008/10/23(木) 20:39
No:22937
|
|
Title: Re:東方弾幕作ってみた
|
|
>管理人さん
仕事早いですねw
それと完全にこちらに落ち度がありましたね。
普通に考えて、正規避けを知らず、ネタ避けしか知らない。通常ありえないですね^^;
親切心のつもりでしたが、誤解を招く発言をしてしまい、申し訳ありませんでした。
ちょっと考えてから、書き込むようにしますねm(_ _)m
>藍さん
>いや〜ここで勉強して作っただけなのでクオリティはまだまだです(汗)
逆を言えば、ここで勉強すればこのくらいは出来るようになるよ!ってことなんですよね・・・・。
ん〜・・・シューティングはあまり作る気なかったけど、興味が出てきちゃいますねw
まぁ、やるにしてもまだ先の話なのですが・・・。
紅魔ってことは・・・・・もう、レミリアのあの弾幕しか思いつかないw
期待してますね^^
317ポイント を落としてしまった。
|
|
|
|
|
Name: array ..プログラマー(36,387ポイント)
Date: 2008/10/23(木) 22:29
No:22944
|
|
Title: Re:東方弾幕作ってみた
|
|
>> 管理人さん
> う〜んと、私は20分位ですかね^^;
ワラタww 自分は3時間で作れるかな〜と思ったところに20分とは・・・流石ですねw
>> 藍さん
次は、私も同じのに挑戦させてもらうかもです^^
どんなのにしろ1日はかかりそう・・・orz
73ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,493ポイント)
Date: 2008/10/24(金) 00:26
No:22958
|
|
Title: Re:東方弾幕作ってみた
|
|
>>藍さん
そろそろバイト終わる頃ですかね?
お疲れ様ですw
動画楽しみにしておきますw
>>御津凪さん
次回作には是非リプレイキャプチャ機能つけたいですねw
>>究極の初心者さん
いえいえ、親切な投稿に横から口を挟んで失礼しました^^;
>>arrayさん
下手でも1400時間も同じプログラム見てたら・・^^;
ぐにゃぐにゃ弾はEXステージで作ったことあるので、作りやすかったですしね。
弾はファンタズムで使った奴のふち白くしてへちゃげさせただけですw
弾幕作るのは楽しいですよね^^
難しそうな弾幕ほど完成したとき嬉しいですよね♪
ただ深弾幕結界だけはもう作りたくないです・・w
160ポイント を手に入れた。
|
|
|
|
|
Name: 柏 ..中級者(13,050ポイント)
Date: 2008/10/24(金) 00:32
No:22960
|
|
Title: Re:東方弾幕作ってみた
|
|
藍さんの動画拝見させて頂きました。
紅魔卿しか持っていないので実際避けた事はないんですが(どのみち避けようとしても心が折れそうなので辞めますが^^;)、
なかなか鬼畜な弾幕ですね。
これを2〜3時間で作ったとは、、、いやぁすごいですね。
ケロちゃんからの応用とはいえ、そこから短時間でこの形にもっていくのは個人的な感想としては「早っ!そしてクオリティ高!」という感じですね。
まだまだ色々作るようなので、楽しみにしています。
私は弾幕を避けるより眺めて楽しむ(STGが苦手ともいう。。。)方なので、こうして公開されるのを眺めているだけで満足ですw
ところで管理人さんはこれを20分ですか、、、もはやさすがとしか言いようがありません^^;
ちなみになんですが、私はニコニコに動画をアップする時は「mencoder」というのを使用してFLVへ変換しています。
どこを読んで導入したのかも忘れましたが(恐らくWikiだったと思いますが)、
うちの平凡なスペックのノートPCでもあまりエンコードに時間もかからないですし、
結構高画質です。たまにしか使わないので目安的なエンコード時間が分からないのですが。。。
もし既出でしたら申し訳ないです。
278ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,814ポイント)
Date: 2008/10/24(金) 01:23
No:22967
|
|
Title: Re:東方弾幕作ってみた
|
|
是非妖々夢だけはやって下さいw
ネットで売ってないんですかね〜?
多分ヤフオク見たらあると思いますよ。
mencoderで変換出来るのはOn2VP6ですか?
エンコに時間がかからないということは、昔のflv・・?
85ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(6,620ポイント)
Date: 2008/10/24(金) 03:32
No:22978
|
|
Title: Re:東方弾幕作ってみた
|
|
エンコはaviutlでmp4が早くて綺麗に仕上がりますよ。
#2時間とか20分だけであのクオリティってとんでもなくジェバンニですねwww
66ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(835,859ポイント)
Date: 2008/10/24(金) 04:19
No:22980
|
|
Title: Re:東方弾幕作ってみた
|
|
私もいつもAviUtlでmp4にしてます。やっぱあのエンコの速さと使いやすさはいいですよね。
ただどうしても「高画質」にはなっても「神画質」と呼ばれる画質にならない・・。
プレミアム会員の800Kbpsにしても。
高画質化系のHPみたら「中間ファイル」を作れとかよく書いてありますが、
wmvやAviからmp4にしたんじゃきれいにエンコ出来ないんですかね〜?
時々東方のリプレイでめちゃくちゃキレイな動画ありますけど、一体あれはどうやってるんだろう・・。
153ポイント を手に入れた。
|
|
|
|
|
Name: lbfuvab ..初心者(6,920ポイント)
Date: 2008/10/24(金) 14:46
No:22996
|
|
Title: Re:東方弾幕作ってみた
|
|
>ただどうしても「高画質」にはなっても「神画質」と呼ばれる画質にならない・・。
ん〜、640x480から512x384の変換時にうまく縮小できていないとかですかね?
私はavisynthでLanczosResizeを良く使いますが・・・(avisynthだと応用が利くので色々と楽)
#もしかして1passでエンコしてますか?それなら2passにすると綺麗になりますよ。
2倍のポイントを手に入れた! 300ポイント を手に入れた。
|
|
|
|
|
Name: 藍 ..初心者(6,864ポイント)
Date: 2008/10/25(土) 01:50
No:23038
|
|
Title: Re:東方弾幕作ってみた
|
|
絶賛動画編集に悪戦苦闘中 変換悪戦苦闘時間>>>>弾幕製作時間 \(^o^)/
24ポイント を手に入れた。
|
|
|
|
|
Name: array [URL] ..プログラマー(36,596ポイント)
Date: 2008/10/25(土) 09:23
No:23046
|
|
Title: Re:東方弾幕作ってみた
|
|
おおー東方弾幕に詳しくないので、かなり参考になります。綺麗ですね。
ちゃっかり、背景も修正され(た?)てて繋ぎ目探したけど分かりませんでしたw
ちなみに私が初めてニコニコにアップした時は動画変換方法調べるのに丸1日
変換時間1時間以上かかった記憶がありますw
70ポイント を手に入れた。
|
|
|
|
Name: Dixq (管理人) [URL] ..かけだし(1,131ポイント)
Date: 2008/10/23(木) 18:45
No:22929
|
|
Title: [注] ホームページ引越しのお知らせ [注]
|
|
このたびホームページを引っ越す事になりました。
今度のドメインは、その名もディクスキュードットネット!
念願の独自ドメインです^^
http://dixq.net/
HTMLファイル内の文字列l.huu.ccを一括置換でdixq.netに変換したので、
リンクミスがあるかもしれません。もしリンクミスなどがあったら教えて下さい^^
なお、掲示板を直接お気に入りに入れている方は
http://dixq.net/board/
をお気に入りに入れて下さいますようお願いいたします。
古いl.huu.ccのHTMLファイルは近々全て
「引っ越しました」のファイルに置換する予定です。
掲示板の過去ログにl.huu.ccの画像やzipファイルが多数リンクされているので、
HTMLファイル以外のファイルはそのまま放置する予定です。
お手数おかけしますが、お気に入りに登録して下さっている方は登録のしなおしをお願いしますm(_ _)m
#もうすぐ300万ですね〜♪
322ポイント を手に入れた。
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,441ポイント)
Date: 2008/10/23(木) 21:57
No:22941
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
この掲示板上部の
新規投稿 ツリー表示 一覧表示 昇進状態 携帯用 検索/過去ログ ホーム
の部分ですが、一番右の「ホーム」のリンクが新ドメインになっていないようです。
それと、新ドメインを周知するためにも、トップページとこの掲示板の上部にバナーでも貼った方がよいかと思います。
147ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,237ポイント)
Date: 2008/10/23(木) 22:11
No:22942
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
ありがとうございます。修正しました。
そうですね〜明日にでも入れ替えようかと思っていたのですが、ちょっと早すぎですかね。
しばらくバナーを入れてみようかと思います^^
82ポイント を手に入れた。
|
|
|
|
|
Name: array ..プログラマー(36,526ポイント)
Date: 2008/10/23(木) 22:43
No:22947
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
=================祝300万=================
なんて言えば分からないですが引っ越しおめでとうございますw
今日300万ヒットいきそうだなと思ってましたが・・・
アクセスしたらこんな感じでした。300万ヒットおめでとうございます♪
どうせだからキリ番のSS撮りたかったんですけどね
139ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(247,952ポイント)
Date: 2008/10/23(木) 23:55
No:22953
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
引っ越し& 300万ヒットおめでとうございます。
ブックマークしておきます。
#今一瞬掲示板が赤かったような(w
61ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,333ポイント)
Date: 2008/10/24(金) 00:07
No:22955
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
>たかぎさん
ありがとうございます。修正しました。
また、古いHPには説明がき追加しておきました。
>arrayさん
ありがとうございます^^
ADSL1メガで引っ越すのは大変でした^^;
300万にさしかかる辺り丁度私も見てたんですが、
連続クリックしたのに〜〜85の次が〜〜01で驚きました^^;
何故かこの瞬間アクセス集中していたようですw
雲の上ですが猫でも〜目指して頑張りますw
>Justyさん
ありがとうございます!今後ともよろしくお願いします^^
#Σ(・∀・;ノ)ノエッ?! ばれてました?w
#いや〜お祝いっぽい色って赤い淡い感じかな〜と思って赤くしたら
#とっても気持ち悪い配色になりました・・w
55ポイント を手に入れた。
|
|
|
|
|
Name: tkmakwins15 ..比類無きプログラマー(89,957ポイント)
Date: 2008/10/24(金) 01:08
No:22963
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
300万アクセスおめでとうございます。独自ドメインも分かりやすくていいと思います。
->管理人さん
Webページのリンクのほうも変更したいのですが、当方のミスによって更新ができなくなっています。
お詫び申し上げます。
76ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,729ポイント)
Date: 2008/10/24(金) 01:18
No:22966
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
ありがとうございます。
名前.net でわかりやすい!しかし肝心の名前がわかりにくい!
とよく言われますw
リンクはこちらで誘導するので大丈夫だと思います。
43ポイント を手に入れた。
|
|
|
|
|
Name: 翡翠 ..入門者(4,182ポイント)
Date: 2008/10/24(金) 10:04
No:22983
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
どうも〜
お祝いに来ました!
300万ヒット、おめでとうございます!
お気に入りには登録し直しましたよ〜
29ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(34,602ポイント)
Date: 2008/10/24(金) 10:39
No:22985
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
引っ越し、300万アクセスおめでとうございます^^
すごいですなぁ〜。
自分も頑張って実力をつけなければっ。。
あと大学終わるまで2年ちょっとしかないですっww
59ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(15,605ポイント)
Date: 2008/10/24(金) 11:30
No:22987
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
管理人さん
引越し&300万アクセス、おめでとうございます。
>念願の独自ドメインです^^
おぉ〜、独自ドメイン!!
自分だけのドメインってかっこいいですね〜。
81ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) ..ぴよぴよ(197ポイント)
Date: 2008/10/24(金) 15:43
No:23004
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
>翡翠さん
ありがとうございます〜!
これからもHP制作頑張ります〜♪
>kazuoniさん
ありがとうございます^^
大学生活終わるまで後5ヶ月しかないです( ̄  ̄;)
悔いの無いようにしたいと思います^^;
>いけやんさん
ありがとうございます^^
この名前覚えにくいからずっと名前変えたかったんですが、これで変えられなくなりました・・w
皆さんに初見で読んでもらえること祈りますw
197ポイント を手に入れた。
|
|
|
|
|
Name: ムンバ ..初心者(5,789ポイント)
Date: 2008/10/25(土) 00:37
No:23025
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
こんばんは。
お引越し&300万アクセス突破おめでとうございます♪
お疲れ様です。^^
寒くなってきましたので、体調など崩されない様にっ!
夜更かしは、いかんです。(笑
今後とも宜しくお願いします。(^^)
2倍のポイントを手に入れた! 132ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,531ポイント)
Date: 2008/10/25(土) 00:56
No:23029
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
遅くなりましたが 300万アクセス突破いたしましたね。
ただいま残業中ではありますが、賞賛と応援の言葉をお送りいたします。
おめでとう御座います。
これからも末永く運営していけるよう、
そして、
天空の花の都へ目指してがんばってください^^
> 夜更かしは、いかんです。(笑
残業中ですがその通りです。
体調も気をつけましょうね。
特にIT業界(他でもそうですが)は残業に耐えうる身体が必要です。
168ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(19,790ポイント)
Date: 2008/10/25(土) 01:04
No:23031
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
300万超えアクセスおめでとうございます。
自分はホームページを持ってないのでその苦労は分かりませんが、
相当なものだっただろう事は想像できます。
これからも皆にとって利用しやすいHP運営を頑張ってください。
(龍神録2の開発も・・・「龍神録2作成日記第二号」待ってますw)
104ポイント を手に入れた。
|
|
|
|
|
Name: Dixq (管理人) [URL] ..伝説なるハッカー(835,047ポイント)
Date: 2008/10/25(土) 01:23
No:23035
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
>ムンバさん
ありがとうございます^^
寒くなってきましたね〜!
バイクに乗ってると特に寒いです。
キューの得意技、「ダウンコート重ね着」が今年も活躍するでしょうw
>御津凪さん
ありがとうございます!
以前からお忙しそうでしたが、本当にお忙しそうですね^^;
体を壊されませんよう^^;
最近「朝の爽快さ」を6年ぶり位にしったので、早く寝て早く起きること心がけてるんですが、
なかなか理想の生活リズムを保つのは難しいです^^;
>木霊さん
ありがとうございます☆
趣味で作ってるものなので、あまり大変だったとか苦労したって記憶は無いですが、
作った当時はここまでいろんなコンテンツ増やすとは思っても見ませんでした。
・・というかいつからこのサイトはゲーム一本路線に?^^;
龍神録2作成日記2号早く作らなくては!
頑張ります^^
141ポイント を手に入れた。
|
|
|
|
|
Name: ケータイ ..ぴよぴよ(13ポイント)
Date: 2008/10/25(土) 01:24
No:23036
|
|
Title: Re:[注] ホームページ引越しのお知らせ [注]
|
|
携帯電話から掲示板を見ているのですが、アクセスするためのURLは変わらないのでしょうか?
13ポイント を手に入れた。
|
|
|
|
Name: 紅葉 ..ぴよぴよ(846ポイント)
Date: 2008/10/23(木) 17:32
No:22926
|
|
Title: ワールド軸回転?
|
|
そのメッシュに対しての回転ではなくワールド軸に対しての回転は出来ないのでしょうか?
回転行列を使い2つまでの軸回転ならおかしくないですが3ついじると狂ってしまいます。
イメージとしてはキーボードの方向キーを押したらカメラから見てその方向に回転します。
今の段階だと90等のきりのいい数字の他で上下の操作が逆になり微妙な回転をします。
原因の理論としてはなんとなくわかるのですが、理解できません><
カメラは移動したり回転したりしません。
117ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(246,653ポイント)
Date: 2008/10/23(木) 21:11
No:22939
|
|
Title: Re:ワールド軸回転?
|
|
なんか、最近よく似た質問を見かけたような気がしますが。
具体的なソースとか成果物はないのですか?
>イメージとしてはキーボードの方向キーを押したらカメラから見てその方向に回転します。
つまりこういうことですか?
ttp://toku.xdisc.net/cgi/up/ttt/nm4018.zip.html
nm4018.zip
キーボード上下X回転、左右でY回転、SHIFTを押しながら左右でZ回転
128ポイント を落としてしまった。
|
|
|
|
|
Name: 紅葉 ..かけだし(1,078ポイント)
Date: 2008/10/23(木) 23:36
No:22950
|
|
Title: Re:ワールド軸回転?
|
|
そうです><
if(GetInputKEY(kKEYUP)) Box.Rot.Pit--;
if(GetInputKEY(kKEYDOWN)) Box.Rot.Pit++;
if(GetInputKEY(kKEYRIGHT)) Box.Rot.Yaw--;
if(GetInputKEY(kKEYLEFT)) Box.Rot.Yaw++;
描画
// スケール(x、y、z)・角度(y、p、r)
void DrawModel(float x,float y,float z,GsMESH id,float scx,float scy,float scz,float yaw,float pitch,float roll)
{
D3DXVECTOR3 pos;
pos = D3DXVECTOR3(x,y,z);
DrawModel(&GsMeshHang[id],scx,scy,scz,F(RAD(yaw)),F(RAD(pitch)),F(RAD(roll)),pos);
}
DrawModel(0,0,0,BOX_MESH,1,1,1,Box.Rot.Yaw,Box.Rot.Pit,Box.Rot.Rol);
という感じに書いています。
過去のものも見ましたが私ではありません。
類似な質問になってしまってすいません。
232ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(247,546ポイント)
Date: 2008/10/24(金) 00:22
No:22957
|
|
Title: Re:ワールド軸回転?
|
|
>過去のものも見ましたが私ではありません。
>類似な質問になってしまってすいません。
いえ、失礼しました。
>という感じに書いています。
んーと、DrawModel()内で別の DrawModel()を呼んでいる、と。
内部でどう行列を作って表示しているのかはわかりませんが、
なんとなくそれではうまくいかないような気がします。
少なくとも元の状態のオブジェクトの姿勢の情報と、動かしたい分の x/y/zの
回転量が必要になります。
つまり、どう変化したのかの情報が必要になります。
ちなみにさっきのコードはこんな感じでした。
m_worldは予め単位行列を入れておきます。
D3DXMATRIX rx, ry, rz;
D3DXMatrixIdentity(&rx);
D3DXMatrixIdentity(&ry);
D3DXMatrixIdentity(&rz);
if(非shift && 左)
D3DXMatrixRotationY(&rx, D3DXToRadian(2.0f));
else
if(非shift && 右)
D3DXMatrixRotationY(&rx, -D3DXToRadian(2.0f));
if(上)
D3DXMatrixRotationX(&ry, D3DXToRadian(2.0f));
else
if(下)
D3DXMatrixRotationX(&ry, -D3DXToRadian(2.0f));
if(shift && 左)
D3DXMatrixRotationZ(&rz, D3DXToRadian(2.0f));
else
if(shift && 右)
D3DXMatrixRotationZ(&rz, -D3DXToRadian(2.0f));
D3DXMatrixMultiply(&m_world, &m_world, &rz);
D3DXMatrixMultiply(&m_world, &m_world, &ry);
D3DXMatrixMultiply(&m_world, &m_world, &rx);
pD3DDevice->SetTransform(D3DTS_WORLD, &m_world);
m_worldが行列なのですが、前のフレームの行列をそのまま使って、
そのフレームで動かしたい分だけを rx/ry/rzなどの行列を作り、
掛け合わせていきました。
或いは多分こっちでも動くと思います。
float yaw=0, pitch=0, roll=0;
if(非shift && 左)
yaw = D3DXToRadian(2.0f);
else
if(非shift && 右)
yaw = -D3DXToRadian(2.0f);
if(上)
pitch = D3DXToRadian(2.0f);
else
if(下)
pitch = -D3DXToRadian(2.0f);
if(shift && 左)
roll = D3DXToRadian(2.0f);
else
if(shift && 右)
roll = -D3DXToRadian(2.0f);
D3DXMatrixRotationYawPitchRoll(&m, yaw, pitch, roll);
D3DXMatrixMultiply(&m_world, &m_world, &m);
pD3DDevice->SetTransform(D3DTS_WORLD, &m_world);
406ポイント を落としてしまった。
|
|
|
|
|
Name: 紅葉 ..かけだし(1,099ポイント)
Date: 2008/10/24(金) 10:14
No:22984
|
|
Title: Re:ワールド軸回転?
|
|
これがソースになります><
チャレンジしてみたのですが勉強不足でできません><
21ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(249,171ポイント)
Date: 2008/10/24(金) 12:19
No:22988
|
|
Title: Re:ワールド軸回転?
|
|
なるほど、こうなっていたわけですね。
うーん、この描画ライブラリは姿勢を角度だけで表現しているので、
ちょっと厄介ですね。
なので、行列を直接渡して描画する関数を追加してしまいましょう。
1 Ci-Libに以下の関数を追加します。
void Gs_DrawModelMat(GsMESH id, const MAT &m);
{
lpD3DDev->SetTransform(D3DTS_WORLD,&m);
DrawMyMesh(&GsMeshHang[id]);
} Ci-Libに数ある描画関数の中でも、非常にシンプルです。
2 構造体 MOD_TESに
D3DXQUATERNION Quat;
を追加して、
D3DXMATRIX Mat
を消します。
見ての通り、クォータニオンです。
これはオブジェクトの姿勢を保持します。
3 GameMainの GameInit()で以下を追加します。
D3DXQuaternionIdentity(&Box.Quat);
クォータニオンの初期化ですね。
4 GameMainの関数 PlayControl()と GameDraw3D()を以下のように書き換えます。
void PlayControl(void)
{
DIR3& rot = Box.Rot;
rot.Yaw = rot.Pit = rot.Rol = 0;
const float rotateAngle = D3DXToRadian(5.0f);
if(Gs_GetKEY(kKEYRIGHT)) rot.Yaw -= rotateAngle;
if(Gs_GetKEY(kKEYLEFT)) rot.Yaw += rotateAngle;
if(Gs_GetKEY(kKEYUP)) rot.Pit-= rotateAngle;
if(Gs_GetKEY(kKEYDOWN)) rot.Pit += rotateAngle;
}
Box.Rotは毎回必ず全て 0で初期化しています。これで、このフレームでどれだけ動くかの
情報を保持します。
あと、余力があれば、Rollコントロールも追加してみて下さい。
void GameDraw3D(void)
{
// 前のフレームまでの回転と今の回転を合成
D3DXQUATERNION q;
D3DXQuaternionRotationYawPitchRoll(&q, Box.RotOffset.Yaw, Box.RotOffset.Pit, Box.RotOffset.Rol);
D3DXQuaternionMultiply(&Box.Quat, &Box.Quat, &q);
// このモデルの行列
D3DXMATRIX m, boxMat;
D3DXMatrixIdentity(&boxMat);
// 回転
D3DXMatrixRotationQuaternion(&m, &Box.Quat);
D3DXMatrixMultiply(&boxMat, &boxMat, &m);
// 移動
D3DXMatrixTranslation(&m, Box.Pos.x, Box.Pos.y, Box.Pos.z);
D3DXMatrixMultiply(&boxMat, &boxMat, &m);
// 表示
Gs_DrawModelMat(M_BOX, boxMat);
}
これは位置と前のフレームまでの姿勢と、このフレームでの回転量を元に行列を作ります。
そして、1で作った Gs_DrawModelMat()に引き渡して描画を行います。
これで一応動きます。
1,341ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(249,519ポイント)
Date: 2008/10/24(金) 16:00
No:23007
|
|
Title: Re:ワールド軸回転?
|
|
あー、見たらこの Ci-Libには Gs_DrawModelAxis()という任意の軸回転をサポートした
関数がありますね。
だとすると、4の GameDraw3D()は1で追加した関数を使わなくても
これで表示できます。
void GameDraw3D(void)
{
D3DXQUATERNION q;
D3DXQuaternionRotationYawPitchRoll(&q, Box.Rot.Yaw, Box.Rot.Pit, Box.Rot.Rol);
D3DXQuaternionMultiply(&Box.Quat, &Box.Quat, &q);
float angle;
D3DXVECTOR3 axis;
D3DXQuaternionToAxisAngle(&Box.Quat, &axis, &angle);
Gs_DrawModelAxis(Box.Pos.x, Box.Pos.y, Box.Pos.z, M_BOX, 1, 1, 1,
0, 0, 0, D3DXToDegree(angle), axis.x, axis.y, axis.z);
}
348ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..かけだし(1,399ポイント)
Date: 2008/10/24(金) 17:27
No:23010
|
|
Title: Re:ワールド軸回転?
|
|
ハッカーさん
何度も回答ありがとうございます。
最初の意見の方をしてみたのですが
毎フレーム場所が初期化されてしまいだめでした。
次の意見もしてみましたが
D3DXQuaternionRotationYawPitchRoll(&q, Box.RotOffset.Yaw, Box.RotOffset.Pit, Box.RotOffset.Rol);
のoffsetがみつからず(用意していない?)
Box.RotOffset.Yaw を Box.Rot.Yaw にすると
なぜか回転し続けてしまいます・・・
ライブラリが配布されたもの+オリジナルなので理解できない所が多々あります。
できれば後者で上げた方の完成版?をいただけないでしょうか
甘えた発言で申し訳ありません。
2倍のポイントを手に入れた! 300ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(249,664ポイント)
Date: 2008/10/24(金) 18:08
No:23011
|
|
Title: Re:ワールド軸回転?
|
|
あ、失礼しました。
RotOffsetは Rotですね。
>毎フレーム場所が初期化されてしまいだめでした
こっちはどういう意味かよくわかりませんが、
>なぜか回転し続けてしまいます・
rot.Yaw = rot.Pit = rot.Rol = 0;がないからだったりしませんか?
とりあえず、GameMainの方を添付しておきます。
GameDraw3D()は #ifdefで分けられていますが、どちらでもいけると思います。
145ポイント を手に入れた。
|
|
|
|
|
Name: 紅葉 ..かけだし(1,442ポイント)
Date: 2008/10/24(金) 20:30
No:23014
| 解決!
|
Title: Re:ワールド軸回転?
|
|
ありがとうございます>< できました。
このサイトは本当にいい場所で感謝しています。
43ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(249,812ポイント)
Date: 2008/10/24(金) 22:09
No:23018
|
|
Title: Re:ワールド軸回転?
|
|
>できました。
出来たのはいいのですが、どうやってやっているかはしっかりと見ておいて下さい。
Gs_DrawModelMat()版と Gs_DrawModelAxis()版の両方で。
どっちを使った方がいいのかというのについては、将来を見据えるなら前者、
今のライブラリと調和させるなら後者となります。
でも、なんでもかんでも Yaw/Pitch/Rollでは辛いような・・・。
148ポイント を手に入れた。
|
|
|
|
Name: kokoro ..かけだし(2,496ポイント)
Date: 2008/10/08(水) 15:59
No:22146
|
|
Title: 学校の課題なんですが・・・
|
|
[1] 授業単元: C言語
[2] 問題文(含コード&リンク):
★以下の仕様を満たすプログラムをC言語で作成しなさい。
【仕様】座席予約簡易プログラム
▽通路を挟んだ5行×5列(1−1〜5−5まで)の座席がある列車の座席を予約・キャンル
するプログラムを作る。
▽メニューは、「予約」「キャンセル」「終了」の3種類とする。
▽空き状態を0、予約済み状態を1で表現する。初期の予約状態はランダムにしておく。
▽「予約」では、予約状況の一覧を表示し、予約する座席数を入力させる。入力数が空席の数以上であれ ば、 「空席が足りません」として、再度入力させる。
▽次に希望する座席を入力させる(行‐列の順)。入力されたら確認メッセージ
(「(座席番号)」を予約しますか?)を表示する。Yesならば予約処理をし、「予約しました」と表示してメニ ューに戻る。 Noならばメニューに戻る。
▽すでに予約済みの座席を指定した時は、「(座席番号)は予約済みです」とエラーメッセージを表示し、再度 入力させる。
▽入力数が2以上のときは複数選択が可能になるようにする(全ての希望を入力した時点で確認メッセージ を表示)
▽入力数が空席の数と同じときは、すぐに予約確認メッセージを表示する。
▽「キャンセル」では、「予約」メニューと同様の機能をもたせる(一覧表示・キャンセルする座席数の入力・
座席番号の入力・確認メッセージ・エラー処理・複数選択機能)
▽「終了」では、プログラム終了する。
全体的に分からないのですが、とりあえず書いてあることをプログラムにしてみました(添付しました)
一覧をランダムにするのはどうしたら良いでしょうか?他のところも教えてほしいです。
ここのところをどうすれば良いか分かりません→▽入力数が2以上のときは複数選択が可能になるようにする(全ての希望を入力した時点で確認メッセージを表示)
▽入力数が空席の数と同じときは、すぐに予約確認メッセージを表示する。
全体的に分からないので教えてください。
547ポイント を手に入れた。
|
|
|
|
Name: いけやん ..中級者(13,519ポイント)
Date: 2008/10/08(水) 16:28
No:22148
|
|
Title: Re:学校の課題なんですが・・・
|
|
素人の私ですが、部分的にですが(汗
>▽入力数が空席の数と同じときは、すぐに予約確認メッセージを表示する。
時間がないので、ソースは読んでないのですが
入力数をカウントする変数、空席をカウントする変数なんかを用意して
入力数:NCount
空席数:KCount
入力されるたびに++したりして
if(NCount==KCount){
Printf(表示);
}
素人のソースなので参考にならないと思いますが・・・
121ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..中級者(13,763ポイント)
Date: 2008/10/09(木) 09:11
No:22171
|
|
Title: Re:学校の課題なんですが・・・
|
|
>printf("空き:0 予約済み:1\n");
> for(j=0; j<=5; j++){
> printf(" %d\t",j);
> for(i = 0; i < 5; i++){
> printf(" %d\t",i+1);
>
> }
> printf("\n");
> }
質問なんですが上記の処理は、25マスに乱数を入れて
0,1を代入する処理を書きたいと言う解釈で合っていますかね?
こんな感じかな?
#define MAX 5
srand(time(NULL));
for(i=0;i<MAX;++i){
for(j=0;j<MAX;++j){
zaseki[i][j]=rand()%1;//0〜1を代入する
}
}
もしかすると
randの使い方が間違っているかもしれません。
その時は、ごめんなさい。
244ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(81,450ポイント)
Date: 2008/10/09(木) 09:48
No:22172
|
|
Title: Re:学校の課題なんですが・・・
|
|
いけやんさん、惜しいです。
> zaseki[i][j]=rand()%1;//0〜1を代入する
は
zaseki[i][j]=rand()%2;//0〜1を代入する
です。
あまりを0か1にしたいのですから1で割ってはあまりは0しかありえません。
なぜなら0以外の整数は1で割り切れちゃいますから^^;
ほかにはビット演算を用いて乱数の演算を減らすやり方も出来ますね。
int k;
k=rand()%32;
for(i=0;i<5;i++){
zaseki[i][0]=k&16;
zaseki[i][1]=k&8;
zaseki[i][2]=k&4;
zaseki[i][3]=k&2;
zaseki[i][4]=k&1;
}
※hint
32= 00100000
16= 00010000
8= 00001000
4= 00000100
2= 00000010
1= 00000001
です。
乱数で0から31(32で割ったあまり)を取り出し、
2進数に置き換えた各桁を座席に割り当てるやり方。
293ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..中級者(13,773ポイント)
Date: 2008/10/09(木) 09:58
No:22174
|
|
Title: Re:学校の課題なんですが・・・
|
|
>やそさん
訂正ありがとうございます。
乱数をあまり使った事がなかったので、助かります。
>ほかにはビット演算を用いて乱数の演算を減らすやり方も出来ますね。
そんなやり方もあるんですか〜。
自分はビット演算なんかは、疎いので
少し難しいですね。
>kokoroさん。
間違ったものを書いて、すいませんでした。
77ポイント を落としてしまった。
|
|
|
|
|
Name: Haru ..上級者(17,051ポイント)
Date: 2008/10/09(木) 10:18
No:22176
|
|
Title: Re:学校の課題なんですが・・・
|
|
>ありがとうございます。他にも教えてほしいのですが、誰か教えてください。
全体的にといっても、何がわからないのかわからないと、他の皆さんも
教えずらいと思います。
>▽通路を挟んだ5行×5列(1−1〜5−5まで)の座席がある列車の座席
私の理解不足かもしれませんがこの説明がよくわからないんですが・・・
1 2 3 4 5
A o o o o o
B o o o o o
C o o o o o
D o o o o o
E o o o o o
こんな席だというイメージで良いんですかね?
私もまだまだ未熟者なので、大した力にはなれませんが、
if(????)
{
printf("空席が足りません\n");
printf("予約する座席数を入力してください。\n");
scanf("%d",&yoyaku);
}
ここのif分は
全体の席数 < 現在の予約数+これからする予約の数
==error
になる訳ですよね?今のままだと、errorを出してもう一度scanfでまた、errorがでてしまったら、そのまま次に進んでしまいます。また、終了処理を選択しなくても、勝手に終了してしまうので、
while(1) //無限ループ
{
scanf(%d,&num);
switch(num)
{
case1: //予約処理
while(1)
{
errorにならなかったら...
break;
}
break;
case2: //キャンセル処理
break;
case3: //終了
return 0;
}
}
少しごちゃごちゃしてしまいましたが、こんな感じで良いのではないでしょうか?
546ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(81,565ポイント)
Date: 2008/10/09(木) 12:01
No:22177
|
|
Title: Re:学校の課題なんですが・・・
|
|
をっと。
乱数はループの中で発生させないといけなかった(汗)
int k;
for(i=0;i<5;i++){
k=rand()%32;
zaseki[i][0]=k&16;
zaseki[i][1]=k&8;
zaseki[i][2]=k&4;
zaseki[i][3]=k&2;
zaseki[i][4]=k&1;
}
です。
115ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(81,779ポイント)
Date: 2008/10/09(木) 12:52
No:22182
|
|
Title: Re:学校の課題なんですが・・・
|
|
あ、またミスに気づいた。代入する値は0か1だっけ?
int k;
for(i=0;i<5;i++){
k=rand()%32;
zaseki[i][0]=((k&16)>>4);
zaseki[i][1]=((k&8)>>3);
zaseki[i][2]=((k&4)>>2);
zaseki[i][3]=((k&2)>>1);
zaseki[i][4]=k&1;
}
1の位までビットシフトっす。
2倍のポイントを手に入れた! 214ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(2,661ポイント)
Date: 2008/10/09(木) 22:22
No:22215
|
|
Title: Re:学校の課題なんですが・・・
|
|
分からないところなんですが・・・
yes,noの判定。
予約済みの座席を指定した時のエラーメッセージ。
入力数が2以上の時は複数選択が可能になるようにする。
入力数が空席の数と同じの時は、すぐに確認メッセージを表示。
のところがうまくプログラムが作れません。教えていただきたいです。
135ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(17,715ポイント)
Date: 2008/10/10(金) 10:03
No:22232
|
|
Title: Re:学校の課題なんですが・・・
|
|
>>yes,noの判定。
1:yes 2:no
if(res == 1)
{
//予約
}
else
{
//キャンセル
}
>>予約済みの座席を指定した時のエラーメッセージ。
if(zaseki[i][j] != 0)
{
//予約済みです
}
#一番最初に配列は0で初期化しておく
>>入力数が2以上の時は複数選択が可能になるようにする。
if(yoyaku > 1)
{
for(roop = 0; roop <=yoyaku; roop++)
{
//予約処理
}
}
>>入力数が空席の数と同じの時は、すぐに確認メッセージを表示。
???何のメッセージかわからないですが…
if(yoyaku == aki)
{
//確認メッセージ
}
多分こんな感じでよいのではないでしょうか?
164ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,243ポイント)
Date: 2008/10/10(金) 10:05
No:22233
|
|
Title: Re:学校の課題なんですが・・・
|
|
まず、Haruさんがされているように、全体をWhileかdo〜whileで繰り返しましょう。
>yes,noの判定。
kokoroさんの方法でいいと思います。
>予約済みの座席を指定した時のエラーメッセージ。
if(zaseki[i-1][j-1]==1)
printf("エラーメッセージ\n");
のようになりますが、エラーの場合、再入力が必要なので
これもWhileかdo〜whileで繰り返しましょう。
>入力数が2以上の時は複数選択が可能になるようにする。
予約座席数を入力した後、
while(yoyaku>0){
座席番号入力
yoyaku--;
aki--;
}
のようにこれも繰り返します。
>入力数が空席の数と同じの時は、すぐに確認メッセージを表示。
上の予約座席数を入力した後、
if(aki==yoyaku)
すべて予約にする
else if(aki>yoyaku)
上の座席番号入力のwhile文
まだわからないのであれば、わかるところまでプログラムを添付してください。
305ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(17,871ポイント)
Date: 2008/10/10(金) 10:21
No:22234
|
|
Title: Re:学校の課題なんですが・・・
|
|
>>予約済みの座席を指定した時のエラーメッセージ。
>if(zaseki[i-1][j-1]==1)
>printf("エラーメッセージ\n");
>のようになりますが、エラーの場合、再入力が必要なので
>これもWhileかdo〜whileで繰り返しましょう
失礼しました。nonさんの言うとおりi,jは-1しなくてはいけませんでした。
156ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(2,701ポイント)
Date: 2008/10/10(金) 10:39
No:22235
|
|
Title: Re:学校の課題なんですが・・・
|
|
皆さんありがとうございます。
これで作ってみます。またわからないところがあったら、教えてください。
40ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(82,519ポイント)
Date: 2008/10/10(金) 12:52
No:22237
|
|
Title: Re:学校の課題なんですが・・・
|
|
まずは処理の流れを文章や図で書き出しましょう。
スタート
↓
初期処理
(使用する変数の宣言や初期値代入など)
↓
メニュー表示
↓
番号入力
(入力した番号が1-3以外のときはメッセージを出してメニュー表示からやり直す?)
↓
入力した番号によって各処理へ
☆予約
現在の予約状況の表示
↓
予約する座席数を入力
↓
現在予約されている座席数と比較
(座席数が足りなければ座席数入力へ戻る)
↓
座席番号の入力
↓
予約状況と比較
(既に予約されている座席の場合は座席番号の入力へ戻る)
↓
予約確認
↓
全ての予約が終わっていれば抜ける。
(終わっていなければ予約数を1減じて、座席番号の入力へ戻る)
☆1☆まずは座席の初期設定(ランダムに0,1を設定する)
int reserved;/*予約済み席数を数える変数
reserved=0;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
zaseki[i][j]=rand()%2;/* 2で割った余り(すなわち0か1)を設定
reserved+=zaseki[i][j];
}
}
aki=25-reserved;/* ついでに空席数も計算しておく。
☆2☆予約状況の表示
printf("\t1\t2\t3\t4\t5\n");/* 列の見出し
for(i=0;i<5;i++){
printf("%d:\t",i+1);/* 行の見出し
for(j=0;j<5;j++){
printf("%d\t",zaseki[i][j]);/* 予約状況表示
}
printf("\n");
}
位置がずれているようなら調整してください。
☆3☆メニュー番号入力
while(1){
scanf("%d",&num);
if(num>0 || num<4){
break;
}
printf("1から3を入力してチョーダイ!!\n");
}
☆4☆予約
while(1){
scanf("%d",&yoyaku);
if(yoyaku<=aki){
break;
}
printf("そんなに予約できましぇーん!!\n");
printf("空席数:%d 以下で入力してねえん\n",aki);
}
while(yoyaku>0){
printf("希望する座席番号を入力してください(行-列)\n");
scanf("%d-%d",&i,&j);
if(zaseki[i][j]==1){
printf("座席[%d-%d]は予約済みです。\n",i,j);
else{
printf("を、空席みたいっすよ旦那。%d-%d取っときやすか?\n",i,j);
res=getchar();
if(res=='y' || res='Y'){
zaseki[i][j]=1;
printf("押さえやしたぜ。へっへっへ。\n");
yoyaku--;
}
}
}
こんな感じかなぁ・・・
740ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..中級者(14,013ポイント)
Date: 2008/10/10(金) 13:15
No:22239
|
|
Title: Re:学校の課題なんですが・・・
|
|
遅かった・・・
やそさんが組まれたみたいですね・・・
今自分も一部ですが、組んでいまた。
でも、やそさんの方が断然いいですね(汗
やそさん・・・・・
printfで表示させるところがおもしろすぎですよ!!
>printf("を、空席みたいっすよ旦那。%d-%d取っときやすか?\n",i,j);
>printf("押さえやしたぜ。へっへっへ。\n");
ツボでした。
昼ご飯が詰まりましたwww
脱線しました。すいません。
部分的にですが
Yesの所はそんな感じだと思います。
>Noならばメニューに戻る
これは、メニューの所をwhile等のループで回しておいて
省略
if(Yesならば){}
if(Noならば){
printf("もう一度予約して下さい");
continue;//ループに戻る
}
の様な感じでいけるのでは?と思います。
240ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(2,835ポイント)
Date: 2008/10/10(金) 21:44
No:22249
|
|
Title: Re:学校の課題なんですが・・・
|
|
ここまで作ってみました。
あと、▽入力数(座席数)が2以上のときは複数選択が可能になるようにする
(全ての希望を入力した時点で確認メッセージ を表示)
▽入力数(座席数)が空席の数と同じときは、すぐに予約確認メッセージを表示する。
のところがどうしてもできないのですが、どうしたら良いのでしょう????
134ポイント を手に入れた。
|
|
|
|
|
Name: box ..ハッカー(126,931ポイント)
Date: 2008/10/11(土) 00:24
No:22263
|
|
Title: Re:学校の課題なんですが・・・
|
|
ソースは見ておりません。
> あと、▽入力数(座席数)が2以上のときは複数選択が可能になるようにする
> (全ての希望を入力した時点で確認メッセージ を表示)
入力数(座席数)をどういう変数で管理しているか、
複数の座席を選択する、とは、どういう処理を意味するのか、
すべての希望を入力した時点、とは、どういうタイミングのことをいうのか、
確認メッセージの内容はどういったものか。
> ▽入力数(座席数)が空席の数と同じときは、すぐに予約確認メッセージを表示する。
空席の数をどういう変数で管理しているか、
入力数(座席数)と空席数が同じ、ということを、C言語ではどう表現するか、
予約確認メッセージの内容はどういったものか。
考えることはいっぱいありますね。
さあ、頭をフル回転させましょう。
193ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(83,997ポイント)
Date: 2008/10/11(土) 15:21
No:22291
|
|
Title: Re:学校の課題なんですが・・・
|
|
ちょっと遊んでみました。
がんばって気になる(ツンデレ風味の)あの子のスケジュールを押さえるのだ!!(笑)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define GYOU 5
#define RETU 5
int main(void)
{
/* 変数の宣言 */
int NUM[RETU][GYOU];
int i,j,num,zasekisu,aki,res;
aki = 0;
/* 初期処理 */
/* 乱数 種 決定 */
srand((unsigned)time(NULL));
/* めにゅー */
while(1){
printf("メニュー 1:予約 2:キャンセル 3:終了\n");
printf("早く番号を入れなさいよっ!もう、グズなんだから!!:");
scanf("%d",&num);
if(num>0 || num<4){
break;
}/* 1から3だけ〜。どんだけ〜 */
}/* while文の終了
/* どれを選んでも一応現在の予約状況を表示 */
printf("予約一覧\n");
printf("空き:0 予約済み:1\n");
for(i=0; i<RETU; i++){
for(j = 0; j < GYOU; j++){
NUM[i][j] = rand()%2;/* 0 or 1をセット */
if(NUM[i][j] == 0){/* 空の数を数える */
aki = aki+1;
}
printf("%d\t",NUM[i][j]);
}
printf("\n");/* 1行の表示後に改行する */
}
/* 予約 */
if(num == 1){
/* 予約する日数を入力する */
printf("予約する日数を入力するのよ!\n");
while(1){
scanf("%d",&zasekisu);
if(zasekisu<=aki){
break;
}
printf("私は忙しいのだぞ!おまえの為にそんなにスケジュール空けられるわけあるか馬鹿者が!\n");
printf("予約する日数を空日数:%d 以下に抑えるのだ\n",aki);
}
/* ▽入力数が空席の数と同じときは、すぐに予約確認メッセージを表示する。 */
if(aki == zasekisu){/* 空席数と予約数が同じ場合は全席予約ってこと? */
printf("現在の空日数を全て予約するのか?(y/n)\n");
res = getchar();
if(res == 'Y' || res == 'y'){
for(i=0; i<RETU; i++){
for(j = 0; j < GYOU; j++){
NUM[i][j]=1;/* 問答無用で全て1にセット */
}
}
printf("全席予約しました。\n");
printf("全くどれだけ私にloveloveなのだ。私も罪なオンナだな。ふふふっ。\n");
}
}
/* ▽入力数が2以上のときは複数選択が可能になるようにする(全ての希望を入力した時点で確認メッセージを表示) */
/* 座席数を数えながらループする */
while(zasekisu>0){
/* 座席番号妥当性チェック */
printf("希望する日を入力してください。(行‐列)\n");
scanf("%d-%d",&i,&j);
while(1){
if((i>0 && i<6)&&(j>0 && j<6)){/* 座席番号は1から5のみ許可 */
break;
}
printf("もう一度、日付を良く確認するのだ。馬鹿者め。(行‐列)\n");
scanf("%d-%d",&i,&j);
}
/* 予約済みかどうかの確認 */
if(NUM[i-1][j-1] == 1){
printf("その日[%d-%d]は忙しい。やめておけ。\n",i,j);
}else{
printf("その日「%d-%d」で良いのか?(y/n)\n",i,j);
printf("Y または Nで簡潔に答えるがいい。\n");
res = getchar();
if(res == 'Y' || res == 'y'){/* nの判定をしていないのでy以外は全てnoとなる */
NUM[i][j]=1;
printf("スケジュール「%d-%d」を押さえました。\n",i,j);
zasekisu--;/* 予約完了したので残り予約数(zasekisu)を1減らす */
}/* if(res〜)文の終了 */
}/* if(NUM〜)文の終了 */
printf("残り予約数:%d\n",zasekisu);/* なんとなく親切設計に */
}/* while(zasekisu〜)文の終了 */
/* 予約数全て入力終了 */
printf("全ての予約が完了しました。\n");
}/* if(num == 1)の終了
/* キャンセル */
/*if(num == 2){
/* キャンセルはがんばって考えよう! */
}*/if(num == 2)文の終了
/* 終了 */
if(num == 3){
printf("なに!止めるというのか?!\n");
scanf("%d",&i);
printf("ちょ、ちょっと本気か?!\n");
scanf("%d",&i);
printf("お前なんかもう知らん。勝手にすればよかろう。\n");
}
return 0;
}/* mainの終了
おふざけが過ぎるかな?
ロジック自体は一応まともに考えてはいるんでお許しを(笑)
目障りならば消してくだされ(削除pass:yaso)
ぽこぽこ修正^^;
1,475ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,825ポイント)
Date: 2008/10/11(土) 15:34
No:22293
|
|
Title: Re:学校の課題なんですが・・・
|
|
面白いもの見させていただきましたw
あ、time.hがインクルードされてないようです。
srand(time(NULL));
も警告避けるために
srand((unsigned)time(NULL));
のがいいかなと思います。
・・・ツンデレはいつ頃から流行ったのでしょうねw
100ポイント を手に入れた。
|
|
|
|
|
Name: kazuoni ..プログラマー(31,871ポイント)
Date: 2008/10/11(土) 15:38
No:22294
|
|
Title: Re:学校の課題なんですが・・・
|
|
あ、あと
if((i>0 && i<6)&&((j>0 && j<6))
↓
if((i>0 && i<6)&&((j>0 && j<6)))
とint akiが二つあります^^;
46ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(84,056ポイント)
Date: 2008/10/11(土) 18:38
No:22302
|
|
Title: Re:学校の課題なんですが・・・
|
|
kazuoniさん、チェックあんがとさん^^
ツール使わず、脳内コンパイルのみなので、穴はやっぱりポコポコあったね^^;
srandはトピ主さんのソースをまんまコピペしただけで、何も考えてなかった(笑)
59ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(3,112ポイント)
Date: 2008/10/17(金) 13:54
No:22558
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
実行結果
予約する座席数を入力してください。
2
-希望する座席番号を入力してください。(行‐列)
1-2
座席番号「1-2」を予約しますか。
Yes=1 または No=0を入力してください。
1
座席番号「1-2」を予約しました。
メニュー 1:予約 2:キャンセル 3:終了
番号を入力してください
と1つ目を予約した後、メニューに戻ってしまいます。
例えば、予約する座席数を「2」と入力した時、1つ目を予約した後2つ目の予約にいくように
繰り返したいのですが
どうしたら良いのか・・・教えてください。
239ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(3,249ポイント)
Date: 2008/10/17(金) 14:22
No:22565
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
↑のはできました。
もう一つ質問なんですが、
予約が完了した後メニューに戻り、その後また予約を選択した後
一覧表が表示された時、前に予約した番号が一覧表に表示されるようにしたい
(ランダムにならずに、予約したところに「1」が出るようにしたい。)
のですがどうしたらいいのでしょうか?
ソースは一緒です。教えてください。
137ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..中級者(14,909ポイント)
Date: 2008/10/17(金) 14:39
No:22569
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
if(aki == zasekisu){
printf("予約しますか。\n",i,j);
printf("Yes=1 または No=0を入力してください。\n");
scanf("%d",&res);
if(res == 1){
NUM[i][j]=1;
printf("予約しました。\n");
break;
}else{
continue;
}
}
>予約する座席数を入力してください。
>2
↑を入れているのが
>zasekisu
この変数なんですよね?
予約したい座席数をzasekisuが持っているから
zasekisuまで回れとして
for(〜; < zasekisu;〜){//予約する座席分るーぷ
if(res == 1){
NUM[i][j]=1;
printf("予約しました。\n");
break;
}
}
こんな感じですかね?
後ここおかしくないですか?
if(aki == zasekisu){
空いてる座席数と予約したい座席数が同じならという事ですよね?
if(aki >= zasekisu){
空いてる数の方が多い場合でないといけないと思うのですが・・・
2倍のポイントを手に入れた! 896ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(3,708ポイント)
Date: 2008/10/18(土) 18:43
No:22660
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
実行結果
メニュー 1:予約 2:キャンセル 3:終了
番号を入力してください1
一覧表示
空き:0 予約済み:1
1 1 1 1 1
1 1 1 1 0
1 1 1 1 1
1 1 0 0 0
1 1 1 0 1
予約する座席数を入力してください。
3
-希望する座席番号を入力してください。(行‐列)
4-3
座席番号「4-3」を予約しますか。
Yes=1 または No=0を入力してください。
1
座席番号「4-3」を予約しました。
-希望する座席番号を入力してください。(行‐列)
4-4
座席番号「4-4」を予約しますか。
Yes=1 または No=0を入力してください。
1
座席番号「4-4」を予約しました。
-希望する座席番号を入力してください。(行‐列)
4-5
座席番号「4-5」を予約しますか。
Yes=1 または No=0を入力してください。
1
座席番号「4-5」を予約しました。
メニュー 1:予約 2:キャンセル 3:終了
番号を入力してください 1
一覧表示
空き:0 予約済み:1
0 0 0 1 0
0 1 0 0 1 この一覧が
0 0 0 0 0 ←ランダムにならずに前に予約した
0 0 0 1 1 ところが予約されているようにしたい。
1 0 0 0 0
(ランダムにならずに、予約したところに「1」が出るようにしたい。)
このようにするにはどうしたら良いのでしょうか?
459ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,018ポイント)
Date: 2008/10/18(土) 18:58
No:22661
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
乱数を発生させて配列に入れている部分を、while(1)の前に、移動すればいいのでは?
37ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(3,735ポイント)
Date: 2008/10/18(土) 19:33
No:22663
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
srand(time(NULL)); の下に
NUM[i][j] = rand()%2;
ですか?
27ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,053ポイント)
Date: 2008/10/18(土) 19:50
No:22664
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
そうです。もちろん、forの2重ループ部分全部。
乱数をセットする部分と、配列を表示する部分に分けて考えましょう。
35ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,146ポイント)
Date: 2008/10/18(土) 21:21
No:22667
|
|
Title: Re:学校の課題なんですが・・・限界です´`
|
|
ありゃありゃ、上はへんな投稿文書に・・・(失礼しました)
kokoroさんのプログラムもほぼ、完成したみたいなので、ちょっと作ってみました。
上の添付ファイルです。
参考にしてください。ただし、学校に提出するのは自分のにしてね。
なお、配列とakiは簡単にするためにグローバル変数にしました。
76ポイント を手に入れた。
|
|
|
|
|
Name: kokoro ..入門者(3,835ポイント)
Date: 2008/10/24(金) 13:44
No:22991
|
|
Title: Re:学校の課題なんですが・・・
|
|
質問なんですが、全部予約して、一覧表示させると全部予約(全部「1」)にならない
のはなぜでしょうか。
また、全てキャンセルして、一覧表示すると全部「0」になりません。
教えてください。
83ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,790ポイント)
Date: 2008/10/24(金) 14:05
No:22993
|
|
Title: Re:学校の課題なんですが・・・
|
|
for(i=1; i<5; i++){
for(j=1; j<5; j++){
NUM[i-1][j-1]=0; // ここ間違い
}
}
yoyakuzumi = 0;
aki = 25;
printf("キャンセルしました。\n");
なぜ-1していますか?
84ポイント を手に入れた。
|
|
|
|
|
Name: いけやん ..上級者(15,353ポイント)
Date: 2008/10/24(金) 14:07
No:22994
|
|
Title: Re:学校の課題なんですが・・・
|
|
if(res == 1){
for(i=1; i<5; i++){
for(j=1; j<5; j++){
NUM[i-1][j-1]=1;
}
}
yoyakuzumi = 25;
aki = 0;
printf("予約しました。\n");
}
試せる環境がないので、多分なんですが
ループを1から始めて5までとしているので
1,2,3,4までしか回っていないのではないのでしょうか?
もしあれでしたら
printf()なんかを挟んで
値を確かめては?
for(i=1; i<5; i++){
printf(値確認)
for(j=1; j<5; j++){
printf("値確認")
NUM[i-1][j-1]=1;
252ポイント を落としてしまった。
|
|
|
|
Name: 独学初心者 ..ぴよぴよ(399ポイント)
Date: 2008/10/23(木) 04:53
No:22887
|
|
Title: シューティング、自機の当たり判定ががが…
|
|
はじめまして。
シューティングゲームの館を見て、初めてVC++インストールしたような初心者です。
何とか、試行錯誤しながら理解して自機ショットを敵に当てて倒すことはできたのですが、逆がどうしてもできなくって困っています。
C2065で実際に(x*x)…と計算する際のx,y,rangeが定義されてないとなってしまいます…(エラー文はこれだけです)
あれ?
double x,y;
int range;
の下の定義が生きてない?
と思ったのでいろいろ試したのですが…多分もっと前とかでしくじってると思うのですがいかんせん見当がつかないです…
どこが悪いんでしょうか…?
void CollisionDetection2(){
for(int i=0;i<ENEMY_TOTAL_NUM;i++){//敵の最大数100体分ループ
if(EnemyShot[i].flag==1){//敵のショットが発射中なら
for(int j=0;j<ENEMY_TOTAL_SHOT_NUM;j++){//1組200個分のループ
if(EnemyShot[i].EnemyShots[j].flag==1){//1個でも発射中の弾があれば
if(Player.flag==1){//プレイヤーの表示中なら
double x,y;
int range;
x=(int)(EnemyShots[j].x-Player.x);//x=(弾のx位置-プレイヤーのx位置)
y=(int)(EnemyShots[j].y-Player.y);//x=(弾のy位置-プレイヤーのy位置)
range=9;//(弾の当たり判定)
break;
}
if((int)sqrt(x*x+y*y) < range+Player.range){
EnemyShot[i].flag=0;
break;
}
}
}
}
}
}
また、これに伴い
Global、Externの両方の.hのプレイヤーの構造体にrangeとflagを足して
initial.cppに
Player.range=25;
Player.flag=1;
それから
PlayerControl.cppに
if(Player.flag==1){
DrawGraph((int)Player.x,(int)Player.y,img_player[0],TRUE);//プレイヤーを描画
}
の一文追加しています
(このプログラムコードは管理人によって字下げされました)
399ポイント を手に入れた。
|
|
|
|
Name: Mist ..プログラマー(28,510ポイント)
Date: 2008/10/23(木) 09:52
No:22895
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
ソースコードは規約を読んで字下げしてください。
変数の有効範囲について勉強してください。
if(Player.flag==1){//プレイヤーの表示中なら
double x,y;
int range;
x=(int)(EnemyShots[j].x-Player.x);//x=(弾のx位置-プレイヤーのx位置)
y=(int)(EnemyShots[j].y-Player.y);//x=(弾のy位置-プレイヤーのy位置)
range=9;//(弾の当たり判定)
break;
}
if((int)sqrt(x*x+y*y) < range+Player.range){
今回のようにifの中で変数を宣言した場合、その変数が有効なのはifの中だけになります。
そのため、次のifでその変数を使用するとコンパイラはその変数は存在しないというエラーになります。
218ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..ぴよぴよ(675ポイント)
Date: 2008/10/23(木) 14:17
No:22912
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
Mist様
読み辛いものを上げてしまい申し訳ないです。以後気をつけます;
また読みづらいにも関わらず御返答いただきありがとうございました。
break下の } を変えたら無事起動できました。
それと、良く読むと結構 EnemyShot[i]. を付け忘れてるとこがあったので、double x,y の計算と最後の弾が当たったら消える…という所にも追加してみました。
結果…見事に貫通です;
当たったら弾が消えるで当たり判定だけ見たいんですが、プログラミング自体を始めて1週間、なかなか難しいもんです…
代入してる項目に何か問題があるんだろうか?と思うのですが…
276ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(833,193ポイント)
Date: 2008/10/23(木) 14:35
No:22915
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
コードは見易いように修正しておきました。
投稿された生データみましたが、コピペされた時点で正確な字下げが出来ていなかったようでした。
字下げしないと括弧の対応の把握が困難でバグの元になるので、
きちんと字下げすることオススメします。
後、貫通するのは、たまたまその判定円の中に入っていなかったのではないでしょうか?
例えば・・
90ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(833,646ポイント)
Date: 2008/10/23(木) 14:51
No:22916
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
黒丸が自機だと思って下さい。
今赤い弾が自機に向かって飛んできているとします。
弾は1つです。モーションがわかりやすいように時間ごとの様子を表現しています。
場合1はこの瞬間黒にあたったことが判定出来ますね。
しかし場合2のようにすごい速さで弾が飛んできている時は、丁度そのフレームでは弾同士が当たらないかもしれません。
数学でならったような方程式で交点を求めているわけではなく、
単に弾を移動させて、そこであたったかどうか見ているだけなので、条件にあわないこともあります。
ですから、場合2の場合でも場合1のように弾の当たり判定の大きさずつ移動させてあたったかどうかシミュレートしてみなければいけません。
または、方程式などで軌跡を計算して当たり判定を計算する方法もあると思います。
計算スピードとしては方程式で解く方が早いでしょうけど、めんどうだったので、
龍神録では弾の当たり判定ずつ移動させてあたったかどうかシミュレートする方法とっています。
もしバグの原因がこれじゃなかったらごめんなさい。
それから当たり判定の計算はdouble型でやった方がいいと思いますよ。
弾の移動速度をゆっくりにしても貫通するならこれが原因じゃありません。
453ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..ぴよぴよ(893ポイント)
Date: 2008/10/23(木) 19:02
No:22930
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
管理人様
丁寧に図までつけていただきありがとうございます。
スピードは4.0から1.0まで落として試してみたのですが、どうやらだめみたいです;
構文エラーはMist様のおかげで解消できたので、式として成り立ってはいるはずなのですが…
とりあえず、現在管理人様にいただいたアドバイス等を元に作ったソースがこんな形になりました。
/*enemy_shot.cpp内*/
void CollisionDetection2(){
for(int i=0;i<ENEMY_TOTAL_NUM;i++){//敵の最大数100体分ループ
if(EnemyShot[i].flag==1){//敵のショットが発射中なら
for(int j=0;j<ENEMY_TOTAL_SHOT_NUM;j++){//1組200個分のループ
if(EnemyShot[i].EnemyShots[j].flag==1){//1個でも発射中の弾があれば
if(Player.flag==1){//プレイヤーの表示中なら
double x,y;
int range;
x=(double)(EnemyShot[i].EnemyShots[j].x-Player.x);//x=(弾のx位置-プレイヤーのx位置)
y=(double)(EnemyShot[i].EnemyShots[j].y-Player.y);//x=(弾のy位置-プレイヤーのy位置)
range=20;//(弾の当たり判定)
break;
if((double)sqrt(x*x+y*y) < range+Player.range){
EnemyShot[i].EnemyShots[j].flag=0;
break;
}
}
}
}
}
}
}
式自体が無効になってしまってるんでしょうか?
main.cppの方にもexternもwhile以下も書いてはあるんですが…
それともinitial.cppに貼り付けたPlayer.range=25とかがまずいのでしょうか?
構造体には追加してるので、有効かと思うんですが…
うーん…;
218ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,363ポイント)
Date: 2008/10/23(木) 19:12
No:22932
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
当たり判定の所で、ブレイクポイントをセットして、
プログラムがそこを通るか、チェックしたほうが良いかもしれませんね。
式的には合っているようですし。
もしかしたら関数が呼ばれていないかもしれないし、
フラグの立て間違いで当たり判定チェックまで届いていないかもしれません。
128ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,155ポイント)
Date: 2008/10/23(木) 19:24
No:22933
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
プログラミングを始めて1週間ということで、ブレイクポイントをご存知ないかもしれないので、一応補足を。
まず、VC++の画面のメニューバー付近に「Debug」または「Release」どちらかが表示されていると思います。
Debugになっている場合はそれでOKで、ReleaseになっていたらDebugにして下さい。
そして、プログラムを書くエディタのすぐ左側にクリックできるスペースがあります。
そこをクリックすると、赤い●が表示されます。
SSをご覧下さい。
この●の位置まで処理が来ると自動的に処理をとめてくれます。
また、同時にその時その変数に何の値が入っているか表示してくれます。
このサンプルに使ったプログラムはこちらです。
aの値は常に変わっているので、パッとみ、何が入ってるかわからないですよね。
でもSSのように自動変数の表示で確認出来ます。
なので、ブレイクポイントを使うと
「そこまで処理がきているか」「そこの変数に何が入っているか」の2つが確認できるわけです。
デバッグを実行するときはF5を押します。
デバッグは必要ない時にはデバッグ無しの実行であるCtrl+F5を押しましょう。
256ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..かけだし(1,467ポイント)
Date: 2008/10/23(木) 23:02
No:22949
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
御津凪様、管理人様
ご返答ありがとうございます。
ブレイクポイントでデバックしたところ、プレイヤーのショットと比較して
発射された弾が実際に描写される前(発射音の時点)でウィンドウが止まる
見てみると発射されてないからか、どうやらdouble x,yの値を求める計算になるときに
EnemyShot[i]まではフラグも立ってるんですが
これがEnemyShot[i].EnemyShots[j]
EnemyShot[i].EnemyShots[j]={flag=0,x=0.000000000000,y=0.000000000000}
になってしまってるみたいです。
実際にプレイヤーのショットの同じ項をブレイクポイントで指定してみたところ
ちゃんと弾が発射された状態でウィンドウが閉じ
PlayerShotもflagが1でxもyもウィンドウが消える直前、つまりちゃんと発射後の状態になっていました。
デバックの際EnemyShot[i]とEnemyShot[i].EnemyShots[j]の間にEnemyShot[i].EnemyShotsという項がありましたが、ここですでに全てが0にリセット状態になっているためか、最後の
if((double)sqrt(x*x+y*y) < range+Player.range)
の式はスルーされちゃってるみたいです。
ヘッダの構造体かとおもっていじってみたりもしたのですが、一向に直る気配がないです;
なので一応今のヘッダの構造体Global.hの構造体部分を載せておきます。
// 敵のショットの構造体
typedef struct{
int flag;
double x,y;
} ENEMY_SHOTS_t;
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[2000];
typedef struct{
int pattern,counter,img,range;
double x,y,mem_ex,mem_ey,mem_px,mem_py,Angle[ENEMY_TOTAL_SHOT_NUM];//[2000];
ENEMY_SHOTS_t EnemyShots[ENEMY_TOTAL_SHOT_NUM];//[2000];
int flag;
} ENEMY_SHOT_t;
ENEMY_SHOT_t EnemyShot[ENEMY_TOTAL_NUM];//[100];
Extern側は、ENEMY_SHOTS_t、ENEMY_SHOT_tの前にexternがついてます。
574ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..かけだし(1,564ポイント)
Date: 2008/10/23(木) 23:39
No:22951
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
すみません、やっぱり構造体のミスでx,yが算出できなかったみたいで、EnemyShotの側のx,y直したら算出できました。
…が、やっぱりif((double)sqrt(x*x+y*y) < range+Player.range){の行にさしかかるとスルーです;
どうしたものですか…
97ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,278ポイント)
Date: 2008/10/23(木) 23:57
No:22954
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
スルーというのはどういうことでしょう?
もし条件文に入らないのならその時x,y、rangeなどの値はどうなっていますか?
どのように値が遷移しているか確認していけば解ると思います。
なお、x,yがdoubleならdoubleでキャストする必要はありません。
41ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..かけだし(1,310ポイント)
Date: 2008/10/24(金) 00:17
No:22956
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
管理人様
ご返答ありがとうございます。
ブレイクポイントの●をその行に打つと、例えばdouble x,yの値を求める式とかは計算が発生したらウィンドウが閉じて自動変数等の表示がされるところ、この所に来ると自機と弾が重なっても全くそんな素振りもなく、といった感じです;
それと先程書き忘れましたが、弾自体の座標のxとyはどうやらウィンドウ閉じる時点で敵機と全く一緒の様です。
発生した瞬間にウィンドウを閉じてるのか、プレイヤーショットの同じ行の場合、ショット発生してちょっと前に飛んでウィンドウが閉じてるのですが…座標もウィンドウが消えた時点の座標の様です
また判定されてないsqrtの文もプレイヤー側だとショット押した瞬間にウィンドウが閉じて計算されてる様なのですが、その辺もどうしてなのか色々やってみてはいるのですが…;
254ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(834,629ポイント)
Date: 2008/10/24(金) 00:31
No:22959
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
う〜ん。。。やはりプログラムの全文がないとこれだけではよくわからないです・・。
もし解決しないようならこちらにプロジェクト一式送ってもらえませんか?
どこが悪いか見てみます。
その際はデータは最小限でいいです。例えば音楽ファイルとか重くなりそうなら添付しないでOKです。
プロジェクトのファイルは〜〜.slnと〜〜.vcprojだけで大丈夫です。
特に〜〜.ncbファイルはいらないのに10M位あると思うのでどけておいて下さい。
136ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(247,830ポイント)
Date: 2008/10/24(金) 01:13
No:22964
|
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
スレを読んでも今ひとつ、何が起きているのかよくわからないのですが、
気になるところが1点。
これはもう修正されていますか?
if(Player.flag==1){//プレイヤーの表示中なら
double x,y;
int range;
x=(double)(EnemyShot[i].EnemyShots[j].x-Player.x);//x=(弾のx位置-プレイヤーのx位置)
y=(double)(EnemyShot[i].EnemyShots[j].y-Player.y);//x=(弾のy位置-プレイヤーのy位置)
range=20;//(弾の当たり判定)
break;
if((double)sqrt(x*x+y*y) < range+Player.range){
ここに breakがあると、いつまで経っても距離判定の if文には来ないような・・・。
284ポイント を手に入れた。
|
|
|
|
|
Name: 独学初心者 ..かけだし(1,565ポイント)
Date: 2008/10/24(金) 02:17
No:22971
| 解決!
|
Title: Re:シューティング、自機の当たり判定ががが…
|
|
管理人様、Justy様
ご返答ありがとうございました。
先ほど駄目なようなら…と言っていただき、なるだけご迷惑を…と思って自力でがんばっていたらキーボードに突っ伏していて大惨事に…;;
beak…そ、そっか!
最初に } 取ったときに、構文エラーが直ったので「そーなのかー」とそこでストップしてて気がついてなかったです;
そうですよね…そこの } が下に移ったのだから弾が消えるようにしたその後のbreakが…
このbreak消して無事弾消えました!!
ご返答くださった皆様、本当にありがとうございました!
すっごく初歩な質問にも暖かく答えていただき、大変感謝です!
重ねてありがとうございました!
255ポイント を手に入れた。
|
|
|
|
Name: でごいち ..ぴよぴよ(772ポイント)
Date: 2008/10/23(木) 20:25
No:22935
|
|
Title: 急ぎです。テクスチャマッピングの機能追加を希望します
|
|
でごいちです。添付ファイルのCGを実装するプログラムですが、残りの希望としてはテクスチャマッピングの機能を追加したいと思ってます。少々急いでおりますので、早めの内にご指導宜しくお願いします。
指導例:
この関数とこの関数の間に〜というプログラムを追加すると良い・・・・など。
72ポイント を手に入れた。
|
|
|
|
Name: box ..ハッカー(127,700ポイント)
Date: 2008/10/23(木) 20:31
No:22936
|
|
Title: Re:急ぎです。テクスチャマッピングの機能追加を希望します
|
|
> 少々急いでおりますので、早めの内に
俺(または私)は急いでるんだから、早く答えをよこせ、ということですか?
36ポイント を手に入れた。
|
|
|
|
|
Name: でごいち ..ぴよぴよ(835ポイント)
Date: 2008/10/23(木) 20:48
No:22938
|
|
Title: Re:急ぎです。テクスチャマッピングの機能追加を希望します
|
|
いいえ、そのつもりはありませんが・・・・誤解を招く表現であったとすれば申し訳ありません。早急に解決方法のアドバイスを頂き(勿論自分でもいくらかの案を練るようにはしてますが)、作業のペースを上げたいと思っています。
63ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(246,877ポイント)
Date: 2008/10/23(木) 22:25
No:22943
|
|
Title: Re:急ぎです。テクスチャマッピングの機能追加を希望します
|
|
検索はしてみましたか?
テクスチャ
ttp://wisdom.sakura.ne.jp/system/opengl/gl23.html
OpenGL勉強会用 資料のページ
ttp://www.is.oit.ac.jp/~whashimo/server/~whashimo/Article/OpenGL/Chapter7/index.html
OpenGL::テクスチャのはりかた - OpenGL de プログラミング - livedoor Wiki(ウィキ)
ttp://wiki.livedoor.jp/mikk_ni3_92/d/OpenGL::%A5%C6%A5%AF%A5%B9%A5%C1%A5%E3%A4%CE%A4%CF%A4%EA%A4%AB%A4%BF
OpenGL FAQ 21. テクスチャ・マッピング
ttp://opengl.jp/oglfaq/texture.htm
OpenGLでテクスチャーの扱い方 - a geek
ttp://d.hatena.ne.jp/hiratara/20080810/1218379797
これらを読めば直ぐに使い方はわかると思います。
224ポイント を手に入れた。
|
|
|
|
|
Name: でごいち ..ぴよぴよ(987ポイント)
Date: 2008/10/23(木) 22:54
No:22948
|
|
Title: Re:急ぎです。テクスチャマッピングの機能追加を希望します
|
|
Justyさんありがとうございます。添付のリンクは、分かる範囲で参考にさせて頂きます。
決して答を教えろとかいう類のつもりでは全くないですが(誤解を招くことがあれば申し訳ありません)出来れば、私のプログラムに何とかという関数を追加するとこのような動作を行う、という具体例を示していただけるとリンクの内容理解を深める上でありがたいので、他の閲覧者の方もどうか宜しくお願い致します。
152ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(247,891ポイント)
Date: 2008/10/23(木) 23:51
No:22952
|
|
Title: Re:急ぎです。テクスチャマッピングの機能追加を希望します
|
|
では、細かい説明は Webに譲るとして、簡単に。
1 グローバル変数に GLuint gTexture; を追加します。
2 初期化の関数の最後の方にでも
{
int x, y;
unsigned char *p;
GLubyte data[64][64][3];
glGenTextures(1, &gTexture);
glBindTexture(GL_TEXTURE_2D, gTexture);
p = (unsigned char *)data;
for(y = 0; y < 64; y++)
{
int r = (y * 0xff) / 64;
for (x = 0; x < 64; x++)
{
*p++ = x%2? 255: (unsigned char)r;
*p++ = (unsigned char)(x%2? 255-(y * 0xff / 64): (x * 0xff / 64));
*p++ = (unsigned char)(y%2? r: (0xff-r));
}
}
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D , 0 , 3 , 64 , 64 ,
0 , GL_RGB , GL_UNSIGNED_BYTE , data);
}
を追加します。
3 既存のコードに以下の関数を追加し、描画のどこかでコールして下さい。
void display2()
{
glBindTexture(GL_TEXTURE_2D, gTexture);
glEnable(GL_TEXTURE_2D);
glBegin(GL_TRIANGLE_STRIP);
glTexCoord2f(0, 0);
glVertex3f(5, 0, 5);
glTexCoord2f(1, 0);
glVertex3f(-5, 0, 5);
glTexCoord2f(0, 1);
glVertex3f(5, 0, -5);
glTexCoord2f(1, 1);
glVertex3f(-5, 0, -5);
glEnd();
glDisable(GL_TEXTURE_2D);
}
4 終了時(main関数を抜けるところ)で glDeleteTextures(1, &gTexture);を
コールして下さい。
これで、座標[0, 0, 0]あたりに四角のポリゴンがグリッドっぽい変なテクスチャが
張られた状態で表示されます。
1,014ポイント を手に入れた。
|
|
|
|
Name: SH ..かけだし(1,974ポイント)
Date: 2008/10/23(木) 00:07
No:22875
|
|
Title: エラー:外部シンボル…は未解決です の解決法
|
|
現在龍神録プログラミング25章まで進んだのですが、
一通り作業を進めた後でビルドしようとすると以下のエラーが出ました。
load.obj : error LNK2001: 外部シンボル ""int * img_etc" (?img_etc@@3PAHA)" は未解決です。
graph.obj : error LNK2001: 外部シンボル ""int * img_etc" (?img_etc@@3PAHA)" は未解決です。
fatal error LNK1120: 外部参照 1 が未解決です。
検索してみたところ
このエラーは『定義の名前が間違っている』ときに発生すると書かれていました。
が、GV.hでは GLOBAL int img_etc[50]; と定義されていますし、誤字は検索機能を使用し、無いことを確認しました。
また、GV.hをインクルード出来ていないということもありません。
何が原因でしょうか…
67ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(832,303ポイント)
Date: 2008/10/23(木) 01:06
No:22881
|
|
Title: Re:エラー:外部シンボル…は未解決です の解決法
|
|
そうですね〜・・ミスがなさそうなら、反映されていないと考えるしかなさそうです。
ビルド>リビルドしてみて、だめならVC++再起動してみてもう一度一からリビルドでコンパイルしなおしてみて下さい。
62ポイント を手に入れた。
|
|
|
|
|
Name: SH ..かけだし(2,016ポイント)
Date: 2008/10/23(木) 21:21
No:22940
| 解決!
|
Title: Re:エラー:外部シンボル…は未解決です の解決法
|
|
管理人様毎度ありがとうございます…
おかげさまで無事に解決することが出来ました。
42ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(118,026ポイント)
Date: 2008/10/21(火) 11:11
No:22750
|
|
Title: テトリスのスーパーローテーションの実装
|
|
テトリスのガイドラインにスーパーローテーションというのがあります。
回転できなかった際に、自動的に軸をズラして回転させる機能の事です。
ガイドラインには厳密なルールが無いようでして、完全にプログラマー任せになっている結構いい加減なガイドラインなんですね。(Tスピンもそんな感じだし…)
で、違和感を感じない程度のスーパーローテーションを実装しようと思ったのですが、私が考えついた方法は…
1:通常5×5マスで管理しているテトリミノの中心で回転させる。回転に失敗したら2へ…。
2:軸をズラして回転させる。この時の回転中心座標は5×5マスの範囲内で行なう。
3:軸をズラす場合の優先順位は、X軸は中心に近い順、Y軸は下方向を優先としつつ中心に近い順、X軸とY軸ではY軸を優先する。
というものなのですが、なんだかまわりくどい気がします。他の方法がありましたら、教えていただけないでしょうか?
323ポイント を手に入れた。
|
|
|
|
Name: 木霊 ..上級者(18,785ポイント)
Date: 2008/10/23(木) 18:26
No:22927
|
|
Title: Re:テトリスのスーパーローテーションの実装
|
|
未熟ながら少し考えてみました。
1.四角ブロック
■■
■■
回転しても形が変わらない = 回転処理自体必要ない = スーパーローテーションも必要ない
2.テトリス棒
■
○ ■○■■
■
■
「○」の部分を回転軸にして4×4で判定する
□■□□
■○■■
□■□□
□■□□
回転した時に赤い部分にだけ障害(外周・固定されたテトリミノ)があれば移動して回転、
テトリミノの部分に障害がないならその場で回転、それ以外なら回転しない(できない)
左側の赤い部分なら右に移動、右側のなら左に、下側のなら上にそれぞれ移動
3.Z字・逆Z
■
■○ ■○
■■ ■
3×3で判定
□■□
■○□
■■■
立っている状態で右方向に障害があるときだけSRの判定
□■△ △が外壁 □□△ □□□△
■■△ ←の状態から→になる時 ■■△ に一マス左に移動 ■■□△
■□△ □■△ □■■△
逆Zは左右を逆転
4.L字・逆L・凸型
■ ■■ ■■■
○■ ■○ ■○ ○■
■■ ■■■ ■
■ ■ ■
■○■ ○■ ■○■ ■○
■ ■ ■
3×3で判定
■■■ ■
■○■ ■○■
■■■ ■
判定方法はテトリス棒と一緒
・・・テトリミノ毎に判定するのでもっと回りくどくなってしまいました・・・
というか、見当違いなこと考えていたかも・・・
653ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(118,159ポイント)
Date: 2008/10/23(木) 18:45
No:22928
|
|
Title: Re:テトリスのスーパーローテーションの実装
|
|
逆L型、L型はこちらの方が回転が綺麗ではないでしょうか?
まぁ、好みの問題ではありますけど…(^_^;)
□■□ ■□□ □■■ □□□
□○□ ■○■ □○□ ■○■
■■□ □□□ □■□ □□■
それは、さておきまして、返信有難うございます(^-^)
木霊さんの考え方は、回転させてみて、回転できなかったら上下左右にズラしてみる方法ですね。
しかし、その方法だと、どこでやめるかの判定が難しくならないですか?(^_^;)
回転→失敗→移動→失敗→移動…
の永久ループになってしまわないでしょうか?
例えば、テトリミノ自体は最下段にあるのに、下方向に回転移動が叶わなかった場合、一気に最上段に移動してしまう…なんていう現象が起こるかもしれません。
でも、昔そういう仕様のテトリスもありましたから、それもありかな?(^_^;)
こういう明確な基準のないものを考えて、納得のいく答えを模索するのは、なかなか難しいですよね。
293ポイント を手に入れた。
|
|
|
|
|
Name: 木霊 ..上級者(19,120ポイント)
Date: 2008/10/23(木) 19:09
No:22931
|
|
Title: Re:テトリスのスーパーローテーションの実装
|
|
判定は一回だけでいいかなと思ってました。
自分の記憶では、ボタンを押しても回転しない場合があったような気がしたので・・・
(最後にプレイしたテトリスがゲームボーイ版です)
(仮想)回転→判定→通常の回転or移動して回転or回転不可
で回転不可以外なら仮想ミノを実際のものに反映
の流れで
通常の回転 →回転後の状態でどこも障害と重なっていない
移動して回転→回転後の状態で判定部分の外周部に障害がある場合(移動は一マスのみ)
回転不可 →上記以外の状態
>逆L型、L型はこちらの方が回転が綺麗ではないでしょうか?
確かに・・・一度思いつくと、自力ではなかなかその他の方法に気付かないですよね。
>こういう明確な基準のないものを考えて、納得のいく答えを模索するのは、なかなか難しいですよね
本当にそうですよね。
でもそれが楽しかったりw
335ポイント を手に入れた。
|
|
|
|
Name: 山崎 ..ぴよぴよ(243ポイント)
Date: 2008/10/23(木) 15:57
No:22918
|
|
Title: フォルダを作成したい
|
|
山崎と申します。C++でのフォルダの作成の方法についてお伺いしたく参りました。
OSはXP,エディタはVisualStudio2008を使っております。
OpenCVで画像処理を施し、その結果の画像を新たにフォルダを作ってそこに保存したいと考えております。
//FileNameには画像処理前の画像名、ImageはopenCvのIplImage型で画像処理後のデータが入っています
char SaveFileName[100];
sprintf(SaveFileName,"%s\\NewImage.jpg",FileName);
cvSaveImage(SaveFileName,Image);
このような感じで、cppファイルがある場所と同じ場所に、画像処理前の画像名と同じ名前のフォルダをつくりそこに
cvSaveImageで画像ファイルを保存しようとしたのですが、できませんでした。
どのようにすれば、新しく任意の場所にフォルダを作成できるのでしょうか。
皆様のお力におすがりしたいと思います。
243ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,369ポイント)
Date: 2008/10/23(木) 16:42
No:22919
|
|
Title: Re:フォルダを作成したい
|
|
フォルダを作成する一番簡単な方法は、mkdir を使用する方法です。
#include <stdio.h>
#include <stat.h>
int main( void ){
// "folder"というフォルダをカレントディレクトリ(通常実行したプログラムの場所)に作成
if(mkdir("folder") == 0){
// 成功
printf("フォルダの作成に成功しました。\n");
}
else{
// 失敗
printf("フォルダの作成に失敗しました。\n");
}
return 0;
}
VisualStudio2008 からのプログラム起動では、
デフォルトでは作成された実行ファイルのディレクトリ(DebugやReleaseフォルダ)ではなく、
プロジェクトフォルダ(cppファイルなどが置かれている場所)がカレントディレクトリになります。
(プロジェクトプロパティのデバッグカテゴリで起動時のカレントディレクトリを変更できます)
245ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..ぴよぴよ(412ポイント)
Date: 2008/10/23(木) 17:05
No:22922
|
|
Title: Re:フォルダを作成したい
|
|
御津凪さん、ご返信頂きまことにありがとうございます。
お教えしていただいたmkdirを使ってみたのですが、
include ファイルを開けません。'stat.h': No such file or directory
というエラーが出てしまいます。
mkdir関数をネットで検索したところ、<stat.h>を<sys\stat.h>としているコードが見られたので
真似して<stat.h>を<sys\stat.h>に直して再度試してみたところ、今度は
'mkdir': 識別子が見つかりませんでした
というエラーが出ます。
どうすればmkdirを使えるでしょうか。
何度も申し訳ございません。
169ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,491ポイント)
Date: 2008/10/23(木) 17:21
No:22924
|
|
Title: Re:フォルダを作成したい
|
|
MSDN で調べてみると、 VisualStudio では"mkdir"ではなく、"_mkdir"でした。
すみません。
インクルードも <direct.h> となっているようです。
(身近にあった処理系で探していたので、VS とは違っていました)
122ポイント を手に入れた。
|
|
|
|
|
Name: 山崎 ..ぴよぴよ(491ポイント)
Date: 2008/10/23(木) 17:32
No:22925
| 解決!
|
Title: Re:フォルダを作成したい
|
|
御津凪さん
<stat.h>を<direct.h>にし、_mkdir()を用いたところ、
みごとにフォルダを作成することができました。
本当にありがとうございました。
79ポイント を手に入れた。
|
|
|
|
Name: yasya ..かけだし(2,009ポイント)
Date: 2008/10/18(土) 21:33
No:22668
|
|
Title: 無題
|
|
質問なんですが、RPGとかの戦闘シーンでパーティーを組んで複数人で戦うやつあるじゃないですか。ああいうのを今作ってるんですけど、どうやったらいいかよく分かりません^^;
一応、最初に数値を定義しておいて、その数値の大きいほうから順にプログラムを実行して、最後まで実行したらループするみたいなの作ればいいんじゃないかと自分で考えてんですが、どうしていいかわからず行き詰ってしまいました・・・。
どうしたらいいか教えて下さい。
144ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,730ポイント)
Date: 2008/10/18(土) 22:25
No:22669
|
|
Title: Re:無題
|
|
なかなか回答の難しい内容ですが、
こういうときはなるべくきっちりとした関数を作るのが解決に繋がると思います。
キャラクタのデータを渡したらそれを戦闘制御するような関数を作ったとします。
seigyo(charcter0);
seigyo(charcter1);
seigyo(charcter2);
のようにキャラクタデータ渡せば同様に制御してくれるような関数があれば汎用的に使えるかもしれません。
とにかく関数を汎用的に使えるように作ることでしょうか。
まぁ当然の事ですよね・・;
今どのようなシステムかわかりませんが
私もRPGはいくつか作りましたがアクティブタイムバトルは何かと制御がややこしかったので、
最初は普通の簡単なルールのRPGから作ってはどうでしょう。
181ポイント を手に入れた。
|
|
|
|
|
Name: yasya ..かけだし(2,065ポイント)
Date: 2008/10/19(日) 18:14
No:22699
|
|
Title: Re:無題
|
|
管理人さん、回答ありがとうございます^^
まあ、できるところまでやってみます。
あと、ついでと言っては何ですが、もう一つ質問させて下さい。
複数の数値の大小を比べるにはどうしたらいいでしょうか?
56ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(829,113ポイント)
Date: 2008/10/19(日) 18:23
No:22700
|
|
Title: Re:無題
|
|
複数の値が無いと比較出来ないと思いますが、
3つ以上の場合で、ifなどの条件式の組み合わせだけじゃ比較が難しい場合ってことですかね?
ソートしたらいいんじゃないですか?
3つならソートしなくてもif,else使えば比較出来るでしょうが、4つ以上になると難しくなりますよね。
単純ソート、バブルソート辺りがソートのプログラムとしては簡単です。
この際アルゴリズムの勉強したいとお思いなら
ヒープソート、クイックソート、基数ソートなども勉強してみるといいですよ。
クイックソートについてはこちらのHPでクイックソート解説アプリを配布しているので、
もしよかったら見て下さい。
220ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(18,196ポイント)
Date: 2008/10/20(月) 14:17
No:22707
|
|
Title: 無題
|
|
度々すみません。Haruです。ファイルの更新日時を取得したいのですが、調べた結果完全に環境に依存するということはわかったのですが、「linux gcc」の環境でファイルの更新日時を取得できる、関数はありますか?
59ポイント を手に入れた。
|
|
|
|
Name: Haru ..上級者(18,250ポイント)
Date: 2008/10/20(月) 15:04
No:22709
|
|
Title: Re:無題
|
|
>statのst_mtimeじゃだめなの?
かなり、これで良いっぽいですm(__)m
いつもありがとうございます!!
54ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(18,728ポイント)
Date: 2008/10/23(木) 10:01
No:22897
|
|
Title: Re:無題
|
|
ファイルの更新日を取得する関数を、教えていただき、どちらのファイルが新しいかを判別する。という事は
stat(変数A,&st); stat(変数B,&st2);
if((st.st_mtime) >(st2.st_mtime))
のようにして出来るようになったのですが、
今度は先月か(または先々月)どうかを、判別する事をしたいのですが
、何か良い方法はあるでしょうか?(ツール起動時においての先月かどうか、という意味です)
#前々回に教えて頂いた、ファイル、ディレクトリの判別は
switch(buf.st_mode & S_IFMT)
{
case S_IFREG:
case S_IFDIR:
}
Mistさんに教えて頂いたとおりstatの、
このマクロで解決できました!!
328ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,624ポイント)
Date: 2008/10/23(木) 10:18
No:22898
|
|
Title: Re:無題
|
|
> 今度は先月か(または先々月)どうかを、判別する事をしたいのですが
判別する対象か明確じゃないですが、最終更新日時がというのであれば
st_mtimeにどんな値が入っているのかを理解していれば、特に難しくはないと思いますが。
ヒント
UNIXタイム
66ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,706ポイント)
Date: 2008/10/23(木) 10:27
No:22899
|
|
Title: Re:無題
|
|
> このマクロで解決できました!!
む、思ってたのとちょっと違うな(^^;
一応サンプル。
if ( S_ISREG(buf.st_mode) {
printf("普通のファイルです。\n");
} else if ( S_ISDIR(buf.st_mode) {
printf("ディレクトリです。\n");
} else {
printf("ファイルでもディレクトリでもありません。\n");
}
82ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(19,953ポイント)
Date: 2008/10/23(木) 10:29
No:22900
|
|
Title: Re:無題
|
|
9/30に更新したものを10/1に開いても先月と判定するということでしょうか
それならlocaltime( )関数でtime_t時間をtm構造体に変換してtm_monメンバー変数を比較すればいいでしょう
84ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(19,168ポイント)
Date: 2008/10/23(木) 14:15
No:22911
|
|
Title: Re:無題
|
|
>む、思ってたのとちょっと違うな(^^;
>一応サンプル。
ありがとうございます。
こっちの方がスッキリしてるので、こちらを使わせてもらうことにしました。
>判別する対象か明確じゃないですが、最終更新日時がというのであれば
>st_mtimeにどんな値が入っているのかを理解していれば、特に難しくはないと思いますが。
これを調べている間にtoyoさんのアドバイスに行き着いてしまいました(^^;
でも、これはこれで覚えておいて損はなさそうなので調べてみます!!
>9/30に更新したものを10/1に開いても先月と判定するということでしょうか
やっぱり、ここは気になりますよね(^^;
まぁ、ここまで、出来たならもし、30日後だというのであれば、
すぐそれに直せますから、さほど気にしなくても大丈夫ですかね!笑
>それならlocaltime( )関数でtime_t時間をtm構造体に変換してtm_monメンバー変数を比較すればいいでしょう
このようになりました!!
time(&buf.st_atime);
time(&timer);
nowmon = localtime(&timer); //システム起動時月
newmon = localtime(&buf.st_atime); //ファイル更新月
if(newmon->tm_mon+1 == nowmon->tm_mon)
440ポイント を手に入れた。
|
|
|
|
|
Name: Haru ..上級者(19,210ポイント)
Date: 2008/10/23(木) 14:18
No:22913
|
|
Title: Re:無題
|
|
間違ってenter押したら投稿されてしまった(^^;
Mistさんtoyoさん
ありがとうございました!!
42ポイント を手に入れた。
|
|
|
|
Name: でごいち ..ぴよぴよ(700ポイント)
Date: 2008/10/23(木) 11:39
No:22903
|
|
Title: OpenGL環境でCGを実装するプログラミング(2)
|
|
昨日、こちらの掲示板に初めて投稿させて頂いたでごいちと申します。
学校の課題の一環としてOpenGL環境の下でCG作品を自由に設計するプログラムを作成していると昨日の書き込みで話したかと思います。シェーディング(単に空間を照らすだけではいけない)については、先の投稿にあったtoyoさんのアドバイスを参考に作成しようと思ってますが、今回はテクスチャマッピングを実装する方法が思うように進みません。シェーディングと合わせて、どなたか専門知識をお持ちの方、どうかプログラム例などについてご指導宜しくお願い致します。プログラム例は、私の方で添付した既存のプログラムのどの辺にどのような関数を挿入すべきか、についてお願い致します。
なお、テクスチャマッピングでは壁紙などを設計することを理想としております。テクスチャマッピングをどの程度使用したかが採点の上で大きなポイントになるようです。勿論、壁以外のプログラムをアドバイスして下さっても構いません。
追伸:改めまして私のプログラミング環境について申しますと、OSはWindowsXPでコンパイラは「Borland C++(bcc32)」です。
378ポイント を手に入れた。
|
|
|
Name: まお ..ぴよぴよ(183ポイント)
Date: 2008/10/22(水) 22:48
No:22867
|
|
Title: 課題なんですが・・・
|
|
ネットワーク通信プログラム例のコネクション型のプログラムを改造し、任意のファイルをダウンロードできるように機能追加せよ。
クライアントプログラムをtcp_downloadc、サーバプログラムをtcp_downloadsとし、サーバプログラムを192.168.1.2で動作させているとする。
ダウンロードするファイル名をfile1とした場合
tcp_downloadc 192.168.1.2 file1
とすることでfile1の内容を見られるようにするプログラムを作成すること。
183ポイント を手に入れた。
|
|
|
|
Name: まお ..ぴよぴよ(205ポイント)
Date: 2008/10/22(水) 22:49
No:22868
|
|
Title: Re:課題なんですが・・・
|
|
もうひとつのファイルです
2倍のポイントを手に入れた! 22ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,558ポイント)
Date: 2008/10/23(木) 09:56
No:22896
|
|
Title: Re:課題なんですが・・・
|
|
規約により課題の丸投げは禁止されています。
規約に遵守した質問に変更されるか、2ちゃんの宿題スレへでも行ってください。
48ポイント を手に入れた。
|
|
|
|
Name: ポリヲ ..ぴよぴよ(0ポイント)
Date: 2008/10/20(月) 20:57
No:22715
|
|
Title: 音ゲー(太鼓の○人)について
|
|
現在DXライブラリで音ゲー(太鼓の〇人)を作成しているのですが、
メインとなる当たり判定、構造体を利用してのターゲットの出現で躓いています。
音楽に合わせて流すのでは無く、ランダムで良いのでターゲットを流す方法を教えて下さい。
今はfor文を利用し、x座標を減らして右から左に流している状態なのですが・・・・
|
|
|
|
Name: Justy ..ハッカー(244,749ポイント)
Date: 2008/10/20(月) 21:49
No:22716
|
|
Title: Re:音ゲー
|
|
>音楽に合わせて流すのでは無く、ランダムで良いのでターゲットを流す方法を教えて下さい。
>今はfor文を利用し、x座標を減らして右から左に流している状態なのですが・・・・
これはランダムな間隔で、ターゲットを発生させる方法を訊いているのでしょうか。
音に合わせなくていいのであれば、大体こんなかんじです。
// 判定のベースとなる間隔(ここでは20フレームに一回)
if((++counter % 20) == 0)
{
// 乱数で4回に1回発生する
if((rand() % 4) == 0)
{
// 発生
}
}
counterは毎フレーム加算していくカウンターです。
最初の if文は 20フレームに1回だけ真になります。
ここの if文では発生する最低の間隔を決めています(要はリズムです)。
次の if文は rand()を用いて4回に1回だけランダムに真になります。
ここで真になれば発生、として、左に流していけばターゲットはランダムに
発生することになります。
223ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,795ポイント)
Date: 2008/10/21(火) 02:27
No:22730
|
|
Title: Re:音ゲー
|
|
ちょっとサンプル作ってみるつもりが、作ってるうちに、
あれもつけないと、これもつけないと・・となってしまい、
作り初めて3時間・・サンプルと言えないようなコードになってしまいました^^;
こちらからダウンロードできるのでもしよかったら見て下さい。
基本的に龍神録の館と同じ考え方でやってます。
ダンレボでいう矢印にあたるあれなんて言うんでしょう・・。
太鼓のにっこりマーク?^^;
あれをシューティングでいう弾と同じ考えで制御しています。
実行ファイルも一緒に入れてあるので、遊んで見れるので、たいしたもんじゃないですが、
遊んでみて下さい。
赤い太鼓のマークはキーボード十時キーの「下キー」
青い太鼓のマークはキーボード十時キーの「左または右キー」
です。解凍したフォルダの「太鼓の鉄人.exe」を開いて下さい。
http://l.huu.cc/zip/taiko.zip
注:何故か30fpsになることがあります・・。30fpsと表示されたら再起動して下さい。
何か60fpsにならないバグがあるのだと思いますが、パッとみよくわからないので、また改めてみてみます;
太鼓の名人ってサイトがあるみたいなので、一応鉄人にしてみましたw
サンプルといえない長さですが・・解説してみます。
370ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(827,252ポイント)
Date: 2008/10/21(火) 02:51
No:22732
|
|
Title: Re:音ゲー
|
|
龍神録の館と同じ要領で作っています。
GV.hでは必要な変数の宣言をし、struct.hでは構造体の定義、define.hでは定義、
function.hでは関数のextern宣言をしています。
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
load();//データロード
ini();//初期化
while(ProcessLoop()==0){//メインループ
clear_se_flag();//効果音フラグを初期化
calc_ch();//入力に対する計算
bullet_main();//弾の計算メイン
kekka_main();//弾ヒット結果表示メイン
graph_main();//描画メイン
draw_fps(0,460);//FPS表示
play_se();//効果音
fps_wait();//fps制御
count++;
if(CheckStateKey(KEY_INPUT_ESCAPE)==1)break;//エスケープが入力されたらブレイク
ScreenFlip();//裏画面反映
}
DxLib_End();//DXライブラリ終了処理
return 0;
}
main.cppでは必要な関数を上のように呼んでいるだけですね。
bullet.cppでは弾についての制御をしています。
基本的に登録・計算・描画という流れになっていますから、
必要な時は登録出来る番号を探してきて、登録し、
常にそのデータを計算し、登録されているデータを描画するプログラムになっています。
これはエフェクト、ヒット結果表示、弾どれについても同じことがいえます。
serch_bullet()
で登録出来る番号を探してきて
input_bullet()
で弾を登録する
登録された弾は常に
calc_bullet()
で計算されており、描画は
graph_bullet()
で行われています。
ここで当たり判定について注意なのですが、単に当たり判定内にあるものを消したんじゃ、
2つも3つも同時に消える場合があるかもしれません。
入力が行われた時、その一番近くにある弾を消さないといけません。
もし同じ距離に2つあったら、左側にある弾を消すべきでしょう。
つまりヒットしたデータを作り、更にそれをソートしてやる必要があります。
ちょっと面倒だったので、サンプルでは一番ヒットの判定の中心に近い弾を消すようにしてあります。
また、単に現在いる弾の位置を基準にヒットしたかどうかは決められません。
□□□□□●□□□□□○
今この●の部分がヒットの判定基準位置だとしましょう。○が弾です。
□□□□□●□□□□□○
□□□□□●□□□□○□
□□□□□●□□□○□□
□□□□□●□□○□□□
□□□□□●□○□□□□
□□□□□●○□□□□□
□□□□□●□□□□□□
このように近づいている時はいいですが、弾がすごいはやさだと
□□□□□●□□□□□○
□□□□□●□○□□□□
□□□○□●□□□□□□
ってこともありえます。判定基準に入らずに通り過ぎる場合があるわけです。
この場合は軌跡を考慮する必要があるでしょう。
弾のスピードを逆算し、前回どこにいたかを計算し、
前回〜今回の範囲を基準範囲と比較する必要があるでしょう。
あと、音楽とコラボする演出は私も以前やりました。
しっかりしたFPS計算にくわえ、処理落ちした時に音楽ばかり先にいってしまわないよう、
音楽も制御する必要があります。
これには非公開関数を使う必要があるので、もしわからなければお聞き下さい。
なんかちょっとサンプル組んでみるだけのはずが長くなってしまいました^^;
1,543ポイント を落としてしまった。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(827,537ポイント)
Date: 2008/10/21(火) 06:40
No:22739
|
|
Title: Re:音ゲー
|
|
なんか中途半端で気になって寝れなかったので音楽と譜面を付けてみました^^;
プレイしたところこんな感じです↓。
プロジェクトと実行ファイルはこちら
http://l.huu.cc/zip/taiko2.zip
操作方法
赤弾:下キー
青弾:左か右キー
注意
何故か30FPSになることがあるので、その時は再起動を(汗
一応処理落ちしても音楽が60フレームごとに時間と同期するようになっています。
譜面はhumenフォルダに入っている0,1,2の羅列です。
1つが64分音譜だと思ってもらえると解り易いかと思います。
0が何も無い、1が赤、2が青を示しています。
このままじゃ「サンレンプ」が表現出来ないので、「3」を導入するなど何か工夫が必要そうです。
285ポイント を手に入れた。
|
|
|
|
|
Name: ポリヲ ..ぴよぴよ(156ポイント)
Date: 2008/10/23(木) 09:46
No:22894
|
|
Title: Re:音ゲー
|
|
> Justyさん
rand()の使い方が良くわからなかったので、参考になります。ありがとうございます
>管理人さん
素早い対応で、サンプルまで作っていただき助かります。
しかし、難しい内容ですね・・・・頑張って解析して、自分なりに組んでみようと思います。
まぁ、わからない所がかなり多いですが(^^;)
ありがとうございました。
156ポイント を手に入れた。
|
|
|
|
Name: 400828 ..ぴよぴよ(708ポイント)
Date: 2008/10/22(水) 20:25
No:22850
|
|
Title: 学校の宿題です
|
|
画面から入力した10この数の合計・平均を表示しなさい。ただし、合計・平均を求める処理は関数に定義しなさい。
#include <stdio.h>
int* calc(int*);
void main()
{
int w[10],result[2];
int i;
for(i=0;i<10;i++){
scanf("%d",&w[i]);
}
result=calc(w);xs
printf("合計:%d\n",result[0]);
printf("平均: %d\n",result[1]);
}
int* calc(int w[]){
int sum,avg,i,result[2];
sum=0;
for(i=0;i<10;i++){
sum = sum + w[i];
}
result[0]=sum;
result[1]=sum/10;
return result;
}
2倍のポイントを手に入れた! 510ポイント を手に入れた。
|
|
|
|
Name: 管理人 ..伝説なるハッカー(831,747ポイント)
Date: 2008/10/22(水) 20:47
No:22854
|
|
Title: Re:学校の宿題です
|
|
次からタグを使って字下げして下さいね。
詳しくは規約をご覧下さい。
アドレスを返したいのならポインタで受け取らないといけません。
int *p;
などを宣言し、pに入れてあげて下さい。
また、返しているのはローカル変数のアドレスで不適切です。
普通に配列を渡してやればいいのではないでしょうか?
以下にサンプルを書いておきます。この意味が理解できればこの課題も出来ると思います。
#include <stdio.h>
void calc(int result[2], int input_dat[10]){
result[0]=input_dat[0];
result[1]=input_dat[9];
}
int main(void){
int result[2],input_dat[10]={0,1,2,3,4,5,6,7,8,9};
calc(result,input_dat);
printf("%d,%d\n",result[0],result[1]);
return 0;
}
204ポイント を手に入れた。
|
|
|
|
Name: dic ..かけだし(1,108ポイント)
Date: 2008/10/22(水) 20:39
No:22853
|
|
Title: データ構造で決めかねてます
|
|
はじめまして現在シューティングを作成しようかと考えているのですが、
プログラムのデータ構造、つまり構造体をバリバリ使いまくるか
オブジェクト指向で汎用性を高くもたせるか迷ってます
構造体バリバリで書くと後のソースいじるときに大量のソースになり
保守するのが難しくなりやすいのと
オブジェクト指向で書くと汎用性を維持するためのコードで複雑になりやすく
これまた保守が難しくなりやすいかと考えています
どちらの手法で組んでいくか、また、別の手法があるかアドバイスいただけませんか?
2倍のポイントを手に入れた! 420ポイント を手に入れた。
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(26,035ポイント)
Date: 2008/10/22(水) 21:03
No:22856
|
|
Title: Re:データ構造で決めかねてます
|
|
私の場合、オブジェクト指向(C++)で書いていますが、
依存性の高い方法で書いています。
オブジェクト指向だからといって汎用性が必要というわけではないはず。
(作ったゲームシステム部分を他のゲームなどに流用するなら別ですが)
構造体バリバリでもオブジェクト指向でも、一番大事なのは命名規則です。
大雑把に変数名をつけるとなおさら管理が大変になります。
特に中規模以上のゲームにおいて重要で、
あれやこれやと変更ばかりしていると、
頭の中がこんがらがって、
「そぉい!」
と投げ出してしまいますのでご注意を。
どの言語にしても、曖昧な構想のままでプログラムを組むのはオススメしません。
何が言いたいのかというと、
「こういう構造だからこういう風にプログラムを組む」
と、自分に対してプログラム企画書を作ってみると良いかもしれませんよ、
ということです。
281ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(245,830ポイント)
Date: 2008/10/22(水) 21:13
No:22857
|
|
Title: Re:データ構造で決めかねてます
|
|
dicさんの意図を正しく読みとれているか自信はないのですが、
まずどちらでやっても、ゲームの規模に応じてソースコード量は増えます。
既存のライブラリやツールを使うことで多少は減らせるかもしれませんが
基本的にはこれは避けられません。
その上で、ゲームの規模以上に保守が困難になるほどコード量が多くなったり
複雑になるので有れば、どこかに無駄があるか、設計に問題があるのだと思います。
(他にも多数のソースの保守に慣れていない、製作の進め方に問題がある等の可能性もありますが・・・)
特に汎用性については、こだわりすぎるとそんな汎用性は実は必要はなかった、
なんてことも起こりうります。
なので、個人的にはオブジェクト指向的な方がいいと思いますど、
無理してまでやる必要はないですし、どっちでやっても結局保守が難しいと
思うので有れば、どっちでもいいような。
ちなみにそれぞれのケースで書いた場合、設計的にはどんな感じに
しようとしているのでしょうか?
332ポイント を手に入れた。
|
|
|
|
|
Name: dic ..かけだし(1,400ポイント)
Date: 2008/10/22(水) 21:30
No:22860
|
|
Title: Re:データ構造で決めかねてます
|
|
>御津凪さん
何個か作ったのですが、やはり「そぉい」と投げ出しました
やはり命名規則が必要なんですね
ありがとうございます
>Justyさん
構造体で書くと
typedef struct {
void (*function); // 動作用関数ポインタ
double x, y; // 座標
}t_Bullet;
オブジェクト指向で書くと
class CBase {
double x, y;
public:
virtual void Function(); // 動作関数の実装はサブクラスにまかせる
};
class CBullet : public CBase
{
public:
void Function();
};
のような感じですね
どっちでもいいので、どっちにしようかなぁ・・・と
292ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,256ポイント)
Date: 2008/10/22(水) 21:35
No:22861
|
|
Title: Re:データ構造で決めかねてます
|
|
汎用性という意味では、単にオブジェクト指向だけでなく、ジェネリックプログラミングも取り入れたほうがよいとは思いますが...
ソフトウェアを完成させることを最優先するのであれば、現在もっとも得意な手法を採用する方が得策です。
「生兵法は怪我のもの」というように、なまかじりの知識でだましだましやると、かえって効率が落ちます。
まあ、一般的なデータ構造であれば、標準C++ライブラリのコンテナなどを駆使した方が便利なことは確かです。
105ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(246,284ポイント)
Date: 2008/10/22(水) 22:55
No:22869
|
|
Title: Re:データ構造で決めかねてます
|
|
>どっちでもいいので、どっちにしようかなぁ・・・と
なるほど。
うーん、たかぎさんも仰っていますが、あんまり変わらないですね。
どちらでやっても、片方で起こる問題はもう片方でも起きる可能性は高そうです。
となると、どちらで書くのに慣れているか、で決めてしまってもいいかと思います。
慣れているならオブジェクト指向版で、そうでなければ構造体版で。
173ポイント を手に入れた。
|
|
|
|
|
Name: dic ..かけだし(1,436ポイント)
Date: 2008/10/23(木) 08:11
No:22891
| 解決!
|
Title: Re:データ構造で決めかねてます
|
|
なるほど
完成させるのが目的なので単純な構造体でいこうかと思います
ありがとうございました
36ポイント を手に入れた。
|
|
|
|
Name: 新米白米 ..ぴよぴよ(281ポイント)
Date: 2008/10/23(木) 01:01
No:22879
|
|
Title: アイコンが読み込めないエラーについて
|
|
OS:WindowsVista
コンパイラ:Borland C++ Compiler5.5
エディタ:BccDeveloper
で、本家DXライブラリに自作ソフトにオリジナルアイコンを付ける という項目があったので実装してみようと
しましたところ、
Error resource.rc 1 15: Invalid icon format
というエラーが出てしまったのですが、どのようにすれば正常にアイコンを実装させることができますか?
iconファイルは元々bmpファイルだったものをサイズ変更→縦横32 にして256色で保存(拡張子は.icoに変更)
しました。ファイル名はicon01.ico です
また、rcファイルのファイル名はresource.rcとし、内容として
MAINICON ICON "icon01.ico"
と書きました。
プロジェクトの設定でもちゃんとリソーススクリプト名を正しく設定したのですが、なぜかエラーが出てしまい
困っています。
どなたか解決方法わかる方いましたら お願いします。
281ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(246,581ポイント)
Date: 2008/10/23(木) 01:09
No:22882
|
|
Title: Re:アイコンが読み込めないエラーについて
|
|
>256色で保存(拡張子は.icoに変更)
これは、bmpファイルをただ単にリネームしただけなのでしょうか?
だとしたら、icoファイルは bmp形式ではないのでそれではうまくいきません。
ちゃんとアイコン変換ツールか何かを使って ico形式に変換してあげて下さい。
icon cube. /アイコン作成ソフト フリーソフト
ttp://iconcube.vis.ne.jp/f/s-m/
15ポイント を手に入れた。
|
|
|
|
|
Name: 新米白米 ..ぴよぴよ(340ポイント)
Date: 2008/10/23(木) 01:25
No:22883
| 解決!
|
Title: 解決しました!
|
|
拡張子だけ変えればいいのかと思ってましたが違うんですね。
おかげで解決できました!!
ありがとうございます!
59ポイント を手に入れた。
|
|
|
|
Name: 山口 ..ぴよぴよ(19ポイント)
Date: 2008/10/22(水) 23:38
No:22872
|
|
Title: 画面に対して回転する
|
|
3Dゲームを作ろうと思っています。
画面にはメッシュが描画されています。
キーボードの方向キーを押したらその方向に回転するということをかきたいのですが
2軸以上回転させるとおかしくなります。
理論はネットで見て理解しましたがよくわかりません。
ライブラリはオリジナルのものです。
19ポイント を手に入れた。
|
|
|
|
Name: Justy ..ハッカー(246,455ポイント)
Date: 2008/10/22(水) 23:43
No:22874
|
|
Title: Re:画面に対して回転する
|
|
何がどうおかしくなるのか、どういうコードを書いたのかわからないので、
推測ですが察するに行列の掛け合わせる順番がおかしいのではないでしょうか。
44ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,845ポイント)
Date: 2008/10/22(水) 16:09
No:22826
|
|
Title: 時間がないので早く回答お願いします
|
|
ScreenFlip関数はフルスクリーンだと表画面と裏画面を交換する処理を行いますがウインドウの時のように裏画面の内容を表画面にコピーするようにするにはどうしたらいいでしょうか?
53ポイント を手に入れた。
|
|
|
|
Name: toyo ..上級者(19,839ポイント)
Date: 2008/10/22(水) 16:47
No:22833
|
|
Title: Re:時間がないので早く回答お願いします
|
|
ScreenFlipはフルスクリーンでもウィンドウ表示でも同じ処理をしてると思います。
ところで締め切り時間は何時でしょうか
31ポイント を手に入れた。
|
|
|
|
|
Name: 通りすがり ..中級者(11,657ポイント)
Date: 2008/10/22(水) 16:59
No:22834
|
|
Title: Re:時間がないので早く回答お願いします
|
|
そのタイトルの付け方は印象悪いですよ。
私達に回答の義務は無いのに早く答えろと言っているように聞こえます。
答える気すらなくなって、得られたはずの回答も得られなくなる場合すらあるでしょうね。
質問の内容にきちんとしたタイトルをつけ、もしそれでも付け加えたいんなら
急いでいる旨を最後に付け加えるべきでしょう。
92ポイント を落としてしまった。
|
|
|
|
|
Name: Mist ..プログラマー(28,283ポイント)
Date: 2008/10/22(水) 19:12
No:22841
|
|
Title: Re:時間がないので早く回答お願いします
|
|
> ScreenFlipはフルスクリーンでもウィンドウ表示でも同じ処理をしてると思います。
違います。
フルスクリーン時は裏画面と表画面の入れ替え。
ウィンドウ時は裏画面を表画面にコピーです。(=ScreenCopy)
57ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,361ポイント)
Date: 2008/10/22(水) 19:18
No:22843
|
|
Title: Re:時間がないので早く回答お願いします
|
|
何の時間がないのか知りませんが...
これだけ回答がついても本人が現れないようですので、それほど急いでいないようです。
単に忙しくて時間がとれないというだけでしょうか? それなら外注にでも出してください。
83ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(2,117ポイント)
Date: 2008/10/22(水) 19:26
No:22844
|
|
Title: Re:時間がないので早く回答お願いします
|
|
すいませんあわてていたもので・・・
ScreenFlip関数はフルスクリーン時は裏画面と表画面の入れ替え、ウィンドウ時は裏画面を表画面にコピーしているのですが、今までウィンドウでやっていたのでそのことに気づかず、フルスクリーンで起動したらボタンを押すたびに表画面と裏画面が交互に出て目も当てられない状況に・・・
で具体的に何がしたいかと言うとフルスクリーンの時もウィンドウの時のように裏画面を表画面にコピーするように設定することはできないか?と言うことです。
ちなみに締め切りは明日23日の5時ごろだと思います。情報お願いします。
201ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,292ポイント)
Date: 2008/10/22(水) 19:33
No:22845
|
|
Title: Re:時間がないので早く回答お願いします
|
|
私の回答読みました?
ちなみに、ScreenCopyはFlipよりも重いので処理速度に注意してください。
9ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(25,754ポイント)
Date: 2008/10/22(水) 19:33
No:22846
|
|
Title: Re:時間がないので早く回答お願いします
|
|
裏画面をクリアしてから描画していますか?
クリアしないと、裏画面と表画面の入れ替えたとき、
そのまま裏画面に表示した画像が残っているので、このような症状が出ます。
画面を入れ替えるたびに裏画面を描画すると、解消されますよ。
(単純にクリアだけしてたら一瞬だけしか表示されませんので注意)
147ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(2,200ポイント)
Date: 2008/10/22(水) 19:49
No:22847
|
|
Title: Re:時間がないので早く回答お願いします
|
|
いやーウィンドウの時とフルスクリーンの時で処理が変わるとは知らなかったもので、ボタンが押された時だけ画像を描画&表画面へ反映するようにしたら効率いいかなーとか考えてたんですよね。よく考えたらその程度の変化なんかわからないですよねー、仕方が無いのでプログラムを組み直します。回答ありがとうございます。
83ポイント を手に入れた。
|
|
|
|
Name: でごいち ..ぴよぴよ(78ポイント)
Date: 2008/10/22(水) 10:42
No:22813
|
|
Title: OpenGL環境でCGを実装するプログラミング
|
|
学校の課題の一環として、OpenGL環境の基で自由にCGを設計するプログラムを作成しております。私は、過去の課題で作成したロケットのプログラムをさらに拡張し、シェーディングやテクスチャマッピングを設計するつもりでいます(勿論、ロケットの作成手順はある程度理解はしています)。テクスチャマッピングの方では壁(床は既に設計済み)を設計しようと思うのですが、それが思うように設計できません。また、シェーディングの設計(単に空間が光るだけではいけない)方法も思うように設計できません。どなたか専門知識をお持ちの方、プログラム例などのご指導を宜しくお願い致します。
参考までに、C言語の実行環境について説明します。OSはWindowsXPで、コンパイラは「Borland C++(bcc32)」です。C言語の知識としては、関数を用いてmainの中で呼び出すレベルのプログラムは何とかできます。構造体やポインタも、授業で扱ったプログラムを拡張したりするレベルのことは大丈夫です。
この掲示板は勿論のこと、CGのプログラムも初めての利用なのでどうかご指導のほど宜しくお願いいたします。
追:インクルードヘッダ"myShape.h"は、添付のWordファイル内に同時収録してあります。
78ポイント を手に入れた。
|
|
|
|
Name: toyo ..上級者(19,708ポイント)
Date: 2008/10/22(水) 12:12
No:22814
|
|
Title: Re:OpenGL環境でCGを実装するプログラミング
|
|
Word持ってないので普通のテキストファイル(zip可)でアップできませんか
29ポイント を落としてしまった。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(25,607ポイント)
Date: 2008/10/22(水) 12:33
No:22816
|
|
Title: Re:OpenGL環境でCGを実装するプログラミング
|
|
Word で見ても、特に *.doc 形式にする必要は無かったように思えます。
*.doc 形式にした理由というのはあるのでしょうか?
もしかしたら「ここをこうする」といったコメントをダイレクトに書いてもらいたかったと思うのですが、
toyo さんのように 読み込めない環境の方がいるので、
私も *.txt 形式(複数のファイルなら *.zip 形式)での添付を推薦します。
私はOpenGLを扱ったことが無いので、質問にはちょっと答えられませんが、
砲台を4つ作られている部分(弾やら足やら)を砲台を一つ設計する関数にして、
それを4回呼び出す形に直せば少しはすっきりして見やすくなるはずですよ。
209ポイント を手に入れた。
|
|
|
|
|
Name: でごいち ..ぴよぴよ(207ポイント)
Date: 2008/10/22(水) 15:08
No:22823
|
|
Title: Re:OpenGL環境でCGを実装するプログラミング
|
|
なるほど・・・・改めて、関連するファイルを1つに圧縮して再アップします。現在のロケットのCGにシェーディングの機能を追加したり(単に物体を照らすだけではいけない)、テクスチャマッピングで壁を実装する方法を、例えばこの関数とこの関数の間にこのようなプログラムを挿入すればよいなど、の形式でご指導お願い致します。
129ポイント を手に入れた。
|
|
|
|
|
Name: toyo ..上級者(19,808ポイント)
Date: 2008/10/22(水) 16:24
No:22827
|
|
Title: Re:OpenGL環境でCGを実装するプログラミング
|
|
>単に物体を照らすだけではいけない
というのは具体的にどういうものでしょうか
とりあえず上の円柱だけ単に照らしてみました
/* toyo add */
GLfloat red[] = { 1.0, 0.0, 0.0, 1.0 };
/* end */
/* 上側の円柱を設計 */
glPushMatrix();
glRotatef(theta, 0.0, 1.0, 0.0); /* ローカル座標系, 右回りに指定角度だけ回転:θ, x, y, z */
glTranslatef(0.0, dist + 1 + x, 0.0);
glColor3f(1.0, 1.0, 1.0);
/* toyo add */
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_DIFFUSE, red);
/* end */
mySolidCylinder(1.0, 2.0, 12);
/* toyo add */
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
/* end */
glPopMatrix();
*昔買ったOffice2000は持ってるんですが使う機会がないので今のパソコンにはインストールしてないんですよね
100ポイント を手に入れた。
|
|
|
|
|
Name: でごいち ..ぴよぴよ(322ポイント)
Date: 2008/10/22(水) 18:42
No:22838
|
|
Title: Re:OpenGL環境でCGを実装するプログラミング
|
|
toyoさん、大変ありがとうございました。参考にさせていただき、少しでも完成度の高い作品を作りたいということは言うまでもありませんが、1つだけお詫びがあります。先の投稿で、「物体を単純に光らせるというのはいけない」と記述しましたが、課題の実施要領を見直した所「空間を光らせるだけではいけない」と書かれていました。最初の投稿に訂正するとともに見間違いをお詫びします。
と言う訳で閲覧者の皆様、他に何か良い考えがあれば前述の内容を全て踏まえてご指導のほど宜しくお願い致します。
115ポイント を手に入れた。
|
|
|
|
Name: 匿名 ..かけだし(1,513ポイント)
Date: 2008/10/17(金) 15:46
No:22582
|
|
Title: atan2関数の利用
|
|
角度を求めるatan2関数ですが、ホーミングの所などのサンプルプログラムで、求めた角度を使ってX,Yの値をどう変化させているのかがわかりません。そもそもX,Yの値を変化させる処理がどこなのかも分かりません。そのあたりを分かりやすく教えてください。
72ポイント を落としてしまった。
|
|
|
|
Name: たいちう ..中級者(11,372ポイント)
Date: 2008/10/17(金) 16:23
No:22586
|
|
Title: Re:atan2関数の利用
|
|
void calc_cshot()という関数の中でやってますね。
//ショットの移動計算
void calc_cshot(){
...
if(cshot[i].knd==1)
calc_homing(i);
cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
...
}
139ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,535ポイント)
Date: 2008/10/20(月) 16:40
No:22710
|
|
Title: Re:atan2関数の利用
|
|
知りたいのは両方ですが、atan2の引数と戻り値、あと戻り値をXY座標に反映させているのはどの部分かです。
22ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..中級者(11,538ポイント)
Date: 2008/10/20(月) 17:33
No:22712
|
|
Title: Re:atan2関数の利用
|
|
> atan2の引数と戻り値、
void calc_homing(int k)
{
...
cshot[k].angle=atan2(y,x);
...
}
> あと戻り値をXY座標に反映させているのはどの部分かです。
void calc_cshot(){
...
cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
...
}
42ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,629ポイント)
Date: 2008/10/21(火) 16:24
No:22766
|
|
Title: Re:atan2関数の利用
|
|
すいません読解力がなくて・・・
cshot[k].angle=atan2(y,x);
これのx,yは何の座標でしょうか?
あとcshot[k].angleに戻り値が入るのはわかりますが
atan2の戻り値は何ですか?x,yに対するcosですか?
94ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..中級者(12,154ポイント)
Date: 2008/10/21(火) 17:13
No:22770
|
|
Title: Re:atan2関数の利用
|
|
> atan2の戻り値は何ですか?x,yに対するcosですか?
三角関数を理解しましょう。
y = f(x)というスタイルで書きます。
y = tan(x)という関数があります。
tan(x)の逆関数がatan(x)。
y = tan(x)ならば、x = atan(y)となります。
戻り値は角度(単位はラジアン)
y = tan(x)が、角度から傾きを求める関数なので、
y = atan(x)は、傾きから角度を求めるための関数です。
y = tan(x)のグラフを思い浮かべてもらえば(or 探してもらえば)分かりますが、
このグラフは連続でなく、その逆関数であるy = atan(x)も連続ではないので、
傾きから角度を求めるには場合分けが必要です。
# ここまでの説明のxとyは、関数の引数と値を表していました。
# 以降のxとyは、二次元座標系でのx座標とy座標、x成分とy成分、等を表します。
場合分けをしないですむ便利な関数がz = atan2(y, x)です。
傾きが(yの増加分) / (xの増加分)であることから、(yの増加分)と(xの増加分)を
引数として渡せば、その角度を返してくれる関数です。
259ポイント を手に入れた。
|
|
|
|
|
Name: 匿名 ..かけだし(1,776ポイント)
Date: 2008/10/21(火) 19:40
No:22783
|
|
Title: Re:atan2関数の利用
|
|
よくわかりました
ところで
cshot[i].x+=cos(cshot[i].angle)*cshot[i].spd;
cshot[i].y+=sin(cshot[i].angle)*cshot[i].spd;
の部分ですが
これってどこが関数なのか変数名かよくわかりにくいですね
一体どんな処理が行われているのでしょうか?
cshot[i].x+=は
X座標=X座標+
cshot[i].angleは角度ですよね
では
cos()*とcshot[i].spd;の部分はどういう意味でしょうか?
147ポイント を手に入れた。
|
|
|
|
|
Name: たいちう ..中級者(12,308ポイント)
Date: 2008/10/22(水) 09:36
No:22811
|
|
Title: Re:atan2関数の利用
|
|
中心が原点、半径rの円の座標は次の式で表せます。
x = r * cos(θ)
y = r * sin(θ)
(0 <= θ <= 2 * π)
上式のrに該当する部分が、cshot[i].spd。
θがcshot[i].angleです。
上式は静止した座標を扱っています。
速度の概念を次の式であらわせられます。
新しい座標 = 元の座標 + 微小時間 * 速度
HPの説明を読んでいませんが、きっと微小時間(単位時間?) * 速度が
spdに代入されていると考えてよいでしょう。
これらの式を組み合わせると、件の式になるわけです。
154ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(830,470ポイント)
Date: 2008/10/22(水) 15:06
No:22822
|
|
Title: Re:atan2関数の利用
|
|
>これってどこが関数なのか変数名かよくわかりにくいですね
関数はcos,sinで引数は括弧で始まって括弧で終わっている部分までです。
みにくかったらスペースを空けるなどしてみるといいかもしれません。
コサインやサインにスピードをかけたものを足しているだけです。
単位円ってご存知でしょうか?
黒い矢印の長さはいつも1ですよね。
sinもcosもx,yの値は-1〜1の値を移動し、矢印の長さは1です。
これを移動量として使用するなら、現在弾のスピードが1なのですから、
たまに設定したスピードである.spdをかければそのスピードになります。
移動計算はx,yにわけて行う必要があります。
角度に対してx成分が求まるのはcosですよね。
斜辺を底辺でわったものですから。
今45度に弾がむいているとすると、大きさ1に対してxの移動量は0.7位のはずですよね。
スピードが3ならこの0.7に3をかければxの移動量も3倍になります。
yも同様に計算します。
高校1年位の教科書に載っていると思うので、もし匿名さんがこの年齢以上でしたら
一度おさらいしてみてはどうでしょうか。
(昔とかわっていたら、高1じゃないかもしれません)
385ポイント を手に入れた。
|
|
|
|
Name: 初心者 ..初心者(8,468ポイント)
Date: 2008/10/21(火) 01:57
No:22727
|
|
Title: 検索結果件数
|
|
Yahooを用いて検索語を入力した場合に検索結果の件数のみを表示させるプログラムを作りたいのですが何をどうすれば良いのか全く分かりません。どうにか教えて頂けないでしょうか。よろしくお願いします。
81ポイント を落としてしまった。
|
|
|
|
Name: 初心者 ..初心者(8,792ポイント)
Date: 2008/10/22(水) 00:22
No:22799
|
|
Title: Re:検索結果件数
|
|
ありがとうございます。YahooのAPIについて調べ
#!/usr/bin/perl
use LWP::Simple;
my $key = '検索文字列'; # UTF-8
$key =~ s/([^0-9A-Za-z_ ])/'%'.unpack('H2',$1)/ge;
my ($hit) = ($c ="http://api.search.yahoo.com/WebSearchService/V1/webSearch/totalResultsAvailable="(\d+)"/);
を作ってみたのですがこれでよろしいのでしょうか?
明日までに作成しなければならないのですがどなたか教えて頂けないでしょうか?
188ポイント を落としてしまった。
|
|
|
|
|
Name: YuO ..上級者(24,929ポイント)
Date: 2008/10/22(水) 12:24
No:22815
|
|
Title: Re:検索結果件数
|
|
Perlはわからないのですが,間違っていることは断言出来ます。
実際に実行してみればわかることでしょうけれど……。
まずは,サンプルリクエストURLをそのまま投げて,レスポンスを取得するところから始めてください。
リクエストが成功していればそのレスポンスはXMLなので,XML解析エンジンに結果を放り込んでXPath : /ResultSet/@totalResultsAvailableを取得します。
# 先頭の/を忘れていました
それで,検索結果の件数が取得出来ます。
現時点だと,384000000になりました。
次に,アプリケーションIDを取得して,YahooDemoの部分を取得したIDに変更します。
再度流して実際の検索結果 (沖縄) と比べます。
# 実際の検索結果では383000000だったので,実際には若干の誤差がある模様。
最後に,query部分を可変にすればできあがりです。
276ポイント を手に入れた。
|
|
|
|
Name: たつみ ..かけだし(1,018ポイント)
Date: 2008/10/21(火) 16:53
No:22768
|
|
Title: 多量の画像の読み込み
|
|
初めて投稿させてもらいます.
今,画像処理のプログラムを作成しています.
パターンマッチングを用いて,
入力画像が,大量のパターン画像のどれに一番似ているかを相関係数を出して選びます.
そこでわからないこととして,画像を読み取るさいに,以下のようにすると思われるのですが,
unsigned char** data = LoadImage("result.bmp", XSIZE, YSIZE);
これでは,result.bmpのようにいちいち画像の名前を入れなければなりません.
大量に画像があるため,そのようなことはしたくないのですが,何かいい方法はないでしょうか?
C言語は基礎を教科書を使って一通り勉強したぐらいで,まだまだ初心者です.
使っているものは,C言語,VisualC++.OpenCVです.
以上,よろしくお願いします.
208ポイント を手に入れた。
|
|
|
|
Name: GPGA ..熟練のプログラマー(52,179ポイント)
Date: 2008/10/21(火) 17:15
No:22771
|
|
Title: Re:多量の画像の読み込み
|
|
思いつく限りで、2通りあります。
一つ目は、あるフォルダの中に、入力画像と大量パターン画像を入れておき
入力画像ファイル名はinput.bmpなど固定の名前としておきます。
アプリケーション側は、上記のフォルダを指定すると
内部にあるinput.bmpとそれ以外の画像ファイルを比較するようにします。
二つ目は、パスを記述するテキストファイルを用意し、その中に各画像ファイルのパスを記述します。
例えば、list.txtというテキストファイル内に
IN=input.bmp
PAT=pattern0.bmp
PAT=pattern1.bmp
PAT=・・・
と記述しておき、アプリケーション側に、list.txtのパスを指定すると
テキストファイルを解析して、画像を読み込み、比較をおこなうようにします。
204ポイント を手に入れた。
|
|
|
|
|
Name: たつみ ..かけだし(1,110ポイント)
Date: 2008/10/21(火) 17:35
No:22775
|
|
Title: Re:多量の画像の読み込み
|
|
GPGAさん,ありがとうございます.
具体的にどのようにすればいいのでしょうか.
今のプログラムは,画像2つを比較し,その相関係数を出すようにしています.
ですので,パターン画像を次々と入れ替えて読み込みたいのです.
92ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ぴよぴよ(403ポイント)
Date: 2008/10/21(火) 17:54
No:22776
|
|
Title: Re:多量の画像の読み込み
|
|
WIN32API関数
FindFirstFile()
を使えばいいかと
23ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,317ポイント)
Date: 2008/10/21(火) 18:22
No:22778
|
|
Title: Re:多量の画像の読み込み
|
|
私なら、ファイル名の後ろに一連番号をつけますけど。
VisualC++は使ったことがないので、Cですけど。
#include<stdio.h>
#include <string.h>
int main(void)
{
char str[100];
int i;
for(i=0;i<10;i++){
sprintf(str,"pattern%d.bmp",i);
puts(str); //LoadImageの代わりね
}
return 0;
}
171ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(52,651ポイント)
Date: 2008/10/21(火) 19:39
No:22781
|
|
Title: Re:多量の画像の読み込み
|
|
>具体的にどのようにすればいいのでしょうか.
具体的に書いたつもりだったんですが、何がわからないのでしょうか?
>パターン画像を次々と入れ替えて読み込みたいのです.
というのは、以下のようなことをやりたいわけですよね?
/*!
* @brief 相関係数を求める関数
*
* @param inFile 入力ファイルのパス
* @param patFile パターンファイルのパス
*
* @return 相関係数を返す。
*/
double CorrelationCoefficient(const char* inFile, const char* patFile);
int main() {
cosnt char* inFile = "input.bmp"; // 入力ファイル
const char* patFile[3] = { // 大量のパターンファイル
"pattern0.bmp",
"pattern1.bmp",
"pattern2.bmp",
}
int i;
// パターン画像を次々と入れ替えて読み込む
for (i = 0; i < 3; ++i) {
CorrelationCoefficient(inFile, patFile[i]);
}
}
それで、main関数内部で定義しているinFile変数とpatFile配列変数の中身を
いちいち入力するのではなく、一括で取得したいとのことなので
No:22771の案を出したわけです。
472ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ぴよぴよ(623ポイント)
Date: 2008/10/21(火) 19:52
No:22785
|
|
Title: Re:多量の画像の読み込み
|
|
unsigned char** data = LoadImage("result1.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result2.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result3.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result4.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result5.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result6.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result7.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result8.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result9.bmp", XSIZE, YSIZE);
unsigned char** data = LoadImage("result10.bmp", XSIZE, YSIZE);
のように単なる数字の羅列になるだけだから
これをひとまとめにできないか?
ということでしょうか?
220ポイント を手に入れた。
|
|
|
|
|
Name: たつみ ..かけだし(1,422ポイント)
Date: 2008/10/22(水) 01:41
No:22806
| 解決!
|
Title: Re:多量の画像の読み込み
|
|
みなさん,お答ありがとうございます.
dicさん
FindFirstFile()は調べたのですが,少し難しそうだったので,別の方法を取りました.
>単なる数字の羅列になるだけだから
これをひとまとめにできないか?
まったくその通りです.
GPGAさん
その方法を試してみたのですが,
リストから画像名を配列に入れる方法を調べ,行ったのですが,
エラーが起こってしまいました.(私のやり方が悪いだけだと思うのですが)
そこで,nonさんの方法を用いたところ,なんとか望みのプログラムを作ることができました.
みなさん,どうも有難うございました.
2倍のポイントを手に入れた! 312ポイント を手に入れた。
|
|
|
|
Name: 大工 ..プログラマー(31,300ポイント)
Date: 2008/10/21(火) 06:13
No:22738
|
|
Title: C++ mapに関する質問
|
|
Map_Class では private で定義した s に map のキーを入力しそれと一致するものがあれば値を 100 に
するクラスです.問題は second 関数で実際に値を変えるのですが,関数自体を const で定義しているので
ポインタから p->second = 100; という様な操作ができません.リファレンスをみてもアドレスを渡して
該当するキーの値を変えるという関数がありませんでした.
新しく関数を作ることなく(出来ればですが・・・・^^;)該当するキーの値を変更したいのですが
可能でしょうか?
#include<iostream>
#include<string>
#include<map>
class Map_Class {
private:
std::string s;
public:
void second(std::map<std::string, int>&) const;
const std::string& string_first() const {return s;}
Map_Class(std::string ms) : s(ms) {}
};
void Map_Class::second(std::map<std::string, int>& m) const {
std::map<std::string, int>::const_iterator it;
if ((it=m.find(string_first()))!=m.end()) {
//second の値を変えたい.
}
}
int main(void) {
std::map<std::string, int> maps;
std::string ss = "bb";
Map_Class mc(ss);
std::map<std::string, int>::iterator it = maps.begin();
maps.insert(std::map<std::string, int>::value_type("aa", 10));
maps.insert(std::map<std::string, int>::value_type("bb", 20));
maps.insert(std::map<std::string, int>::value_type("cc", 30));
//maps.insert(std::map<std::string, int>::value_type("aa", 30));
//ここで第一引数を"aa"とすると
//aa:10
//bb:20
//と表示された.
// 変化前
while(it != maps.end()) {
std::cout << (*it).first << ":" << (*it).second << std::endl;
++it;
}
mc.second(maps);
// 変化後
while(it != maps.end()) {
std::cout << (*it).first << ":" << (*it).second << std::endl;
++it;
}
return 0;
}
あと,付け足しなのですが insert 関数を使ってる3行目をコメントアウトしているようにしたら "aa" の値は
変わることなく2つしか表示されませんでした.これはどういう仕様なのでしょうか?
117ポイント を手に入れた。
|
|
|
|
Name: dic ..ぴよぴよ(11ポイント)
Date: 2008/10/21(火) 09:13
No:22740
|
|
Title: Re:C++ mapに関する質問
|
|
std::map<std::string, int>::const_iterator it;
の行を
std::map<std::string, int>::iterator it;
に変えれば可能かと
というか C/C++ でしかも STL の話になるのですがね
11ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,341ポイント)
Date: 2008/10/21(火) 09:23
No:22741
|
|
Title: Re:C++ mapに関する質問
|
|
関数がconstantなのでイテレータはconstantである必要があると思います.
PCがない環境なので絶対という話ではありませんが…
41ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ぴよぴよ(266ポイント)
Date: 2008/10/21(火) 10:00
No:22743
|
|
Title: Re:C++ mapに関する質問
|
|
よくわかりませんが
// 変化前
it = maps.begin();
while(it != maps.end()) {
// 変化後
it = maps.begin();
while(it != maps.end()) {
のように it = maps.begin(); の入れる位置が間違っているかと
それで表示さるるとしたら
お使いのコンパイラは何でしょうか?
それとmapは重複する値の格納を許可しておりません
maps.insert(std::map<std::string, int>::value_type("aa", 10));
maps.insert(std::map<std::string, int>::value_type("aa", 20));
としても2番目はエラーが返ってきます
255ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,239ポイント)
Date: 2008/10/21(火) 10:58
No:22747
|
|
Title: Re:C++ mapに関する質問
|
|
たかぎさん>
なるほど・・・てっきり下のように定義したら書き換えはいかなることでも不可能だとおもってました。
void Map_Class::second(std::map<std::string, int>& m) const
関数の後に const をつけるとなにが const になるのでしょうか?
102ポイント を落としてしまった。
|
|
|
|
|
Name: 大工 ..プログラマー(31,347ポイント)
Date: 2008/10/21(火) 11:02
No:22748
|
|
Title: Re:C++ mapに関する質問
|
|
dicさん>
it の入力値はプログラムミスです><。
開発環境はLinuxです。
なにはともあれ、mapは重複した入力は受け付けないのですね?
上書きする場合はoperator[]を利用するしかないのでしょうか?
108ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,003ポイント)
Date: 2008/10/21(火) 11:16
No:22752
|
|
Title: Re:C++ mapに関する質問
|
|
> 関数の後に const をつけるとなにが const になるのでしょうか?
そのメンバ関数を呼出す際に指定したオブジェクトがconstになります。
具体的には、
struct A
{
void func() const;
};
A a;
a.func();
とすれば、funcメンバ関数の中では、thisの型がconst A*になります。
106ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,479ポイント)
Date: 2008/10/21(火) 12:21
No:22753
|
|
Title: Re:C++ mapに関する質問
|
|
なるほど
では,そのようにconstantをつけるとメンバー変数の値を参照するしか出来ないということでしょうか?さらにメンバー関数もconstantが必要?
私の質問の場合,引数の話なのでイテレータにconstantは必要ないということなのですね…?(多分…
同様にグローバルで定義してる関数はconstantは不必要…?
132ポイント を手に入れた。
|
|
|
|
|
Name: GPGA ..熟練のプログラマー(51,975ポイント)
Date: 2008/10/21(火) 12:35
No:22754
|
|
Title: Re:C++ mapに関する質問
|
|
メンバ関数にconstを付けた場合、その関数内では、mutable修飾子を付けていない全てのメンバ変数がconstになるということです。
>同様にグローバルで定義してる関数はconstantは不必要…?
const付きグローバルの関数は、宣言した時点でエラーとなります。
78ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,147ポイント)
Date: 2008/10/21(火) 12:39
No:22755
|
|
Title: Re:C++ mapに関する質問
|
|
> では,そのようにconstantをつけるとメンバー変数の値を参照するしか出来ないということでしょうか?
原則としてはそうです。
ただし、mutable指定子を付けた場合が例外です。
また、メンバ変数がポインタの場合、ポインタ自体はconstになりますが、その参照先まではconstにならないので要注意です。
> さらにメンバー関数もconstantが必要?
これは意味がよく分かりませんでした。
> 私の質問の場合,引数の話なのでイテレータにconstantは必要ないということなのですね…?(多分…
今回は、引数が std::map<std::string, int>& m だったからです。
const std::map<std::string, int>& m であれば、当然話が違ってきます。
> 同様にグローバルで定義してる関数はconstantは不必要…?
非メンバ関数や静的メンバ関数の場合、関数頭部の後ろにconstを付けることはできません。
144ポイント を手に入れた。
|
|
|
|
|
Name: dic ..ぴよぴよ(380ポイント)
Date: 2008/10/21(火) 14:21
No:22759
|
|
Title: Re:C++ mapに関する質問
|
|
mapは重複したキーを認めていないので
multimapならば重複したキーを認めているのでmultimapを利用されてはいかがでしょうか?
一人で開発、保守、運用されるならば operator[] のオーバーロードもいいでしょうが
あまりお勧めしないです
114ポイント を手に入れた。
|
|
|
|
|
Name: 大工 ..プログラマー(31,546ポイント)
Date: 2008/10/21(火) 15:35
No:22764
|
|
Title: Re:C++ mapに関する質問
|
|
たかぎさん>
>さらにメンバー関数もconstantが必要?
これはconstantを付けた関数の中でまた,違うメンバー関数を呼び出すときはその関数も constant が必要?という意味です.
67ポイント を手に入れた。
|
|
|
|
|
Name: たかぎ [URL] ..熟練のプログラマー(65,198ポイント)
Date: 2008/10/21(火) 16:07
No:22765
|
|
Title: Re:C++ mapに関する質問
|
|
> >さらにメンバー関数もconstantが必要?
> これはconstantを付けた関数の中でまた,違うメンバー関数を呼び出すときはその関数も constant が必要?という意味です.
const付きのメンバ関数からは、const付きのメンバ関数しか呼出すことができません。
thisをconst_castすることで強引にconstを外した上で、const無しのメンバ関数を呼出すことはできますが、原則としてお勧めできません。
48ポイント を手に入れた。
|
|
|
|
Name: もげ ..ぴよぴよ(410ポイント)
Date: 2008/10/17(金) 14:13
No:22561
|
|
Title: 重複しない乱数の作成
|
|
質問です。
乱数の発生について質問ですが、重複しない乱数の発生は成功したのですが、重複せずに乱数を取得するプログラムができません。
ちなみに、メイン文には書かずに、プロトタイプ宣言をして重複しない乱数を発生させる関数を作っています。
乱数系列は
srand((unsigned) time(&t));
を使っています。
/*乱数発生関数。整数Nを受け取り0から(N-1)までの整数をランダムに返す*/
int rando(int num,int i){
int ret;
int j=0;
int r[num];
for(;;){
ret = rand();
ret = ret % num;
if(num<i)break;
r[i] = ret;
int c=0;
for(j=0;j<=i;j++)if(r[j]==ret)c++;
if(c==1)break;
}
return ret;
}
メイン文の発生箇所ですが一部をのけてみます。
for (i=0;i<item_MAX;i++){
weight[i] = rando(item_weight_MAX,i);
}
自分で作ったのですが失敗しております。
新規で何かいい案があればよろしくお願い致します。
また、付け加える要素があればよろしくお願いいます。
410ポイント を手に入れた。
|
|
|
|
Name: バグ ..ハッカー(115,307ポイント)
Date: 2008/10/17(金) 14:21
No:22564
|
|
Title: Re:重複しない乱数の作成
|
|
すみません、質問の意味がよく分かりません。
重複しない乱数の取得というのは、例えば、関数を10回実行したら0〜9までの数値が重複なくランダムな順番で収納されるという意味ですか?
4ポイント を落としてしまった。
|
|
|
|
|
Name: もげ ..ぴよぴよ(532ポイント)
Date: 2008/10/17(金) 14:27
No:22567
|
|
Title: Re:重複しない乱数の作成
|
|
メイン文のとこでNという数を定義でき、0〜Nまでの数値をが重複なくランダムな順番で収納されるという意味です。
質問の意味が分かりにくく、申し訳ありませんでした。
よろしくお願い致します。
2倍のポイントを手に入れた! 122ポイント を手に入れた。
|
|
|
|
|
Name: Mist ..プログラマー(28,107ポイント)
Date: 2008/10/17(金) 14:31
No:22568
|
|
Title: Re:重複しない乱数の作成
|
|
私だったら、N回乱数生成関数をコールするのではなく、N個分の配列を渡してセットしてもらうようにします。
そうすれば、関数内で重複チェックできます。
74ポイント を手に入れた。
|
|
|
|
|
Name: 御津凪 [URL] ..プログラマー(25,303ポイント)
Date: 2008/10/17(金) 14:39
No:22570
|
|
Title: Re:重複しない乱数の作成
|
|
こういうことでしょうか。
void shuffle( int* ary, int n ){
int i,j,k;
for(i = 0;i < n;++i) ary[i] = i;
for(i = 0;i < n-1;++i){
j = i + (rand() % (n - i));
k = ary[j];
ary[j] = ary[i];
ary[i] = k;
}
}
与えられた配列 ary に、0 〜 n までの数値を(重複なく)ランダムにセットする関数です。
中でやっていることの意味は、自分で読み解いてみてください。
そのほうが、自分の力になります。
128ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..ぴよぴよ(583ポイント)
Date: 2008/10/17(金) 14:39
No:22571
|
|
Title: Re:重複しない乱数の作成
|
|
具体に的にはどのように書くのでしょうか?
数時間考えたのですが、うまくいかなくて困っています。(泣)
お忙しくなければ、助言を頂けないでしょうか?
51ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..ぴよぴよ(655ポイント)
Date: 2008/10/17(金) 14:42
No:22572
|
|
Title: Re:重複しない乱数の作成
|
|
御津凪さんありがとうございます。
実際にためにて、プログラムをうっていこうと思います。
>中でやっていることの意味は、自分で読み解いてみてください。
もちろん、自分の力で読み解いてみようと思います。
お忙しいのに、ありがとうございました。
72ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,466ポイント)
Date: 2008/10/17(金) 14:46
No:22573
|
|
Title: Re:重複しない乱数の作成
|
|
無駄なループを極力なくすなら、こんな感じ?
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 10
void shuffle(int* buf, int size);
int main(void)
{
srand((unsigned)time(NULL));
int data[N];
shuffle(data, N);
for (int i = 0; i < N; ++i)
{
printf("%d\n", data[i]);
}
return 0;
}
void shuffle(int* data, int size)
{
// 初期化
for (int i = 0; i < N; ++i)
{
*(data + i) = i;
}
// シャッフル
for (int i = 0; i < N - 1; ++i)
{
int id = rand() % (N - 1);
int swap = *(data + id);
*(data + id) = *(data + N - 1);
*(data + N - 1) = swap;
}
}
159ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,689ポイント)
Date: 2008/10/17(金) 14:48
No:22574
|
|
Title: Re:重複しない乱数の作成
|
|
ごめん、shuffle関数の第2引数を使ってなかった…OTL
そんな訳で、修正版…
このアルゴリズム、なんか名前があったはずなんだけど、忘れてしまいましたわ…(^_^;)
void shuffle(int* data, int size)
{
// 初期化
for (int i = 0; i < size; ++i)
{
*(data + i) = i;
}
// シャッフル
for (int i = 0; i < size - 1; ++i)
{
int id = rand() % (size - 1);
int swap = *(data + id);
*(data + id) = *(data + size - 1);
*(data + size - 1) = swap;
}
}
223ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..ぴよぴよ(751ポイント)
Date: 2008/10/17(金) 14:53
No:22575
|
|
Title: Re:重複しない乱数の作成
|
|
バグさんご親切にありがとうございます。
お二方の教えていただいた内容を十分に活用していきたいと思います。
今から実際にいろいろ打ってみますが、うまく成功しなかったらよろしくお願い致します。
現在、遺伝的アルゴリズムを勉強中なのですが難しいです><
96ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..ぴよぴよ(831ポイント)
Date: 2008/10/17(金) 14:55
No:22576
|
|
Title: Re:重複しない乱数の作成
|
|
ちなみにソースプログラムのせておきますが、参考にさせていただいたプログラムをいじったかたちです。
うまく、乱数が重複しない形を作成できればいいのですが^^;
80ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..ぴよぴよ(949ポイント)
Date: 2008/10/17(金) 15:30
No:22578
|
|
Title: Re:重複しない乱数の作成
|
|
実際に教えていただいた感じで関数を作成いたしましたが、うまくできませんでした。
上に添付したプログラムにあうように作成するにはどうすればいいのでしょうか?
正直、お手上げで迷ってます;;
お忙しいとは思いますが、何かとよろしくお願い致します。
平均計算用の関数は未完成なので気にしないでください。
118ポイント を手に入れた。
|
|
|
|
|
Name: やそ ..比類無きプログラマー(84,846ポイント)
Date: 2008/10/17(金) 15:33
No:22579
|
|
Title: Re:重複しない乱数の作成
|
|
>うまく、乱数が重複しない形を作成できればいいのですが^^;
さて実行した結果はどうだったのでしょう?
rando(・・・)内で定義した配列は上手く機能していたでしょうか?
返り(戻り)値retは重複せずに済みましたか?
rando(・・・)をみてもバグさんや御津凪さんが提示してくれたロジックを参考にしているようにはあまり見えなかったのは私だけ??
あのロジックって以前、トランプのシャッフルの方法のトピックで出ていたシャッフルのロジックですね^^
(まあ、どこでもありがちとも言いますが^^;)
211ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,080ポイント)
Date: 2008/10/17(金) 15:44
No:22581
|
|
Title: Re:重複しない乱数の作成
|
|
>rando(・・・)をみてもバグさんや御津凪さんが提示してくれたロジックを参考にしているようにはあまり見えなかったのは私だけ??
添付したのは、参考にする前のものなので^^;
VMで仮想Linuxでやってるので、LinuxからWindouwsにコピーができないのです;;
ひとまず、掲示してくれた方に失礼ですのでもう少し粘ってみます!
131ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(115,765ポイント)
Date: 2008/10/17(金) 16:01
No:22583
|
|
Title: Re:重複しない乱数の作成
|
|
>>やそさん
似ていますが、微妙に違います。
ループに無駄が多すぎると某所でツッコミをくらいまして…(^_^;)
今回の方法だとループ回数が『配列の要素数−1回』でいけるみたいです。
76ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(825,360ポイント)
Date: 2008/10/17(金) 16:18
No:22584
|
|
Title: Re:重複しない乱数の作成
|
|
今までのrandのような形で使いたいのかなと思い、こんなの用意してみました。
my_rand.hの内容は理解する必要ありません。
このままソースファイルと同じフォルダにこの名前で保存すればOKです。
my_srand(10,20);
と書くと、今後my_rand関数を呼べば10〜20の数値のどれかが重複無く返ってきます。
この場合12回以上my_randを呼ぶとエラーになります。
my_rand.h内で領域を確保しているため、乱数を使い終わったら解放
delete_my_rand
する必要があるので注意して下さい。
基本的にmain.cppの内容だけ見てもらったら大丈夫かと思います。
設定して、乱数を呼んで、消去という流れです。
なお、main.cppという名前はこれでなくても構いません。
----------------------------------------------------------
/* my_rand.h */
----------------------------------------------------------
int *MyRandArrayPointer; //乱数入れる入れ物
int MyRandCallNum; //今何回呼ばれたか
int MyRandArrayNum; //入れ物の個数
//my_srandで設定した乱数を順番に取り出す。
//エラーの場合0を返し、error_flagが-1になる。
int my_rand(int *error_flag){
int ret;
if(MyRandArrayNum<=MyRandCallNum){
*error_flag=-1;
return 0;
}
ret=*(MyRandArrayPointer + MyRandCallNum);
MyRandCallNum++;
*error_flag=0;
return ret;
}
//from〜toまでの乱数を設定する
//エラーの返り値は-1
int my_srand(const int from, const int to){
int i,n;
//toの方がfromが小さいか、intの扱える範囲を超えていたら
if( (n = to+1-from) <= 0 || from<=-INT_MAX || to>=INT_MAX)
return -1;//エラー
//配列要素確保
MyRandArrayPointer = (int *)malloc( n * sizeof(int) );
//fromからtoまでを格納
for( i=from ; i<=to ; i++ ){
*MyRandArrayPointer=i;
MyRandArrayPointer++;
}
//ポインタ戻す
MyRandArrayPointer-=n;
//シャッフル
for ( i=0 ; i<n ; i++ ){
int id = rand() % n;
int swap = *(MyRandArrayPointer + id);
*(MyRandArrayPointer + id) = *(MyRandArrayPointer + i);
*(MyRandArrayPointer + i ) = swap;
}
MyRandCallNum=0;
MyRandArrayNum=n;
return 0;
}
void delete_my_rand(){
free(MyRandArrayPointer);
}
----------------------------------------------------------
/* main.cpp */
----------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "my_rand.h"
int main(void){
int error_flag;
srand((unsigned)time(NULL));//乱数初期化
my_srand(10,14);//MY乱数初期化。10〜14の数値を設定する
printf("%d\n",my_rand(&error_flag));//10〜14のどれかが表示される
printf("%d\n",my_rand(&error_flag));//10〜14のどれかが表示される
printf("%d\n",my_rand(&error_flag));//10〜14のどれかが表示される
printf("%d\n",my_rand(&error_flag));//10〜14のどれかが表示される
printf("%d\n",my_rand(&error_flag));//10〜14のどれかが表示される
printf("%d\n",my_rand(&error_flag));//エラー(上で5個しかセットしてないので)
printf("%d\n",my_rand(&error_flag));//エラー(この時error_flagには-1が入っている)
delete_my_rand();//MY乱数消去
return 0;
}
----------------------------------------------------------
実行結果
10
11
14
13
12
0
0
----------------------------------------------------------
こういう使い方が適切かどうかわかりませんが、
何か参考になればどうぞ^^;
1,298ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,156ポイント)
Date: 2008/10/17(金) 17:09
No:22592
|
|
Title: Re:重複しない乱数の作成
|
|
管理人様ありがとうございます。
あれから、やってみたのですが、値の取得がきちんとできていない為かー1とい値をずっととりつづけています。
どこに原因があるのでしょうか?
ご助力お願いします。
76ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(825,981ポイント)
Date: 2008/10/17(金) 17:16
No:22593
|
|
Title: Re:重複しない乱数の作成
|
|
う〜む、ソースコード無しにどこがわるいですか?
と言われるのは、病院に来ていない患者を診断して下さいと言われるようなもので^^;
>ー1とい値をずっととりつづけています。
これはmy_randを呼んだ時のerror_flagが-1ということでよかったでしょうか?
メインファイルの他の文はなしで、
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "my_rand.h"
int main(void){
int error_flag;
srand((unsigned)time(NULL));//乱数初期化
my_srand(10,14);//MY乱数初期化。10〜14の数値を設定する
printf("%d\n",my_rand(&error_flag));//10〜14のどれかが表示される
delete_my_rand();//MY乱数消去
return 0;
}
これだけならちゃんと表示できますか?
これでうまくいくならここから段々と元も戻していって、どこが悪いか見つけてみてはどうでしょう?
後、お使いのコンパイラ、OSなどの環境は何ですか?
375ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,356ポイント)
Date: 2008/10/17(金) 17:45
No:22596
|
|
Title: Re:重複しない乱数の作成
|
|
my_rand.h: In function ‘my_srand’:
my_rand.h:23: error: ‘INT_MAX’ undeclared (first use in this function)
my_rand.h:23: error: (Each undeclared identifier is reported only once
my_rand.h:23: error: for each function it appears in.)
管理人様の張って頂いたものをコピーさせていただきますたが、エラーがでてしまいました。
環境は
コンパイラ gcc
OSはFedora9です。
私が添付したソースプログラムにも対応できないみたいです。
ほんとに無知ですいません。
なんとか今日中にソースプログラムの方に関数として作りたいんですがね;;
200ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,338ポイント)
Date: 2008/10/17(金) 18:20
No:22599
|
|
Title: Re:重複しない乱数の作成
|
|
勘違いです。ごめんなさい。
#include <limits.h>
をつけるのかもしれません。
27ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,407ポイント)
Date: 2008/10/17(金) 18:30
No:22602
|
|
Title: Re:重複しない乱数の作成
|
|
#include <limits.h> を追加しましたが、うまくいきませんでした><
重複しない乱数ならうまくいくのに、重複しない乱数って難しいんですね;;
正直ギブアップ寸前なので、どなたか添付したソースで作成してくれるお方はおられませんか?
正直やってくださいは、規約に違反するかもしれないですが分からないので;;
もし、違反で皆様の反感をかうようであれば諦めますが;w;
51ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,429ポイント)
Date: 2008/10/17(金) 18:31
No:22603
|
|
Title: Re:重複しない乱数の作成
|
|
できれば、C言語がいいですね;;>バグさん
C++はやってないのでいっさい分からないのです><
22ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,374ポイント)
Date: 2008/10/17(金) 18:44
No:22605
|
|
Title: Re:重複しない乱数の作成
|
|
INT_MAX を 例えば 32767 に書き換えたらうまく動きますか?
2倍のポイントを手に入れた! 36ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,456ポイント)
Date: 2008/10/17(金) 18:46
No:22606
|
|
Title: Re:重複しない乱数の作成
|
|
数字に変えたらうごきました!>nonさん
なんでだろう;;
でも、自分が添付したファイルに適用できるのでしょうか><
27ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,400ポイント)
Date: 2008/10/17(金) 18:55
No:22607
|
|
Title: Re:重複しない乱数の作成
|
|
INT_MAXは整数の最大値です。 limits.hの中で宣言されていると思ってましたが、
もげさんとは環境のちがいなのでしょうか?
とりあえず、もげさんのプログラムではMAXが20のようなので32767で問題ないと思います。
もっと、詳しい人のコメントを待ちましょう。
もげさんのプログラムを見て思ったんですが、MAXが全部20でいいのかな?
重量0ってのもありなんですか?いらんお世話ですが。
26ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,476ポイント)
Date: 2008/10/17(金) 19:01
No:22608
|
|
Title: Re:重複しない乱数の作成
|
|
毎回変えれるようにしてあるので、MAXは変更できるようにしてあります。
よって、30にしたりすることもあります。
0〜Nまでの乱数にしているので0っていうことも可能性としてあります。
環境はどうなのでしょうかね?
あまり詳しくないので分かりません;;
ちょっとしたことでも言っていただけるのでありがたいです;;>nonさん
皆様よろしくお願い致します。
20ポイント を手に入れた。
|
|
|
|
|
Name: non ..かけだし(1,433ポイント)
Date: 2008/10/17(金) 19:11
No:22610
|
|
Title: Re:重複しない乱数の作成
|
|
もしかして、
#include "my_rand.h"
の後に
#include <limits.h>
を追加したのでは?
"my_rand.h"より前に入れました?
33ポイント を手に入れた。
|
|
|
|
|
Name: もげ ..かけだし(1,524ポイント)
Date: 2008/10/17(金) 19:18
No:22611
|
|
Title: Re:重複しない乱数の作成
|
|
前にいれたら成功しました!
管理人様がくれたプログラムで実行したら実行できました。
ありがとうございます>nonさん
ただ、自分のプログラムではうまくいかずです;;
48ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(826,246ポイント)
Date: 2008/10/17(金) 21:09
No:22614
|
|
Title: Re:重複しない乱数の作成
|
|
う、お返事遅くなってすみません。リナックスでしたか。
先ほどいった様に、少しずつ作っていってはどうですか?
とりあえずサンプルは動くんですよね?
それなら、とりあえずサンプルをそのまんま貼り付けて作っていけばどうでしょう?
int main(void){
int error_flag;
srand((unsigned)time(NULL));//乱数初期化
my_srand(10,14);//MY乱数初期化。10〜14の数値を設定する
//ここでmy_rand(&error_flag)を使う
delete_my_rand();//MY乱数消去
return 0;
}
その「ここで」の部分で使ってます?乱数消した後で使ったりしてません?
どうしても解決しないならソース丸ごとこちらに投稿してもらうほかなさそうです。
265ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(243,979ポイント)
Date: 2008/10/17(金) 21:32
No:22617
|
|
Title: Re:重複しない乱数の作成
|
|
管理人さんへ。
[22584]のコードでちょっと質問が。
たいしたことじゃないのかもしれませんが、シャッフルのところで偏りがおこる
可能性があるような気がします。
RAND_MAXが 0x7fffしかない環境で toと fromの間が 0x8001以上あると、
my_srand()でのシャッフル処理で交換対象である iと idのうち idの方は
0〜0x7fff、前半 0x8000個分しか交換対象になりません。
となると 0x8001個目以降にあった大きめの数字は前半に偏り気味になりませんか??
# あ、あと fromのチェックに INT_MINではなく -INT_MAXを使ったのは何ででしょう?
258ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,150ポイント)
Date: 2008/10/17(金) 21:54
No:22619
|
|
Title: Re:重複しない乱数の作成
|
|
Justyさんご指摘ありがとうございます。
>fromのチェックに INT_MINではなく -INT_MAXを使ったのは何ででしょう?
う、そういえばプラスの方が1つ少ないはずですね。
仰るとおりINT_MINを使うべきでした。
(2バイトint -32768〜+32767)
(4バイトint -2147483648〜+2147483647)
ですね。
>大きめの数字は前半に偏り気味になりませんか??
確かにINT_MAXでエラー判定をしているわりに、大きな値に対応出来ていませんでしたね;
この場合シャッフルで使っている乱数をINT_MAXの値まで出るようにしてやるのが最善の解決策なんでしょうか。
INT_MAX / RAND_MAX 回rand()を加算してやればよさそうですが、
intが4バイトで、RAND_MAXが2バイトの環境の場合、相当な加算回数になりそうですね。
それとも自前で乱数の関数用意したほうがいいんでしょうか。
220ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(244,394ポイント)
Date: 2008/10/17(金) 22:30
No:22620
|
|
Title: Re:重複しない乱数の作成
|
|
>仰るとおりINT_MINを使うべきでした。
あ、やっぱりそうでしたか。
>そういえばプラスの方が1つ少ないはずですね。
2の補数表現を採用している環境ではそうですね。
>この場合シャッフルで使っている乱数をINT_MAXの値まで出るようにしてやるのが最善の解決策なんでしょうか
>それとも自前で乱数の関数用意したほうがいいんでしょうか。
自前というか、そこらにあるまともな乱数生成ライブラリを使った方がいいです。
どうしても rand()でということなら(微妙な偏りが心配ですが)
1回目の rand()の値をX倍したものと2回目の rand()%Yを足すと
最大 INT_MAXになるような関数を作ればいいんじゃないかなぁ、と一瞬思いましたが、
環境によってはやっぱりこれじゃだめですね。
# いっそのこと fromから toは RAND_MAX個しかダメ、としてしまってもいいのかも。
415ポイント を手に入れた。
|
|
|
|
|
Name: 管理人 ..伝説なるハッカー(828,213ポイント)
Date: 2008/10/17(金) 22:49
No:22622
|
|
Title: Re:重複しない乱数の作成
|
|
>いっそのこと fromから toは RAND_MAX個しかダメ、としてしまってもいいのかも。
そうですね。まぁそこまで大きな値は使わないでしょうし、
手抜き仕様で、RAND_MAX個までということにしておきます^^;
63ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(116,461ポイント)
Date: 2008/10/18(土) 10:31
No:22638
|
|
Title: Re:重複しない乱数の作成
|
|
なんとなくクラス化してみました。
コンストラクタで、最大値(unsigned int型ですが、0〜INT_MAXの範囲でしか指定できません)と、擬似乱数列の種を設定してやって、あとはRand関数を呼び出せば、指定した最大値未満(10と指定した場合は0〜9)の数値をランダムな順番で返します。
返す値が無くなったら、自動でリセットして、再び新たな順番で値を返します。
#include <cstdlib>
#include <vector>
class CRandom
{
private:
std::vector<int> m_data;
unsigned int m_max;
unsigned int m_count;
public:
CRandom(unsigned int max, unsigned int seed)
{
// 初期化
m_max = 0;
m_count = 0;
m_data.clear();
SetMaxValue(max);
Srand(seed);
}
virtual ~CRandom(void)
{
// 念の為に破棄する
m_data.clear();
}
void Srand(unsigned int seed)
{
srand(seed);
}
bool SetMaxValue(unsigned int max)
{
if (max > INT_MAX || max == 0)
{
// int型の最大値よりも大きい値、もしくは0が入力された場合はfalseを返す
return false;
}
else
{
// メンバ変数の初期化
m_count = 0;
m_max = max;
m_data.clear();
m_data.resize((std::vector<int>::size_type)max);
// データバッファを初期化
for (unsigned int i = 0; i < m_max; ++i)
{
m_data[i] = i;
}
// データバッファをシャッフル
for (unsigned int i = 0; i < m_max - 1; ++i)
{
int id = rand() % (m_max - 1);
int swap = m_data[id];
m_data[id] = m_data[m_max - 1];
m_data[m_max - 1] = swap;
}
return true;
}
}
int Rand()
{
// サイズが0の場合は常に0を返す
if (m_max == 0)
{
return 0;
}
// 乱数が一巡した場合はリセットする
if (m_count >= m_max)
{
SetMaxValue(m_max);
}
// 乱数を返しつつ、カウントを進める
return m_data[m_count++];
}
};
567ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(244,554ポイント)
Date: 2008/10/18(土) 11:52
No:22644
|
|
Title: Re:重複しない乱数の作成
|
|
>なんとなくクラス化してみました
ちょww、スワップ処理で idと m_max-1の組でしか行わないなんて・・・。
m_maxが RAND_MAXより大きかったら、RAND_MAX + 1個目以降は最後の要素以外シャッフルされないような。
せっかく C++なんでstd::random_shuffle(m_data.begin(), m_data.end());を
使えばいいのではないでしょうか。
# m_maxは m_data.size()で代用できるので要らないですよね。
160ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,065ポイント)
Date: 2008/10/19(日) 01:13
No:22680
|
|
Title: Re:重複しない乱数の作成
|
|
>>Justyさん
すみません、STLはまだまだ勉強不足だったようです(^_^;)
書き直してみました。こんな感じでどうでしょう?
#include <vector>
#include <algorithm>
#include <cstdlib>
#include <ctime>
class CRandom
{
public:
CRandom()
{
}
int operator()(int max) const
{
double data = static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX);
return static_cast<unsigned int>(data * max);
}
};
class CShuffle
{
private:
std::vector<int> m_data;
size_t m_count;
public:
CShuffle(size_t max, unsigned int seed)
{
m_count = 0;
m_data.clear();
Srand(seed);
SetMax(max);
}
virtual ~CShuffle(void)
{
m_data.clear();
}
void Srand(unsigned int seed)
{
std::srand(seed);
}
bool SetMax(size_t max)
{
if (max > RAND_MAX || max > INT_MAX || max == 0)
{
return false;
}
else
{
m_count = 0;
m_data.clear();
m_data.resize(max);
for (int i = 0; i < static_cast<int>(m_data.size()); ++i)
{
m_data[i] = i;
}
CRandom random;
std::random_shuffle(m_data.begin(), m_data.end(), random);
return true;
}
}
int GetValue()
{
if (m_data.size() == 0)
{
return 0;
}
if (m_count >= m_data.size())
{
SetMax(m_data.size());
}
return m_data[m_count++];
}
};
604ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,233ポイント)
Date: 2008/10/19(日) 01:16
No:22681
|
|
Title: Re:重複しない乱数の作成
|
|
CRandomクラスのコンストラクタ部の字下げがズレてますね…すみません(^_^;)
class CRandom
{
public:
CRandom()
{
}
int operator()(int max) const
{
double data = static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX);
return static_cast<unsigned int>(data * max);
}
};
168ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,351ポイント)
Date: 2008/10/19(日) 02:23
No:22683
|
|
Title: Re:重複しない乱数の作成
|
|
うわ、戻り値の型が違うし…OTL
class CRandom
{
public:
CRandom()
{
}
int operator()(int max) const
{
double data = static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX);
return static_cast<int>(data * max);
}
};
118ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(244,526ポイント)
Date: 2008/10/20(月) 01:02
No:22702
|
|
Title: Re:重複しない乱数の作成
|
|
>書き直してみました。こんな感じでどうでしょう?
おーーー、いろいろ変わっていますね。
いいのではないでしょうか。
84ポイント を落としてしまった。
|
|
|
|
|
Name: バグ ..ハッカー(117,468ポイント)
Date: 2008/10/20(月) 08:58
No:22703
|
|
Title: Re:重複しない乱数の作成
|
|
作ってはみたものの、使い道が思いつかないなぁ…とか思っていたら、ワールドルールテトリスのNEXTに使用できそうかな?とかひらめきました(笑)
気が向いたら実装してみようかな?
56ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,703ポイント)
Date: 2008/10/20(月) 23:23
No:22718
|
|
Title: Re:重複しない乱数の作成
|
|
他には、トランプや麻雀なんかのテーブルゲームや、カードゲームのデッキの管理とか…でしょうか?
38ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(245,031ポイント)
Date: 2008/10/21(火) 00:39
No:22719
|
|
Title: Re:重複しない乱数の作成
|
|
カードゲーム系ですか。
ゲームの種類によっては使えるかもしれませんね。
ちょっとまじめに考えてみると、基本的に(順番はどうであれ)既に一意になっている
オブジェクトリストそのものをシャッフルしてしまえば済んでしまう場合は
使わないと思うので、
・ 対象が数値であること
(何か別のオブジェクトリストに対するインデックスだとしたら、その別のリストが増減しないこと)
・ 1巡中は同じ数字が出ないこと
・ 1巡しきる可能性があること
・ 1巡したら、リセットして再度利用できること
というような条件の幾つかが揃わないとなかなか使わないと思われます。
そう考えるとその全てを満たすテトリスの NEXTはとてもベストなんですよね。
と、それで思いつきました。
ビンゴゲームのあたり番号とかも(再度利用する必要はないかもしれませんが)
最低3つの条件を満たしているので使えそうです。
245ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..上級者(24,190ポイント)
Date: 2008/10/21(火) 01:08
No:22722
|
|
Title: Re:重複しない乱数の作成
|
|
一般にはカードゲームなどで必須ですが,それ以外でも使いようがあります。
例えば,表示下限の順位近くにおいて同位が多数の時に,表示する物をいくつか選ぶためにも使えます (シャッフル後,先頭N個を使う)。
# 面倒だからSQL ServerだとORDER BYの最後のキーにNEWIDつけてTOPでぶった切ったりしちゃいますが。
さて,テトリスのNEXTは使わない方がよいです。
落ち物ゲームでは,一般的に全プレーヤーの公平を保つために,落とす物体の順序を同一にしますが,これを実現するには,疑似乱数の式と種だけ決めるのがよいでしょう。
シャッフルで行うには,一ゲームの平均数より相当長く用意しないと「一回り」が感覚で掴まれてしまう可能性がありますので。
ところで,std::random_shuffleには,入力と同じ列が返らないという,残念な仕様があります。
そのため,ゲームで使うのはやめた方がよいでしょう。
# or 2度使うとか。入力と同じ列の確率が,他より高くなりますが。
404ポイント を落としてしまった。
|
|
|
|
|
Name: Justy ..ハッカー(245,427ポイント)
Date: 2008/10/21(火) 02:59
No:22733
|
|
Title: Re:重複しない乱数の作成
|
|
>テトリスのNEXTは使わない方がよいです
えーと、ガイドラインのテトリスの NEXTは
「最初の7個は必ず7種類のテトリミノ全てがランダムな順番で均一に出現し、
次の7個もランダムな順番で均一に出現する」
とのことなので、乱数・シャッフルの質については気にするべきでしょうが、
別段シャッフルでいいかと思いますが、いかがでしょうか。
テトリス - Wikipedia
http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%88%E3%83%AA%E3%82%B9
>std::random_shuffleには,入力と同じ列が返らないという,残念な仕様があります
>そのため,ゲームで使うのはやめた方がよいでしょう。
厳密なランダムなシャッフルではないことは承知していますが、入力と同じ列って
返っていたような(実装依存?)。
どっちにしても、よほどシビアなところで使うとか、よほど乱数・シャッフルの質が
悪いとかでもない限り、ゲームで問題になることはないと思います。
396ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..上級者(24,576ポイント)
Date: 2008/10/21(火) 10:35
No:22746
|
|
Title: Re:重複しない乱数の作成
|
|
> えーと、ガイドラインのテトリスの NEXTは
えーと,知りませんでした。
後で確認してみます。
> 厳密なランダムなシャッフルではないことは承知していますが、入力と同じ列って
> 返っていたような(実装依存?)。
実装依存か,私の思い込みのようです。申し訳ないです。
26ポイント を手に入れた。
|
|
|
|
|
Name: YuO ..上級者(24,653ポイント)
Date: 2008/10/21(火) 20:15
No:22789
|
|
Title: Re:重複しない乱数の作成
|
|
> 後で確認してみます。
とりあえず,DS版のテトリスで,6組分確認しました。
消さずに42個落とすのはしんどかったです……。
XBox360版 (ヘッドセット同梱版) もあるのですが,1回でこりごり……。
77ポイント を手に入れた。
|
|
|
|
|
Name: バグ ..ハッカー(117,796ポイント)
Date: 2008/10/21(火) 23:54
No:22797
|
|
Title: Re:重複しない乱数の作成
|
|
ガイドラインが出来る前の作品(ファミコン版とか)は、Z型が5つ連続で落ちてきたりして困る事がありましたからね…(苦笑)
39ポイント を手に入れた。
|
|
|
|
|
Name: Justy ..ハッカー(245,498ポイント)
Date: 2008/10/22(水) 00:51
No:22803
|
|
Title: Re:重複しない乱数の作成
|
|
YuOさん
>とりあえず,DS版のテトリスで,6組分確認しました。
>消さずに42個落とすのはしんどかったです……。
乙です。
って、DS/XBox360両方で持ってるんですか。
私はテトリスは持って無いんですよね。
今度買ってこようかなぁ。
バグさん
>Z型が5つ連続で落ちてきたりして困る事がありましたからね
それは・・・ひどい(w
71ポイント を手に入れた。
|
|
|
|
|