好开心,终于把黑白棋的程序写出来了。
学会了熟练地用getchar(),还有“Black -%3d White - %3d”是看了别人的报告才发现的,不然只会一直Presentation Error。
#include<stdio.h>
#include<string.h>
char board[15][15];
char command[100][5];
int player=0;
int judge(int P,int a,int b){
/*if(a==4 ){
printf("test-----------------\n");
for(int i=1;i<9;i++){
for(int j=1;j<9;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
printf("----------------------\n\n\n\n");
}*/
int Lw=0,Rw=0,Uw=0,Dw=0,LUw=0,RUw=0,LDw=0,RDw=0;
int at=a,bt=b;//临时的坐标
//---判断上面
if(P==0) {
while(board[--at][bt]=='B');
if(board[at][bt]=='W' && at<(a-1)) { Lw=1;return 1; }
}
if(P==1){
while(board[--at][bt]=='W');
if(board[at][bt]=='B' && at<(a-1)){ Lw=1;return 1; }
}
//--------判断下面
at=a;bt=b;
if(P==0){
while(board[++at][bt]=='B');
if(board[at][bt]=='W' && at>(a+1)){ Rw=1;return 1; }
}
if(P==1){
while(board[++at][bt]=='W');
if(board[at][bt]=='B' && at>(a+1)){ Rw=1;return 1; }
}
//-----判断左边
at=a;bt=b;
if(P==0){
while(board[at][--bt]=='B');
if(board[at][bt]=='W' && bt<(b-1)){ Uw=1;return 1; }
}
if(P==1){
while(board[at][--bt]=='W');
if(board[at][bt]=='B' && bt<(b-1)){ Uw=1;return 1; }
}
//-----判断右边
at=a;bt=b;
if(P==0){
while(board[at][++bt]=='B');
if(board[at][bt]=='W' && bt>(b+1)){ Dw=1;return 1; }
}
if(P==1){
while(board[at][++bt]=='W');
if(board[at][bt]=='B' && bt>(b+1)){ Dw=1;return 1; }
}
//-----判断左上
at=a;bt=b;
if(P==0){
while(board[--at][--bt]=='B');
if(board[at][bt]=='W' && bt<(b-1)){ LUw=1;return 1; }
}
if(P==1){
while(board[--at][--bt]=='W');
if(board[at][bt]=='B' && bt<(b-1)){ LUw=1;return 1; }
}
//-----判断右上
at=a;bt=b;
if(P==0){
while(board[++at][--bt]=='B');
if(board[at][bt]=='W' && bt<(b-1)){ RUw=1;return 1; }
}
if(P==1){
while(board[++at][--bt]=='W');
if(board[at][bt]=='B' && bt<(b-1)){ RUw=1;return 1; }
}
//-----判断左下
at=a;bt=b;
if(P==0){
while(board[--at][++bt]=='B');
if(board[at][bt]=='W' && at<(a-1)){ LDw=1;return 1; }
}
if(P==1){
while(board[--at][++bt]=='W');
if(board[at][bt]=='B' && at<(a-1)){ LDw=1;return 1; }
}
//-----判断右下
at=a;bt=b;
if(P==0){
while(board[++at][++bt]=='B');
if(board[at][bt]=='W' && at>(a+1)){ RDw=1;return 1; }
}
if(P==1){
while(board[++at][++bt]=='W');
if(board[at][bt]=='B' && at>(a+1)){ RDw=1;return 1; }
}
if(Lw==0 && Rw==0 && Uw==0 && Dw==0 && LUw==0 && RUw==0 && LDw==0 && RDw==0) return 0;
}
void List(){
int count=0;
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
if( (board[i][j]=='-') && judge(player,i,j)==1 ){
if(count==0){ printf("(%d,%d)",i,j);}
else printf(" (%d,%d)",i,j);
count++;
}
}
}
if(count==0) { printf("No legal move."); }
printf("\n");
return ;
}
void Move(int P,int a, int b){
if(!judge(P,a,b)) player=!player;
P=player;
int at=a,bt=b;//临时的坐标
//---判断下面
if(P==0) {
board[at][bt]='W';
while(board[++at][bt]=='B');
if(board[at][bt]=='W' && at>(a+1)){
while(board[--at][bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[++at][bt]=='W');
if(board[at][bt]=='B' && at>(a+1)){
while(board[--at][bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断上面
if(P==0) {
board[at][bt]='W';
while(board[--at][bt]=='B');
if(board[at][bt]=='W' && at<(a-1)){
while(board[++at][bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[--at][bt]=='W');
if(board[at][bt]=='B' && at<(a-1)){
while(board[++at][bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断左边
if(P==0) {
board[at][bt]='W';
while(board[at][--bt]=='B');
if(board[at][bt]=='W' && bt<(b-1)){
while(board[at][++bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[at][--bt]=='W');
if(board[at][bt]=='B' && bt<(b-1)){
while(board[at][++bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断右边
if(P==0) {
board[at][bt]='W';
while(board[at][++bt]=='B');
if(board[at][bt]=='W' && bt>(b-1)){
while(board[at][--bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[at][++bt]=='W');
if(board[at][bt]=='B' && bt>(b-1)){
while(board[at][--bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断左上
if(P==0) {
board[at][bt]='W';
while(board[--at][--bt]=='B');
if(board[at][bt]=='W' && bt<(b-1)){
while(board[++at][++bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[--at][--bt]=='W');
if(board[at][bt]=='B' && bt<(b-1)){
while(board[++at][++bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断右上
if(P==0) {
board[at][bt]='W';
while(board[--at][++bt]=='B');
if(board[at][bt]=='W' && bt>(b+1)){
while(board[++at][--bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[--at][++bt]=='W');
if(board[at][bt]=='B' && bt>(b+1)){
while(board[++at][--bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断右下
if(P==0) {
board[at][bt]='W';
while(board[++at][++bt]=='B');
if(board[at][bt]=='W' && bt>(b+1)){
while(board[--at][--bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[++at][++bt]=='W');
if(board[at][bt]=='B' && bt>(b+1)){
while(board[--at][--bt]=='W'){ board[at][bt]='B';}
}
}
at=a,bt=b;//临时的坐标
//---判断左下
if(P==0) {
board[at][bt]='W';
while(board[++at][--bt]=='B');
if(board[at][bt]=='W' && bt<(b-1)){
while(board[--at][++bt]=='B'){ board[at][bt]='W';}
}
}
if(P==1){
board[at][bt]='B';
while(board[++at][--bt]=='W');
if(board[at][bt]=='B' && bt<(b-1)){
while(board[--at][++bt]=='W'){ board[at][bt]='B';}
}
}
//打印
int Bnum=0,Wnum=0;
for(int i=1;i<=9;i++){
for(int j=1;j<=9;j++){
if(board[i][j]=='W') Wnum++;
if(board[i][j]=='B') Bnum++;
}
}
printf("Black -%3d White -%3d\n",Bnum,Wnum);
player=!player;//切换
/*printf("test------------\n");
for(int i=1;i<9;i++){
for(int j=1;j<9;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
printf("-------------------\n");*/
return;
}
void Quit() {
for(int i=1;i<9;i++){
for(int j=1;j<9;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
//printf("\n");
return;
}
int main(){
//freopen("input.txt","r",stdin);
//freopen("output.txt","w",stdout);
int T;
scanf("%d",&T);
int flag=1;
while(T--){
getchar();
memset(board,'-',sizeof(board));
memset(command,0,sizeof(command));
for(int i=1;i<=8;i++){
for(int j=1;j<=8;j++){
scanf("%c",&board[i][j]);
}
getchar();
}
int t=0;
while(scanf("%s",command[t])==1 && command[t++][0]!='Q');
/*printf("test------------\n");
for(int i=1;i<9;i++){
for(int j=1;j<9;j++){
printf("%c",board[i][j]);
}
printf("\n");
}
printf("-------------------\n");*/
if(command[0][0]=='W') player=0;
if(command[0][0]=='B') player=1;//当前的player,黑为1,白为0;
if(!flag) {printf("\n");}//判断quit后是否空一行
else flag=0;
int a,b;
for(int i=1;i<=t;i++){
if(command[i][0]=='L') List();
if(command[i][0]=='M'){
a=command[i][1]-'0';
b=command[i][2]-'0';//将Move的坐标赋给ab
Move(player,a,b);
}
if(command[i][0]=='Q'){
Quit();
}
}
/*for(int i=1;i<9;i++){
for(int j=1;j<9;j++){
printf("%c",board[i][j]);
}
printf("\n");
}*/
}
return 0;
}