[1.1] 自分が今行いたい事は何か
いずれRTSのゲームを作れるようになりたいと思い、こちらのトピックを参考にしてオセロプログラムを組むことにしています。
http://dixq.net/forum/viewtopic.php?f=3&t=8520
[1.2]
http://idehideout.fc2web.com/p/rev/00.html
こちらのサイトのオセロプログラムを参考にしながらDXライブラリで実行できるように改造しつつプログラムを作っています。
素材
#include "DxLib.h"
//盤面の大きさ
#define BOARDSIZE 8
//状態を定義
#define NONE 0
#define BLACK 1
#define WHITE 2
int put(int x, int y, int turn);
int checkFlip(int sx, int sy, int turn, int vec);
void flip(int x, int y, int turn, int vec);
int sx = 0, sy = 0;
int Green;
int sentaku,sentaku_se;
int i, j;
int chip[3];
int vec_y[] = { -1, -1, 0, 1, 1, 1, 0, -1 };
int vec_x[] = { 0, 1, 1, 1, 0, -1, -1, -1 };
int moveflag = 0;
//白のターン:0 黒のターン:1
int turn = 0;
int vec = 0;
int flag = 0;
int Key[256];
//盤面
int board[BOARDSIZE][BOARDSIZE];
// キーの入力状態を更新する
int gpUpdateKey(){
char tmpKey[256]; // 現在のキーの入力状態を格納する
GetHitKeyStateAll(tmpKey); // 全てのキーの入力状態を得る
for (int i = 0; i<256; i++){
if (tmpKey[i] != 0){ // i番のキーコードに対応するキーが押されていたら
Key[i]++; // 加算
}
else { // 押されていなければ
Key[i] = 0; // 0にする
}
}
return 0;
}
//初期化関数
void setBoard(void)
{
int i,j;
for (i = 0; i < BOARDSIZE; i++){
for (j = 0; j < BOARDSIZE; j++){
board[i][j] = NONE;
board[BOARDSIZE / 2 - 1][BOARDSIZE / 2] = BLACK; //[3][4]
board[BOARDSIZE / 2][BOARDSIZE / 2 - 1] = BLACK; //[4][3]
board[BOARDSIZE / 2][BOARDSIZE / 2] = WHITE; //[4][4]
board[BOARDSIZE / 2 - 1][BOARDSIZE / 2 - 1] = WHITE; //[3][3]
}
}
}
//盤面表示関数
void disp(void){
int i, j;
for (i = 0; i < BOARDSIZE; i++){
for (j = 0; j < BOARDSIZE;j++){
switch (board[i][j]){
case NONE:
DrawGraph(32 * i, 32 * j,chip[0],TRUE);
break;
case BLACK:
DrawGraph(32 * i, 32 * j,chip[1],TRUE);
break;
case WHITE:
DrawGraph(32 * i, 32 * j,chip[2],TRUE);
break;
default:
DrawString(32 * i, 32 * j, "er",TRUE);
break;
}
}
}
DrawGraph(sx * 32, sy * 32, sentaku, TRUE);
DrawFormatString(270, 32, GetColor(255, 255, 255), "座標X:%d 座標Y:%d", sx+1,sy+1);
if (turn == 0){
DrawFormatString(270, 64, GetColor(255, 255, 255), "白のターン");
}else{
DrawFormatString(270, 64, GetColor(255, 255, 255), "黒のターン");
}
}
void Choose(void){
int kx = sx;
int ky = sy;
if (Key[KEY_INPUT_LEFT] == 1) { kx--; moveflag = 1; }
if (Key[KEY_INPUT_RIGHT] == 1) { kx++; moveflag = 1; }
if (Key[KEY_INPUT_UP] == 1) { ky--; moveflag = 1; }
if (Key[KEY_INPUT_DOWN] == 1) { ky++; moveflag = 1; }
if ((0 <= kx && kx <= 7) && (0 <= ky && ky <= 7)){
sx = kx;
sy = ky;
}
if (moveflag == 1){
PlaySoundMem(sentaku_se, DX_PLAYTYPE_BACK, TRUE);
moveflag = 0;
}
}
void input(int turn){
if (Key[KEY_INPUT_Z] == 1) {
put(sx, sy, turn);
}
}
int check(int sx, int sy, int turn){
int vec;
//どれか一方向でもひっくり返るか確認
for (vec = 0; vec < 8; ++vec){
if (checkFlip(sx, sy, turn, vec) == 1) return 1;
}
}
int checkFlip(int sx,int sy,int turn,int vec ){
int flag = 0;
int x = sx;
int y = sy;
while (1){
y += vec_y[vec];
x += vec_x[vec];
//盤面の外に出ていたら終了
if (x < 0 || y < 0 || x > BOARDSIZE - 1 || y > BOARDSIZE - 1) return 0;
//空きマスだったら終了
if (board[x][y] == NONE) return 0;
//相手のコマがあったらフラグを立てる
if (board[x][y] == (turn ? BLACK : WHITE)){
flag = 1;
continue;
}
//もしフラグがたっていればループ脱出。いなければ終了
if (flag == 1) break;
return 0;
}
return 1;
}
int put(int x, int y, int turn){
//空白でなければ終了
if (board[x][y] != NONE) return 0;
//全方向について確認
for (vec = 0; vec < 8; ++vec){
if (checkFlip(x, y, turn, vec) == 1){
//裏返す
flip(x, y, turn, vec);
flag = 1;
}
}
if (flag == 1){
//この場所にコマを置く
board[x][y] = (turn ? WHITE : BLACK);
return 1;
}
return 0;
}
void flip(int x, int y,int turn, int vec){
while (1){
y += vec_y[vec];
x += vec_x[vec];
//自分のコマがあったら終了
if (board[x][y] == (turn ? WHITE : BLACK)) {
turn = (turn + 1) % 2;
break;
}
//それ以外なら自分のコマで塗りつぶす
board[x][y] = (turn ? WHITE : BLACK);
}
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定
Green = GetColor(0, 256, 0);
LoadDivGraph("chip.bmp", 3, 3, 1, 32, 32, chip);
sentaku = LoadGraph("sentaku.png", TRUE);
sentaku_se = LoadSoundMem("se01.mp3");
setBoard();
while (!ProcessMessage()){
ClearDrawScreen();
gpUpdateKey();
Choose();
disp();
input(turn);
ScreenFlip();
}
DxLib_End(); // DXライブラリ終了処理
return 0;
}
[1.4] input関数→put関数→checkFlip関数でチェックしてflip関数で反転という流れはわかるのですが、ターンを変えるタイミングとあちこちにあるvec変数をよくわかっていないのでご教授お願いできたらと思います
[2] 環境
[2.1] OS : Windows8、64bit
[2.2] コンパイラ名 : Microsoft Visual Studio Express 2013 for Windows Desktop
[3] その他
・どの程度C言語を理解しているか
Cの基礎知識の本を読んで一週間です。
初心者だと思ってます。
・ライブラリを使っている場合は何を使っているか
DXライブラリ"DxLib.h"