C言語の課題で、オセロゲームを作成することになりました。
しかし、課題内容に沿うような表示が出来ません。また、ひっくり返す際はどのようにしたらよいのかがわからず困っています。
長くなってしまいますが課題内容とソースコードです。
<課題>
文字型で10×10の配列を用意し、main 関数内で宣言定義し、配列の内側8×8の要素を用い文字(大文字エックス)'X'、(大文字オー)'O'、(空白文字)' 'をランダムに各要素(升目)に入力を行う。これをオセロゲームの一つの局面と考え(ランダム配置なので実際にはあり得ない局面かもしれないが)、各' 'の升目に対し、'X'は置けるのか'O'は置けるのかの判定を、関数 (setpos) でおこなうプログラムを作成しなさい。またsetpos関数では指定により裏返し処理も実行できるようにすること。
•'X'は黒、'O'は白、' 'は空白と考える
•' 'の位置は main 関数で検出し、関数setposに引数として知らせる(渡す)こと
•setpos関数は戻り値として置けない場合には0、置ける場合には裏返る数を返すこと
•都合上関数setposは次の形で宣言定義する
int setpos(int y, int x, char c, char p[ ][10], int on);
◦y: 置きたい升目の行
◦x: 置きたい升目の列
◦c: 置きたい文字('X' or 'O')
◦p[ ][10]:局面の配列
◦on: 裏返し処理実行無しは0、有りは1
•別の関数(名前はdisp)で、上図のように配列の内容を表示するプログラムを作成し、ランダム入力の後、表示を行うこと
•標準入力から升目を入力する場合にはA5、B8のような形で行えるようにすること
•main関数の機能で' 'の位置情報と裏返せる数の結果を表示させること
(例えば B0 X :1、 O :0)
<プログラム>
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int setpos(int y, int x, char c, char p[][10], int on) {
int vecY;
int vecX;
int reverseEach;
int reverseTotal = 0;
int i, j;
for (vecY = -1; vecY <= 1; vecY++) {
for (vecX = -1; vecX <= 1; vecX++) {
if (vecX == 0 && vecY == 0) {
continue;
}
reverseEach = 0;
for (i = y + vecY, j = x + vecX; p[i][j] != ' '; i += vecY, j += vecX) {
if (p[i][j] != c) {
reverseEach++;
}
else if (reverseEach == 0)
break;
else {
reverseTotal++;
}
}
if (reverseTotal == 0)
return 0;
else {
return reverseTotal;
}
}
}
}
void disp(char *a)
{
printf(" %c", *a);
}
int main(void) {
int y, x;
char a[10][10];
int i = 0, j = 0, k, l;
srand((unsigned)time(NULL));
for (k = 0; k <= 7; k++) {
for (l = 0; l <= 7; l++) {
a[i][j] = (rand() % 3 + 0);
if (a[i][j] == 2)
a[i][j] = 'O';
else if (a[i][j] == 1)
a[i][j] = 'X';
else {
a[i][j] = ' ';
}
disp(&a[i][j]);
}
printf("\n");
}
printf("\n");
// scanf("%d", &y);
// scanf("%d", &x);
setpos(1, 2, 'O', a, 0);
return 0;
}