ページ 11

授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 07:09
by ティキタカ
今月からC++の講義を大学で取っています。英語なのですがいまいち教授が何をしたいのかわかっていません。
パックマンゲームのようなものを作れと教授は言っているのですが、下のやつを読む限り少し教授のものをかえれば提出可能のような気がしてなりません。すみませんが何か助言をいただけないでしょうか。
I will provide you with code to get you started on this program. You cannot modify my class code in any way and it must be included in your code that you turn in. This means that you will inherit from and you can either use some of what I write in my base class or you can override all of my member functions to create your own member functions but still use inheritance. Modifying my class in any way and/or not using inheritance to create an inherited class from my provided class will result in 30 points deduction in your project grade.

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 08:25
by みけCAT
とりあえず訳してみました。間違っていたらごめんなさい。

作業を始めるためのコードを差し上げます。
このクラスコードは全く書き換えてはいけません、そしてあなたが提出するコードに組み込まなければいけません。
ベースクラスを継承し、ベースクラスで書いたものの一部を利用することも、全メンバ関数をオーバーライドして自分でメンバ関数を作ることもできます。
提供するクラスを書き換えたり、提供するクラスから派生するクラスを継承を用いずに使った場合は、30点減点になります。

ポイントは
* 提供するコードの改変は厳禁
* 提供するクラスを継承しろ
ですね。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 09:44
by ティキタカ
返信ありがとうございます
私も同じ解釈です。これを読んで疑問に思ってしまい怖くてここで説明をお願いしたのは、普通は宿題は一から書くものだと思ったからです(実際にこの前はソースコードもなしにアウトプットと条件だけ渡されただけです)。今回の宿題に関しては、今渡されたものをoverrideとpointer(もうひとつ条件がありました)を使ったものに書き換えろという事だと思ってます。
ありがとうございます。一様やってみます。
あとで出来たものを乗っけようと思います。何卒よろしくお願いします。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 12:29
by ティキタカ
とりあえずclassの部分を作ったのですが、これに上の条件(inheritanceとoverride)当てはめれば良いのかわかりません
助けていただけると、幸いです。

コード:

#include<iostream>
#include<stdlib.h>
using namespace std;
const int MAX_HEIGHT = 60;
const int MAX_WIDTH = 60;

class PickUpGame
{
protected:
    char Screen [MAX_HEIGHT][MAX_WIDTH];
    int xPos, yPos;

public:
    PickUpGame():xPos(0),yPos(MAX_WIDTH-1)//constractor x and y positions to screen
    {
        SetupScreen();
    }
    
    void SetupScreen()//cursor position on the screen
    {
        for(int height = 0; height<MAX_HEIGHT; height++)
        {
            for(int width= 0; width< MAX_WIDTH; width++)
            {
            Screen[height][width]='.';
            }
        }
    Screen[xPos][yPos] = '<';
    }
    
    void print()//print the grid
    {
        for(int height = 0; height < MAX_HEIGHT; height++)
        {
            for (int width = 0;width < MAX_WIDTH; width++)
            {
                cout<<Screen[height][width];
            }
            cout<<endl;
        }
    }
    
    void Move(char Direction)//user input to move around the grid
    {
        switch(static_cast<int>(Direction))
        {
            case 72:
                Screen[xPos][yPos]=' ';
                xPos--;
                Screen[xPos][yPos]='^';
                break;
           
            case 80:
                Screen[xPos][yPos]=' ';
                xPos++;
                Screen[xPos][yPos]='v';
                break;
            
            case 75:
                Screen[xPos][yPos]=' ';
                yPos--;
                Screen[xPos][yPos]='<';
                break;
            
            case 77:
                Screen[xPos][yPos]=' ';
                yPos++;
                Screen[xPos][yPos]='>';
                break;
        }
    }
    
};

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 13:12
by ティキタカ
重ね重ね申し訳ありません。ようやく何をすれば良いのかわかってきました。
上のコードは公開されている部分に付け足して、いわゆるパックマンの部分を作ったわけですが、これにえさを十個ほど置いて、それを画面上にランダムに配置し、それを全て取りおわったら終了か、途中で退出するゲームを作りなさいという事でした。

コード:

int food()
    {
     return choockolate=(rand()%10+1);
    }
    void foodrocation()
    {
        
        for (int kazu=0; kazu<choockolate; kazu++)
            {
                cout<<"O"<<endl;
            }
 }
上のコードはランダムナンバーで1−10の間でえさの数を決めたのですが、これをどうやってフィールド上にランダムに配置して、なおかつ同じところに配置しないようにすれば良いですか??

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 13:25
by usao
オフトピック
話が不連続すぎて,読んでて付いていけません.


問題文が英語なので何をしたいのかいまいちわからない

与えられたものを継承して作ればいいらしいよ

やはりその解釈であっていたか

>class PickUpGame


何で?

前提条件として何かしら与えられたものを継承しろって言われてるんだから
何はともあれ派生するべきでは?
(それとも PickUpGame というのは継承して作るべき対象とは別のものなのでしょうか?)

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 13:54
by ティキタカ
本当に申し訳ありません。自分自身も何をしていいのか本当に混乱していました。
やる事がわかったので、書かせていただきます。
簡潔に言うとこのゲームはパックマンの敵がいないものを作りなさい、そしてフィールド上にランダムに配置したクッキーをただ全て集めたらゲームは終了です。
1コードが公開されていて、そのコードはパックマン自体をカーソルキーで動かすものでした。
2そのコードに1−10の間で乱数を取得し、例えば2ならばその数だけフィールドにランダムにえさを配置しなければ
なりません。
3全てのえさをとりきるか、qボタンを押した場合ゲームを終了できます
4クラスの継承、そしてメインにポインターを入れてコードを作らなければなりません。
上のクラスの部分がそのパックマン自体を動かすコードと、フィールドになります。
そして、上のfoodの部分はどうやってclassの部分にくっつけるのか、そしてランダムに配置するプログラムをどうやって書いていいのかわかってなくて困ったままになっているという感じです。

説明不足で、また後から気付いた部分が多いため、助けてもらう身であるのに説明がバラバラ申し訳ございません。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 13:59
by ティキタカ
すみません、ぼくの場合クッキーではなくてチョコレートと書いてあります。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 16:29
by usao
どの要素はできそうで,どの要素ができなそうなのかがいまいち解りかねるので,
「そんなことは わかりきってるよ」という事とかを書くことになるかもしれませんが…


>1コードが公開されていて、そのコードはパックマン自体をカーソルキーで動かすものでした。

(1)まずは,事実確認です.
提供されたクラスを仮に「クラスA」と呼ぶことにしましょう.
最初の状態として
クラスA と クラスA型のインスタンスを用いてゲームを進行する部分(メイン関数とかかな?) から成る
「パックマンを好き勝手に動かせちゃうぜ」というものが無事に動作する状態までが用意されている
ということでしょうか.
(もし,プログラムとして動作する状態までが用意されていないのであれば,まずはそこまでを作りましょう)



(2)何はともあれ クラスAを継承したクラスB を作りませんか.継承が要求されているので.
・クラスAを「単に継承しただけの」クラスBを作る.機能追加とかは一切してない最低限の状態.
・メイン側(?)で用いるクラスをAからBに変える.
この状態で無事に動くところがスタートラインな気がします.まずはここまで用意できますか?



(3)餌の配置
おそらく,ですが…「フィールドの初期状態を準備する」ためのメソッドがクラスAに存在しているのではないでしょうか.
(例えば,先にあなたが掲示した PickUpGame で言えば,SetupScreen()のようなのが存在していて,メインの最初らへんで呼ばれてたりとか.)

ランダムにN個のクッキーを配置する作業 は,そういう箇所をオーバーライドすれば実現できるのではありませんか.
(仮に,「そのランダムに配置する方法(アルゴリズム)ってのはどうするの?」ということがわからないのだとしても,
 とりあえず クラスAが準備する初期状態とは異なる状態(仮のもの:なんでもいいです)でフィールドを初期化するところまでを実現してください.
 そうすれば,あとは その部分のアルゴリズムの話 だけに絞られるので.)



>pointer(もうひとつ条件がありました)を使ったものに書き換えろ

…については,とりあえず後回しにするとして,以上まで できますか (or できていますか) ?

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月26日(火) 17:25
by ティキタカ
返信ありがとうございます
まずは(1)ですがその通りです。その動かせる範囲まで提示されています。
(2)と(3)についてですが、餌を配置するためにclassを継承して画面に配置しなければならないという事がなんとか理解できました、とにかくここまでわかっていて出来るところまで頑張ってみます。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 07:13
by ティキタカ
それっぽいものを作ってみました
しかしカーソルが動かないのと、えさ(チョコレート)が配置されません
メインの中のdoロープの所とチョコレートの配置のところがどうもおかしいです

コード:

#include<iostream>
#include<cstdlib>
#include<stdlib.h>//For system()
#include<conio.h>//For getche()エラーメッセージ
#include<time.h>

#define Tateyoko  40
using namespace std;

const int MAX_HEIGHT = Tateyoko;
const int MAX_WIDTH = Tateyoko;


class PickUpGame
{
protected:
    char Screen[MAX_HEIGHT][MAX_WIDTH];//The grid to print to the screen
    int xPos, yPos;//The current x and y postion of the users cursor on the grid
    char Tyocolate ='$';
public:
    //Constructor that will initialize the screen and x and y postions
    PickUpGame() : xPos(0), yPos(MAX_WIDTH - 1)
    {
        SetupScreen();// Initialize the grid
    }
    //Initialize the screen with all'.' characters and set the initial user cursor position on the gird
    
    void SetupScreen()
    {
        for (int height = 0; height < MAX_HEIGHT; height++)
        {
            for(int width = 0; width < MAX_WIDTH; width++)
            {
            Screen[height][width] = '.'; // initialize each grid position
            }
        }
    Screen[xPos][yPos] = '<';//Set the users initial cursor position
    }
    
    void Print()
    {
        for (int height = 0; height < MAX_HEIGHT; height++)
        {
            for(int width = 0; width < MAX_WIDTH; width++)
            {
                cout<< Screen[height][width];//Print the character at this location in the grid
            }
            cout<<endl; //After each row is printed, print a newline character
        }
    }
    void Move(char Direction)
    {
    switch(static_cast<int>(Direction))//Don't know the ASCII characters for the arrow keys so use the ASCII numbers
        {
        case 72: //Up arrow
            Screen[xPos][yPos] =' ';//Wipe oout the users current curosr
            xPos--;//Move the users x position on the gird
            Screen[xPos][yPos] ='^';//Move the users cursor
            break;
        case 80: //Down arrow
            Screen[xPos][yPos] =' ';
            xPos++;
            Screen[xPos][yPos] ='v';
            break;
        case 75: //Left arrow
            Screen[xPos][yPos] = ' ';
            yPos--;
            Screen[xPos][yPos] = '<';
            break;
        case 77: //Right arrow
            Screen[xPos][yPos] = ' ';
            yPos++;
            Screen[xPos][yPos] = '>';
            break;
         }
    }
};

class GetChocolate : public PickUpGame
{
private:
    int ZenbuNoChoco; //sum of chocolate
    int NokoriNoTyoco; //remining chocolate

public:
    GetChocolate()
    {
        SetupScreen(); // grid with chocolates
    }
   
    void Setupscreen()
    {
        int Yoko, Tate;
        
        ZenbuNoChoco = (rand() % 10) + 1;//get the chocolate numbers from 1 to 10
        
        for( int Oku = 1; Oku < ZenbuNoChoco; ++Oku )//チョコレートの配置. ここが少しおかしいと思います
        {
            Tate = (rand() % Tateyoko);
            Yoko = (rand() % Tateyoko);
            if(Screen[Tate][Yoko] != Tyocolate && Screen[Tate][Yoko] != Screen[xPos][yPos])//チョコが置けるかどうか
            {
                Screen[Tate][Yoko] = Tyocolate;
            }else Oku--;
        }
    }
    
    void MitsuketaChoco(int Takasa, int Haba)//見つけるごとにフィールド上のチョコが減って行く
    {
        if (Screen[xPos+Takasa][yPos+Haba] == Tyocolate)
        {
            ZenbuNoChoco--;
        }
        
    }
    void Ugoku (char *Tamesu)
    {
        bool Tsuzuku = false;
        switch(static_cast<int>(*Tamesu))
        {
            case 72:
                if (xPos - 1>= 0)
                    Tsuzuku = true;
                MitsuketaChoco(-1, 0);
                break;
            case 80:
                if (xPos + 1 < MAX_HEIGHT)
                    Tsuzuku = true;
                MitsuketaChoco(1, 0);
                break;
            case 75:
                if (yPos - 1>= 0)
                    Tsuzuku = true;
                MitsuketaChoco(0,-1);
                break;
            case 77:
                if (yPos + 1 < MAX_WIDTH)
                    Tsuzuku =true;
                MitsuketaChoco(0, 1);
                break;
        }
        if (Tsuzuku)
            PickUpGame::Move(*Tamesu);
        
        if (NokoriNoTyoco ==0)
            *Tamesu = 'q';
    }
    
      int SubeteChoco()
  {
      return ZenbuNoChoco;
  }
  int Nokoruchoko()
  {
      return NokoriNoTyoco;
  }
};
 int main()
{   srand(unsigned(time(NULL)));
    char chrUserMove = ' ';
    
    system("cls");//clear the screen before printing anything
    cout<<"Welcome to Cookie pickup. You will move to the cookies by using the arrow keys."<<endl;
    system("pause");
    do
    {
        GetChocolate *Game = new GetChocolate;
        do
        {
            system("cls");
            
            Game->Print();
            
            cout<<endl;
            cout<< "What direction would you like to move in?" <<endl;
            cout<< "(Move using the arrow keys or type q to Quite.)"<<endl;
            
            chrUserMove =_getche();//エラーメッセージ
            Game->Ugoku (& chrUserMove);
        }while(chrUserMove!= 'Q' && chrUserMove != 'q');
        system("cls");
        
        Game->Print(); cout<<endl;
        
        
        if (Game->Nokoruchoko() == 0)
          {
          cout<<" Congratulations  you found all cookies"<<endl;
          }
          cout<<"Would you like to play agin? (Y/N)";
        chrUserMove =_getche();//エラーメッセージ
    }while (chrUserMove != 'N');
    {
        return 0;
    }
}







Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 07:53
by ティキタカ
xcode を使ってmacで書いてます

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 09:38
by usao
ひょっとして
「これを継承しろ,そしてこれは一切変更するな」と言われているクラス
というのが PickupGame  ……なのでしょうか?


>カーソルが動かない
とりあえず
GetChocolate::Ugoku()内の各所で適当にデバッグ用の表示などを入れてみて
意図した通りに処理が進行しているかを確かめてみてはいかがでしょうか.
あと,MitsuketaChoco()内でScreen[][]の範囲外な箇所を参照しそうに見えます.


>えさ(チョコレート)が配置されません
GetChocolate::Setupscreen() は PickUpGame::SetupScreen() と名前が異なっています(タイプミスかな?)
GetChocolateのコンストラクタでは後者の SetupScreen() の側を呼んでいます.


あと,main()内でnewに対応したdeleteが無いような.

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 09:52
by ティキタカ
その通りです、継承しろと言われてるのがpickupgameというものでした。
餌のやつはタイプミスです、ありがとうございます。
GetChocolateのところいろいろ試してみます
main のとこ忘れてました、入れてみます。
ちなみに、macだと#include<conio.h>は使えないと思うのですが、何か第替え案ありますか?

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 12:40
by みけCAT
ティキタカ さんが書きました:ちなみに、macだと#include<conio.h>は使えないと思うのですが、何か第替え案ありますか?
Macで動くかはわかりませんが、8086runのソースコードが参考になるかもしれません。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 14:14
by ティキタカ
返信ありがとうございます
試しましたが、うまく行きませんでした。
1台パソコンを借りて今はビジュアルスタジオで開いています。
矢印は一様動くようにはなったのですが、動きはおかしくうまく行かないという感じです。

Re: 授業の一部なのですが(英語です)不安です

Posted: 2015年5月27日(水) 15:54
by ティキタカ
提出期限が来てしまったので提出します。
ここで助言をくださった方々本当にありがとうございました。