BF5のオープンβ

f:id:soloplayera2:20180912001407j:plain

 BFシリーズは、BFBC2からプレイし始め、BF3、BF4、BFH、BF1すべて購入してきました。FPSに飽きてきたのか、だんだんプレイする時間が減って、BF1では、始めても1,2マップでやめて違うゲームプレイするといった状況であった。

 BF5をプレイしてみた感想としては、補給がポイントになってくると感じた。兵士はマガジン2つ分しか弾薬を持っておらず、ビーグルも弾薬に制限があり、撃ち切ったら補給となっている。うまくて生存時間が長い人には理不尽だが、自分のようなあまり上手くない人にとっては、よいシステムなのではないかと感じた。その他に特に何も感じなかった。マップももう少しプレイしてみないとなんとも言えない。建築要素は、面白かったが、陣地構築中に狙撃されることが何回かあったので、しにくいようになったら、建築要素が生きてくると思った。あとは、小さい段差の躓きをなくして欲しかった。とりあえず、BF1とは結構違っていたので購入しようとは思う。

黒マスはどこだ

『Cによる探索プログラミング』の練習問題7.1のプログラムを作成しました。ひとりにしてくれのプログラムから使い回せる部分が多かったので参考またはコピぺして簡単に作成できました。特に、黒マスが白マスを分断していないかチェックする関数はコピペである。自分で実装するとしたらそうとう複雑になっていたと思う。ソースコードではコピペ部分は表示してない。次は自動に解答するプログラムが課題である

 

ソースコード

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define N 6
#define OK 1
#define ERROR 0
#define WHITE 0
#define BLACK -1

void init_arr(int arr[N][N]);
void copy_arr(int arr1[N][N], int arr2[N][N]);
int black_around(int arr[N][N], int i, int j);
int check_divide(int *board);
int check_around_divide(int *board, int *check, int i, int j, int k);
int check_edge_divide(int *board, int i, int j, int k, int l, int m);
void print_arr(int arr[N][N]);
int set_black_sq(int arr[N][N]);
int num_white_sq(int arr[N][N], int i, int j);
int set_num(int arr[N][N]);
int is_OK(int arr[N][N]);
void white_2_black(int arr[N][N]);

int main(){
srand(time(NULL));
int answer[N][N];
int question[N][N];
int i,j,f;

//答えの盤面を真っ白に初期化
init_arr(answer);
//黒マスをセット
f = 0;
while(f == 0){
if(set_black_sq(answer)){
f = 1;
}
}
//数字をセット
f = 0;
while(f == 0){
if(set_num(answer)){
f = 1;
}
}
//問題の作成
copy_arr(question, answer);
white_2_black(question);
printf("This is problem\n");
print_arr(question);
while(1){
printf("Input the place of the black!\n");
printf("If row is i and rank is j,input:i j.\n");
printf("When you give up, input :-1 -1.\n");
scanf("%d %d",&i ,&j);
if (i == -1 && j == -1) {
printf("Never mind!\n");
printf("An example of answer is\n");
print_arr(answer);
return 0;

}else if(!(i >= 0 && j >= 0 && i < N && j < N)) {
printf("Input correctly!\n");
continue;

}else if(black_around(question, i, j) == ERROR) {

printf("The places of the black must not continue.\n");
continue;
}else if(question[i][j] > 0){

printf("The places of number must not be changed\n");
continue;
}
question[i][j] = BLACK;
if(check_divide(&(question[0][0]))==ERROR) {
printf("The places of the black must not divide the board.\n");
question[i][j] = WHITE;
continue;
}
print_arr(question);
if(is_OK(question)){
printf("Conguratulation!!\n");
return 0;
}
}
return 0;
}

//盤面を白にする
void init_arr(int arr[N][N]){
int i, j;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
arr[i][j] = WHITE;
return;
}

//盤面のコピー
void copy_arr(int arr1[N][N], int arr2[N][N]){
int i, j;
for(i = 0; i < N; i++)
for(j = 0; j < N; j++)
arr1[i][j] = arr2[i][j];
return;
}

//黒の上下左右を調べる
int black_around(int arr[N][N], int i, int j){
int left = j - 1;
int right = j + 1;
int up = i - 1;
int down = i + 1;
if(left >= 0){
if(arr[i][left] == BLACK)return ERROR;
}
if(right < N){
if(arr[i][right] == BLACK)return ERROR;
}
if(up >= 0){
if(arr[up][j] == BLACK)return ERROR;
}
if(down < N){
if(arr[down][j] == BLACK)return ERROR;
}
return OK;
}

 

 

//黒マスをセット
int set_black_sq(int arr[N][N]){
int i, j, f;
int k, l;
for(i = 0; i < (N * N / 4); i++){
f = 0; j = 0;
while(f == 0 && j < 100){
k = rand() % N; l = rand() % N;
if(black_around(arr, k, l)){
arr[k][l] = BLACK;
f = 1;
}
if(check_divide(&arr[0][0]) == ERROR){
f = 0;
arr[k][l] = WHITE;
}
j++;
}
//100回ループしてもセットできないときはやり直し
if(j == 100)return ERROR;
}
return OK;
}

//盤面の表示
void print_arr(int arr[N][N]){
int i ,j;
for(i = 0; i < N; i++){
for(j = 0; j < N; j++){
if(arr[i][j] == WHITE){
printf(" 0");
}else if(arr[i][j] == BLACK){
printf(" #");
}else{
printf(" %2d", arr[i][j]);
}
}
printf("\n");
}
}

//ターゲットのマスの上下左右の黒マス、端までのマスを調べる。
int num_white_sq(int arr[N][N], int i, int j){
int sum = 1;
int yoko, tate;
for(yoko = j - 1; yoko >= 0; yoko--){
if(arr[i][yoko] == BLACK)break;
sum++;
}
for(yoko = j + 1; yoko < N; yoko++){
if(arr[i][yoko] == BLACK)break;
sum++;
}
for(tate = i - 1; tate >= 0; tate--){
if(arr[tate][j] == BLACK)break;
sum++;
}
for(tate = i + 1; tate < N; tate++){
if(arr[tate][j] == BLACK)break;
sum++;
}
return sum;
}

//白マスにランダムにセット
int set_num(int arr[N][N]){
int n, f, m;
int i,j;
for(n = 0; n < (N * N / 5); n++){
f = 0; m = 0;
while(f == 0 && m < 100){
i = rand() % N; j = rand() % N;
if(arr[i][j] == WHITE){
arr[i][j] = num_white_sq(arr, i, j);
f = 1;
}
m++;
}
//100回ループしてセットできなかったらやり直し
if(m == 100)return ERROR;
}
return OK;
}

//正解か判定
int is_OK(int arr[N][N]){
int i, j, num;
for(i = 0; i < N; i++){
for(j = 0; j < N; j++){
num = 0;
if(arr[i][j] != WHITE && arr[i][j] != BLACK){
if(arr[i][j] != num_white_sq(arr, i, j))return ERROR;
}
}
}
return OK;
}


//問題作成のとき黒マスを白マスに変える
void white_2_black(int arr[N][N]){
int i, j;
for(i = 0; i < N; i++){
for(j = 0; j < N; j++){
if(arr[i][j] == BLACK){
arr[i][j] = WHITE;
}
}
}
return;
}

 

実行例

This is problem
0 0 4 0 0 0
0 0 0 0 0 2
0 0 0 8 0 0
7 0 0 0 0 0
0 6 0 0 0 0
0 0 0 3 0 2
Input the place of the black!
If row is i and rank is j,input:i j.
When you give up, input :-1 -1.