三角点格棋

#include <iostream>
#include <cstring>
#include <cstdio>
#define INF 10000
using namespace std;
int bian[18] = { 109,106,98,96,95,87,85,84,74,65,63,54,53,52,42,32,31,21 }, map[18];
int triangle[9][3] = { { 21,32,31 },{ 42,52,54 },{ 53,63,65 },{ 74,84,87 },{ 85,95,98 },{ 96,106,109 } ,{ 84,85,54 } ,{ 53,52,32 },{ 95,96,65 } };
int lu,mark;
void movemap(int head, int end)
{
 int i;
 mark = 0;
 lu = end * 10 + head;
 for (i = 0; i < 18; i++)
 {
  if (lu == bian[i])
  {
   map[i] = 1;
   mark++;
   break;
  }
 }
 if(mark==0) printf("傻子,输错了\n");
}
int NewTriangle()
{
 int n = 0;
 if (map[15] == 1 && map[16] == 1 && map[17] == 1) n++;
 if (map[11] == 1 && map[13] == 1 && map[14] == 1) n++;
 if (map[9] == 1 && map[10] == 1 && map[12] == 1) n++;
 if (map[5] == 1 && map[7] == 1 && map[8] == 1) n++;
 if (map[2] == 1 && map[4] == 1 && map[6] == 1) n++;
 if (map[3] == 1 && map[0] == 1 && map[1] == 1) n++;
 if (map[6] == 1 && map[7] == 1 && map[11] == 1) n++;
 if (map[12] == 1 && map[13] == 1 && map[15] == 1) n++;
 if (map[3] == 1 && map[4] == 1 && map[9] == 1) n++;
 return n;
}

int Alphabeta(int depth,int s, int alpha, int beta, int total, int scoreA, int scoreB)
{
 int  p = 0;
 int hhh = 0, KK = 0, sum;
 if (scoreA >= 5 || scoreB >= 5)
  return 1;
 for (int i = 0; i<18; i++)
 {
  if (map[i] == 1)
   continue;
  else map[i] = 1;
  int val;
  sum = NewTriangle();
  KK = sum - total;
  if (KK > 0)
  {
   if (s == 0)
    val = Alphabeta(depth+1,s, alpha, beta, sum, scoreA + KK, scoreB);
   else
    val = Alphabeta(depth+1,s, alpha, beta, sum, scoreA, scoreB + KK);
  }
  else
  {
   val = -Alphabeta(depth+1,1 - s, -beta, -alpha, sum, scoreA, scoreB);
  }
  if (val == 1 && depth == 0)
   return i;
  map[i] = 0;
  if (val > alpha)
   alpha = val;
  if (val >= beta)
   return beta;
 }
 return alpha;
}
int main()
{
 int player = 0, scoreA = 0, scoreB = 0, game = 1, sum,score;
 int i, n, head, end, ans, KK;
 while (game++)
 {
  memset(map, 0, sizeof(map));
  player = scoreA = scoreB = ans = 0;
  sum = 0;
  while (scoreA < 5 && scoreB <5)
  {
   printf("请输入:");
   cin >> head >> end;
   movemap(head, end);
   if (mark == 0)
    continue;
   KK = NewTriangle() - sum;
   k:
   if (KK > 0)
   {
    scoreA += KK;
    sum = NewTriangle();
    continue;
   }
   else {
    player = 1;
    ans = Alphabeta(0, player, -INF, INF, sum, scoreA, scoreB);
    head = bian[ans] % 10;
    end = bian[ans] / 10;
    printf("%d %d\n", head, end);
    score = NewTriangle() - sum;
    scoreB += score;
    sum = NewTriangle();
    if (score > 0)
     goto k;
    
   }
  }
  printf("game %d: ", game);
  if (scoreA >= 5)
   printf("You win!\n");
  else printf("你太菜了23333\n");
 }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值