在棋盘上移动骑士的程序

时间:2018-08-27 14:02:51

标签: c

当骑士从一个位置移动到另一个位置时,此程序将棋盘的位置从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;
}

3 个答案:

答案 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。如果决定更改数组的大小,则必须搜索所有代码,找到八位并替换它们。使用8define

您应始终检查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),尝试将骑士朝所需方向移动。

您已经有八行非常相似的代码,并且移动该块所需的工作越多,获得的效果就越差。

该功能需要执行的操作:

  1. 根据moveNumber和current确定目标坐标 位置
  2. 验证目标坐标在板上
  3. 可能在该位置检查一件物品
  4. 将新坐标分配给您传入的变量x和y

您的原始代码中没有最后一步,但是检查目标位置在木板上也很重要。

因此,如果您当前拥有switch(moveNumber)...,则可以致电TryToMoveKnight(&currentRow,&currentColumn,moveNumber);