当骑士从一个位置移动到另一个位置时,此程序将棋盘的位置从0更改为1。如果我尝试案例0,则程序可以正常工作。然后,在案例0之后,如果我尝试案例1,则位置更改为1就是从案例0 1左上放置的位置。相反,它应该是从案例0开始右上放置的那个。为什么输出是这样的?
#include <stdio.h>
int main(){
int board[8][8]={0};
int currentRow=4, currentColumn=4;
int cont=0, moveNumber=0, i, j;
while(moveNumber>=0 && moveNumber<=7){
printf("Enter a move: ");
scanf("%d", &moveNumber);
cont++;
switch(moveNumber){
case 0:
board[currentRow-1][currentColumn+2]=1;
break;
case 1:
board[currentRow-2][currentColumn+1]=1;
break;
case 2:
board[currentRow-2][currentColumn-1]=1;
break;
case 3:
board[currentRow-1][currentColumn-2]=1;
break;
case 4:
board[currentRow+1][currentColumn-2]=1;
break;
case 5:
board[currentRow+2][currentColumn-1]=1;
break;
case 6:
board[currentRow+2][currentColumn+1]=1;
break;
case 7:
board[currentRow+1][currentColumn+2]=1;
break;
}
for(i=0; i<8; i++){
for(j=0; j<8; j++){
printf("%d ", board[i][j]);
}
printf("\n");
}
printf("Total moves: %d\n",cont);
}
return 0;
}
答案 0 :(得分:3)
主要问题是您永远不会更新<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="engME.YourFullNamesListPage">
<StackLayout>
<StackLayout Orientation="Horizontal">
<Label Text="Test 1" HorizontalTextAlignment="Center"/>
<Label Text="Test 2" HorizontalTextAlignment="Center"/>
<Label Text="Test 3" HorizontalTextAlignment="Center"/>
<Label Text="Test 4" HorizontalTextAlignment="Center"/>
</StackLayout>
<StackLayout Orientation="Vertical" VerticalOptions="Fill" HorizontalOptions="FillAndExpand">
<ListView x:Name="FullNamesList" VerticalOptions="FillAndExpand" RowHeight="50">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="1.1*"/>
<ColumnDefinition Width=".3*"/>
</Grid.ColumnDefinitions>
<Label FontSize="Large"
FontAttributes="Bold"
HorizontalTextAlignment="Start"
Margin="20,0,0,0"
VerticalTextAlignment="Center"
Grid.Row="0"
Grid.Column="0">
<Label.Triggers>
<DataTrigger TargetType="Label" Binding="{Binding Gender}" Value="F">
<Setter Property="Text" Value="{Binding Name}"/>
<Setter Property="TextColor" Value="#cc0066"/>
</DataTrigger>
<DataTrigger TargetType="Label" Binding="{Binding Gender}" Value="M">
<Setter Property="Text" Value="{Binding Name}"/>
<Setter Property="TextColor" Value="#007acc"/>
</DataTrigger>
<DataTrigger TargetType="Label" Binding="{Binding Gender}" Value="A">
<Setter Property="Text" Value="{Binding Name}"/>
<Setter Property="TextColor" Value="#00994d"/>
</DataTrigger>
</Label.Triggers>
</Label>
<Label Text="{Binding ShortMeaning}"
FontSize="Small"
TextColor="Gray"
VerticalTextAlignment="Center"
Grid.Row="0"
Grid.Column="1">
</Label>
<Image Source="favorite.png"
Grid.Row="0"
Grid.Column="2"
Scale=".7">
</Image>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</StackLayout>
</ContentPage>
或currentRow
,因此所有移动都从其初始值发生。
其他一些注意事项:在这种情况下,应避免使用“幻数”-currentColumn
。如果决定更改数组的大小,则必须搜索所有代码,找到八位并替换它们。使用8
或define
。
您应始终检查const int
的返回值。例如,如果用户键入scanf
怎么办?
需要数组边界检查。如果一个举动使骑士脱离了局限并越过了阵列的边界,会发生什么?
a
答案 1 :(得分:1)
正如@Jonhnny Mopp指出的那样,您永远不会更新currentRow或currentColumn。
因此,在案例0之后,您设置了board [3] [6],在案例1之后,您设置了board [2] [5]。
所以案例1的返回值在案例0的左上方。
答案 2 :(得分:0)
我建议您编写一个函数TryToMoveKnight(int* x, int* y, int moveNumber)
,尝试将骑士朝所需方向移动。
您已经有八行非常相似的代码,并且移动该块所需的工作越多,获得的效果就越差。
该功能需要执行的操作:
您的原始代码中没有最后一步,但是检查目标位置在木板上也很重要。
因此,如果您当前拥有switch(moveNumber)...
,则可以致电TryToMoveKnight(¤tRow,¤tColumn,moveNumber);