起因#
約半月前、DBinaryさんがコードで勝敗を決めるプログラマーコンテスト、つまり磁芯大戦を開催しました。
私はまだ初心者ですが、自分でも遊んでみたいと思います。
コーディング#
磁芯大戦のロジックは非常にシンプルです。
ユーザーが自分のロボットのコードを編集する -> コードを実行する -> ゲームが終了し、誰がより多くの領土を占拠したか、または誰が誰を撃破したかを見る。
技術力が乏しいので、まずは領土の占拠を実装しましょう💦
まずは簡単な地図のレンダリングを実現します:
// マップのサイズを定義
int map_data[12][12];
/* マップデータをロード */
void base() {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
map_data[j][i] = 0;
}
}
}
/* マップをレンダリング */
void lod_map() {
printf("\n");
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
printf("[%d]", map_data[i][j]);
}
printf("\n");
}
printf("\n");
}
次に、2 人のプレイヤーを追加してレンダリングします:
int p1_data = 1;
int p2_data = 2;
/* 現在の座標 */
int p1_now[] = {0,0};
int p2_now[] = {11,11};
...
/* プレイヤーをレンダリング */
void lod_map() {
map_data[p1_now[0]][p1_now[1]] = p1_data;
map_data[p2_now[0]][p2_now[1]] = p2_data;
...
}
プレイヤーコントローラーとプレイヤーコードのロードを書きます:
/* モバイルコントロール */
void move(int direction, int player) {
if (player==1) {
switch (direction) {
/* 下 */
case 1:
p1_now[0] = p1_now[0]+1;
break;
/* 上 */
case 2:
p1_now[0] = p1_now[0]-1;
break;
/* 左 */
case 3:
p1_now[0] = p1_now[1]-1;
break;
/* 右 */
case 4:
p1_now[0] = p1_now[1]+1;
break;
default:
break;
}
} else {
switch (direction) {
/* 下 */
case 1:
p2_now[0] = p2_now[0]+1;
break;
/* 上 */
case 2:
p2_now[0] = p2_now[0]-1;
break;
/* 左 */
case 3:
p2_now[0] = p2_now[1]-1;
break;
/* 右 */
case 4:
p2_now[0] = p2_now[1]+1;
break;
default:
break;
}
}
}
/* プレイヤーを制御 */
void player_1() {
move(1, 1);
move(1, 1);
}
void player_2() {
move(2, 2);
}
/* プレイヤーデータを読み込む */
void lod_player() {
player_1();
player_2();
}
ゲームデータの統計を行います:
/* ゲームデータの統計 */
void lod_end() {
int p1_num;
int p2_num;
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 12; j++) {
if (map_data[i][j] == 1) {
p1_num++;
} else if (map_data[i][j] == 2) {
p2_num++;
}
}
}
/* printf("[INFO]Game data: P1:%d, P2:%d\n", p1_num-12, p2_num-12); */
if (p1_num<p2_num) {
printf("[WIN]P2の勝利!\n");
} else if (p1_num>p2_num) {
printf("[WIN]P1の勝利!\n");
} else {
printf("[WIN]勝者なし。");
}
}
最後に、ゲームを開始します!
int main() {
printf("\n[INFO] ゲームを開始します\n\n");
base();
for (int i=0; i<12; i++) {
printf("[INFO] ラウンド %d", i);
lod_player();
lod_map();
sleep(1);
/* 何かのモード(?) */
//printf("\33[2J \033[0m");
//printf("\007 \033[0m\n");
}
lod_end();
return 0;
}
完全なコード: Github