C++ コンソール

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

C++ コンソール

#1

投稿記事 by 初見 » 11年前

はじめまして!
コンソールのプロジェクトでプログラミングしています。
クラス設計で画面遷移を組み込もうとしていて…
色々クラス設計がうまくいかず困って画面遷移の組み込みを教えて頂ける方を募集しています。

タイトル、リザルトをお聞きしたいと思っています。
尚こちらで参考になる文章での説明でも構いません。

また、可能であればスカイプかメールで考えています。


返信おまちしております。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#2

投稿記事 by softya(ソフト屋) » 11年前

はじめまして。
この掲示板としては、後々の人のために記録に残る掲示板でのやりとりをお願いします。ここは出会い・紹介系の掲示板ではありませんので。
さて、本題ですがソースコードがあると話が進みやすいと思います。
あるいは、うまく行かなかったクラス設計の構想でも構いません。
それと念の為にお聞きしますが、課題ではありませんか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初見

Re: C++ コンソール

#3

投稿記事 by 初見 » 11年前

softya(ソフト屋) さんが書きました:はじめまして。
この掲示板としては、後々の人のために記録に残る掲示板でのやりとりをお願いします。ここは出会い・紹介系の掲示板ではありませんので。
さて、本題ですがソースコードがあると話が進みやすいと思います。
あるいは、うまく行かなかったクラス設計の構想でも構いません。
それと念の為にお聞きしますが、課題ではありませんか?
課題ではありませんが記載いたします。

コンソールのプロジェクトで画面遷移のクラス設計を教えて頂ければと思います。

クラス設計で説明してくれる方お待ちしております。
タイトル、ゲームというかメイン(中身は特にいりません。)リザルトがクラス化しているサンプルまたは説明お待ちしております。

私個人の技量としてはクラス化前には画面遷移は作成したことあります。

クラス化しようと挑戦しましたが挫折したのでお力をお貸し頂ければと思っています。

コード:

//=====================================================================================

//=====================================================================================
#include <stdio.h>		    //stdio.hをインクルード
#include <stdlib.h>			//stdlib.hをインクルード
#include <conio.h>		    //conio.hをインクルード
#include <time.h>	        //time.hをインクルード
#include "main.h"

//グローバル変数
int stage[21][12]= {0};		//壁と固定済みブロック用
int block[4][4]  = {0};	    //現在落下中のブロックを入れる
int field[21][12] ={0};     //描画するデータ。stage[][]にblock[][]を重ねたもの

//7種類のブロックのデータ
int block_list[7][4][4] =
{{{0,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,1,0,0}},

{{0,0,0,0},
{0,1,1,0},
{0,1,0,0},
{0,1,0,0}},

{{0,0,1,0},
{0,1,1,0},
{0,1,0,0},
{0,0,0,0}},

{{0,1,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,0,0}},

{{0,0,0,0},
{0,1,0,0},
{1,1,1,0},
{0,0,0,0}},

{{0,0,0,0},
{0,1,1,0},
{0,1,1,0},
{0,0,0,0}},

{{0,0,0,0},
{0,1,1,0},
{0,0,1,0},
{0,0,1,0}}};

int y = 0;									//ブロックの画面上でのy座標
int x = 4;								    //ブロックの画面上でのx座標
int oneline, twoline, threeline, fourline;  //消したラインの数
int gameover = 0;							//ゲームオーバー判定。新しいブロックが初期位置に置けなければ1になる。

//関数プロトタイプ宣言
void Initialize();							//ゲーム起動直後 初期設定を行う関数。画面と壁のデータを初期化
int  CreateBlock();							//新しいブロックを生成して次のブロックに発生させる
void ShowGameField();						//field[][]の中身に応じて、画面を描画する
void ControlBlock();						//キー入力に応じてブロックに移動や回転等の処理を行わせる
//=====================================================================================
// ブロック処理一覧
//=====================================================================================
int  CheckOverlap(int, int);				//落下中ブロックが壁や固定済みブロックに接触していないか判別
void MoveBlock(int, int);					//落下中ブロックを一旦消して、任意の座標に移動させる

int  TurnBlock();							//ブロックの回転を処理する
void DropBlock();							//ブロックを落下させる。下に移動できない場合ブロックをその位置に固定
void LockBlock();							//着地したブロックを固定済みブロックに加える関数
void CheckLines();							//ブロックが横一列にそろえばそこを消去後、上のブロックをそこに下ろす

#define SCREEN_CENTER_X //タイトル用
#define SCREEN_CENTER_Y //タイトル用
void SceneTitle();

static GAMEMODE eGameMode = GAMEMODE_TITLE;
static GAMEMODE ePreGameMode = eGameMode;
//=====================================================================================
// メイン関数開始
//=====================================================================================
int main()
{

	int time = 0; //時間をカウント
	//Initialize(); //初期化(描画実行)
	//ゲームオーバーになるまでゲーム続行
	while(!gameover)
	{
		if(ePreGameMode != eGameMode)
		{
			//シーンの変更が行われた
			Initialize();

			//プリデータ更新
			ePreGameMode = eGameMode;
		}
		if(eGameMode == GAMEMODE_TITLE)
		{
			//タイトル画面処理
			SceneTitle();
		}
		else if(eGameMode == GAMEMODE_MAIN)
		{
			if(kbhit())
			{
				ControlBlock();
			}
			//時間がきたらブロックを1マス落下させる。時間が来てなければ時間を1だけインクリメント。
			if(time < 20000)
			{
				time++;
			}
			else{
				DropBlock();
				time = 0;
			}
		}
		//キー入力があればそれに応じて操作
	}
	return 0;
}
//=====================================================================================
// メイン関数終了
//=====================================================================================
//ゲームの初期化
void Initialize()
{
	int i, j; //for文ループ制御用変数

	//画面と壁を初期設定
	for(i = 0; i <= 20; i++)
	{
		for(j = 0; j <= 11; j++)
		{
			if((j == 0) || (j == 11) || (i == 20)) 
			{
				field[i][j] = stage[i][j] = 9;
			}
			else {
				field[i][j] = stage[i][j] = 0;
			}
		}
	}
	CreateBlock(); //最初のブロック発生させる
	ShowGameField(); //ゲーム直後の画面を描画
}
//ブロック作成
int CreateBlock()
{
	int i, j; //forループ制御用の変数
	int block_type; //ブロックの種類用。0~6の乱数を入れる

	//まずブロックの座標を初期位置にリセット
	y = 0;
	x = 4;
	//乱数を発生させ、その乱数を7で割った余り(0~6まで)でブロックの種類を決定
	srand((unsigned)time(NULL));
	block_type = rand() % 7;

	//ブロックデータの中からblock_typeに応じた種類のブロックを読み込む
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			block[i][j] = 0;
			block[i][j] = block_list[block_type][i][j];
		}
	}
	//壁+ブロックをフィールドへ
	for(i = 0; i<4; i++) 
	{
		for(j = 0; j<4; j++) 
		{
			field[i][j+4] = stage[i][j+4] + block[i][j];

			//初期位置に置いたブロックが既に固定ブロックに重なっていればゲームオーバー
			if(field[i][j+4] > 1)
			{
				gameover = 1;
				return 1;
			}
		}
	}
	return 0;
}
//画面表示
void ShowGameField()
{
	int i, j; //forループ制御用変数

	//画面を一旦クリア
	system("cls");//内部のシステムから

	//データに応じてブロックや空白を画面表示
	for(i = 0; i<21; i++) {
		for(j = 0; j < 12; j++) {

			switch(field[i][j]) {
										case 0:
											printf("  ");
											break;
										case 9:
											
											printf("□");
											
											break;
										default:
										

											printf("■");
										
											break;
			}
		}
		printf("\n");
	}
	
	//ゲームオーバーの場合はGAME OVERを表示
	if(gameover){
		system("cls");
		printf("GAME OVER");
		getchar();//キーが押されるまで待機
	}
}
//キー入力に応じてブロックを処理
void ControlBlock()
{
	char key;      //受け付けたキーを保存する変数

	key = getch(); //キーから一文字入力

	//キーに応じて各方向へブロックを移動したり、回転させたりする
	switch(key) {
					case 's'://右キー
						if(!CheckOverlap(x+1, y)) 
						{
							MoveBlock(x+1, y);
						}
						break;
					case 'f'://左キー
						if(!CheckOverlap(x-1, y))
						{
							MoveBlock(x-1, y);
						}
						break;
					case 'd'://中心キー
						if(!CheckOverlap(x, y+1))
						{
							MoveBlock(x, y+1);
						}
						break;
					case ' ':
						TurnBlock();
	}
}	
//重なり検査
int CheckOverlap(int x2, int y2)
{
	int i, j; //forループ制御用変数

	//ブロックが向かう位置に、固定ブロックもしくは壁があるかどうかを検査
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			if(block[i][j]) {
				if(stage[y2 + i][x2 + j] != 0) {
					return 1;
				}
			}
		}
	}
	return 0;
}
//移動
void MoveBlock(int x2, int y2)
{
	int i, j; //forループ制御用変数

	//今までのブロックを消して
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			field[y+i][x+j] -= block[i][j];
		}
	}
	//ブロックの座標を更新
	x = x2;
	y = y2;
	//新しい座標にブロックを入れなおし
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			field[y+i][x+j] += block[i][j];
		}
	}
	ShowGameField();
}
//ブロックを回転する処理
int TurnBlock()
{
	int i, j;				//forループ制御用
	int temp[4][4] = {0};   //ブロックを一時保存するための配列

	//ブロックを回転する前にtempにセーブ
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			temp[i][j] = block[i][j];
		}
	}
	//ブロックを回転
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			block[i][j] = temp[3-j][i];
		}
	}
	//重なってるブロックが出てしまったらブロックを回転前に戻して中止
	if(CheckOverlap(x, y)) {
		for(i = 0; i<4; i++) {
			for(j = 0; j<4; j++) {
				block[i][j] = temp[i][j];
			}
		}
		return 1;
	}
	//一旦フィールドからブロック消して回転後のブロックを再表示
	for(i = 0; i<4; i++) {
		for(j = 0; j<4; j++) {
			field[y+i][x+j] -= temp[i][j];
			field[y+i][x+j] += block[i][j];
		}
	}
	ShowGameField();

	return 0;
}
//ブロックを落とす
void DropBlock()
{
	//重なりがなければ移動
	if(!CheckOverlap(x, y+1)) {
		MoveBlock(x, y+1);
	}
	//重なりがあれば壁にする
	else{
		LockBlock();
		CreateBlock();
		ShowGameField();
	}
}
//着地後のブロックを固定し、横一列がそろってるかの判定を呼び出す
void LockBlock()
{
	int i, j;		//forループ制御用変数

	//ブロックを壁に加える
	for(i = 0; i<21; i++) {
		for(j = 0; j<12; j++) {
			stage[i][j] = field[i][j];
		}
	}
	CheckLines();   //横一列がそろってるか判定して処理する関数を呼ぶ

	//列完成判定後の壁をフィールドへ
	for(i = 0; i<21; i++) {
		for(j = 0; j<12; j++) {
			field[i][j] = stage[i][j];
		}
	}
}
//横一列が完成しているか検査。そろっていればそこを消して上のブロック群を下ろす
void CheckLines()
{
	int i, j, k;   //forループ制御用
	int comp;      //横一列がそろっていれば1、一つでも隙間があると0になる
	int lines = 0; //同時に消したラインの数

	while(1) 
	{
		for(i = 0; i<20; i++)
		{
			comp = 1;

			for(j = 1; j<11; j++)
			{
				if(stage[i][j] == 0) 
				{
					comp = 0;
				}
			}
			if(comp == 1) break;
		}
		if(comp == 0) break;

		lines++;
		// 列を消去
		for(j = 1; j<11; j++) 
		{
			stage[i][j] = 0;
		}
		//消えた列より上にあった固定ブロックを列の消えたところへ下ろす
		for(k = i; k>0; k--) {
			for(j = 1; j<11; j++) {
				stage[k][j] = stage[k-1][j];
			}
		}
	}
	//同時に消したラインの数をカウント
	switch(lines) 
	{
	case 1:
		oneline++;
		break;
	case 2:
		twoline++;
		break;
	case 3:
		threeline++;
		break;
	case 4:
		fourline++;
		break;
	default:
		break;
	}
}
//初期タイトル画面処理
void SceneTitle(){
	
	printf("TTTTT");

	printf("T");

	printf("T");
	
	printf("T");
	
	printf("T");
	//=====================
	//ここまでがTをprintf
	//=====================
	
	printf("EEEE");

	printf("E");

	printf("EEE");

	printf("E");

	printf("EEEE");
	//=====================
	//ここまでがEをprintf
	//=====================
	
	printf("TTTTT");

	printf("T");

	printf("T");

	printf("T");
	printf("T");
	//=====================
	//ここまでがTをprintf
	//=====================
	printf("RRR");
	printf("R    R");
	printf("RRRR");
	printf("R  R ");
	printf("R   R");
	//=====================
	//ここまでがRをprintf
	//=====================
	printf(" III ");
	printf("  I  ");
	printf("  I  ");
	printf("  I  ");
	printf(" III ");
	//=====================
	//ここまでがIをprintf
	//=====================
	printf(" SSS ");
	printf("S    ");
	printf(" SSS ");
	printf("S");
	printf(" SSS ");
	//=====================
	//ここまでがSをprintf
	//=====================
	printf("\n\n\n\n\n\n\n\n操作方法一覧\n");
	printf("\n右  移動Sキー\n下  移動Dキー\n左  移動Fキー");
	while(!kbhit());//キーが入力される待機
	eGameMode = GAMEMODE_MAIN;
}
あくまで確認ように掲載いたします。
下手にあえとファイル分割を崩しています。
一応コンパイル通ります。
こちらを参考に画面遷移の部分でも構いませんクラス設計に直して説明頂けると幸いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#4

投稿記事 by softya(ソフト屋) » 11年前

いきなり、このソースコードに手を付けるのは無謀だと思いますので、とりあえずTitle、Game、Resultクラスをmainから呼ぶのを作ってみてもらえますか。
中身は、printfでprintf("タイトル");な感じだけあれば十分です。
クラスに対しての理解度も知りたいので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初見

Re: C++ コンソール

#5

投稿記事 by 初見 » 11年前

softya(ソフト屋) さんが書きました:いきなり、このソースコードに手を付けるのは無謀だと思いますので、とりあえずTitle、Game、Resultクラスをmainから呼ぶのを作ってみてもらえますか。
中身は、printfでprintf("タイトル");な感じだけあれば十分です。
クラスに対しての理解度も知りたいので。
すみませんクラス化を正しく理解出来ていないため記載して下手な回答になってしまうので
正直こちらで掲載出来かねます。

本当に申し訳ないですが…解答というかクラス化したもので説明お願いします。


それからこちらで疑問に思ったことがあれば質問したいと思っています。
また、私自身で一から考えてみたいと思っています。

大変申し訳ないですが…お力をお貸しくだされば幸いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#6

投稿記事 by softya(ソフト屋) » 11年前

恥ずかしくて書けないと言うことでしょうか? だれでも最初は無茶苦茶で下手くそですよ。 
理解度が分からないと回答しても無駄足に成ることが多いのでお願いしたわけです。

あと、元のコードをクラス化しては提供しないつもりです。それでは、勉強になりませんので。
出てくる元のコードも不十分ながらクラス化されていると思ったのですが、C言語のまま出てきたので予想外でした。
なお、これを最初にクラス化するのは絶対に避けてください。
最初にやるには複雑すぎると思います。

と言うことでサンプルを書きますのでお待ちください。
※ 下記の件の説明があるまで保留いたします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#7

投稿記事 by softya(ソフト屋) » 11年前

ところですいませんが、こちらのコードとそっくりなのですがご自分で作られたものではないと言うことでしょうか?
「テトリス - AFTER★SE7EN」
http://d.hatena.ne.jp/Kow/20111103/1320289940
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初見

Re: C++ コンソール

#8

投稿記事 by 初見 » 11年前

softya(ソフト屋) さんが書きました:ところですいませんが、こちらのコードとそっくりなのですがご自分で作られたものではないと言うことでしょうか?
「テトリス - AFTER★SE7EN」
http://d.hatena.ne.jp/Kow/20111103/1320289940
連絡ありがとうございます。

こちらかは分かりませんが別のサイトにて許可頂き掲載しました。
一部改編しています。
出来れば上記にコードで実践して説明して頂ければ幸いです。
または、ゲーム自体は必要はなく画面遷移をクラス設計している状態のクラス化が確認したいのです。
色々無理を承知で頼んでいますが…

引き続きよろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#9

投稿記事 by softya(ソフト屋) » 11年前

> または、ゲーム自体は必要はなく画面遷移をクラス設計している状態のクラス化が確認したいのです。

テトリス以外の簡単ならサンプルならお引き受けします。
ちゃんとクラスを使いオブジェクト指向で、簡単なサンプルならお見せできます。
デザインパターンのstateパターンを使う予定です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初見

Re: C++ コンソール

#10

投稿記事 by 初見 » 11年前

softya(ソフト屋) さんが書きました:> または、ゲーム自体は必要はなく画面遷移をクラス設計している状態のクラス化が確認したいのです。

テトリス以外の簡単ならサンプルならお引き受けします。
ちゃんとクラスを使いオブジェクト指向で、簡単なサンプルならお見せできます。
デザインパターンのstateパターンを使う予定です。
度々回答ありがとうございます。
テトリス以外で構いません。
むしろこちらの要望にお応え手いただき感謝いたします。
基本的に画面遷移が確認できれば参考になるのですみませんがよろしくお願いします。
これで基本的に質問はまとまったので最後にします。

解決できましたらこちらから書き込みいたします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#11

投稿記事 by softya(ソフト屋) » 11年前

何かキーを押すと次の画面状態に遷移するサンプルです。
ご要望の通りにクラスである効用を使っております。

コード:

#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std; 


class GameBase;
class GameState {
private:
	GameBase *mNowGameState;
public:
	GameState()
	{
		mNowGameState = NULL;
	}
	~GameState()
	{
		clear();
	}
	void set(GameBase *GameState)
	{
		clear();
		mNowGameState = GameState;
	}
	GameBase * get()
	{
		return mNowGameState;
	}
	bool isEnd() {
		return mNowGameState == NULL;
	}
private:
	void clear()
	{
		if( mNowGameState != NULL ) {
			delete mNowGameState;
		}
	}
};

class GameBase {
private:
	bool mbNextState;
public:
	GameBase() {
		mbNextState = false;
	}
    void keyAction()
    {
		mbNextState = true;
	}
    void run(GameState &gameState)
    {
		if( mbNextState ) {
			gameState.set(getNextState());
		} else {
			view();
		}
	}
	virtual void view() = 0;
	virtual GameBase* getNextState() = 0;
};


class GameResult : public GameBase {
public:
	void view()
    {
		cout << "Game Over" << endl;
	}
	GameBase* getNextState()
    {
		cout << "to End" << endl;
		return NULL;
	}
};

class GameMain : public GameBase {
public:
	void view()
    {
		cout << "Game" << endl;
	}
	GameBase* getNextState()
    {
		cout << "to Result" << endl;
		return new GameResult();
	}
};

class GameTitle : public GameBase {
public:
	void view()
    {
		cout << "Title" << endl;
	}
	GameBase* getNextState()
    {
		cout << "to Main" << endl;
		return new GameMain();
	}
};

class GameMng {
private:
	GameState mGameState;
public:
	GameMng()
	{
		mGameState.set(new GameTitle());
	}
	void action()
	{
		GameBase *nowGame = mGameState.get();
		if( _kbhit() && _getch() ) {
			nowGame->keyAction();
		} else {
			nowGame->run(mGameState);
		}
	}
	bool isEnd()
	{
		return mGameState.isEnd();
	}
};

int main()
{
	GameMng gameMng;

 	while( !gameMng.isEnd() ) {
		gameMng.action();
        Sleep( 20 );
        system("cls");
    }
	
    return 0;
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初見

Re: C++ コンソール

#12

投稿記事 by 初見 » 11年前

softya(ソフト屋) さんが書きました:何かキーを押すと次の画面状態に遷移するサンプルです。
ご要望の通りにクラスである効用を使っております。

コード:

#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std; 


class GameBase;
class GameState {
private:
	GameBase *mNowGameState;
public:
	GameState()
	{
		mNowGameState = NULL;
	}
	~GameState()
	{
		clear();
	}
	void set(GameBase *GameState)
	{
		clear();
		mNowGameState = GameState;
	}
	GameBase * get()
	{
		return mNowGameState;
	}
	bool isEnd() {
		return mNowGameState == NULL;
	}
private:
	void clear()
	{
		if( mNowGameState != NULL ) {
			delete mNowGameState;
		}
	}
};

class GameBase {
private:
	bool mbNextState;
public:
	GameBase() {
		mbNextState = false;
	}
    void keyAction()
    {
		mbNextState = true;
	}
    void run(GameState &gameState)
    {
		if( mbNextState ) {
			gameState.set(getNextState());
		} else {
			view();
		}
	}
	virtual void view() = 0;
	virtual GameBase* getNextState() = 0;
};


class GameResult : public GameBase {
public:
	void view()
    {
		cout << "Game Over" << endl;
	}
	GameBase* getNextState()
    {
		cout << "to End" << endl;
		return NULL;
	}
};

class GameMain : public GameBase {
public:
	void view()
    {
		cout << "Game" << endl;
	}
	GameBase* getNextState()
    {
		cout << "to Result" << endl;
		return new GameResult();
	}
};

class GameTitle : public GameBase {
public:
	void view()
    {
		cout << "Title" << endl;
	}
	GameBase* getNextState()
    {
		cout << "to Main" << endl;
		return new GameMain();
	}
};

class GameMng {
private:
	GameState mGameState;
public:
	GameMng()
	{
		mGameState.set(new GameTitle());
	}
	void action()
	{
		GameBase *nowGame = mGameState.get();
		if( _kbhit() && _getch() ) {
			nowGame->keyAction();
		} else {
			nowGame->run(mGameState);
		}
	}
	bool isEnd()
	{
		return mGameState.isEnd();
	}
};

int main()
{
	GameMng gameMng;

 	while( !gameMng.isEnd() ) {
		gameMng.action();
        Sleep( 20 );
        system("cls");
    }
	
    return 0;
}

解答ありがとうございます。
可能であれば#include <iostream>ではなく#include <stdio.h> を使ったものは用意できますか?
#include <iostream>に依存しているインクルードではないもで対応頂ければ幸いです。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#13

投稿記事 by softya(ソフト屋) » 11年前

#include <iostream>がC++としては良いと思いますがダメな理由を教えて下さい。

【追記】
と言うよりも <iostream>とか<stdio.h>などC++の勉強としては瑣末な問題です。
クラスの勉強用なので、そのまま元のコードが動く必要性も無いはずです。

【補足】
ちなみに、元のテトリスコードをそのまま流用できない形でわざと組んであります。
テトリスは必要ないと言われたので間違いないですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

初見

Re: C++ コンソール

#14

投稿記事 by 初見 » 11年前

softya(ソフト屋) さんが書きました:#include <iostream>がC++としては良いと思いますがダメな理由を教えて下さい。

【追記】
と言うよりも <iostream>とか<stdio.h>などC++の勉強としては瑣末な問題です。
クラスの勉強用なので、そのまま元のコードが動く必要性も無いはずです。

【補足】
ちなみに、元のテトリスコードをそのまま流用できない形でわざと組んであります。
テトリスは必要ないと言われたので間違いないですよね?
回答ありがとうございます。
#include <iostream>元のコードを動かすというか私個人としては<iostream>を触ったことがないのとこれからも使う予定がないため
出来れば<iostream>を使わないで画面遷移が確認できれば基本的に解決するのでよろしくお願います。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#15

投稿記事 by softya(ソフト屋) » 11年前

C++の勉強のためにもiostreamを使ってください。
C++の特徴であるオペレータのオーバーロードの良い見本です。

【補足】
これから長い勉強なのに課題でもないなら急ぐ理由はないはずです。

【ついでに補足】
初心者なら絶対質問してくるはずの記述方法で書いてあります。コード自体の疑問はないのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: C++ コンソール

#16

投稿記事 by へにっくす » 11年前

初見 さんが書きました:#include <iostream>元のコードを動かすというか私個人としては<iostream>を触ったことがないのとこれからも使う予定がないため
出来れば<iostream>を使わないで画面遷移が確認できれば基本的に解決するのでよろしくお願います。
じゃあわざわざC++使ってクラス化する必要無いじゃん。
何でそこにこだわるの?
課題じゃないのでしょう?
ここは質問に答えるところですよ。何かを作ってもらうところじゃありません。
written by へにっくす

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++ コンソール

#17

投稿記事 by みけCAT » 11年前

申し訳ありませんが、softya(ソフト屋)さんを批判したいと思います。
なぜ画面遷移のクラス設計の話をしているのに、オペレータのオーバーロードが出てくるのですか?
確かにC++を学ぶ上では重要かもしれないですが、今でなくてもいいのではないでしょうか?

coutで出力している場所を全てputsでの出力に置き換えれば、iostreamを使う必要は無くなるはずです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: C++ コンソール

#18

投稿記事 by softya(ソフト屋) » 11年前

みけCAT さんが書きました:申し訳ありませんが、softya(ソフト屋)さんを批判したいと思います。
なぜ画面遷移のクラス設計の話をしているのに、オペレータのオーバーロードが出てくるのですか?
確かにC++を学ぶ上では重要かもしれないですが、今でなくてもいいのではないでしょうか?

coutで出力している場所を全てputsでの出力に置き換えれば、iostreamを使う必要は無くなるはずです。
すいません。強要するつもりはないです。
勉強する姿勢としての話として描かせていただきました。
そもそも<iostream>を変える事はC/C++を理解していれば全然難しい話ではないと思いますが、どう思われますでしょうか。
この質問は言語の勉強の話だと私は思っているのですが、<iostream>から変えること自体も学びになると思います。
そのコードをそのまま載せてはせっかくの機会がなくなるので意味が無い気がしました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: C++ コンソール

#19

投稿記事 by みけCAT » 11年前

softya(ソフト屋) さんが書きました:すいません。強要するつもりはないです。
勉強する姿勢としての話として描かせていただきました。
わかりました。確かにいろいろな要素に触れるのも良い事だと思います。
softya(ソフト屋) さんが書きました:そもそも<iostream>を変える事はC/C++を理解していれば全然難しい話ではないと思いますが、どう思われますでしょうか。
この質問は言語の勉強の話だと私は思っているのですが、<iostream>から変えること自体も学びになると思います。
そのコードをそのまま載せてはせっかくの機会がなくなるので意味が無い気がしました。
同意します。
自分で考えるそぶりを見せずに、何でも人に聞きまくるのは良くないと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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