大学で初めてプログラミングに触れてはや3か月。コツコツ「やさしいC」から独学で学び、集大成として「連立方程式を解くプログラム」と「オセロ」を作成。
連立方程式のほうは行列の知識を使えば思ったよりすんなり作れたけど、オセロがうまくいかない。
細かいバグはほっといて、まず実行さえできればよかったのに、10手目あたりで突然動かなくなる。
最終的にはコンピュータ同士で戦わせて最強のAIを作りたかったけど、、、悲しい。近所のスーパーのシュークリームで慰める。
↓ソースコード↓
#include <stdio.h>
/*配置を出力する関数*/
void aaa(char aa[12][12]);
/*Aの番に裏返す関数(単位ベクトル、初期位置(縦、横)、配列)*/
void bbb(int a, int b, int d, int c, char aa[12][12]);
/*Bの番に裏返す関数(単位ベクトル、初期位置(縦、横)、配列)*/
void ccc(int a, int b, int d, int c, char aa[12][12]);
int main(void) {
int a, b, c, d, e, f;
int g = 0;
int h = 0;
int i = 0;
char aa[12][12];
/*最初の配置を配列に代入(縦がa)*/
for (a = 0; a < 12; a++) {
for (b = 0; b < 12; b++) {
if ((a == 4 && b == 4) || (a == 5 && b == 5)) {
aa[a][b] = 'A';
continue;
}
if ((a == 4 && b == 5) || (a == 5 && b == 4)) {
aa[a][b] = 'B';
continue;
}
aa[a][b] = ':';
}
}
/*配置を出力*/
aaa(aa);
printf("Aが先行です。\n");
for (a = 0; a < 30; a++) {
while (g == 0) {
/*Aの番*/
printf("Aの番です。どこに打ちますか?(上の数字が先)\n");
scanf_s("%d", &c);
scanf_s("%d", &d);
/*置いて裏返す*/
for (a = d - 1; a <= d + 1; a++) {
for (b = c - 1; b <= c + 1; b++) {
if (aa[a][b] == 'B') {
e = a - d;
f = b - c;
bbb(e, f, d, c, aa);
g++;
}
}
}
if (g == 0) {
printf("そこには打てません\n");
}
}
aaa(aa);
g = 0;
while (g == 0) {
/*Bの番*/
printf("Bの番です。どこに打ちますか?(上の数字が先)\n");
scanf_s("%d", &c);
scanf_s("%d", &d);
/*置いて裏返す*/
for (a = d - 1; a <= d + 1; a++) {
for (b = c - 1; b <= c + 1; b++) {
if (aa[a][b] == 'A') {
e = a - d;
f = b - c;
ccc(e, f, d, c, aa);
g++;
}
}
}
if (g == 0) {
printf("そこには打てません\n");
}
}
aaa(aa);
g = 0;
}
for (a = 1; a <= 8; a++) {
for (b = 1; b <= 8; b++) {
if (aa[a][b] == 'A')
h++;
if (aa[a][b] == 'B')
i++;
}
}
if (h > i)
printf("%d対%dでAの勝ちです", h, i);
if (h == i)
printf("引き分けです");
if (h < i)
printf("%d対%dでBの勝ちです", i, h);
return 0;
}
/*配置を出力する関数*/
void aaa(char aa[12][12])
{
int a, b;
for (a = 1; a <= 8; a++) {
printf("\t%d", a);
}
printf("\n");
for (a = 1; a <= 8; a++) {
printf("%d\t", a);
for (b = 1; b <= 8; b++) {
printf("%c\t", aa[a][b]);
}
printf("\n\n");
}
}
/*Aの番に裏返す関数(ベクトル、初期位置(縦、横)、配列)*/
void bbb(int a, int b, int d, int c, char aa[12][12])
{
int e = 1;
int f, g, h;
g = c;
h = d;
aa[d][c] = 'A';
while (aa[d + a][c + b] == 'B') {
if (aa[d + a * 2][c + b * 2] == 'B') {
c += b;
d += a;
e++;
}
if (aa[d + a * 2][c + b * 2] == 'A') {
for (f = 0; f <= e; f++) {
if (a != 0 && b != 0)
aa[d + a * 2 - a * e][c + b * 2 - b * e] = 'A';
if (a == 0)
aa[d][c + b * 2 - b * e] = 'A';
if (b == 0)
aa[d + a * 2 - a * e][c] = 'A';
}
}
if (aa[d + a * 2][c + b * 2] == ':') {
break;
}
}
c = g;
d = h;
}
/*Bの番に裏返す関数(単位ベクトル、初期位置(縦、横)、配列)*/
void ccc(int a, int b, int d, int c, char aa[12][12])
{
int e = 1;
int f, g, h;
g = c;
h = d;
aa[d][c] = 'B';
while (aa[d + a][c + b] == 'A') {
if (aa[d + a * 2][c + b * 2] == 'A') {
c += b;
d += a;
e++;
}
if (aa[d + a * 2][c + b * 2] == 'B') {
for (f = 0; f <= e; f++) {
if (a != 0 && b != 0)
aa[d + a * 2 - a * e][c + b * 2 - b * e] = 'B';
if (a == 0)
aa[d][c + b * 2 - b * e] = 'B';
if (b == 0)
aa[d + a * 2 - a * e][c] = 'B';
}
}
if (aa[d + a * 2][c + b * 2] == ':') {
break;
}
}
c = g;
d = h;
}
/*ベクトル
(-1,-1)(-1,0)(-1,1)
(0,-1)(0,0)(0,1)
(1,-1)(1,0)(1,1)*/
/追記/
今まで書いてきたプログラムは多くても80行程度で、実行できないか明らかにおかしい実行結果になるだけだった。突然動かないことに悲しみと、少しだけ「なんか、”ぽい”な」というワクワクがある。
200行のコードから粗探しするのしんどい。社会人エンジニアのデバックの大変さ、やばすぎ。