最近无聊在写奥赛罗(黑白棋),求关于落棋可行判定的思路
c语言吧
全部回复
仅看楼主
level 12
刘好羞🌝 楼主
已经解决的是如何判定是否落在棋盘外,以及是否能落在当前位置。
但是还是无法判断某方是否能落子,以及双方是否都无棋可走。
目前有两种思路。
一:用两个队列,每回合更新双方可行队列。
二:即时判断。
问题是个人想到的生成队列的方式似乎比每回合即时判断的效率要低啊= =
各位有想法么。
能否落在当前位置是用的八方向递归查找,2L放代码

2011年07月27日 07点07分 1
level 12
刘好羞🌝 楼主
#include<stdio.h>
struct coordinate
{
      int x;
      int y;
}direct[8]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char map[10][10];
char p[3];
//地图类
int exitcode;
int flag;
//开关类
int me,op;
int d;
//控制变量类
int num[2];
int temp;
//普通记录变量类
void initmap()
{
    memset(map,0,sizeof(map));
    int i,j;
    for (i=0;i<10;i++)
        for (j=0;j<10;j++)
            map[i][j]=p[3];
    map[4][4]=p[me];
    map[5][5]=p[me];
    map[4][5]=p[op];
    map[5][4]=p[op];
}
void init()
{
    num[0]=2;
    num[1]=2;
    me=0;
    op=1;
    p[me]='*';
    p[op]='@';
    p[3]='.';
    exitcode=2;
    initmap();
}
void printmap()
{
    int i,j;
    printf("  1 2 3 4 5 6 7 8\n");
    for (i=1;i<=8;i++)
    {
        printf("%d",i);
        for (j=1;j<=8;j++)
            printf(" %c",map[i][j]);
        printf("\n");
    }
    printf("\n");
    printf("%c --- %d\n",p[0],num[0]);
    printf("%c --- %d\n",p[1],num[1]);
    printf("\n");
}
void change()
{
    temp=me;
    me=op;
    op=temp;   
}
int search(int i,int j,int step)
{
    if (map[i][j]==p[3])
        return 0;
        else if (map[i][j]==p[me])
            return step-1;
                    else if (step=search(i+direct[d].x,j+direct[d].y,step+1))
                        map[i][j]=p[me];
    return step;
}
void sortgame()
{
    int i,j;
    while (exitcode)
    {
          printmap();
          i=0;
          j=0;
          printf("%c's turn.Your coordinate(y,x):",p[me]); 
          scanf("%d,%d",&i,&j);
          while ((i<1)||(i>8)||(j<1)||(j>8))
          {
                printf("You have entered an unreachable position, please input again.\n");
                printf("%c's turn.Your coordinate(x,y):",p[me]);
                scanf("%d,%d",&i,&j);
          }
          flag=0;
          for (d=0;d<8;d++)
              if (temp=search(i+direct[d].x,j+direct[d].y,1))
                  {
                        num[me]+=temp;
                        num[op]-=temp;
                        flag=1;
                  }
          if (!flag)
              {
                    exitcode--;
                    printf("Unusable step.\n");   
              }
              else
              {
                  map[i][j]=p[me];
                  num[me]++;
                  exitcode=2;
              }
          change();
    }   
    printf("Either of you have no way to go, game exit.\n");
}
main()
{
      init();
      sortgame();
      getch();
}
2011年07月27日 07点07分 5
level 8
没玩过、、、
2011年07月27日 07点07分 6
level 4
那个我是新手···看不懂
2011年07月27日 11点07分 7
level 11
你想写AI?
2011年07月27日 11点07分 8
level 11
我一下子想到了莎士比亚……
————————————————————————————
即时判断吧……反正没什么复杂度=w=棋盘大小是固定的不是么
2011年07月27日 11点07分 9
level 11
他只是想判断局面状态
2011年07月27日 11点07分 10
level 11
那就直接即时暴力就够了呀。。。
2011年07月27日 11点07分 11
level 11
主要的萌点是〔奥塞罗〕这称呼
2011年07月27日 11点07分 12
level 12
刘好羞🌝 楼主
那就即时暴力吧= =
其实是这样的,想先写出人人对战。
再练习AI,反正接口都留好了~
2011年07月27日 13点07分 13
level 12
刘好羞🌝 楼主
控制台版PVP->控制台版PVE->图形化PVE
2011年07月27日 13点07分 14
level 9
[拜]
2011年07月27日 13点07分 15
level 12
刘好羞🌝 楼主
[拜]
2011年07月27日 13点07分 16
level 9
[拜]膜拜ai,唯一一个ai因为接口不是同一个人开发陷入无限循环就拜拜了
2011年07月27日 13点07分 17
level 12
刘好羞🌝 楼主
= = 练练算法,顺便入手几本Prolog的书看能不能自己啃的动
2011年07月27日 13点07分 18
level 12
刘好羞🌝 楼主
前辈可以去试试坦克大战那个啊~
2011年07月27日 13点07分 19
level 9
[瀑布汗~]心情真好
2011年07月27日 13点07分 20
level 9
我是算法白痴。。。[发怒]
2011年07月27日 13点07分 21
level 12
刘好羞🌝 楼主
初生牛犊不怕虎,,,这正好说明了咱小白嘛、、、、
话说C吧啥时也搞个活动玩玩呗,大家都闲得无聊的时候。
2011年07月27日 13点07分 22
level 9
这个东西怎么写?
2011年07月27日 13点07分 23
1 2 尾页