Re: オセロを作る2 ( No.1 ) |
- 名前:管理人 日時:2020/04/16 10:19
特にルールとしては設定していませんが、丸投げは批判の対象となってしまいますので控えてください
FFGXさん自身でできるところまでプログラムを組んでみて、どのように実装すれば良いか
分からない点などありましたらご質問していただければご返答します
|
Re: オセロを作る2 ( No.2 ) |
- 名前:FFGX 日時:2020/04/16 17:49
すみませんでした。僕が作りたいのは
ボタンでしたが、ボタンの作り方が分からない為
その件について教えてください。
配列の3をボタンにしたいです。
|
Re: オセロを作る2 ( No.3 ) |
- 名前:kanamaru 日時:2020/04/16 18:06
dxlibではボタンは作成できません。
winapiを使うことで出来ますが、
僕の想像通りなら、ボタンは必要はありません。
Mouse = GetMouseInput();
if( Mouse & MOUSE_INPUT_LEFT ){
GetMousePoint( &mx, &my );
if(f[mx/PX][my/PX]==3){
//3の場所がクリックされた。
}
}
Mouseとmxとmyはプログラムの最初で0で初期化しておいてください。
後は描画するときに配列が3だった時に目立つように描画させればいいと思います。
mxとmyは説明の都合上使いましたが、もしかしてcxとcyがそのための変数なのでしょうか?
その場合は適宜書き換えてください。
|
Re: オセロを作る2 ( No.4 ) |
- 名前:FFGX 日時:2020/04/16 21:23
そうです。
やってみようと思います。
ありがとうございます。
|
Re: オセロを作る2 ( No.5 ) |
- 名前:FFGX 日時:2020/04/17 07:43
自分の力でなんとなくやってみましたが
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,1,2,0,0,0},
{0,0,0,2,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
で変わらないのですがどうしたらいいでしょうか
#include<DxLib.h>
#define PX 60
#define O 8
int Mouse;
int T[4];
int B[8][2] = {
{0, -1},
{1, -1},
{1, 0},
{1, 1},
{0, 1},
{-1, 1},
{-1, 0},
{-1, -1},
};
int turn;
int cx = 0, cy = 0, cx2 = 0, cy2 = 0;
int f[O][O] = {
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,1,2,0,0,0},
{0,0,0,2,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0}
};
void P() {
int w = GetColor(255, 255, 255);
for (int y = 0; y < O; y++) {
for (int x = 0; x < O; x++) {
DrawExtendGraph(x * PX, y * PX, x * PX + PX, y * PX + PX, T[f[y][x]], false);
}
}
DrawBox(480, 0, 640, 480, w, true);
}
bool check(int _c, int _x, int _y,bool _t) {
if (f[_y][_x] != 0)
return false;
for (int i = 0; i < O; i++) {
int x = _x, y = _y;
x += B[i][0];
y += B[i][1];
if (f[y][x] != (_c^1)) {
continue;
}
while (1) {
x += B[i][0];
y += B[i][1];
if (x <= 0 || x >= O || y <= 0 || y >= O) {
break;
}
if (f[y][x] == 0) {
break;
}
if (f[y][x] == _c) {
if (!_t) {
return true;
f[y][x] = 3;
}
int x2 = _x, y2 = _y;
while (1) {
f[y][x] = _c;
x2 += B[i][0];
y2 += B[i][1];
if (x2 == x && y2 == y) {
break;
}
}
}
}
}
return false;
}
bool check(int _c) {
for (int y = 0; y < O; y++) {
for (int x = 0; x < O; x++) {
if (check(_c, x, y, false)) {
return true;
}
}
}
return false;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
SetOutApplicationLogValidFlag(false);
SetWindowText("リバーシ");
ChangeWindowMode(true);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
LoadDivGraph("madia\\a.png", 4, 4, 1, 60, 60, T, false);
while (1) {
ClearDrawScreen();
P();
if (turn == 1) {
DrawString(480, 0, "黒のターン", (0, 0, 0));
}
else {
DrawString(480, 0, "白のターン", (0, 0, 0));
}
ScreenFlip();
while (1) {
Mouse = GetMouseInput();
if (Mouse & MOUSE_INPUT_LEFT) {
GetMousePoint(&cx, &cy);
if (f[cx / PX][cy / PX] == 0) {
WaitTimer(1000);
if (!check(turn, cx / PX, cy / PX, false)) {
break;
}
}
}
}
check(turn, cx / PX, cy / PX, false);
f[cy][cx] = turn;
turn ^= 1;
}
WaitKey();
DxLib_End();
return 0;
}
help me
|
Re: オセロを作る2 ( No.6 ) |
- 名前:FFGX 日時:2020/04/17 14:46
ちょっとコードを変えました。
#include<DxLib.h>
#define PX 60
#define O 8
int Mouse;
int T[4];
int vector[8][2] = {
{0, -1},
{1, -1},
{1, 0},
{1, 1},
{0, 1},
{-1, 1},
{-1, 0},
{-1, -1},
};
int turn;
int cx = 0, cy = 0, cx2 = 0, cy2 = 0;
int f[O][O] = {
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,1,2,0,0,0},
{0,0,0,2,1,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0},
};
void P() {
int w = GetColor(255, 255, 255);
for (int y = 0; y < O; y++) {
for (int x = 0; x < O; x++) {
DrawExtendGraph(x * PX, y * PX, x * PX + PX, y * PX + PX, T[f[y][x]], false);
}
}
DrawBox(480, 0, 640, 480, w, true);
}
bool check(int _c, int _x, int _y) {
if (f[_y][_x] != 0){
return false;
}
for (int i = 0; i < O; i++) {
int x = _x, y = _y;
x += vector[i][0];
y += vector[i][1];
if (f[y][x] != (_c ^ 1)) {
continue;
}
while (1) {
x += vector[i][0];
y += vector[i][1];
if (x < 0 || x >= O || y < 0 || y >= O) {
break;
}
if (f[y][x] == 0) {
break;
}
if (f[y][x] == _c) {
return true;
}
}
}
return false;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
SetOutApplicationLogValidFlag(false);
SetWindowText("リバーシ");
ChangeWindowMode(true);
DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
LoadDivGraph("madia\\a.png", 4, 4, 1, 60, 60, T, false);
while (1) {
ClearDrawScreen();
P();
if (turn == 0) {
DrawString(480, 0, "黒のターン", GetColor(0, 0, 0));
}
else {
DrawString(480, 0, "白のターン", GetColor(0, 0, 0));
}
ScreenFlip();
while (1) {
Mouse = GetMouseInput();
GetMousePoint(&cx, &cy);
if (Mouse & MOUSE_INPUT_LEFT) {
if (!check(turn, cx / PX, cy / PX)) {
break;
}
if (f[cy / PX][cx / PX] == 3) {
f[cy / PX][cx / PX] = turn + 1;
WaitTimer(500);
turn ^= 1;
break;
}
}
}
}
DxLib_End();
return 0;
}
こんな感じです。
|
Re: オセロを作る2 ( No.7 ) |
- 名前:名無三 日時:2020/04/17 15:26
もう少し考えてほしい気持ちもするけど、今回は特別に暇なので我流に書くよ
#include<DxLib.h>
#include <memory>
#include<vector>
#define PIC_SIZE 60
#define x_size 8
#define y_size 8
enum Piece {
NONE,
BLACK,
WHITE,
what
};
class Reverse {
private:
const int B[8][2] = {
{0, -1},//上
{1, -1},//右上
{1, 0},//右
{1, 1},//右下
{0, 1},//下
{-1, 1},//左下
{-1, 0},//左
{-1, -1},//左上
};
std::vector<std::vector<int>> F_start;
std::vector<std::vector<int>> F;
public:
Reverse() {
F.resize(x_size);
for (auto& f : F) {
f.resize(y_size);
}
F_start.resize(x_size);
for (auto& f : F_start) {
f.resize(y_size);
}
for (int x = 0; x < F_start.size(); x++) {
for (int y = 0; y < F_start[x].size(); y++) {
F_start[x][y] = 0;
if ((x == 3 && y == 3) || (x == 4 && y == 4)) { F_start[x][y] = 1; }
if ((x == 4 && y == 3) || (x == 3 && y == 4)) { F_start[x][y] = 2; }
}
}
}
~Reverse() {
}
void start(void) {
F = F_start;
}
const bool outof(const int& px, const int& py) { return(px <= -1 || px >= x_size || py <= -1 || py >= y_size); }
bool check(uint8_t& turn, const int& _x, const int& _y) {
const int BorW = (turn == 1) ? BLACK : WHITE;
if (outof(_x, _y) || (F[_x][_y] != NONE)) { return false; }//もう置いている
F[_x][_y] = BorW;
for (int dir = 0; dir < 8; dir++) {
if (outof(_x + B[dir][0],_y + B[dir][1])) { continue; }//盤外
int x0 = _x, y0 = _y;
while (1) {
x0 += B[dir][0];
y0 += B[dir][1];
if (outof(x0, y0)) { break; }//盤外
if (F[x0][y0] == NONE) { break; }//挟んでいない
if (F[x0][y0] == BorW) {
//挟んでいる時埋める
int x1 = _x, y1 = _y;
while (1) {
x1 += B[dir][0];
y1 += B[dir][1];
if (F[x1][y1] != BorW) {
F[x1][y1] = BorW;
}
else {
break;
}
}
break;
}
}
}
turn ^= 1;
return false;
}
auto& getF(void) { return F; };
};
class Draw {
private:
int pics_handle[4];
public:
Draw() {
LoadDivGraph("media\\a.bmp", 4, 4, 1, PIC_SIZE, PIC_SIZE, pics_handle, false);
}
~Draw() {
}
void draw(std::vector<std::vector<int>>&F, uint8_t turn) {
//盤面
DrawBox(0, 0, 480, 480, GetColor(0, 0, 0), true);
for (int x = 0; x < F.size(); x++) {
for (int y = 0; y < F[x].size(); y++) {
DrawExtendGraph(x * PIC_SIZE, y * PIC_SIZE, (x + 1) * PIC_SIZE, (y + 1) * PIC_SIZE, pics_handle[F[x][y]], false);
}
}
//サイド画面
DrawBox(480, 0, 640, 480, GetColor(255, 255, 255), true);
if (turn == 1) {
DrawString(480, 0, "黒のターン", (0, 0, 0));
}
else {
DrawString(480, 0, "白のターン", (0, 0, 0));
}
}
};
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
//DXLIB初期化
{
SetOutApplicationLogValidFlag(FALSE);
SetMainWindowText("リバーシ");
ChangeWindowMode(TRUE);
DxLib_Init();
}
//リバース演算
auto revparts = std::make_unique<Reverse>();
auto drwparts = std::make_unique<Draw>();
//
int mousex = 0, mousey = 0;
uint8_t turn = 0;
revparts->start();
while (ProcessMessage() == 0) {
SetDrawScreen(DX_SCREEN_BACK);
ClearDrawScreen();
{
drwparts->draw(revparts->getF(), turn);
}
ScreenFlip();
if ((GetMouseInput() & MOUSE_INPUT_LEFT) != 0) {
GetMousePoint(&mousex, &mousey);
revparts->check(turn, mousex / PIC_SIZE, mousey / PIC_SIZE);
}
}
DxLib_End();
return 0;
}
サンプルとリファレンスちゃんと読め
ループはちゃんと回せ
XとY統一しろ
フォルダ名タイポ
|
Re: オセロを作る2 ( No.8 ) |
- 名前:FFGX(解決) 日時:2020/04/17 19:15
ありがとうございます。
ですが失敗します。
自分の力でやってみようと思います。
|
Re: オセロを作る2 ( No.9 ) |
- 名前:名無三(補足) 日時:2020/04/17 19:26
ごめん、make_uniqueがC++14からってのを失念してた
動くように作っているから、プロジェクトの言語標準を上げてもらえれば動くはず
|
Re: オセロを作る2 ( No.10 ) |
- 名前:P 日時:2020/04/17 23:56
ほぼスレとしては話題は終わりかけているようなものですが、
一応私からもアドバイスをしようかと思います。
まず前に投稿した迷路からそうなのですが、
AやBといった簡単な変数名や関数名はこれを機に卒業しましょう。
名無三さんが書かれているように、x_sizeやy_sizeとその変数や定数が何を意味するのか、関数は何をするのかを明確にすると、
他の人も教えやすいですし、後からソースを見返した際に困惑することがなくなります。
無限ループの際にwhile(1)と書かれていますが、
DXライブラリでは1回のループ毎にProcessMessage()という関数を実行し、
戻り値が0であるかを確認しなければなりません。
何故なのかは今のFFGXさんには理解が難しいと思います。(WINAPIの話になってしまうため)
この関数を実行しないと、Xボタンを押して終了した際にプログラムが起動したままなどの問題が発生します。
必ずどこかしらで呼び出してください。
まだCまたはC++に関して不足している部分があるように思えます。
DXライブラリではなく、コンソール上でオセロを作る等をやってみてはいかがでしょうか?
その方がまだC言語の練習になると思います。
コンソール上での簡単なゲームの作成ができるようになってから、
DXライブラリのサイトにあるDXライブラリゲームプログラム開発講座というものに挑戦してみてください。
|
Re: オセロを作る2 ( No.11 ) |
- 名前:FFGX(解決) 日時:2020/04/18 08:29
分かりました。
コンソール版で作ってみたのですが。
ちゃんとしていた為、
dxライブラリを使用してみようかと思います。
関数を勉強してから質問します。
|
|