C++のメニュー画面

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
不知火
記事: 23
登録日時: 3年前

C++のメニュー画面

#1

投稿記事 by 不知火 » 3年前

初投稿です。私はオセロを作っていて、オセロ自体は様々なサイトを参考に作れたのですが、現在ゲームしか出来上がっておらず操作説明やルールを解説する
ページを作ろうとしています。http://dixq.net/g/sp_06.htmlのサイトを参考にして、 ... く作れず困っています
オセロ本体のソースです。

コード:

 
#include "DxLib.h"
#include <string>

int board[8][8]; // 盤のデータ(0:なし 1:黒コマ 2:白コマ)
std::string msg;
int msg_wait;

// 指定した位置にコマを置く
int putPiece(int x, int y, int turn, bool put_flag) {
	int sum = 0;
	if (board[y][x] > 0) return 0;
	for (int dy = -1; dy <= 1; dy++) for (int dx = -1; dx <= 1; dx++) {
		int wx[8], wy[8];
		for (int wn = 0;; wn++) {
			int kx = x + dx * (wn + 1); int ky = y + dy * (wn + 1);
			if (kx < 0 || kx > 7 || ky < 0 || ky > 7 || board[ky][kx] == 0) break;
			if (board[ky][kx] == turn) {
				if (put_flag) for (int i = 0; i < wn; i++) board[wy[i]][wx[i]] = turn;
				sum += wn;
				break;
			}
			wx[wn] = kx; wy[wn] = ky;
		}
	}
	if (sum > 0 && put_flag) board[y][x] = turn;
	return sum;
}

// パスチェック
bool isPass(int turn) {
	for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
		if (putPiece(x, y, turn, false)) return false;
	}
	return true;
}

// 思考ルーチン1 プレイヤー
bool think1(int turn) {
	static bool mouse_flag = false;
	if (GetMouseInput() & MOUSE_INPUT_LEFT) {
		if (!mouse_flag) {
			mouse_flag = true;
			int mx, my;
			GetMousePoint(&mx, &my);
			if (putPiece(mx / 48, my / 48, turn, true)) return true;
		}
	}
	else mouse_flag = false;
	return false;
}


// 思考ルーチン2 最も多く取れるところに置く
bool think2(int turn) {
	int max = 0, wx, wy;
	for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
		int num = putPiece(x, y, turn, false);
		if (max < num || (max == num && GetRand(1) == 0)) {
			max = num; wx = x; wy = y;
		}
	}
	putPiece(wx, wy, turn, true);
	return true;
}

// 思考ルーチン3 優先順位の高いところに置く
bool think3(int turn) {
	int priority‎[8][8] = {
		{ 0, 6, 2, 1, 1, 2, 6, 0 },
		{ 6, 6, 5, 4, 4, 5, 6, 6 },
		{ 2, 5, 2, 3, 3, 2, 5, 2 },
		{ 1, 4, 3, 3, 3, 3, 4, 1 },
		{ 1, 4, 3, 3, 3, 3, 4, 1 },
		{ 2, 5, 2, 3, 3, 2, 5, 2 },
		{ 6, 6, 5, 4, 4, 5, 6, 6 },
		{ 0, 6, 2, 1, 1, 2, 6, 0 },
	};
	int max = 0, wx, wy;
	for (int p = 0; p <= 6 && max == 0; p++) {
		for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
			if (priority‎[y][x] != p) continue;
			int num = putPiece(x, y, turn, false);
			if (max < num || (max == num && GetRand(1) == 0)) {
				max = num; wx = x; wy = y;
			}
		}
	}
	putPiece(wx, wy, turn, true);
	return true;
}

// メッセージセット
// turn ... 1:BLACK 2:WHITE 3:DRAW
// type ... 0:TURN 1:PASS 2:WIN!
void setMsg(int turn, int type) {
	std::string turn_str[] = { "黒", "白", "DRAW" };
	std::string type_str[] = { "ターン", "パス", "勝利!" };
	msg = turn_str[turn - 1];
	if (turn != 3) msg += " " + type_str[type];
	msg_wait = 50;
}

// 勝敗チェック
int checkResult() {
	int pnum[2] = {};
	int result = 0;
	for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
		if (board[y][x] > 0) pnum[board[y][x] - 1]++;
	}
	if (isPass(1) && isPass(2)) {
		if (pnum[0] > pnum[1]) result = 1;
		else if (pnum[0] < pnum[1]) result = 2;
		else result = 3;
	}
	if (result) setMsg(result, 2);
	return result;
}

// WinMain
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
	int pieces[2];
	int back;
	int status = 2; // 1:プレイ中 2:TURNメッセージ中 3:パスメッセージ中 4:終了
	int turn = 1; // 1:黒ターン 2:白ターン
	SetGraphMode(384, 384, 32);
	ChangeWindowMode(TRUE);
	DxLib_Init();
	SetDrawScreen(DX_SCREEN_BACK);
	LoadDivGraph("piece.png", 2, 2, 1, 48, 48, pieces);
	back = LoadGraph("back.png");
	board[3][3] = board[4][4] = 1;
	board[4][3] = board[3][4] = 2;
	setMsg(turn, 0);
	while (!ProcessMessage()) {
		ClearDrawScreen();
		switch (status) {
		case 1:
			if (isPass(turn)) {
				setMsg(turn, 1);
				status = 3;
			}
			else {
				bool(*think[])(int) = { think1, think2 };
				if ((*think[turn - 1])(turn)) {
					turn = 3 - turn; status = 2;
					setMsg(turn, 0);
				}
			}
			if (checkResult()) status = 4;
			break;
		case 2:
			if (msg_wait > 0) msg_wait--;
			else status = 1;
			break;
		case 3:
			if (msg_wait > 0) msg_wait--;
			else {
				turn = 3 - turn; status = 2;
				setMsg(turn, 0);
			}
			break;
		}
		DrawGraph(0, 0, back, FALSE);
		for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
			if (board[y][x]) DrawGraph(x * 48, y * 48, pieces[board[y][x] - 1], TRUE);
		}
		if (status > 1) {
			int mw = GetDrawStringWidth(msg.c_str(), msg.size());
			DrawBox(192 - mw / 2 - 30, 172, 192 + mw / 2 + 30, 208, GetColor(200, 180, 150), TRUE);
			DrawString(192 - mw / 2, 182, msg.c_str(), GetColor(255, 255, 255));
		}
		ScreenFlip();
	}
	DxLib_End();
	return 0;
}

 
このゲームにメニュー画面をつけるにはどのようなソースを追加すればいいのでしょうか? よろしくお願いします。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#2

投稿記事 by 不知火 » 3年前

ちなみに私はC言語を学校で習っています。
投稿したプログラムはDxLib_VC.propsを使用しています。

Math

Re: C++のメニュー画面

#3

投稿記事 by Math » 3年前

折角だけどpiece.pngとback.pngがなくてテスト出来ない...

Math

Re: C++のメニュー画面

#4

投稿記事 by Math » 3年前

[あISLeさんのプロパティシート(DxLib_VC.props)を使っているのですね。]
それを作られた方がここにおられますよ。

Math

Re: C++のメニュー画面

#5

投稿記事 by Math » 3年前

これhttp://dixq.net/g/sp_06.htmlはC++でC言語をマスターしても難しいレベルですよ。C++のクラスを使いこなすには時間がかかるのでまずはC言語でここhttp://dixq.net/g/sp_03.htmlから始めるといいと思いますよ。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#6

投稿記事 by 不知火 » 3年前

Math さんが書きました:折角だけどpiece.pngとback.pngがなくてテスト出来ない...
すいません添付するの忘れてました。これがpiece.pngとback.pngです。
添付ファイル
piece.png
piece.png (14.44 KiB) 閲覧数: 4596 回
back.png
back.png (2.17 KiB) 閲覧数: 4596 回

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#7

投稿記事 by 不知火 » 3年前

Math さんが書きました:これhttp://dixq.net/g/sp_06.htmlはC++でC言語をマスターしても難しいレベルですよ。C++のクラスを使いこなすには時間がかかるのでまずはC言語でここhttp://dixq.net/g/sp_03.htmlから始めるといいと思いますよ。
わかりましたありがとうございます。教えてもらった場所を参考にして、また分からなかったら聞きに来ます。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#8

投稿記事 by 不知火 » 3年前

再び質問させて頂きます。今度は上のオセロのソースをcppファイルとhファイルに分けたいのですが、どのように分ければいいですか? 自分で考えてみたのですがよく分からないのです。 よろしくお願いします。

Math

Re: C++のメニュー画面

#9

投稿記事 by Math » 3年前

変なコードが混じっていてエラーになっていました。今の所クラス宣言も分割コンパイルも行って居ないので.h(又は.hpp)に分ける必然性がないと思われます。
「コマンドライン・コンパイル」

コード:

D:\z\28\g3>g

D:\z\28\g3>nmake -f g.mak

Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /I"d:\dxlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

g1.cpp
        link /out:g1.exe /SUBSYSTEM:WINDOWS /LIBPATH:"d:\dxlib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" g1.obj
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

        g1.exe
コード

コード:

#include "DxLib.h"
#include <string>
 
int board[8][8]; // 盤のデータ(0:なし 1:黒コマ 2:白コマ)
std::string msg;
int msg_wait;
 
// 指定した位置にコマを置く
int putPiece(int x, int y, int turn, bool put_flag) {
    int sum = 0;
    if (board[y][x] > 0) return 0;
    for (int dy = -1; dy <= 1; dy++) for (int dx = -1; dx <= 1; dx++) {
        int wx[8], wy[8];
        for (int wn = 0;; wn++) {
            int kx = x + dx * (wn + 1); int ky = y + dy * (wn + 1);
            if (kx < 0 || kx > 7 || ky < 0 || ky > 7 || board[ky][kx] == 0) break;
            if (board[ky][kx] == turn) {
                if (put_flag) for (int i = 0; i < wn; i++) board[wy[i]][wx[i]] = turn;
                sum += wn;
                break;
            }
            wx[wn] = kx; wy[wn] = ky;
        }
    }
    if (sum > 0 && put_flag) board[y][x] = turn;
    return sum;
}
 
// パスチェック
bool isPass(int turn) {
    for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
        if (putPiece(x, y, turn, false)) return false;
    }
    return true;
}
 
// 思考ルーチン1 プレイヤー
bool think1(int turn) {
    static bool mouse_flag = false;
    if (GetMouseInput() & MOUSE_INPUT_LEFT) {
        if (!mouse_flag) {
            mouse_flag = true;
            int mx, my;
            GetMousePoint(&mx, &my);
            if (putPiece(mx / 48, my / 48, turn, true)) return true;
        }
    }
    else mouse_flag = false;
    return false;
}
 
 
// 思考ルーチン2 最も多く取れるところに置く
bool think2(int turn) {
    int max = 0, wx, wy;
    for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
        int num = putPiece(x, y, turn, false);
        if (max < num || (max == num && GetRand(1) == 0)) {
            max = num; wx = x; wy = y;
        }
    }
    putPiece(wx, wy, turn, true);
    return true;
}
 
// 思考ルーチン3 優先順位の高いところに置く
bool think3(int turn) {
    int priority[8][8] = {
        { 0, 6, 2, 1, 1, 2, 6, 0 },
        { 6, 6, 5, 4, 4, 5, 6, 6 },
        { 2, 5, 2, 3, 3, 2, 5, 2 },
        { 1, 4, 3, 3, 3, 3, 4, 1 },
        { 1, 4, 3, 3, 3, 3, 4, 1 },
        { 2, 5, 2, 3, 3, 2, 5, 2 },
        { 6, 6, 5, 4, 4, 5, 6, 6 },
        { 0, 6, 2, 1, 1, 2, 6, 0 },
    };
    int max = 0, wx, wy;
    for (int p = 0; p <= 6 && max == 0; p++) {
        for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
            if (priority[y][x] != p) continue;
            int num = putPiece(x, y, turn, false);
            if (max < num || (max == num && GetRand(1) == 0)) {
                max = num; wx = x; wy = y;
            }
        }
    }
    putPiece(wx, wy, turn, true);
    return true;
}
 
// メッセージセット
// turn ... 1:BLACK 2:WHITE 3:DRAW
// type ... 0:TURN 1:PASS 2:WIN!
void setMsg(int turn, int type) {
    std::string turn_str[] = { "黒", "白", "DRAW" };
    std::string type_str[] = { "ターン", "パス", "勝利!" };
    msg = turn_str[turn - 1];
    if (turn != 3) msg += " " + type_str[type];
    msg_wait = 50;
}
 
// 勝敗チェック
int checkResult() {
    int pnum[2] = {};
    int result = 0;
    for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
        if (board[y][x] > 0) pnum[board[y][x] - 1]++;
    }
    if (isPass(1) && isPass(2)) {
        if (pnum[0] > pnum[1]) result = 1;
        else if (pnum[0] < pnum[1]) result = 2;
        else result = 3;
    }
    if (result) setMsg(result, 2);
    return result;
}
 
// WinMain
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    int pieces[2];
    int back;
    int status = 2; // 1:プレイ中 2:TURNメッセージ中 3:パスメッセージ中 4:終了
    int turn = 1; // 1:黒ターン 2:白ターン
    SetGraphMode(384, 384, 32);
    ChangeWindowMode(TRUE);
    DxLib_Init();
    SetDrawScreen(DX_SCREEN_BACK);
    LoadDivGraph("d:/dat/piece.png", 2, 2, 1, 48, 48, pieces);
    back = LoadGraph("d:/dat/back.png");
    board[3][3] = board[4][4] = 1;
    board[4][3] = board[3][4] = 2;
    setMsg(turn, 0);
    while (!ProcessMessage()) {
        ClearDrawScreen();
        switch (status) {
        case 1:
            if (isPass(turn)) {
                setMsg(turn, 1);
                status = 3;
            }
            else {
                bool(*think[])(int) = { think1, think2 };
                if ((*think[turn - 1])(turn)) {
                    turn = 3 - turn; status = 2;
                    setMsg(turn, 0);
                }
            }
            if (checkResult()) status = 4;
            break;
        case 2:
            if (msg_wait > 0) msg_wait--;
            else status = 1;
            break;
        case 3:
            if (msg_wait > 0) msg_wait--;
            else {
                turn = 3 - turn; status = 2;
                setMsg(turn, 0);
            }
            break;
        }
        DrawGraph(0, 0, back, FALSE);
        for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
            if (board[y][x]) DrawGraph(x * 48, y * 48, pieces[board[y][x] - 1], TRUE);
        }
        if (status > 1) {
            int mw = GetDrawStringWidth(msg.c_str(), msg.size());
            DrawBox(192 - mw / 2 - 30, 172, 192 + mw / 2 + 30, 208, GetColor(200, 180, 150), TRUE);
            DrawString(192 - mw / 2, 182, msg.c_str(), GetColor(255, 255, 255));
        }
        ScreenFlip();
    }
    DxLib_End();
    return 0;
}

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#10

投稿記事 by inemaru » 3年前

C++でも良いなら、シーン管理はこんな感じですかね

ソース分割したものが必要であれば声かけてください

以下のスポイラーは似たような感じに動くように、コードを書いてみたもの
注意:
  • ソース分割なし
  • 適当に作成したので、ミスがあるかもしない
  • LoadGraph等のエラーチェックなし(元のコードのまま)
► スポイラーを表示

Math

Re: C++のメニュー画面

#11

投稿記事 by Math » 3年前

正常に作動しました。
Compile

コード:

D:\z\29\g3>g

D:\z\29\g3>nmake -f g.mak

Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /I"d:\dxlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

g1.cpp
        link /out:g1.exe /SUBSYSTEM:WINDOWS /LIBPATH:"d:\dxlib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" g1.obj
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

        g1.exe
Code

コード:

#include "DxLib.h"      // DxLib
#include <iostream>     // cerr
#include <array>        // array
#include <vector>       // vector
#include <functional>   // function
#include <memory>       // unique_ptr
#include <crtdbg.h>     // _CrtSetDbgFlag
 
// DXライブラリ簡易ラップクラス
struct DxLibApp final
{
    DxLibApp(const char* pWindowText = nullptr) try
        : windowWidth_(384)
        , windowHeight_(384)
        , colorBitDepth_(32)
    {
        if (pWindowText != nullptr){
            DxLib::SetWindowText(pWindowText);
        }
        SetGraphMode(windowWidth_, windowHeight_, colorBitDepth_);
        ChangeWindowMode(TRUE);
        if (DxLib_Init() == -1){
            throw "DXライブラリの初期化に失敗しました。";
        }
        SetDrawScreen(DX_SCREEN_BACK);
    }
    catch (char* errStr) {
        std::cerr << errStr << std::endl;
    }
 
    ~DxLibApp(){
        DxLib_End();
    }
 
    static bool ProcessLoop(){
        return (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0);
    }
 
    int windowWidth_;       // ウィンドウ横幅
    int windowHeight_;      // ウィンドウ縦幅
    int colorBitDepth_;     // カラービット数
};
 
// 簡易入力クラス
struct InputKey final
{
    InputKey()
        : keyBuffer_()
        , backKeyBuffer_()
    {}
 
    ~InputKey(){}
 
    inline int Update() {
        std::copy(keyBuffer_.begin(), keyBuffer_.end(), backKeyBuffer_.begin());
        return GetHitKeyStateAll(&keyBuffer_.front());
    }
 
    inline bool IsPress(const int keyCode) const {
        return keyBuffer_[keyCode] ? true : false;
    }
 
    inline bool IsDown(const int keyCode) const {
        return (keyBuffer_[keyCode] && !backKeyBuffer_[keyCode]);
    }
 
    inline bool IsUp(const int keyCode) const {
        return (!keyBuffer_[keyCode] && backKeyBuffer_[keyCode]);
    }
 
private:
    typedef std::array<char, 256> KeyStateBuffer;
 
    KeyStateBuffer  keyBuffer_;
    KeyStateBuffer  backKeyBuffer_;
};
 
// 色定義
struct Color final
{
    // Color型の内容
    union {
        unsigned long value;
        std::array<unsigned char, 4> d;
        struct {
            unsigned char b;
            unsigned char g;
            unsigned char r;
            unsigned char a;
        };
    };
 
    // コンパイル時定数
    template <unsigned char r, unsigned char g, unsigned char b, unsigned char a = 255>
    struct GetColor_RGBA final {
        enum : unsigned long {
            value = static_cast<unsigned long>(((a & 0xff) << 24) | ((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff))
        };
    };
    static const unsigned int White = GetColor_RGBA<255, 255, 255>::value;
 
    // アサート
    static_assert(sizeof(unsigned long) == (sizeof(unsigned char) * 4), "Color型が正常に動作しない環境です。");
};
 
// グローバル変数
static DxLibApp app("シーン変更");
static InputKey inputKey;
 
// シーン列挙
enum eScene : unsigned int
{
    Scene_Top,      // トップ画面
    Scene_Game,     // ゲーム画面
 
    Scene_Count     // シーン数
};
 
// Taskインターフェース
struct ITask {
    enum CommonResult : int
    {
        Result_OK = 0,
        Result_Faile = -1
    };
    virtual int Init() = 0; // 初期処理
    virtual int End() = 0;  // 終了処理
    virtual int Update() = 0;   // 更新処理
    virtual int Draw() = 0; // 描画処理
};
 
// Sceneインターフェース
struct IScene : public ITask
{
    IScene(){}
    virtual ~IScene(){}
    virtual void ChangeScene(eScene scene) = 0;
};
 
// Sceneアブストラクト
// (規定の動作を実装するクラス 必要に応じて継承して使う)
struct BaseScene : public IScene
{
    BaseScene(){}
    virtual ~BaseScene(){}
    virtual int Init() override {
        return CommonResult::Result_OK;
    }
    virtual int End() override {
        return CommonResult::Result_OK;
    }
};
 
// シーンコントローラ
struct SceneController final : public IScene
{
    SceneController()
        : sceneIndex_(0)
        , sceneArrayList_()
    {}
 
    ~SceneController(){}
 
    // Topシーン
    // (※ インナーが嫌だったら、適当にファイル分割して外に出す)
    struct TopScene final : public IScene
    {
        TopScene()
            : pSceneController_(nullptr)
        {}
        TopScene(SceneController* pSceneController)
            : pSceneController_(pSceneController)
        {}
 
        ~TopScene(){}
 
        int Init() override {
            return CommonResult::Result_OK;
        }
 
        int End() override {
            return CommonResult::Result_OK;
        }
 
        int Update() override {
            if (inputKey.IsDown(KEY_INPUT_Z)){
                this->ChangeScene(eScene::Scene_Game);
            }
            return CommonResult::Result_OK;
        }
 
        int Draw() override {
            DrawString(0, 0, "トップシーン\n(Zキーでゲームシーンに変更)", Color::White);
            return CommonResult::Result_OK;
        }
 
        void ChangeScene(eScene scene) override {
            pSceneController_->ChangeScene(scene);
        }
 
    private:
        SceneController*    pSceneController_;
    };
 
    // ゲームシーン
    // (※ インナーが嫌だったら、適当にファイル分割して外に出す)
    struct GameScene final : public IScene
    {
        GameScene()
            : GameScene(nullptr)
        {}
        GameScene(SceneController* pSceneController)
            : pSceneController_(pSceneController)
            , board()
            , msg()
            , msg_wait()
            , think({{
                std::bind(&GameScene::think1, this, std::placeholders::_1),
                std::bind(&GameScene::think2, this, std::placeholders::_1)
            }})
            , pieces()
            , back()
            , status(2)
            , turn(1)
        {
        }
 
        ~GameScene(){}
 
        int Init() override {
            DxLib::LoadDivGraph("piece.png", 2, 2, 1, 48, 48, &pieces.front());
            back = DxLib::LoadGraph("back.png");
            board[3][3] = board[4][4] = 1;
            board[4][3] = board[3][4] = 2;
            setMsg(turn, 0);
            return CommonResult::Result_OK;
        }
 
        int End() override {
            DxLib::InitGraph();
            return CommonResult::Result_OK;
        }
 
        int Update() override {
            if (inputKey.IsDown(KEY_INPUT_Z)){
                this->ChangeScene(eScene::Scene_Top);
            }
 
            switch (status) {
            case 1:
                if (isPass(turn)) {
                    setMsg(turn, 1);
                    status = 3;
                }
                else {
                    if (think[turn - 1](turn)) {
                        turn = 3 - turn; status = 2;
                        setMsg(turn, 0);
                    }
                }
                if (checkResult()) status = 4;
                break;
            case 2:
                if (msg_wait > 0) msg_wait--;
                else status = 1;
                break;
            case 3:
                if (msg_wait > 0) msg_wait--;
                else {
                    turn = 3 - turn; status = 2;
                    setMsg(turn, 0);
                }
                break;
            }
            return CommonResult::Result_OK;
        }
 
        int Draw() override {
            DrawGraph(0, 0, back, FALSE);
            for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
                if (board[y][x]) DrawGraph(x * 48, y * 48, pieces[board[y][x] - 1], TRUE);
            }
            if (status > 1) {
                int mw = DxLib::GetDrawStringWidth(msg.c_str(), msg.size());
                DxLib::DrawBox(192 - mw / 2 - 30, 172, 192 + mw / 2 + 30, 208, Color::GetColor_RGBA<200, 180, 150>::value, TRUE);
                DrawString(192 - mw / 2, 182, msg.c_str(), Color::White);
            }
            return CommonResult::Result_OK;
        }
 
        void ChangeScene(eScene scene) override {
            pSceneController_->ChangeScene(scene);
        }
 
    private:
 
        // 指定した位置にコマを置く
        int putPiece(int x, int y, int turn, bool put_flag) {
            int sum = 0;
            if (board[y][x] > 0) return 0;
            for (int dy = -1; dy <= 1; dy++) for (int dx = -1; dx <= 1; dx++) {
                int wx[8], wy[8];
                for (int wn = 0;; wn++) {
                    int kx = x + dx * (wn + 1); int ky = y + dy * (wn + 1);
                    if (kx < 0 || kx > 7 || ky < 0 || ky > 7 || board[ky][kx] == 0) break;
                    if (board[ky][kx] == turn) {
                        if (put_flag) for (int i = 0; i < wn; i++) board[wy[i]][wx[i]] = turn;
                        sum += wn;
                        break;
                    }
                    wx[wn] = kx; wy[wn] = ky;
                }
            }
            if (sum > 0 && put_flag) board[y][x] = turn;
            return sum;
        }
 
        // パスチェック
        bool isPass(int turn) {
            for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
                if (putPiece(x, y, turn, false)) return false;
            }
            return true;
        }
 
        // 思考ルーチン1 プレイヤー
        bool think1(int turn) {
            static bool mouse_flag = false;
            if (DxLib::GetMouseInput() & MOUSE_INPUT_LEFT) {
                if (!mouse_flag) {
                    mouse_flag = true;
                    int mx, my;
                    DxLib::GetMousePoint(&mx, &my);
                    if (putPiece(mx / 48, my / 48, turn, true)) return true;
                }
            }
            else mouse_flag = false;
            return false;
        }
 
 
        // 思考ルーチン2 最も多く取れるところに置く
        bool think2(int turn) {
            int max = 0, wx, wy;
            for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
                int num = putPiece(x, y, turn, false);
                if (max < num || (max == num && GetRand(1) == 0)) {
                    max = num; wx = x; wy = y;
                }
            }
            putPiece(wx, wy, turn, true);
            return true;
        }
 
        // 思考ルーチン3 優先順位の高いところに置く
        bool think3(int turn) {
            static const int priority?[8][8] = {
                { 0, 6, 2, 1, 1, 2, 6, 0 },
                { 6, 6, 5, 4, 4, 5, 6, 6 },
                { 2, 5, 2, 3, 3, 2, 5, 2 },
                { 1, 4, 3, 3, 3, 3, 4, 1 },
                { 1, 4, 3, 3, 3, 3, 4, 1 },
                { 2, 5, 2, 3, 3, 2, 5, 2 },
                { 6, 6, 5, 4, 4, 5, 6, 6 },
                { 0, 6, 2, 1, 1, 2, 6, 0 },
            };
            int max = 0, wx, wy;
            for (int p = 0; p <= 6 && max == 0; p++) {
                for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
                    if (priority?[y][x] != p) continue;
                    int num = putPiece(x, y, turn, false);
                    if (max < num || (max == num && GetRand(1) == 0)) {
                        max = num; wx = x; wy = y;
                    }
                }
            }
            putPiece(wx, wy, turn, true);
            return true;
        }
 
        // メッセージセット
        // turn ... 1:BLACK 2:WHITE 3:DRAW
        // type ... 0:TURN 1:PASS 2:WIN!
        void setMsg(int turn, int type) {
            std::string turn_str[] = { "黒", "白", "DRAW" };
            std::string type_str[] = { "ターン", "パス", "勝利!" };
            msg = turn_str[turn - 1];
            if (turn != 3) msg += " " + type_str[type];
            msg_wait = 50;
        }
 
        // 勝敗チェック
        int checkResult() {
            int pnum[2] = {};
            int result = 0;
            for (int y = 0; y < 8; y++) for (int x = 0; x < 8; x++) {
                if (board[y][x] > 0) pnum[board[y][x] - 1]++;
            }
            if (isPass(1) && isPass(2)) {
                if (pnum[0] > pnum[1]) result = 1;
                else if (pnum[0] < pnum[1]) result = 2;
                else result = 3;
            }
            if (result) setMsg(result, 2);
            return result;
        }
 
    private:
        SceneController*    pSceneController_;
 
        template <unsigned int size>
        struct Board {
            typedef std::array<std::array<int, size>, size> Type;
        };
        Board<8>::Type  board;      // 盤のデータ(0:なし 1:黒コマ 2:白コマ)
        std::string     msg;
        int             msg_wait;
 
        std::array<std::function<bool(int)>, 2> think;
        std::array<int, 2> pieces;
        int back;
        int status;             // 1:プレイ中 2:TURNメッセージ中 3:パスメッセージ中 4:終了
        int turn;               // 1:黒ターン 2:白ターン
    };
 
    int Init() override
    {
        // シーン登録
        sceneArrayList_.clear();
        sceneArrayList_.emplace_back(new (std::nothrow) TopScene(this));
        sceneArrayList_.emplace_back(new (std::nothrow) GameScene(this));
 
        // シーンの作成に失敗していたらfalseを戻す
        for (auto it = sceneArrayList_.begin(); it != sceneArrayList_.end(); ++it) {
            if (!(*it)){
                return CommonResult::Result_Faile;
            }
        }
        sceneIndex_ = eScene::Scene_Top;
        return sceneArrayList_[sceneIndex_]->Init();
    }
 
    int End() override {
        return sceneArrayList_[sceneIndex_]->End();
    }
 
    int Update() override {
        return sceneArrayList_[sceneIndex_]->Update();
    }
 
    int Draw() override {
        return sceneArrayList_[sceneIndex_]->Draw();
    }
 
    void ChangeScene(eScene scene) {
        // 現在のシーンを終了し、変更後のシーンの初期化
        sceneArrayList_[sceneIndex_]->End();
        sceneIndex_ = scene;
        sceneArrayList_[sceneIndex_]->Init();
    }
 
private:
    unsigned int    sceneIndex_;
    std::vector<std::unique_ptr<IScene>>    sceneArrayList_;
};
 
// エントリーポイント
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    // メモリリーク検出
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
 
    SceneController sceneController;
    if (sceneController.Init() != ITask::CommonResult::Result_OK){
        return -1;
    }
 
    while (DxLibApp::ProcessLoop() && inputKey.Update() == 0)
    {
        sceneController.Update();
        sceneController.Draw();
    }
 
    if (sceneController.End() != ITask::CommonResult::Result_OK){
        return -1;
    }
 
    return 0;
}

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#12

投稿記事 by inemaru » 3年前

不知火 さんが書きました:再び質問させて頂きます。今度は上のオセロのソースをcppファイルとhファイルに分けたいのですが、どのように分ければいいですか? 自分で考えてみたのですがよく分からないのです。 よろしくお願いします。
ソース分割ですが、プロトタイプ宣言について理解しているのであれば
  • ヘッダー(.h)にプロトタイプ宣言
  • ソース(.cpp)に実装
といった感じで、基本は分割すれば良いと思います。
(公開範囲を制限するのであれば対応が必要です。)

下記のスポイラーは、元コードをソース分割する例です。
注意:
  • 初期化、更新、描画、終了 の関数を追加
  • 各種判定が、白黒逆な気がしたので入れ替えました
► スポイラーを表示

Math

Re: C++のメニュー画面

#13

投稿記事 by Math » 3年前

スポイラーさんがスポイル(動いてくれない)のような気がします。

Math

Re: C++のメニュー画面

#14

投稿記事 by Math » 3年前

あ、失礼Securityを高にしていました。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#15

投稿記事 by 不知火 » 3年前

コード:

D:\z\29\g3>g

D:\z\29\g3>nmake -f g.mak

Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

        cl /c /TP /EHsc /D "_MBCS" /MT  /I"d:\dxlib" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 g1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

g1.cpp
        link /out:g1.exe /SUBSYSTEM:WINDOWS /LIBPATH:"d:\dxlib" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" g1.obj
Microsoft (R) Incremental Linker Version 14.00.24215.1
Copyright (C) Microsoft Corporation.  All rights reserved.

        g1.exe
すいませんこのCompileはどこに入力すればよろしいですか?

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#16

投稿記事 by 不知火 » 3年前

皆さん分かりやすい説明ありがとうございます。失礼ですがメニュー画面に新たな項目を追加したいときは、プログラムのどこを改造すればよろしいでしょうか?

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#17

投稿記事 by inemaru » 3年前

コンパイルをコマンドラインでやるのであれば、
cl.exeにコマンドを入力することで
コンパイルができますが、
(参照:https://msdn.microsoft.com/ja-jp/library/f35ctcxw.aspx

Visual Studioが導入されているのであれば、プロジェクトを立てて、ビルドするだけで済みます。
(参照:http://dixq.net/g/h_01.html)

よくわからないのであれば、後者をお勧めします。

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#18

投稿記事 by inemaru » 3年前

どのソースコードに対しての質問でしょうか?

自分が投稿したレスのコードであれば、C++ですが問題ないでしょうか?
(ついでに、シーン管理であって、メニューのソースではありません。)
使用するのであれば、C++11規格対応のコンパイラ(Viusual Studio 2013以上)が必須ですので、ご注意ください。

とりあえず、自分の提示したコードであれば、
  • 164~424行付近
    シーンの定義
  • 428~431行付近
    シーンの登録
となっているので、読み解いてわからない点があれば、
質問してください。

Math

Re: C++のメニュー画面

#19

投稿記事 by Math » 3年前

>すいませんこのCompileはどこに入力すればよろしいですか?

メモ帳が使えればC/C++とDxlibのコンパイル・リンクが出来ます。詳細は私のホームページ
http://cswin10.nisinippon.com/cs/cs1/vs ... /dx01.htmlをご覧ください。
(分割コンパイルも可能です。)

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#20

投稿記事 by 不知火 » 3年前

inemaru さんが書きました:コンパイルをコマンドラインでやるのであれば、
cl.exeにコマンドを入力することで
コンパイルができますが、
(参照:https://msdn.microsoft.com/ja-jp/library/f35ctcxw.aspx

Visual Studioが導入されているのであれば、プロジェクトを立てて、ビルドするだけで済みます。
(参照:http://dixq.net/g/h_01.html)

よくわからないのであれば、後者をお勧めします。
すいません自分はVisual Studioで作っているので下の方法でプロジェクトを立てて、No11さんのコードを入力したのですが、変なバグが沢山出てしまいました。
あまりにも多すぎたので画像として送ります。 pngファイルもプログラムの内部に入れましたし、きちんと入力したはずなのに明らかにおかしなバグばかり出ているので何かが足りないのでしょうか?
添付ファイル
エラー3.png
エラー2.png
エラー1.png

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#21

投稿記事 by inemaru » 3年前

Visual Studioのバージョン等、環境に関して明記してください。
No10に明記してありますが、自分は、VS2013/Windows10 で動作確認しました。

あと、No11のメッセージは自分じゃないので、お答えしかねます。
(自分の提示したコードとまったく同じかまだ確認していない為)

Math

Re: C++のメニュー画面

#22

投稿記事 by Math » 3年前

>あと、No11のメッセージは自分じゃないので、お答えしかねます。
>(自分の提示したコードとまったく同じかまだ確認していない為)
全く同じですよ。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#23

投稿記事 by 不知火 » 3年前

私の場合は Microsoft Visual Studio 2013 
パソコンはWindows 8 です。

Math

Re: C++のメニュー画面

#24

投稿記事 by Math » 3年前

開発者コマンドラインを使う方が結果的には便利ですよ。(作るのは今迄まで通りVisualStudio IDEがいいのですが本の付録のコードとかサイトのサンプルとかを動かすときは圧倒的に開発者コマンドラインが便利です。本一冊文なら数時間で全部テストできますよ)
まず最新のDxlibのをここhttp://dxlib.o.oo7.jp/dxdload.htmlからダウンロードします。(DxLib Ver.3.17a)
それ(DxLib_VC)をD:/直下において、あとは私のホームページの通りメモ帳にコピーすれば(適当なフォルダーでよい。どこでも大丈夫です。)いちどやれば便利とわかる。あとは超簡単で分割コンパイルも可能ですよ。分からない事があったら聞いてください。

Math

Re: C++のメニュー画面

#25

投稿記事 by Math » 3年前

>私の場合は Microsoft Visual Studio 2013 
>パソコンはWindows 8 です。
もちろんOKです。VS2008,2012,2013,2015どれでも大丈夫ですよ。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#26

投稿記事 by 不知火 » 3年前

No24.25さんありがとうございます!
g.makとg1.cpp を作った後はどのようにすればよろしいでしょうか。
実行するのはVisual Studio 2013ですか?

Math

Re: C++のメニュー画面

#27

投稿記事 by Math » 3年前

もう一つついでに g.bat も作ってもらって開発者コマンドプロンプトで g とうって[Enter]して下さい。

Math

Re: C++のメニュー画面

#28

投稿記事 by Math » 3年前

開発者コマンドプロンプトはVS2013付属のソフトでメニューにあるはずです。g.bat を作ったフォルダーへは D:(ドライブを変える)とか
cd z(zfフォルダーに移る)とかをします。

Math

Re: C++のメニュー画面

#29

投稿記事 by Math » 3年前

No15の画面をよくご覧ください。同じ様に g と打てばよいはずです。

Math

Re: C++のメニュー画面

#30

投稿記事 by Math » 3年前

Windows8.1はスタート画面ですべてのプログラムを見れがあるはずです。”開発者コマンド”で検索してもでるはず。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#31

投稿記事 by 不知火 » 3年前

わかりました ありがとうございます。
また分からないことが起きたら聞きに行きます。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#32

投稿記事 by 不知火 » 3年前

Math さんが書きました:No15の画面をよくご覧ください。同じ様に g と打てばよいはずです。
ということは、g.makの内容の一部をNo15の一部に書き換えればOKですよね。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#33

投稿記事 by 不知火 » 3年前

すいませんまた不具合が起きました・・・
http://cswin10.nisinippon.com/cs/cs1/vs ... /dx01.html のサイトで
説明された通りのプログラムを作り、開発者コマンドプロンプトで入力したのですが、nmake -f g.mak の部分で
成功したら一番下にg.exeと表示されるはずが、

コード:

g1.cpp
g1.cpp(1) : fatal error C1083: include ファイルを開けません。'DxLib.h':No such f
ile or directory
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio 12.0
\VC\BIN\cl.EXE"' : リターン コード '0x2'
Stop.
 
と表示されてしまいます。
同じように g.bat を入力する部分でも失敗してしまいます。
プログラムは指定された通りに入力したハズなんですが、万が一間違っていたらよろしくお願いします。

g1.cpp

コード:

 
#include "DxLib.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int)
{
        ChangeWindowMode( TRUE ); // ウィンドウモード
        DxLib_Init(); // DXライブラリ初期化

        DrawString(30, 20, "DxLib: Hello World!", GetColor(255, 255, 255)); // 文字を書く

        WaitKey();   // キー入力があるまで待機
        DxLib_End(); // DXライブラリ終了処理
        return 0;
} 

 
g.mak

コード:

 
TARGETNAME=g1

C_FLAGS=/c /D "_MBCS" /MT  /I"d:\DxLib_VC\プロジェクトに追加すべきファイル_VC用" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /W3 

LINK_FLAGS=/SUBSYSTEM:WINDOWS /LIBPATH:"d:\DxLib_VC\プロジェクトに追加すべきファイル_VC用" "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib" "comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib" "uuid.lib" "odbc32.lib" "odbccp32.lib" 

ALL:
	cl $(C_FLAGS) $(TARGETNAME).cpp
	link /out:$(TARGETNAME).exe $(LINK_FLAGS) $(TARGETNAME).obj
	$(TARGETNAME).exe

 
g.bat

コード:

 
nmake -f g.mak
 

Math

Re: C++のメニュー画面

#34

投稿記事 by Math » 3年前

(ページがかわったのにきずかなかった。)ホームページをよくみてください。
b.bat

コード:

nmake -f g.mak
ですよ。(わかりにくいところだったけど)
ホームページに書いてある通りにしてもらえば動くはずだけど。

Math

Re: C++のメニュー画面

#35

投稿記事 by Math » 3年前

行き違いですね。
フォルダーがちがいますね。
dir とうって 自分のいるフォルダーを確認してください。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#36

投稿記事 by 不知火 » 3年前

わかりました すいません。

コード:

D:\c\DxLib>dir
 ドライブ D のボリューム ラベルは ボリューム です
 ボリューム シリアル番号は 28FA-D364 です

 D:\c\DxLib のディレクトリ

2017/01/31  16:31    <DIR>          .
2017/01/31  16:31    <DIR>          ..
2017/01/31  16:31                16 b.bat
2017/01/31  16:25               525 g.mak
2017/01/31  14:45               388 g1.cpp
2017/01/31  16:05                46 新しいテキスト ドキュメント.txt
               4 個のファイル                 975 バイト
               2 個のディレクトリ  139,905,175,552 バイトの空き領域

D:\c\DxLib>

とりあえずこんな感じです。

Math

Re: C++のメニュー画面

#37

投稿記事 by Math » 3年前

dir d:¥DxLib_VC とうって Dxlib が正しくD:に置かれているか確認お願いします。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#38

投稿記事 by 不知火 » 3年前

コード:

D:\c\DxLib>dir d:¥DxLib_VC
 ドライブ D のボリューム ラベルは ボリューム です
 ボリューム シリアル番号は 28FA-D364 です

 D:\c\DxLib のディレクトリ

ファイルが見つかりません

D:\c\DxLib>
このように表示されました。
DxLibのフォルダはD:にそのまま置き、D:の別のフォルダの中に入れてはいけないということですね?

Math

Re: C++のメニュー画面

#39

投稿記事 by Math » 3年前

>サンプルとかを動かすときは圧倒的に開発者コマンドラインが便利です。本一冊文なら数時間で全部テストできますよ)
>まず最新のDxlibのをここhttp://dxlib.o.oo7.jp/dxdload.htmlからダウンロードします。(DxLib Ver.3.17a)
>それ(DxLib_VC)をD:/直下において、あとは私のホームページの通り<<<=============================
はやってもらっただろうか?

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#40

投稿記事 by 不知火 » 3年前

Math さんが書きました:>サンプルとかを動かすときは圧倒的に開発者コマンドラインが便利です。本一冊文なら数時間で全部テストできますよ)
>まず最新のDxlibのをここhttp://dxlib.o.oo7.jp/dxdload.htmlからダウンロードします。(DxLib Ver.3.17a)
>それ(DxLib_VC)をD:/直下において、あとは私のホームページの通り<<<=============================
はやってもらっただろうか?
もちろん行いました

Math

Re: C++のメニュー画面

#41

投稿記事 by Math » 3年前

D:\c\DxLib>dir d:¥DxLib_VC
ドライブ D のボリューム ラベルは ボリューム です
ボリューム シリアル番号は 28FA-D364 です

D:\c\DxLib のディレクトリ

ファイルが見つかりません
----------------------------------------
になるわけがないからDドライブをよく調べてください。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#42

投稿記事 by 不知火 » 3年前

調べましたがこのフォルダに入っていました。
添付ファイル
3.png
3.png (28.49 KiB) 閲覧数: 3563 回
2.png
2.png (22.3 KiB) 閲覧数: 3563 回
無題.png
無題.png (54.95 KiB) 閲覧数: 3563 回

Math

Re: C++のメニュ画面

#43

投稿記事 by Math » 3年前

あ、 ¥は\にかわるから 全角でうった。 dir d:\DxLib_VC は手入力して下さい。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#44

投稿記事 by 不知火 » 3年前

そうですか! すいませんでした打ち直します。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#45

投稿記事 by 不知火 » 3年前

とりあえず今日はここでいったん休みます。
また明日お世話になるかもしれませんがよろしくお願いします。

Math

Re: C++のメニュー画面

#46

投稿記事 by Math » 3年前

了解しました。

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#47

投稿記事 by inemaru » 3年前

不知火 さんが書きました: すいません自分はVisual Studioで作っているので下の方法でプロジェクトを立てて、No11さんのコードを入力したのですが、変なバグが沢山出てしまいました。
あまりにも多すぎたので画像として送ります。 pngファイルもプログラムの内部に入れましたし、きちんと入力したはずなのに明らかにおかしなバグばかり出ているので何かが足りないのでしょうか?
不知火 さんが書きました:私の場合は Microsoft Visual Studio 2013 
パソコンはWindows 8 です。
同程度の環境を作ってビルドしましたが、普通にビルド通りますね。
コンパイルエラーに関して、コード側に問題がないのは確かです。

画像

不知火さんの環境やプロジェクトの設定に、問題がありそうなので、
プロジェクトファイルとか見たかったのですが、
メイクファイルでビルドするみたいなので、報告のみということで。
オフトピック
念のため、文字コードがエラー原因の可能性を考慮しておきます。
(もし、プロジェクト設定に問題がないとしたら、エラーの原因はこれくらいしか思い当たらない)

右クリック等でリンク先を保存すれば取得できます。(ShiftJISで保存されることを想定)
これをプロジェクトに追加してもだめなら、プロジェクト設定を疑いたい。
https://goo.gl/dGrDPD

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#48

投稿記事 by 不知火 » 3年前

inemaruさんアドバイスありがとうございます。
無事動くことが出来ました!ありがとうございます!

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#49

投稿記事 by 不知火 » 3年前

inemaruさん、わざわざプログラムを作って貰ってすいませんが、
このプログラムの一部を自分流に改造して、新たなシーンを追加してもいいでしょうか?

inemaru
記事: 108
登録日時: 3年前

Re: C++のメニュー画面

#50

投稿記事 by inemaru » 3年前

不知火 さんが書きました: このプログラムの一部を自分流に改造して、新たなシーンを追加してもいいでしょうか?
自分が提示したコードに関しては、
特に断りなしに自由に使用してもらって構いませんが、無保証とさせていただきます。
(ゲーム部分のコードは、不知火さんの提示されたものです)

新たなシーンを追加する際は、
下記の部分に注意すればおそらく大丈夫です。
  • 110~117行付近
    シーン列挙
    シーンを登録した順と対応します
  • 164~293行付近
    シーン定義
    トップシーンとゲームシーンの定義となっています。
  • 428~431行付近
    シーン登録
    トップシーンとゲームシーンをシーン管理に登録(追加)する処理です。
勝敗の判定が白黒逆な気がするので、
385行目は、

コード:

std::string turn_str[] = { "白", "黒", "DRAW" };
の方が正しそう。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#51

投稿記事 by 不知火 » 3年前

わかりました!ありがとうございます。

不知火
記事: 23
登録日時: 3年前

Re: C++のメニュー画面

#52

投稿記事 by 不知火 » 2年前

皆様のおかげで無事オセロが完成しました!
ありがとうございます。貴重なお時間をわざわざ
私の為に使って下さいましてすみませんでした。

閉鎖

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