UVA220 ——黑白棋(Othello)

原创 2016年06月01日 01:03:51

好开心,终于把黑白棋的程序写出来了。

学会了熟练地用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;

}


UVA - 220 Othello(黑白棋)

题目链接 说说 这种题做起来最难受了,思路上没什么难度,细节处理一大堆,一不小心就得wrong,这次还好,一气呵成,写好后稍加改动就过了。 这种题一般代码量是需要不少的,常常会有很多冗余的...
  • to_be_better
  • to_be_better
  • 2015年11月21日 03:57
  • 1481

习题4-3 黑白棋 UVa220

算法竞赛入门经典(第2版)第4章 函数和递归 习题4-3 黑白棋  UVa220 感悟。 1、阅读书中题目,从网站下载英文原题,重点在看输入输出数据与格式。 2、...
  • mrcrack
  • mrcrack
  • 2016年11月01日 15:36
  • 824

BFS:UVa220 ACM/ICPC 1992-Othello(黑白棋)

OthelloOthello is a game played by two people on an 8 x 8 board, using disks that are white on one s...
  • yopilipala
  • yopilipala
  • 2017年09月06日 19:56
  • 215

uva 220 Othello

未A,但是测试了好多数据,没有找出错误。#include #include #include using namespace std; using namespace std; char board[...
  • qq_33901573
  • qq_33901573
  • 2016年05月18日 19:02
  • 163

UVA - 220 - Othello

最害怕这种下棋的题了,情况特别多,考差细节特别多,当时没做,现在翻过头来再看一下,顺便复习一下基础。 这道题要注意格式,输出统计黑白棋子数的时候,数要占两位。其他都是普通的思路,顺着题目要求即可。 ...
  • kun768
  • kun768
  • 2015年01月26日 10:37
  • 1900

UVa 220 - Othello

一道黑白棋的模拟,难度上来说不算难,属于比较麻烦的……因为要八个方向去找去操作,没啥好说的,就是模拟。...
  • crazysillynerd
  • crazysillynerd
  • 2014年08月13日 15:39
  • 1377

UVA220,Othello,黑白棋

很繁琐的一道题,415行代码,其中很多都是重复的,有点像之前那题象棋的马的走法,我是用一个个枚举过去的,有点麻烦,明天学学主流,试试用两个数组表示移动方向的方法。讲讲做这题遇到的麻烦和心得吧。 ~1....
  • lsh_001
  • lsh_001
  • 2017年08月13日 17:04
  • 45

算法竞赛入门经典(第2版)习题4-3 黑白棋 Othello UVa220

这题逻辑和习题4-1象棋很相似,没什么特别的。第一次提交报WA,
  • archya
  • archya
  • 2014年08月08日 14:50
  • 1952

Uva220 Othello

可用Udebug上的测试数据测试下(不全) 1.输出格式注意 程序结束的结尾换行是否有多  2.输出黑白棋子数的时候数字%2d输出 3.边界值注意 4.打印所有合法点的时候两点之间有空格 最有一个点输...
  • h1120023921
  • h1120023921
  • 2016年08月04日 15:34
  • 359

Othello UVa220

Time: 3 hrs.这种棋啊什么玩意的题目是真的烦,情况没考虑好就要WA,而且对于我这种弱鸡代码写的非常冗余。本题输出有很多坑,uDebug调试AC后,竟然还是WA。无奈拿着这个代码自己和自己下黑...
  • yjl9903
  • yjl9903
  • 2018年02月10日 21:28
  • 16
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA220 ——黑白棋(Othello)
举报原因:
原因补充:

(最多只允许输入30个字)