スコアを残す

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
jay

スコアを残す

#1

投稿記事 by jay » 15年前

ゲームの開発中に行き詰ってしまいました、どなたか知恵を貸して下さい。

ゲームの終了時にハイスコアを何らかの形で保存する仕様を実装しようとしたのです。
ハイスコアはプレイヤーキャラの構造体においてint型で格納されています。

最初はファイル操作関数fopenとfcloseを使って
ゲーム起動時にfgetcで記録を読み込み、ゲーム終了時にfputcで書き込み。
それぞれをfor文で必要回数(数値の桁数分)繰り返してtxtファイルに保存しようとしました。

しかしここで問題が発生しました。
上述の通り、ハイスコア(ch.hiscore)はint型で宣言されているのです。
fputcはchar型の文字一つを書き込みする仕様なので、ch.hiscoreの保存が出来ないのです。


具体的に僕がやりたいのは
1、ゲーム起動時に何らかの形で保存されているハイスコアを読み込みch.hiscoreに格納する。
2、ゲーム終了時にch.hiscoreの値を何らかの形で保存して、次回以降に読み込めるようにする。

の2つです。
どなたかいい方法を教えて下さい。

ideyan

Re:スコアを残す

#2

投稿記事 by ideyan » 15年前

保存するときにfprintfで書きだしてはどうでしょうか?

あ~る

Re:スコアを残す

#3

投稿記事 by あ~る » 15年前

http://dixq.net/g/58.html
これを参考にすれば出来ると思います。


匿名

Re:スコアを残す

#5

投稿記事 by 匿名 » 15年前

途中までで構いませんので
そのプログラムを記してもらえると
より回答しやすいです

dic

Re:スコアを残す

#6

投稿記事 by dic » 15年前

文字列を数値に変換する関数
atoi を知っておくと便利です
#include <stdio.h>
#include <stdlib.h>

int main()
{
    char    str[10] = "0123";

    int        score;

    //    文字列0123を数値に変換
    score = atoi(str);

    printf( "%d\n", score );

    return 0;
}

jay

Re:スコアを残す

#7

投稿記事 by jay » 15年前

あ~るさんとシエルさんが教えて下さったページを参考に無事実装することができました。

ありがとうございます。


>dicさん
atoi
atof
atol

これらはセットで覚えておきますね。
使う型に合わせて使い分けが必要ということですね。 画像

パコネコ

格闘ゲームのCPUについて

#8

投稿記事 by パコネコ » 15年前

スタディCというものを使ってC言語でゲームを作っているのですが・・・
グラフィックは友達に頼んでいるのですが、
自分のジャンプと攻撃1と2(1はコンボ3まで、2は遠距離)と移動
というところまでは作りました。
ですが敵の行動を決めることがなかなかできません
条件として思い浮かぶのはHPの量を比べること、相手との位置関係(近いか遠いか)ぐらいです。
プログラムについてというより、今は考え方についてが知りたいです。
というのもプログラムの形に仕上げれるところまで今のままでは持っていけないからです。
どなたか助けていただけませんか?

パコネコ

Re:格闘ゲームのCPUについて

#9

投稿記事 by パコネコ » 15年前

まだできてませんがガードについてもいいですか?
自分が攻撃してから相手はガードをするのでしょうか?
でもそれだとすべてガードされることになる気がします。
ランダムに攻撃をうけさせればいいのでしょうか?
だいたいの確率もお聞きしてもよろしいでしょうか?
たとえば:50%もしくは2回に一回ぐらい
だいたいで結構ですので参考のために教えてください

パコネコ

Re:格闘ゲームのCPUについて

#10

投稿記事 by パコネコ » 15年前

上のもの以外でも
「格闘ゲームならこういうものが必要」などもありましたら
よろしくお願いします。
連続でどんどん質問増やしてすいません
余談ですが
ちなみにキャラが小さいサイズでやっているのでヨコスクのアクションに近い形になってます。
ワイはそう思わないけど友達に言われて・・・

KEYONN_

Re:格闘ゲームのCPUについて

#11

投稿記事 by KEYONN_ » 15年前

まず、格闘ゲームを作るなら、確率を計算する関数が必要ですね。

int GetPersent(int per,int num);//per%の確率でnumが出る

あと、格闘ゲームなら入力コマンドを判定する関数が必要ですね。
#define COUNT 200
#define MAX_KEY 9

typedef struct Comm{
int type;//種類
int usechara;//使うキャラ
unsigned char commbuff[COUNT];//入力バッファ
unsigned char time;//時間
unsigned char key[MAX_KEY];
}Comm;

void CheckCommand(Comm k);//入力構造体からコマンドを判定する関数

それから、キャラクター同士の当たり判定をする関数が必要です。
typedef struct NRECT{
int left;
int top;
int right;
int bottom;
}NRECT;

int CheckHitAttack(NRECT attackA,NRECT diffenceA,NRECT attackB,NRECT diffenceB);
//1Pキャラの攻撃矩形ゾーンと防御矩形ゾーン、2Pキャラの攻撃矩形ゾーンと防御矩形ゾーン
//の当たり判定


あと、なんといっても2Dの格闘ゲームはアニメーションです。
キャラがアニメーションする関数を作ると良いかもしれません。

typedef struct ANIM{
Comm A;//入力キーのバッファーなど
double time;//経過時間
int counter;//カウンター
//...他に必要なのあるかな?
}ANIM;

int CharacterAnimationWorks(ANIM chara);//アニメーション用関数

以上、必要な関数の定義しか書いてませんが、参考になれば幸いです。

Dixq (管理人)

Re:格闘ゲームのCPUについて

#12

投稿記事 by Dixq (管理人) » 15年前

Study C!
懐かしい・・。
これ私が高校の頃からありました。



まずどの程度のクオリティを求めるかですよね。
まだ経験が無いなら単純に確率のみで決定してもいいんじゃないでしょうか。

でもそれだと面白くなくなってくると思います。
例えばストリートファイターでたとえるなら、
ジャンプで入ってきた相手の対空用に昇竜拳を出そうとしたのに、コマンドがうまく入らなくて波動拳になってしまったとか、そういう時は楽にそのまま飛び込んで連続技に繋げられますよね。
飛び込んだら何かしら対空策を施してくるだろうに確率で計算していたら「そこで棒立ち?」とか「そこでその技?」みたいな違和感が出てきてしまうと思います。
そうではなく、「クク・・昇竜拳出し損ねたな!」みたいに思える"人間とプレイしている感"を出したいですよね。

しかし、その全てのパターンに違和感無く条件分岐させることもまた困難だと思います。
こういう場合はゴリゴリプログラムを書く方法より、沢山のサンプルから学習させる方が手っ取り早かったりするかもしれません。
ものすごい量のサンプルが必要ですが、何度もプレイして、そのプレイデータからプレイヤーはどう動き、コマンドするかを覚えさせてそれに合ったコマンドをさせるとか、
そうすると自然な動きになるかもしれません。
自然な動きになるように学習させるのは難しいかもしれませんが。

まずは条件分岐でどこまで出来るかやってみて、それで自然な動きにならなければ学習という方面を視野にいれて制作をしてみてはいかがでしょう。

Dixq (管理人)

Re:格闘ゲームのCPUについて

#13

投稿記事 by Dixq (管理人) » 15年前

後、自然界の現象に正規分布は欠かせませんよね。
確率を計算する関数と一緒に、正規分布で確率を計算する関数も作ると良いと思います。

パコネコ

Re:格闘ゲームのCPUについて

#14

投稿記事 by パコネコ » 15年前

ありがとうございます
かくりつを使うものは「rand()%」でランダム&if文を使うと言った方法しか知りません…
TKOZさんのやつってスタディCで使えますか?
あ、使えなくても勉強になるのでありがたいんですがとりあえず使えるかだけ…確認してもいいですか?
サンプルの使用&記憶はどのようにすればいいと思いますか?
ファイルに保存していくとかですかね。
ファイルはあまり得意ではないですがこの機会に使いたいですね。
他にも応用が効きそうですし…

パコネコ

Re:格闘ゲームのCPUについて

#15

投稿記事 by パコネコ » 15年前

サンプルの使用と書いてますが学習させるにはどうさせればいいのか?という意味です
言葉が足りなくてごめんなさい

KEYONN_

Re:格闘ゲームのCPUについて

#16

投稿記事 by KEYONN_ » 15年前

学習というのは、パコネコさんがC言語を学習するという意味でしょうか?
それとも、他の意味でしょうか?

パコネコ

Re:格闘ゲームのCPUについて

#17

投稿記事 by パコネコ » 15年前

>こういう場合はゴリゴリプログラムを書く方法より、沢山のサンプルから学習させる方が手っ取り早かったり>するかもしれません。
>ものすごい量のサンプルが必要ですが、何度もプレイして、そのプレイデータからプレイヤーはどう動き、コ>マンドするかを覚えさせてそれに合ったコマンドをさせるとか、
これについてですね
難しそうです・・・

Dixq (管理人)

Re:格闘ゲームのCPUについて

#18

投稿記事 by Dixq (管理人) » 15年前

とりあえず単純な確率で動くAIから作ってみてはどうでしょう?
studyCを使った事は無いので、よく知りませんが、
C言語として使えるべき物が使えないコンパイラなら使うのをやめた方がいいと思います。

出来るかどうか試しに書いてみてはどうでしょう。


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

int main(){
srand((unsigned) time(NULL));
printf("%d",rand());
return 0;
}


・・って今見てみたらインタプリタなのですね。
C言語をきちんと勉強するならVisualC++などのコンパイラでコンパイルした方がいいのではないでしょうか?
画像や音楽を簡単に扱いたいならうちのHPでも紹介しているDXライブラリを使うという手があります。

スキマ妖怪

Re:格闘ゲームのCPUについて

#19

投稿記事 by スキマ妖怪 » 15年前

たぶん機械学習のことですね。
この中の遺伝的アルゴリズムとか、ニューラルネットワークとか

http://ja.wikipedia.org/wiki/%E6%A9%9F% ... 6%E7%BF%92


…で機械学習って何ぞ?となると思います。
面白いものを見つけたのでペタリ

体験できるサンプルです。
Trainingモードで何週かしてあげると(少ないと壁にぶつかったりします)
AIモードでしっかり学習してうまく移動できることが確認できると思います。

http://kusaimeshi.vs.land.to/html/gocap.html


> 難しそうです・・・

かなり難しい部類に入ると思います。

パコネコ

Re:格闘ゲームのCPUについて

#20

投稿記事 by パコネコ » 15年前

基本的には使えるはず…使えないのはほかのやつの固有のやつ
できないことはワイが知ってる範囲では、画像の回転や縮小拡大
ですね
ただワイが知らなかったのでお聞きしました。
DXライブラリはここの?やつで勉強させてもらってます。
ただ今はまだノートに書き写している段階です。
移し終わってからゲームなどのプログラムを作りたいです
今は基礎編を写し終わったとこでしょうか…

パコネコ

Re:格闘ゲームのCPUについて

#21

投稿記事 by パコネコ » 15年前

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

>int main(){
> srand((unsigned) time(NULL));
> printf("%d",rand());
> return 0;
>}
はきちっと使えました

パコネコ

Re:格闘ゲームのCPUについて

#22

投稿記事 by パコネコ » 15年前

スキマ妖怪さんに見せていただいた
AIのやつ(車の学習であってますかね?)すごく面白いですね
こんなプログラム作りたいな~と思いました。
今は、まだ難しそうなのでもっといろんな関数覚えてからになりそうです。

パコネコ

Re:格闘ゲームのCPUについて

#23

投稿記事 by パコネコ » 15年前

確率による行動選択にします
皆さんありがとうございました
また困ったことがありましたら皆さんの力を貸してもらいたいと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る