授業の課題でゲームの作成しているのですが、さっぱりわかりません…助けて下さい…お願いします;;

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

授業の課題でゲームの作成しているのですが、さっぱりわかりません…助けて下さい…お願いします;;

#1

投稿記事 by MH » 14年前

以前、投稿したものですが、フォーラムルールを読んでいなかったため、ご迷惑をおかけしました;;
もう一度改めて投稿させていただきます;;

[1] 質問文
 [1.1] C言語の授業で、途中から課題が手に負えなくなってしまいました。以前も質問させていただいてしばらく考えてはいたのですが、まったくわからず、提出期限が迫るばかりです;; 他の授業のテストも迫ってきてしまい、この課題の提出期限も目前になってしまったので、どうにか、正解のプログラムを教えていただけると幸いです;; どうかよろしくお願いいたします。

 [1.2] 下のものを、「乱数などを使って表を十分にスクランブルし、ゲームが始められるようにしろ」という課題です。

コード:

/* PROGRAM 9  乱数 Random.c */


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


int Nummatrix(void);
int Check(int);
int Tableinit(int n);
int Start(int n);
int Table(int);
int Drawkoma(int x, int y, int n);
int Move(int n, char S);
int Select(int n);


int masu[11][11];


main( ){
    int num, test, t;


    clrscr();
    do{
        num = Nummatrix();
        test = Check(num);
        cprintf(" %d \n\r", num);
    }while(test == 1);
    clrscr();
    Tableinit(num);
    do{
        t = Select(num);
    }while(t != 0);
    gotoxy(5,num+8);
    cprintf("   終了\n\n\n");
    return 0;
}


int Nummatrix(){
    char charn[2];
    int n;
    textcolor(10);
    cprintf(" 大きさは?");
    gets(charn);
    n = atoi(charn);
    return n;
}


int Check(int n){
    int check;
    if(n > 1 && n <= 10){
        printf(" 正しい入力です ");
        check = 0;
    }
    else{
         printf(" 入力のまちがい ");
         check = 1;
    }
    return check;
}


int Tableinit(int n){
    int x, y;
    textbackground(11);
    clrscr();
    printf("\n\n\n");
    for(y=1;y<=n;y++){
        for(x=1;x<=n;x++){
            masu[x][y] = x + (y-1)*n ;
            if(x==n && y==n) masu[x][y] = 0;
            Drawkoma(x, y, n);
        }
        cprintf("\n\r");
    }
    return 0;
}


int Start(int n){
	int i, k;
	char choice;
	srand((int)time(0));
	for(i=0; i<=10; i++){
		k = rand()/(1.+ RAND_MAX)*4;
		switch(k){
			case 0:
			    choice ='I';
			    break;
			case 1:
			    choice ='J';
			    break;
			case 2:
			    choice ='K';
			    break;
			case 3:
			    choice ='M';
			    break;
			default:
			    printf("     Random Number ??? \n");
			    break;
		}
		textcolor(10);
		cprintf("%d %c",k, choice);
		getchar();
		Move(n, choice);
	}
	return 0;
}


int Table(int n){
    int x, y;
    textbackground(11);
    clrscr();
    printf("\n\n\n");
    for(y=1;y<=n;y++){
        for(x=1;x<=n;x++) Drawkoma(x ,y ,n);
        cprintf("\n\r");
    }
    cprintf("\n\r");
    return 0;
}


int Drawkoma(int x, int y, int n){
    int col;
    textbackground(15);
    col = (masu[x][y] - 1)/n + 9;
    if(col > 15) col = col+1;
    textcolor(col);
    if(masu[x][y] !=0) cprintf(" %2d",masu[x][y]);
    else{
		textcolor(15); cprintf("  *");
	}
    return 0;
}


int Select(int n){
    int t;
    char S[1];
    t=1;
    textbackground(11);
    textcolor(14);
    gotoxy(4*n+8,5); cprintf("駒を動かす       \n");
    textcolor(15);
    gotoxy(4*n+10,6); cprintf("I:上の駒を入れる \n");
    gotoxy(4*n+10,7); cprintf("J:左の駒を入れる \n");
    gotoxy(4*n+10,8); cprintf("K:右の駒を入れる \n");
    gotoxy(4*n+10,9); cprintf("M:下の駒を入れる \n");
    gotoxy(4*n+10,10); cprintf("0:終了      \n");
    cscanf("%s",S);
    if(S[0]=='0') t=0;
    else Move(n,S[0]);
    return t;
}


int Move(int n, char S){
    int oldx, oldy, x, y;
    for(x=1;x<=n;x++){
        for(y=1;y<=n;y++){
            if(masu[x][y] == 0){
            oldx = x;
            oldy = y;
            }
        }
    }
    switch(S){
		case 'I' : case 'i':
            if(oldy > 1 ){
                masu[oldx][oldy]= masu[oldx][oldy-1];
                masu[oldx][oldy-1] = 0;
                Table(n);
            }
            break;
        case 'J' : case 'j':
            if(oldx > 1 ){
                masu[oldx][oldy]= masu[oldx-1][oldy];
                masu[oldx-1][oldy] = 0;
                Table(n);
            }
            break;
        case 'K' : case 'k':
            if(oldx < n ){
                masu[oldx][oldy]= masu[oldx+1][oldy];
                masu[oldx+1][oldy] = 0;
                Table(n);
            }
            break;
        case 'M' : case 'm':
            if(oldy < n ){
                masu[oldx][oldy]= masu[oldx][oldy+1];
                masu[oldx][oldy+1] = 0;
                Table(n);
            }
            break;
        default:
            break;
    }
    return 0;
}

また、そのあと、「その作った数字の表をファイルdata.dat に保存するプログラムと、そのデータを書き出すプログラムを作れ。」という課題が続いています。このとき、以下のデータを元に作成したいのです。

コード:


/* PROGRAM 10.1 12月8日 ファイル出力 Fileout.c */
 
 
#include <stdio.h>
 
 
 
main( ){
    int i=1, no;
    char WORD[10], check[3];
    FILE *fp;
    
    
    /* Open Error Check */
    if((fp=fopen("Data.dat","w"))==0){
        printf("cannot open file \n");
        return 1;
    }
    
    
    while(i!=0){
        printf("記憶したい言葉を入力 ");
        scanf("%s",WORD);
        fprintf(fp,"%d %s",i,WORD);
        printf("記憶したい数字を入力 ");
        scanf("%d",&no);
        fprintf(fp," %d\n",no);
        printf("繰り返しますか? YES or NO ");
        scanf("%s",check);
        i++;
        if(check[0]=='N' || check[0]=='n') i=0;
    }
    
    
    /*Close Error Check */
    if(fclose(fp)){
       printf("cannot close file \n");
        return 1;
    }
    else return 0;
}

コード:


/* PROGRAM 10.2 12月8日 ファイル入力 Filein.c */
 
 
#include <stdio.h>
 
 
main( ){
    int i, num;
    char WORD[10];
    FILE *fp;
    
    
    /* Open Error Check */
    if((fp=fopen("Data.dat","r"))==0){
        printf("cannot open file \n");
        return 1;
    }
    
    printf("入力されていた言葉、数字は \n");
    while(fscanf(fp,"%d",&i)!=EOF){
        fscanf(fp,"%s %d",WORD,&num);
        printf(" %s %d\n",WORD,num);
    }
    
    
    fclose(fp);
    
    
    return 0;
}

 [1.4] まず、表をシャッフルする方法がまったくわかりません;; なるべく簡単に、早くよくシャッフルできるようにしたいのですが、シャッフルできるように、上のデータを書き直し教えていただけると嬉しいです;;

また、そのあと、そのデータを保存・書き写しするプログラムを作れという課題は、質問自体がよくわからないし、どこをどういじればよいのかもわかりません;;
どうか教えて下さい。よろしくお願いします;;

[2] 環境  
 [2.1] OS : WindowsXP
 [2.2] コンパイラ名 : どこにかいてあるのかわかりません;;
[3] その他
 正直、C言語自体、あまり理解できていません・・・これまで、いくつも課題が出ていたのですが、友達と協力してなんとかこなしてきました。しかし、友達はもうこの授業をあきらめてしまい、私はあきらめたくなくてまだ授業に出ているのですが、課題がどんどん難しくなってきていて、手に負えなくなってしまいました。都合のいいお願いなのは百も承知ですが、どうか、解答を教えていただけると幸いです;;どうか、よろしくお願いいたします。

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 授業の課題でゲームの作成しているのですが、さっぱりわかりません…助けて下さい…お願いします;;

#2

投稿記事 by bitter_fox » 14年前

MH さんが書きました:以前、投稿したものですが、フォーラムルールを読んでいなかったため、ご迷惑をおかけしました;;
もう一度改めて投稿させていただきます;;
では、前回の質問の際いくつか回答がついてますが、それに返答していただけますでしょうか?(前回の質問が放置されています。)
MH さんが書きました:[1] 質問文
 [1.1] C言語の授業で、途中から課題が手に負えなくなってしまいました。以前も質問させていただいてしばらく考えてはいたのですが、まったくわからず、提出期限が迫るばかりです;; 他の授業のテストも迫ってきてしまい、この課題の提出期限も目前になってしまったので、どうにか、正解のプログラムを教えていただけると幸いです;; どうかよろしくお願いいたします。
提出期限が迫ってきているとのことですが、提出期限を教えていただけますでしょうか?
MH さんが書きました: [1.2] 下のものを、「乱数などを使って表を十分にスクランブルし、ゲームが始められるようにしろ」という課題です。

 [1.4] まず、表をシャッフルする方法がまったくわかりません;; なるべく簡単に、早くよくシャッフルできるようにしたいのですが、シャッフルできるように、上のデータを書き直し教えていただけると嬉しいです;;
まず、最初の課題(表のシャッフル)から片付けましょう。
「なるべく簡単に、早く良くシャッフルできるように」とのことですが、それはMHさん個人の希望でしょうか?それとも、その内容は課題に含まれてるのでしょうか?
またこの掲示板は課題の丸投げはしてはいけないとのことですので、お手伝いをさせていただきます。
まず、一個目に載せていただいたプログラムの

コード:

int Nummatrix(void);
int Check(int);
int Tableinit(int n);
int Start(int n);
int Table(int);
int Drawkoma(int x, int y, int n);
int Move(int n, char S);
int Select(int n);
この8つの関数にいったいどういったことをするのかといった説明(コメント)をしてください。
MH さんが書きました:都合のいいお願いなのは百も承知ですが、どうか、解答を教えていただけると幸いです;;どうか、よろしくお願いいたします。
先ほども言いましたが、課題の丸投げはダメですのでそれはできませんが、課題のお手伝いならさせていただきます。

MH

Re: 授業の課題でゲームの作成しているのですが、さっぱりわかりません…助けて下さい…お願いします;;

#3

投稿記事 by MH » 14年前

返信遅れてしまって申し訳ありません><

まず、前回の質問の返答ということですが、

次に、提出期限は1月12日水曜日です・・・
提出期限によってどうしても回答がほしい場合は皆様に理解がいただければ・・・とのことでしたので、どうか少しでもお助けしていただければさいわいです;;

次に、「なるべく簡単に、早く良くシャッフルできるように」とは、先生が言っていたもので、よりそうシャッフルできれば、成績がよくなるのだと思われます。しかし、今は良い成績にかかわらず、とりあえず課題を形にしたいのが一心ですので、ある程度でもそうなるようにしていただければそれだけで十分です;;

プログラムの説明の件は、私たちもこれをプリントで与えられて、そのプログラミングを一部訂正せいろというように言われたものなので、よくわからないのが現状です;;本当に話しにならなくて申し訳ありません;;

コード:

 
int Nummatrix(void); 
int Check(int);
int Tableinit(int n);
int Start(int n);
int Table(int);
int Drawkoma(int x, int y, int n);
int Move(int n, char S);
int Select(int n); 


しかし、この質問の1こめのプログラミングを実行すると、

大きさは?と聞かれ、
1~10の数字に反応するようになっています。
授業で使用できるパソコンでしか、作業できないので、
今手元に確かめる方法がなく、確かな記憶かはあいまいですが・・・
記憶の限りでは、そこで、

と入力すると、たて2列よこ2列の表、つまり

1 2
3 *

という表示がされ、

10と入力すると、
1  2  3  4 5  6  7  8  9 10
11 12 13 14 ・・・




・・・                ・・・ 99 *

という表が出現するはずです。

それに、さらに
I
と入力すると、*という駒が上に移動し、*の駒の上にあった数字がもともと*があった場所に移動されます。

J
と入力すると、*が左に移動し、*の左にあった数字がもともと*があった場所に移動します。

K
と入力すると、*が右に移動し、*の右にあった数字がもともと*のあった場所に移動します。

M
と入力すると、*が下に移動し、*の下にあった数字がもともと*のあった場所に移動します。


と入力すると、ゲームが終了されます。


わかりますでしょうか??;;
どうぞ、今後ともよろしくお願い致します;;

アバター
bitter_fox
記事: 607
登録日時: 14年前
住所: 大阪府

Re: 授業の課題でゲームの作成しているのですが、さっぱりわかりません…助けて下さい…お願いします;;

#4

投稿記事 by bitter_fox » 14年前

MH さんが書きました: 次に、提出期限は1月12日水曜日です・・・
提出期限によってどうしても回答がほしい場合は皆様に理解がいただければ・・・とのことでしたので、どうか少しでもお助けしていただければさいわいです;;
了解です。非常に迫ってきてますので、可及的速やかなご返答をお願いします。
MH さんが書きました:次に、「なるべく簡単に、早く良くシャッフルできるように」とは、先生が言っていたもので、よりそうシャッフルできれば、成績がよくなるのだと思われます。しかし、今は良い成績にかかわらず、とりあえず課題を形にしたいのが一心ですので、ある程度でもそうなるようにしていただければそれだけで十分です;;
解りました。
まず、シャッフルするプログラムを挿入する場所はわかりますでしょうか?

次に、問題を小さくして考えてみましょう。
配列n[10]があった時、
この配列に1~10の値をランダムに代入することはできますでしょうか?
MH さんが書きました:わかりますでしょうか??;;
どうぞ、今後ともよろしくお願い致します;;
繰り返しになりますが、この課題を完成させるのは、僕ではなくMHさんです。

[hr][追記]
「まず、前回の質問の返答ということですが、」
ここで終わってしまっています、続きをお願いします。

閉鎖

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