UVA220 黑白棋 Othello

题目

在这里插入图片描述
你的任务是模拟黑白棋游戏的进程。黑白棋的规则为:黑白双方轮流放棋子,每次必 须让新放的棋子“夹住”至少一枚对方棋子,然后把所有被新放棋子“夹住”的对方棋子 替换成己方棋子。一段连续(横、竖或者斜向)的同色棋子被“夹住”的条件是两端都是 对方棋子(不能是空位)。如图所示,白棋有6个合法操作,分别为(2,3),(3,3),(3,5),(6,2),(7,3),(7,4)。选择在(7,3)放白棋后变成如图所示效果(注意有竖向和斜向的共两枚黑棋变白)。注意(4,6)的黑色棋子虽然被夹住,但不是被新放的棋子夹住,因此不变白。

输入一个8*8的棋盘以及当前下一次操作的游戏者,处理3种指令:

L指令打印所有合法操作,从左到右的顺序排列(无合法操作时输出No legal move)。

Mrc指令放一枚棋子在(r,c)。如果当前游戏者没有合法操作,则是先切换游戏者再操作。保证输入合法。输出操作后的黑白棋子总数。

Q指令退出游戏,并打印当前棋盘(同输入格式)。
在这里插入图片描述

思路

这题可以说难也可以说不难。解题思路并不难,用暴力求解就好了。但中间有很多坑,而且有八个方向。

  • 用八个函数实现八个方向的判定,函数同时具有两个功能:算出合法操作和夹住吃子操作。算出合法操作是基本操作,用一个指针判断是否要进行夹住吃子操作。
  • 要注意棋盘边缘的判定和切换游戏者后是否有合法操作,也就是是否是死局的操作。

代码

#include <iostream>
#include <string>

using namespace std;

int search_jplus(char board[][9],int i,int j,char player,int q);  //吃子操作判定指针q
int search_jsub(char board[][9],int i,int j,char player,int q);
int search_iplus(char board[][9],int i,int j,char player,int q);
int search_isub(char board[][9],int i,int j,char player,int q);
int search_ipjp(char board[][9],int i,int j,char player,int q);
int search_ipjs(char board[][9],int i,int j,char player,int q);
int search_isjp(char board[][9],int i,int j,char player,int q);
int search_isjs(char board[][9],int i,int j,char player,int q);

int main()
{
   
    char board[9][9];
    string ins;
    char player;
    int x,y;
    for(int i=1;i<9;i++)
        for(int j=1;j<9;j++)
        cin>>board[i][j];
    cout<<"Please enter player:";
    cin>>player;
    while(true)
    {
   
        cin>>ins;
        if(ins[0]=='L')
        {
   
            int k=0;
            for(int i=1;i<9;i++)
                for(int j=1;j<9;j++)
            {
   
                int p,q;
                p=q=0;            //判断是否有合法操作指针p
                if(board[i][j]=='-')
                {
   
                    p=search_jplus(board,i,j,player,q);
                    if(p==1)
                    {
   
                        cout<<"("<<i<<","<<j<<")"<<endl;
                        k++;
                        continue;
                    }
                    p=search_jsub(board,i,j,player,q);
                    if(p==1)
                    {
   
                        cout<<"("<<i<<","<<j<<")"<<endl;
                        k++;
                        continue;
                    }
                    p=search_iplus(board,i,j,player,q);
                    if(p==1)
                    {
   
                        cout<<"("<<i<<
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值