所以,我必须在10x10板上制作用户与计算机战舰游戏进行编程。我必须让计算机随机放置五艘尺寸分别为5,4,3,3和2的船。
我所做的是,我生成了0到9之间的两个随机数作为我的x和y坐标,然后是第三个数字来决定船的放置方向。然后,我使用switch语句来检查电路板上是否有足够的空间将船放在第一位,如果有,则修改电路板阵列(好吧,那就是它应该做的事情)。
int main(void)
{ int x,y, bato[5]={5,4,3,3,2}, NbCases=17, countShip, dir, lenShip, countCaseEmpt, countLenShip, nbCaseOk, countModCase,i, dirTest;
time_t t;
srand(time(&t));
// gestir(plato a, int * bato, int x, int y)
// plato coord={{5,3,2,2,2},{5,3},{5,3},{5,3},{5},{0},{1,1}};
// plato is a custom data type defined as "int plato[10][10]"
plato coord={0}; //plateau vide
i=0;
for (countShip=5 ; countShip>0 ; countShip--)
{
do{
i++;
printf("%d\n",i); //counter used to check if the do while loop worked at all
nbCaseOk=0;
dirTest=0;
do {x=abs(rand())%10; y=abs(rand())%10;} while (coord[y][x]!=0); //start coordinates selection
dir = rand()%4; //direction selection
switch (countShip){ //ship lenght determination
case 0: lenShip=2; break;
case 1: lenShip=3; break;
case 2: lenShip=3; break;
case 3: lenShip=4; break;
case 4: lenShip=5; break;}
switch (dir){ //empty case checker and square modifier
case 0: //right
{
if (x+lenShip-1<10)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y][x+countLenShip]==0) nbCaseOk+=1;
if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y][x+countModCase]=countShip; break;}}
case 1: //up
{
if (y+lenShip-1<10)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y+countLenShip][x]==0) nbCaseOk+=1;
if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y+countModCase][x]=countShip; break;}}
case 2: //left
{
if (x-lenShip+1>=0)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y][x-countLenShip]==0) nbCaseOk+=1;
if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y][x-countModCase]=countShip; break;}}
case 3: //down
{
if (y-lenShip+1>=0)
for (countLenShip=1 ; countLenShip<lenShip ; countLenShip++)
if (coord[y-countLenShip][x]==0) nbCaseOk+=1;
if (nbCaseOk==lenShip-1) {dirTest=1;
for (countModCase=0 ; countModCase<lenShip ; countModCase++)
coord[y-countModCase][x]=countShip; break;}}
}} while (dirTest==0);
}
aff(coord);
while (NbCases>0)
{
printf("Rentrer une coordonnee x, puis une coordonnee y, comprises entre 0 et 9:"); //"enter a coordinate between 0 and 9 for x, then another one for y:
scanf("%d",&x); scanf("%d",&y);
NbCases+=gestir(coord, bato, x, y);
aff(coord);
}
printf("état bateau: %d\n nombre cases: %d",coord[0][0], NbCases); //ship state and number of empty squares
return 0;
}
我的问题是我得到了一个无限循环。我很确定错误是在我的switch语句中的某个地方。我使用调试器来查看导致问题的原因是什么,我注意到,即使有足够的空间放置船只,也不会在通过swotch语句时修改2D数组(坐标)。 我将do while循环的条件设置为(dirTest == 0),但即使dirTest在switch语句结束时明显等于1,循环也不会结束。
PS:我真的很抱歉,如果我的代码非常混乱,我今年生活中唯一的编程是去年的一些非常轻量级的python。答案 0 :(得分:1)
您的格式无济于事;请尝试采用更传统的风格。但是,我可以看到几个问题。
break
块中的switch (dir)
语句仅在if (nbCaseOk==lenShip-1)
评估为真时才会到达。因此,在dir == 0
。
for (countShip=5 ; countShip>0 ; countShip--)
没问题,但除非您有充分理由倒数,否则请改用for (countShip=0; countShip<5 ; countShip++)
。无论如何,countShip
在您编写的代码中将包含值为5,4,3,2和1的值。 switch (countShip)
代码块所预期的不是4,3,2,1,0。我不确定你的代码中nbCaseOk
发生了什么,但是你的循环可能没有退出,因为lenShip
永远不会等于2?
abs(rand())%10
是多余的。只需rand()%10
即可。
更一般地说;你在这里重复了很多代码。尝试使用相同的代码处理所有dir
个案例(例如,通过修改两个变量dx
和dy
)。
答案 1 :(得分:0)
看起来在for循环countShip
的第一次运行时等于5,并且您的交换机中未处理此值,这意味着您不会为{{1}分配任何有意义的值}。因此,永远不会满足lenShip
条件,因此您永远不会执行nbCaseOk==lenShip-1
。