⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1234.c

📁 五子棋 五子棋 五子棋 五子棋
💻 C
📖 第 1 页 / 共 2 页
字号:
    if (x1 < 450) {
 if (y1 > 30)
     line(x1 + 7, y1 - 15, x1 + 15, y1 - 15);
 if (y1 > 30)
     line(x1 + 15, y1 - 15, x1 + 15, y1 - 7);
 if (y1 < 450)
     line(x1 + 15, y1 + 7, x1 + 15, y1 + 15);
 if (y1 < 450)
     line(x1 + 15, y1 + 15, x1 + 7, y1 + 15);
    }
    if (x1 > 30) {
 if (y1 < 450)
     line(x1 - 7, y1 + 15, x1 - 15, y1 + 15);
 if (y1 < 450)
     line(x1 - 15, y1 + 15, x1 - 15, y1 + 7);
 if (y1 > 30)
     line(x1 - 15, y1 - 7, x1 - 15, y1 - 15);
 if (y1 > 30)
     line(x1 - 15, y1 - 15, x1 - 7, y1 - 15);
    }
    oldx = x1;
    oldy = y1;
}
 
void
set_chessman()
{
    /*
     * 棋子有三种状态,0是未初始状态,1是控制方棋子,2是对方棋子 
     */
    int             i,
                    j;
    for (i = 0; i < 15; i++)
 for (j = 0; j < 15; j++)
     chessman[i][j] = 0;
}

/*
 * 0表示没有赢,1表示p1胜利,2表示p2胜利,3表示平局
 */
int
win_or_not(int x0, int y0, int who, int chessman[LENGTH][LENGTH], int a)
{
    int             i = x0 / 30 - 1,
                    j = y0 / 30 - 1;
    int             who_run = who;
    int             line_sum = -1;
    int             tmp_i = i,
                    tmp_j = j;
    int             c;
    if (a == 1) {
 /*
  * 测试第一层扩展是否满足赢的条件
  */
 c = chessman[i][j];
 chessman[i][j] = who_run;
    }

    while (1) {   /* 查找共行的棋子是否连接了五个 */
 while (tmp_i >= 0 && line_sum != 4) {
     if (chessman[tmp_i--][j] == who_run)
  line_sum++;
     else
  break;
 }
 if (line_sum == 4)
     line_sum++;
 tmp_i = i;
 while (tmp_i <= 15 && line_sum != 5) {
     if (chessman[tmp_i++][j] == who_run)
  line_sum++;
     else
  break;
 }
 if (line_sum == 5) {
     if (a == 1)
  chessman[i][j] = c;
     return who_run;
 }
 line_sum = -1;
 tmp_i = i;
 break;
    }
    while (1) {   /* 查找共列的棋子是否连接了五个 */
 while (tmp_j >= 0 && line_sum != 4) {
     if (chessman[i][tmp_j--] == who_run)
  line_sum++;
     else
  break;
 }
 if (line_sum == 4)
     line_sum++;
 tmp_j = j;
 while (tmp_j <= 15 && line_sum != 5) {
     if (chessman[i][tmp_j++] == who_run)
  line_sum++;
     else
  break;
 }
 if (line_sum == 5) {
     if (a == 1)
  chessman[i][j] = c;
     return who_run;
 }
 line_sum = -1;
 tmp_j = j;
 break;
    }
    while (1) {   /* 查找上对角线上是否连接了五个 */
 while (line_sum != 4 && tmp_i <= 15 && tmp_j >= 0) {
     if (chessman[tmp_i++][tmp_j--] == who_run)
  line_sum++;
     else
  break;
 }
 tmp_i = i;
 tmp_j = j;
 if (line_sum == 4)
     line_sum++;
 while (line_sum != 5 && tmp_i >= 0 && tmp_j <= 15) {
     if (chessman[tmp_i--][tmp_j++] == who_run)
  line_sum++;
     else
  break;
 }
 if (line_sum == 5) {
     if (a == 1)
  chessman[i][j] = c;
     return who_run;
 }
 tmp_i = i;
 tmp_j = j;
 line_sum = -1;
 break;
    }
    while (1) {   /* 查找下对角线上是否连接了五个 */
 while (line_sum != 4 && tmp_i >= 0 && tmp_j >= 0) {
     if (chessman[tmp_i--][tmp_j--] == who_run)
  line_sum++;
     else
  break;
 }
 tmp_i = i;
 tmp_j = j;
 if (line_sum == 4)
     line_sum++;
 while (line_sum != 5 && tmp_i <= 15 && tmp_j <= 15) {
     if (chessman[tmp_i++][tmp_j++] == who_run)
  line_sum++;
     else
  break;
 }
 if (line_sum == 5) {
     if (a == 1)
  chessman[i][j] = c;
     return who_run;
 }
 break;
    }
    if (step_sum == 225) {
 if (a == 1)
     chessman[i][j] = c;
 return 3;
    }
    if (a == 1)
 chessman[i][j] = c;
    return 0;
}
 
double
score_row(int i, int j, int chessman[LENGTH][LENGTH])
{
    int             sum_chessmen = 0;
    double          score = 0;
    int             mid_j;
    int             who_running = chessman[i][j];
    if (j == LENGTH) {
 while (chessman[i][j] == who_running) {
     j--;
     sum_chessmen++;
 }
 if (sum_chessmen >= 5)
     score = 200000;
 else {
     if (chessman[i][j] == 0) /* 没有下子,活的情况 */
  score = 2000 / POW(10, 4 - sum_chessmen);
     else
  score = 0; /* 死的情况 */
 }
    } else {
 while (chessman[i][j] == who_running && j != LENGTH) {
     j++;
     sum_chessmen++;
 }
 mid_j = j;
 j = j - sum_chessmen - 1;
 while (chessman[i][j] == who_running && j != -1) {
     j--;
     sum_chessmen++;
 }
 if (j >= 0 && mid_j < LENGTH) {
     if (chessman[i][j] == 0 && chessman[i][mid_j] == 0)
  score = 18000 / POW(50, 4 - sum_chessmen);
     else if ((chessman[i][j] != 0 && chessman[i][mid_j] == 0)
       || (chessman[i][j] == 0 && chessman[i][mid_j] != 0))
  score = 2000 / POW(10, 4 - sum_chessmen);
     else
  score = 0;
 }
 if (j < 0 && mid_j < LENGTH) {
     if (chessman[i][mid_j] == 0)
  score = 2000 / POW(10, 4 - sum_chessmen);
     else
  score = 0;
 }
 if (j >= 0 && mid_j >= LENGTH) {
     if (chessman[i][j] == 0)
  score = 2000 / POW(10, 4 - sum_chessmen);
     else
  score = 0;
 }
 if (j < 0 && mid_j >= LENGTH)
     score = 0;
    }
    return score;
}
double
score_col(int i, int j, int chessman[LENGTH][LENGTH])
{
    int             sum_chessmen = 0,
                    mid_i;
    double          score = 0;
    int             who_running = chessman[i][j];
    if (i == LENGTH) {
 while (chessman[i][j] == who_running) {
     i--;
     sum_chessmen++;
 }
 if (sum_chessmen >= 5)
     score = 200000;
 if (chessman[i][j] == 0)
     score = 2000 / POW(10, 4 - sum_chessmen);
 else
     score = 0;
    } else {
 while (chessman[i][j] == who_running) {
     i++;
     sum_chessmen++;
 }
 mid_i = i;
 if (i == LENGTH || chessman[i][j] != who_running) {
     i = i - sum_chessmen;
     while (chessman[i - 1][j] == who_running) {
  i--;
  sum_chessmen++;
     }
     if (i >= 0) {
  if (chessman[i][j] == 0 && chessman[mid_i][j] == 0)
      score = 18000 / POW(50, 4 - sum_chessmen);
  else if ((chessman[i][j] != 0 && chessman[mid_i][j]) == 0
    || (chessman[i][j] == 0
        && chessman[mid_i][j] != 0))
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
     if (i < 0 && mid_i < LENGTH) {
  if (chessman[mid_i][j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
     if (i < 0 && mid_i < LENGTH) {
  if (chessman[mid_i][j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
     if (i >= 0 && mid_i >= LENGTH) {
  if (chessman[i][j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
 }
    }
    return score;
}
double
score_diag_45(int i, int j, int chessman[LENGTH][LENGTH])
{
    int             sum_chessmen = 0;
    double          score = 0;
    int             mid_i,
                    mid_j;
    int             who_running = chessman[i][j];
    if (i == LENGTH || j == LENGTH) {
 while (chessman[i][j] == who_running && i > 1 && j > 1) {
     i--;
     j--;
     sum_chessmen++;
 }
 if (sum_chessmen >= 5)
     score = 200000;
 else {
     if (chessman[i][j] == 0)
  score = 2000 / POW(10, 4 - sum_chessmen);
     else
  score = 0;
 }
    } else {
 while (chessman[i][j] == who_running && i <= LENGTH && j <= LENGTH) {
     i++;
     j++;
     sum_chessmen++;
 }
 mid_i = i;
 mid_j = j;
 i = i - sum_chessmen;
 j = j - sum_chessmen;
 while (chessman[i - 1][j - 1] == who_running) {
     i--;
     j--;
     sum_chessmen++;
 }
 if (sum_chessmen >= 5)
     score = 200000;
 if (i >= 0 && j >= 0 && mid_i < LENGTH && mid_j < LENGTH) {
     if (chessman[mid_i][mid_j] == 0 && chessman[i][j] == 0)
  score = 18000 / POW(50, 4 - sum_chessmen);
     else if ((chessman[mid_i][mid_j] == 0 && chessman[i][j] != 0)
       || (chessman[mid_i][mid_j] != 0
    && chessman[i][j] == 0))
  score = 2000 / POW(10, 4 - sum_chessmen);
     else
  score = 0;
 } else {
     if (i >= 0 && j >= 0) {
  if (chessman[i][j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     } else if (mid_i < LENGTH && mid_j < LENGTH) {
  if (chessman[mid_i][mid_j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     } else
  score = 0;
 }
    }
    return score;
}
double
score_diag_135(int i, int j, int chessman[LENGTH][LENGTH])
{
    int             sum_chessmen = 0;
    double          score = 0;
    int             mid_i,
                    mid_j;
    int             who_running = chessman[i][j];
    while (chessman[i][j] == who_running && j != -1 && i < LENGTH) {
 i++;
 j--;
 sum_chessmen++;
    }
    mid_i = i;
    mid_j = j;
    j += sum_chessmen;
    i -= sum_chessmen;
    j++;
    i--;
    while (chessman[i][j] == who_running && j != LENGTH) {
 i--;
 j++;
 sum_chessmen++;
    }
    if (sum_chessmen >= 5)
 score = 200000;
    else {
 if (i >= 0 && j < LENGTH && mid_j >= 0 && mid_i < LENGTH) {
     if (chessman[i][j] == 0 && chessman[mid_i][mid_j] == 0)
  score = 18000 / POW(50, 4 - sum_chessmen);
     else {
  if ((chessman[i][j] == 0 && chessman[mid_i][mid_j] != 0)
      || (chessman[i][j] != 0
   && chessman[mid_i][mid_j] == 0))
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
 } else {
     if (i >= 0 && j < LENGTH) {
  if (chessman[i][j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
     if (mid_j >= 0 && mid_i < LENGTH) {
  if (chessman[mid_i][mid_j] == 0)
      score = 2000 / POW(10, 4 - sum_chessmen);
  else
      score = 0;
     }
 }
    }
    return score;
}
double
total_score(int who_running, int chessman[LENGTH][LENGTH])
{
    /*
     * 统计出在该点上的得分,who_running=1表示人的棋子,2为电脑的棋子
     */
    int             i,
                    j;
    double          score = 0;
    for (i = 0; i < LENGTH; i++)
 for (j = 0; j < LENGTH; j++) {
     if (chessman[i][j] == who_running) {
  score += score_row(i, j, chessman);
  score += score_col(i, j, chessman);
  score += score_diag_45(i, j, chessman);
  score += score_diag_135(i, j, chessman);
     }
 }
    return score;
}
double
score(int chessman[LENGTH][LENGTH])
{
    /*
     * 计算最终的得分数,分别考虑了在这个位置放对方棋子跟自己棋子的综合
     */
    double          sum1,
                       sum2;
    sum1 = total_score(COMPUTER, chessman);
    sum2 = total_score(PLAYER1, chessman);
    return sum1 - sum2;
}
/*
 * 扩展-----剪枝过程
 */
int
rowdt(int i, int j, int chessman[LENGTH][LENGTH])    /*在树直方向*/
{
    int             k;
    int             midjl = j - STEP,                 /*当前棋子的上方*/
                    midjr = j + STEP + 1;         /*当前棋子的下方棋子的下方??????*/
    if (midjl < 0)                                      
 midjl = 0;                   
    if (midjr > LENGTH)
 midjr = LENGTH;
    for (k = midjl; k < midjr; k++)             /**/ 
 if (chessman[i][k] != 0)                 /*如果有棋子*/
     return 1;
    return 0;
}
int
coldt(int i, int j, int chessman[LENGTH][LENGTH])          /*水平方向*/
{
    int             k;
    int             midil = i + STEP + 1,                  /*当前的右边棋子的右一个*/
                    midiu = i - STEP;                       /*当前棋子的左一个*/
    if (midiu < 0)
 midiu = 0;
    if (midil > LENGTH)
 midil = LENGTH;
    for (k = midiu; k < midil; k++)
 if (chessman[k][j] != 0)
     return 1;
    return 0;
}
int
diadt(int i, int j, int chessman[LENGTH][LENGTH])      /*右上到左下方向*/
{
    int             k,
                    midi,
                    midj;
    midi = i;
    midj = j;
    for (k = 0; k < STEP; k++) {
 midi++;
 midj--;
 if (midj < 0 || midi >= LENGTH)
     break;
 if (chessman[midi][midj] != 0)
     return 1;
    }
    for (k = 0; k < STEP; k++) {
 i--;
 j++;
 if (i < 0 || j >= LENGTH)
     break;
 if (chessman[i][j] != 0)
     return 1;
    }
    return 0;
}
int
vdiadt(int i, int j, int chessman[LENGTH][LENGTH])    /*左上到右下方向*/
{
    int             k,
                    midi,
                    midj;
    midi = i;
    midj = j;
    for (k = 0; k < STEP; k++) {
 midi--;
 midj--;
 if (midi < 0 || midj < 0)
     break;
 if (chessman[midi][midj] != 0)
     return 1;
    }
    for (k = 0; k < STEP; k++) {
 i++;
 j++;
 if (j >= LENGTH || i >= LENGTH)
     break;
 if (chessman[i][j] != 0)
     return 1;
    }
    return 0;
}

int
can_expand(int i, int j, int chessman[LENGTH][LENGTH])
{
    if (rowdt(i, j, chessman))
 return 1;
    if (coldt(i, j, chessman))
 return 1;
    if (diadt(i, j, chessman))
 return 1;
    if (vdiadt(i, j, chessman))
 return 1;
    /*
     * 如果不能扩展,返回0
     */
    return 0;
}
/************************************************************/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -