ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

ゲームプログラミングでEnjoy!!コミュの質問Q&A(プログラミング)

  • mixiチェック
  • このエントリーをはてなブックマークに追加
ここでは、プログラミングに関する質問を書いてもらいます。どなたか質問の答えが分かる方は是非回答をお願いします。

コメント(91)

ありがとうございますexclamation ×2

ちょっと理解できなかったですがとりあえずやってみますグッド(上向き矢印)
連続レスすいませんあせあせ(飛び散る汗)

EnemyTimeTableのあとポインタを指定する意味が分からないんですが
ポインタ型も同時に宣言してるだけです〜
使わないでいいデスヨ。
大体構造体を作るときはポインタ型も同時に作ってしまうのでクセって思ってください。

EnemyTimeTable ett[100];

bool Enemy_born( int nowCount )
{
int i;

for( i=0; i<100; i++ ) {
if( ett[i]. time==nowCount ) Enemy_create( ett[i]. type, ett[i]. x, ett[i]. y );
}
return true;
}

こんな感じで。
細かいとこまでありがとうございますウッシッシ
突然の質問すみません。
今私はwin32apiでテトリスを消す処理を作っているのですが、
ブロックが全部消えてしまったり、揃っても消えないという状況です。
クラスで、消す処理と消したあとにブロックをずらす処理を分けて
やっているのですが、どのようにしたらいいのでししょうか?
どらさんへ。

有名な話ですが、ニコニコ動画に、

【プログラミング】テトリスを1時間強で作ってみた【実況解説】
http://www.nicovideo.jp/watch/sm8517855

という動画があるので、見てください。
その作者さんは、サイトでテトリスのソースとか配布してくださっているので、そちらも感謝して頂戴し、解析してみるのもいいかと思います。

その動画ページにURLが貼ってあります。ゲッダン動画もアリ(笑)
コンシューマー機でのテトリスのバグ

端の方で一番上までブロックを積み上げた後でブロックを消すと、一番上にナゾのブロックが生えてしまう!
これは、外壁のブロック情報が、間違って 積み上げブロックのデータに混ざってしまうというプログラムミスですね。有名ですな。

こういうミスも回避してみて下さい。あえて解決例は書きません。
何回も質問ばっかりしてすいません・・・

今回はスコアの表示を画像を使って行ってみようと思うんですが、
一応、自分はそれぞれの桁数の数字を使って描画しようとしてるんですがうまくいきません。

なにかアドバイスのようなものがあればぜひ教えていただきたいんですが・・・
>>59
ども。

どこで悩んでいるのか、もっと具体的に書かないとダメです。

・点数の数値が拾えない
・画像のフォーマットが解らないので描画できない
・画像の展開に失敗している
・画像のオフセット値が割り出せないでいる

などなど。 どこまで出来ていて、どの部分で悩み中なのか書いて下さい

基礎の Win API で数字の描画をやってみるべきだと思いますが?


画像は、私が作ってみたPSP用のゲームの一例です。得点とか時間とかがグラフィック描画です。
って、全部グラフィック描画ですが。
>>61
すいません

各桁ごとの数値が拾えないんでいるんです。
スコア20000だとすると
一番高いところはは
20000 / 10000で取れるんですけど・・・そのほかの0の部分は値が取れなくて悩んでいるんです。

基礎のほうでは、すべての桁数をいっぺんに描画できたんで悩まなかったんですけど・・・数値を取るのだけできなくて

よろしくお願いします。

解決のヒントは・・・・

ITOA で、点数を文字列に変換して、各文字から '0'文字 を引くと、数字が各桁の数値 SUUCHI になります
で、その数値で SUUJIGAZOU[SUUCHI] というポインタを参照して、数字の画像を描いてみる、という処理が、オーソドックスな解決例

点数   =   001234500
            ↓↓
文字列に変換 "001234500"

各文字から '0' を引く SUUCHI   桁[0]=0 桁[1]=0 桁[2]=1 桁[3]=2 桁[4]=3 桁[5]=4 桁[6]=5 桁[7]=0 桁[8]=0    
その数値をオフセットに利用 SUUJIGAZOU[SUUCHI]

char SUUJIGAZOU[ 11 ] = { (0画像 16x24),(1画像 16x24),(2画像 16x24),(3画像 16x24),(4画像 16x24),(5画像 16x24),(6画像 16x24),(7画像 16x24),(8画像 16x24),(9画像 16x24),(一番上が0の画像 16x24)};
なんで11個あるかというと、得点って 0 からなので、上側の桁が 0 の時に、空白描画にするとか薄い灰色の 0 を描画 とか色々アイデアがあるかと思うので。
(貼り付け画像を見てください)


あるいは、各桁ごとに割り算&引き算して数値を求めて、同様にオフセット値に利用するのもあり。
おっと。

数値 001234500  は、文字列にすると "1234500" だよな、とか。
長さは可変ですよ、注意。

んな訳で、itoa より 割り算&引き算のほうがいいかも、です。

つまり。

>各桁ごとの数値が拾えないんでいるんです。

との事なので、私が使っている関数をちょっと簡略化して書いてみます


void GputScore(int score)
{
  unsigned char *vram; // V-RAMのアドレス
  int num;   //  各桁の数値
  int copy_sc;  // スコアのコピー

  copy_sc = score;  // コピーする

  num = ((int)copy_sc/1000000); // 100万の位を num へ
  copy_sc -= num*1000000;    // 引き算
  vram = GetVramAddr(draw_frame,XXX,YYY); // V-RAM座標割り出し
  gput(suujigazou[num], vram);  // 数字を描画

  num = ((int)copy_sc/100000); // 10万の位を num へ
  copy_sc -= num*100000;    // 引き算
  vram = GetVramAddr(draw_frame,XXX,YYY); // V-RAM座標割り出し
  gput(suujigazou[num], vram);  // 数字を描画

  num = ((int)copy_sc/10000); // 1万の位
  copy_sc -= num*10000;
  vram = GetVramAddr(draw_frame,XXX,YYY);
  gput(suujigazou[num], vram);

  num = ((int)copy_sc/1000); // 1千の位
  copy_sc -= num*1000;
  vram = GetVramAddr(draw_frame,XXX,YYY);
  gput(suujigazou[num], vram);

  num = ((int)copy_sc/100); // 100の位
  copy_sc -= num*100;
  vram = GetVramAddr(draw_frame,XXX,YYY);
  gput(suujigazou[num], vram);

  num = ((int)copy_sc/10); // 10の位
  copy_sc -= num*10;
  vram = GetVramAddr(draw_frame,XXX,YYY);
  gput(suujigazou[num], vram);

  num = copy_sc; // 1の位
  vram = GetVramAddr(draw_frame,XXX,YYY);
  gput(suujigazou[num], vram);
}

これはサンプルなので改造したりしてご利用下さい

説明は要らないですね?

どうもはじめまして。

ゲームなどをふと作って見たいなと思い、書き込ませていただきました。

この手の勉強は学校とかで習うこともなかったのですが、学校等で勉強しないとできるようにはならないのでしょうか?

いまプログラミングについてはほとんど知識がない状態です。

もしも学校にいかなくてもできるなら、どのような方法で勉強すればいいのでしょうか?

よろしければ返答していただけますとありがたいです。
> 覗かないで(∩д∩)さん

はじめまして。

ゲーム作るために学校へ行かなければならないのかと言う質問ですが、そんなことはありません。

学校は学ぶ手段のひとつにすぎません。

今の時代、他にもいくらでも学ぶ手段はあります。

本屋に行けばプログラミングの入門書から参考書、技術書まで色々あります。
ゲームの作り方だけに限定した本も沢山あります。

また、友人や知り合いに詳しい人がいれば教えてもらうよう頼むのも手です。

ネットで調べるのも良いでしょう。
最近は優秀なサイトも沢山あります。

大切なのはやる気です。
やる気さえあればどんなゲームでも作れます。
逆にやる気が中途半端だったりすると中途半端なゲームしか作れません。学校行ってても行ってなくても同じです。本当に。いやマジで。

ゲーム作りを趣味としたいのであれば本やネットで十分だと思います。

ゲームクリエイター…職業としたい場合は学校へ行くと良いでしょう。
独学でも実力あれば認められる世界ですが、学校を出た方が比較的近道かも知れません。
どこが良いかは一概に言えませんので、そこらへんは自分が将来的にどんなふうになりたいかで決めると良いでしょう。

以上、未熟なゲームクリエイターの卵でした。
なんか偉そうですみません笑
> CR-Zタローさん
返信ありがとうございます。

周りからは専門の学校にも行ってないのにできるわけないと言われていてへこんでいましたが、この返答のおかげで、自信を持って勉強することができそうです!

本やネット等を使って勉強開始します。

本当にありがとうございます!
C言語で下のようなビンゴゲームを作りたいのですが全然わかりません

2次元配列の乱数、ビンゴ判定の設定など・・・・

よろしければ作りかたを教えてください

↓

ビンゴカードを作成 [PUSH ENTER]

--------------
|31| 9|38|32|23|
|33|37| 8| 1|24|
|19|43| 0| 2|46|
| 6| 3|22|12|39|
|41|15|50|44| 7|
--------------

ゲームを始めます [PUSH ENTER]

番号を抽出 1回目 [PUSH ENTER]
【3番】 → あった

カードに穴をあける [PUSH ENTER]

--------------
|31| 9|38|32|23|
|33|37| 8| 1|24|
|19|43| 0| 2|46|
| 6| 0|22|12|39|
|41|15|50|44| 7|
--------------

番号を抽出 2回目 [PUSH ENTER]
【21番】 → ない

番号を抽出 3回目 [PUSH ENTER]


・1〜50 の番号がランダムに配置された5 行×5 列のビンゴカードを作成する。

・カード初期状態を表示したあと、乱数を用いた番号の抽選を開始する。ENTER キーの入力で、乱数を取得し番号に適用する。

・番号の抽選とカードの書き換え、およびカードのチェックを繰返し、ビンゴしたら(いずれか1 列に0 が並んだら)プログラムを終了する。
どこにゲーム性があるのか分からない
自分にも分かりませんあせあせ

課題で出されて作れそうにないので質問しました

すいません
課題なら、自分で考えないと・・・(^^


ヒントだけ

int  BIBGO_CARD[5][5];

1〜50で、同じ数値を選ばせないでビンゴに配置する処理。
↑↑ 1次元配列でも良いから、使った数値を保存しておくと楽

乱数で得た数値を、ビンゴカードから検出させる処理。
↑↑ わかるっしょ?

カードの書き換え == 0を代入

ビンゴチェックは BIBGO_CARD[5][5] を調べればわかる

ゲーム性が無くてもいいじゃん!! アルゴリズム考えるの、楽しいぞ(笑)


やってみ。
ありがとうございます。

頑張ってみますウッシッシ

↑のビンゴプログラムを作ったんですが
ビンゴーシートがうまく作れません

[全]ダッシュを入れたりすると実行結果がグチャグチャになってしまいます

下のようなものがつくりたいのですが、どうすればいいですか?

┌───────────┐
│  .B  .I  .N  .G  .O   .|
│┌─┬─┬─┬─┬─┐│
│|11|18|42|55|75||
|├─┼─┼─┼─┼─┤|
│|02|29|36|49|61||
|├─┼─┼─┼─┼─┤|
│|04|22|○|58|69||
|├─┼─┼─┼─┼─┤|
│|14|30|33|52|72||
|├─┼─┼─┼─┼─┤|
│|07|17|32|46|68||
|└─┴─┴─┴─┴─┘|
└───────────┘

ソースも一応動くのですが、訂正したほうがいい箇所など教えてください

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int GetNumber(void);
void Disp(void);
int BingoCheck(void);

int i, j;
int w;
int state[51];
int card[5][5];

int GetNumber()
{
while (1)
{
w = rand() % 50 + 1;

if (state[w] == 0)
{
state[w] = 1;
break;
}
}
return w;
}

void Disp()
{
for (i=0; i<5; i++)
{
for (j=0; j<5; j++)
{

printf("%.2d ", card[i][j]);


}
printf("\n");
}
}



int NumberCheck(int n)
{
for (i=0; i<5; i++)
{
for (j=0; j<5; j++)
{
if (card[i][j] == n)
{
printf("\n");
printf("【 %.2d 】はある\n", n);
card[i][j] = 0;
printf("\n");
return 1;
}
}
}
printf("\n");
printf("【 %.2d 】はない\n", n);
return 0;
}



int BingoCheck()
{
for (i=0; i<5; i++)
{
w = 0;
for (j=0; j<5; j++)
{
w += card[i][j];
}
if (w == 0)
{
return 1;
}
}

for (i=0; i<5; i++)
{
w = 0;
for (j=0; j<5; j++)
{
w += card[j][i];
}
if (w == 0)
{
return 1;
}
}

w = 0;
for (i=0; i<5; i++)
{
w += card[i][i];
}
if (w == 0)
{
return 1;
}

w = 0;
for (i=0; i<5; i++)
{
w += card[i][4-i];
}
if (w == 0)
{
return 1;
}
return 0;
}

int main()
{
srand((unsigned)time(NULL));


for (i=0; i<50; i++)

{
state[i] = 0;
}


for (i=0; i<5; i++)

{
for (j=0; j<5; j++)

{
card[i][j] = GetNumber();
}
}

card[2][2] = 0;

for (i=0; i<50; i++)
{
state[i] = 0;
}

Disp();


while (1)
{
printf("\n");
printf("番号を抽選 [PUSH ENTER]");
getchar();

if (NumberCheck(GetNumber()))
{

Disp();

if (BingoCheck())
{
printf("\n");
printf("ビンゴ\n");
break;
}
}
}

printf("\n");
printf("終了\n");
printf("\n");

return 0;
}
専門学校生で多い、i j の使用についてですが、
プログラムの本では、i j でループ使用しています。

だけど、i j は見づらく、ケアレスミスをするケースも結構あるので、
ix ,iy や xxx yyy
x_loop y_loop
など、独自に見やすくて可読性の高そうな変数名にした方がいいですね。

ループで変数 i j は個人的にはおすすめできないです。

そりは、昔の名残りです。
昔のプログラミング言語は長い変数名が使用できなかったのです

現代のプログラマーは、現代風に進化すればいいのです。

i , j などの一文字変数は、一時利用だけなら問題ないですが、そのループ中でサブルーチンを呼び出す時の変数に i とか使うのはやめたほうがいいですな。

i , j , k などを変数の先頭に付けてれば、「ループ用の変数」であることが暗黙の了解になるかと。
ループで使っているよ、の変数名ルールを決めておくと「ソースの読み易さ&解りやすさ」UPですよっ


1文字変数って、ソース見直しする時とかソース配布した時に、見たプログラマーが「すげぇ見づらいZEっ!!」と文句を言うであろう事は言うまでもありません。

ちなみに、ループは 3重まででやめといたほうが良いとは思うけど、C++とかでは5重OVERとかいくのかなぁ、とか。



ところで、BINGOの質問の人は解決したのかなぁ・・・・・。

ちょっと気になったのは、

配列の使い方ですが、後ろの括弧からX,Y,Z・・・
と使用した方がいいですね。

例えば、
map[Y座標][X座標]
こんな感じです。
†MDO†さんのプログラムでは逆になっています。


現状ではうまく動作するから良いかもしれませんが、
配列の初期化を考えたりするときに支障が出ます。
他にも理由があります。
ですが、詳しく書くと長くなるので割愛しますが、

とりあえず、2次元配列の初期化(値を設定する初期化)を調べてみてください。
言わんとすることがすぐに理解できると思います。
> †MDO†さん

何で、

map[X座標][Y座標] じゃなくて
map[Y座標][X座標] の配列方法が良いかはわかってる?

解らなかったら、配列がどんな順番で並んでいるか理解できてない証拠です
こんにちわ!javaを主に使ってWEBプログラマやってる者です。

プログラミングの勉強の一環でブラウザでできるゲームサイトを作ろうと思うのですが、
普通、ゲームのプログラミングって主にどのような言語を使うのがいいのでしょうか。

もちろん、何で動かすかにもよるのは理解しています。メインはC++なんですかねぇ?
iアプリはjavaだったと記憶しております。ブラウザでうごくゲームで一時期javaのアプレットがはやった時期もありましたよね。今やるなら何がいいでしょうか。

ゲーム作成のことであれば何でもいいので教えてください。お願いします。
>81
動作環境にも大きく依存します
PC上で動かすならJavaは多くのプラットフォームで動く公算が高い利点があります。
Flashなら動作環境に関係なくWEBブラウザなどのFlashプレーヤがあれば動きますが、Javaよりはある一定規模以上になると開発しにくいですね。更にiPhone系ブラウザでは動きません。
ただJavaはリアルタイム性が求められるゲームは苦手です。
CやC++などのコンパイル言語はマシンの性能がフルに使えますし、グラフィック関係のライブラリも充実しています。更にPC以外のコンピュータでも動作させられます。

で、個人のゲームサイトなら恐らくクライアントサイドプログラム中心になるだろうと思います。
とするならばJavaアプレットかFlashが表現の幅がそれなりにあり、良いのではないでしょうか?
ただ私もJavaで以前ゲームを作成しましたが、あまりゲーム向けライブラリは充実していないようです。
単純なテキストベースのゲームならHTML等だけでできますね。
>サントさん

ご返事ありがとうございます。

なるほど普段javaで開発していますが、そんな側面があったとは…・・・

現在の時点では、WEBサイト作成というのが目的でそこに置くコンテンツとしてゲームを置ければいいかなと思っているので、とりあえずはオセロとか簡単なゲームをjavascriptや、javaアプレットなんかで作ってみます。

でも、本格的に開発しようとすればどの動作環境で?言語で?といったことも視野に入れていかなければなりませんね。
質問です。

今、WEBブラウザでjavascriptとCanvasを使ったゲームを書いているのですが、
メニューの作り方がわかりません。

メニューとは、家庭用ゲームを起動すると最初に現れる
【スタート】 ロード セーブ コンティニュー
のような画面や、

RPGの戦闘シーンで使う

 攻撃    ケアル
【魔法】   ファイア
 防御   【サンダー】
 にげる   ブリザド

のような表示のことです。

もちろん、カーソル位置を保持する変数を保持して、キーが押されるごとに描画して云々
すれば、作れることは分かるのですが、

例えば、メニューが複数段階になる(『魔法』を選ぶと、さらに『サンダー』『ファイア』等々を選ぶサブメニューが表示される)と、コードが複雑になってしまうと思います。

もし、『定跡』のようなものがあったら教えていただきたいのです。
最近C言語を勉強して2Dシューティングを作っているんですが、自機のHPが表示されないんですがなんでか分かりません。どなたか教えてください^^;

・Player.cpp
#include <stdio,h>
#include "def.h"
#include "Player.h"

// グローバル変数の宣言
OBJ gPlayer;

・def.h
// オブジェクトの構造体
typedef struct
{
int hp;
}OBJ;

・Player.h
//関数宣言
void PlayerStart(void);
void PlayerMain(void);
void PlayerDraw(void);

void PlayerStart(void)
{
gPlayer.hp = 30;
}

void PlayerDraw(void)
{
char str[100];

// プレイヤーのHPの表示
sprintf(str."PLAYER: %02d" );
gsDrawText( 30. 0. str );
}
全部見てないけど、sprintfの引数が2つなのが気持ち悪い。
> おもけんさん
すでに御存知かもしれないですが、メイン関数からコマンドを呼び出すのが一番良いようです。分岐用変数を用意して、メイン関数からコマンド関数を呼び出して見てください。
こんな回答で大丈夫でしたか?
Windowsアプリケーションで
数当てゲームを
作っているんですが

scanfで数値を入力して
randomの数値とを比較する。

って感じにしたんですが


どうも数値入力が
上手くいきません。

scanf以外で
数値入力ができる方法って
ありますか?


ちなみに
引数とかに間違いはないです。
みなさん、はじめまして。
本来ならご挨拶のトピックにまず投稿すべきなのかも知れませんが、質問があって飛び込んでまいりましたので、自己紹介を兼ねてさっそく質問させていただきたいと思います。

私は現在「英語学習」関連のサイトを持っておりまして、今後インタラクティブな内容を作成したいと考えております。
サイト:http://roundsquaretriangle.web.fc2.com/

このサイトの発音解説ではありきたりな静止画像による発音記号の説明があるのですが、利用者がもっと楽しく分かりやすく学べるように、3DCGアニメーションを駆使したものにしたいと考えました。

そこで Maya を3ヶ月ほど学び下の動画までは作れるようになりました。



 しかしこれは一方的な映像に過ぎません。
 私が求めているのは、たとえば添付画像のように利用者自らが操作することで、この3DCGの向きや距離を変えて観察したり、はたまた学びたい発音記号を選ぶとその実演をアニメーションでやってくれるというようなものです。

 そのように Maya のモデルを活用してインタラクティブなものを作りあげるにはプログラミングが必要かと思い、HSPというものを2日前にダウンロードし、ごく大雑把にではありますが、学んでみました。しかしどうも見た限りでは、メタセコイアや六角大王で作ったモデルを動かすような準備はあるようですが、mayaのモデルを活用し、すでにできあがっているアニメーションリギングを使った表現を組み込めるのか、よく理解できませんでした。

 Youtubeで Maya のチュートリアルを見ますと、「ゲームのキャラクタとして作成した」というコメントがときどきあります。ということはMayaで作ったモデルをその設定を生かしてゲーム(もっともインタラクティブものといえますよね)が作れるわけですが、モデルのあとさらにどう進めばよいのかがまったくわかりません。

 きっとこちらのコミュニティの中にはそういう分野の専門家もいらっしゃるかと思い、質問させていただく次第です。長々と申し訳ありませんが、よろしくアドバイスお願いします。

※「これからプログラミングを学ぶなんていう素人には無理。プロに有料で依頼しないさい」というのも回答としてありです。

ログインすると、残り56件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

ゲームプログラミングでEnjoy!! 更新情報

ゲームプログラミングでEnjoy!!のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。