【新人】误打误撞写的五子棋不知道为什么运行特别卡
c语言吧
全部回复
仅看楼主
level 1
_龙舞_ 楼主
初学C语言,还不太懂,求dalao解答!
#include<stdio.h>
int qipan[19][19];
int main()
{
int white=1;
int black=1;
int i, j;
int x, y;
int color = 0;
for (i = 0; i < 19; i++)
for (j = 0; j < 19; j++)
qipan[i][j] = 2;
while (1)
{
if (color == 1)
printf("白棋请落子:\n");
if (color == 0)
printf("黑棋请落子:\n");
scanf_s("%d %d", &x, &y);
if (qipan[x - 1][y - 1] != 2)
{
printf("该位置已有落子或落子位置超出棋盘范围!请重新输入:\n");
continue;
}
color = (color + 1) % 2;
qipan[x - 1][y - 1] = color;
for (i = 1; i <= 19; i++)
{
if (i == 1)
{
if (qipan[i - 1][0] == 1)//j=1
printf("●");
if (qipan[i - 1][0] == 0)//j=1
printf("○");
if (qipan[i - 1][0] == 2)//j=1
printf("┌");
for (j = 2; j <= 18; j++)
{
if (qipan[i - 1][j - 1] == 1)//j=1
printf("●");
if (qipan[i - 1][j - 1] == 0)//j=1
printf("○");
if (qipan[i - 1][j - 1] == 2)//j=1
printf("┬");
}
if (qipan[i - 1][18] == 1)//j=1
printf("●");
if (qipan[i - 1][18] == 0)//j=1
printf("○");
if (qipan[i - 1][18] == 2)//j=1
printf("┐");
printf("\n");
}
if (i <= 18 && i >= 2)
{
if (qipan[i - 1][0] == 1)//j=1
printf("●");
if (qipan[i - 1][0] == 0)//j=1
printf("○");
if (qipan[i - 1][0] == 2)//j=1
printf("├");
for (j = 2; j <= 18; j++)
{
if (qipan[i - 1][j - 1] == 1)//j=1
printf("●");
if (qipan[i - 1][j - 1] == 0)//j=1
printf("○");
if (qipan[i - 1][j - 1] == 2)//j=1
printf("┼");
}
if (qipan[i - 1][18] == 1)//j=1
printf("●");
if (qipan[i - 1][18] == 0)//j=1
printf("○");
if (qipan[i - 1][18] == 2)//j=1
printf("┤");
printf("\n");
}
if (i == 19)
{
if (qipan[i - 1][0] == 1)//j=1
printf("●");
if (qipan[i - 1][0] == 0)//j=1
printf("○");
if (qipan[i - 1][0] == 2)//j=1
printf("└");
for (j = 2; j <= 18; j++)
{
if (qipan[i - 1][j - 1] == 1)//j=1
printf("●");
if (qipan[i - 1][j - 1] == 0)//j=1
printf("○");
if (qipan[i - 1][j - 1] == 2)//j=1
printf("┴");
}
if (qipan[i - 1][18] == 1)//j=1
printf("●");
if (qipan[i - 1][18] == 0)//j=1
printf("○");
if (qipan[i - 1][18] == 2)//j=1
printf("┘");
printf("\n");
}
}
if (color == 1)
{
for (i = x - 2; i >= -1; i--)//统计同行左侧连续同样棋子个数。
if (qipan[i][y - 1] == 1)
black++;
else
break;
for (i = x; i < 19; i++)//统计同行右侧连续同样棋子个数。
if (qipan[i][y - 1] == 1)
black++;
else
break;
}
if (black >= 5)
break;
black = 1;
if (color == 1)
{
for (i = y; i < 19; i++)//统计同上侧连续同样棋子个数。
if (qipan[x - 1][i] == 1)
black++;
else
break;
for (i = y - 2; i >= -1; i--)//统计同行下侧连续同样棋子个数。
if (qipan[x - 1][i] == 1)
black++;
else
break;
}
if (black >= 5)
break;
black = 1;
if (color == 0)
{
for (i = x - 2; i >= -1; i--)//统计同行左侧连续同样棋子个数。
if (qipan[i][y - 1] == 0)
white++;
else
break;
for (i = x; i < 19; i++)//统计同行右侧连续同样棋子个数。
if (qipan[i][y - 1] == 0)
white++;
else
break;
}
if (white >= 5)
break;
white = 1;
if (color == 0)
{
for (i = y; i < 19; i++)//统计同上侧连续同样棋子个数。
if (qipan[x - 1][i] == 0)
white++;
else
break;
for (i = y - 2; i >= -1; i--)//统计同行下侧连续同样棋子个数。
if (qipan[x - 1][i] == 0)
white++;
else
break;
}
if (white >= 5)
break;
white = 1;
if (color == 1)
{
for (i = x - 2; i >= -1; i--)
for (j = y; j <19; j++)
{
if (qipan[i][j] == 1)
black++;
else
break;
}
for (i = x; i < 19; i++)
for (j = y - 2; j >= -1; j++)
if (qipan[i][j] == 1)
black++;
else break;
}
if (black >= 5)
break;
black = 1;
if (color == 1)
{
for (i = x; i < 19; i++)
for (j = y; j < 19; j++)
{
if (qipan[i][j] == 1)
black++;
else
break;
}
for(i = x - 2; i >= -1;i--)
for (j = y - 2; j >= -1; j--)
{
if (qipan[i][j] == 1)
black++;
else
break;
}
if (black >= 5)
break;
black = 1;
}
if (color == 1)
{
for (i = x; i < 19; i++)
for (j = y - 2; j >= -1; j--)
{
if (qipan[i][j] == 1)
black++;
else
break;
}
for (i = x - 2; x >= -1; x++)
for (j = y; j < 19; j++)
{
if (qipan[i][j] == 1)
black++;
else
break;
}
}
if (black >= 5)
break;
black = 1;
if (color == 0)
{
for (i = x - 2; i >= -1; i--)
for (j = y; j <19; j++)
{
if (qipan[i][j] == 0)
white++;
else
break;
}
for (i = x; i < 19; i++)
for (j = y - 2; j >= -1; j++)
if (qipan[i][j] == 0)
white++;
else break;
}
if (white >= 5)
break;
white = 1;
if (color == 0)
{
for (i = x; i < 19; i++)
for (j = y; j < 19; j++)
{
if (qipan[i][j] == 0)
white++;
else
break;
}
for (i = x - 2; i >= -1; i--)
for (j = y - 2; j >= -1; j--)
{
if (qipan[i][j] == 0)
white++;
else
break;
}
if (white >= 5)
break;
white = 1;
}
if (color == 0)
{
for (i = x; i < 19; i++)
for (j = y - 2; j >= -1; j--)
{
if (qipan[i][j] == 0)
white++;
else
break;
}
for (i = x - 2; x >= -1; x++)
for (j = y; j < 19; j++)
{
if (qipan[i][j] == 0)
white++;
else
break;
}
}
if (white >= 5)
break;
white = 1;
}
if (white == 5)
printf("白棋获胜!!!\n");
if (black == 5)
printf("黑棋获胜!!!\n");
}
2017年12月05日 07点12分 1
level 1
_龙舞_ 楼主
[惊哭]每次到一半就卡退出了,求解
2017年12月05日 07点12分 2
level 1
_龙舞_ 楼主
顶顶
2017年12月05日 07点12分 3
level 1
_龙舞_ 楼主
顶顶
2017年12月05日 07点12分 4
level 8
数组越界了吧
2017年12月05日 07点12分 5
level 12
因为你有数组下标是-1的情形,所以退出,把-1改成0
卡顿是你的算法在判断是否存在连着5个棋子的情形很耗时间,每操作一次,对19*19个点,每一个点都判断上下左右斜是否存在5个点,计算量太大
2017年12月05日 10点12分 6
level 9
每下一步,只需要判断最新下的那个子有没有连线,不用全盘跑一遍
2017年12月05日 20点12分 10
dalao我应该怎么修改。。?
2017年12月06日 09点12分
1