国际象棋中骑士与C的编程动作

时间:2017-04-16 15:58:41

标签: c chess

你的任务基本上是将K置于Knight的输入值,然后将X放到棋盘的其余部分。然后对于Knight可以做的每一个动作,我们放入数字,然后我们增加数字,例如:

X X X X X X X X
X X X X X X X X
X X X 1 X 2 X X
X X 4 X X X 3 X
X X X X K X X X
X X 5 X X X 6 X
X X X 7 X 8 X X
X X X X X X X X

我的代码在下面,但是当我运行它时,我得到输出: 42108284210828421082842108284210828421082842108284210828 42108284210828421082842108284210828421082842108284210828 42108284210828421082814210828242108284210828 42108284210828342108284210828421082844210828 42108284210828421082842108284210825421082842108284210828 42108284210828542108284210828421082864210828 42108284210828421082874210828842108284210828 42108284210828421082842108284210828421082842108284210828

那么你可以帮我修改我的代码吗?由于我是一个新手,我的if条件非常蹩脚,所以如果你能帮我把简单的条件放在砖头内,我真的可以上诉它。

   #include <stdio.h>
#include <stdlib.h>

void boardDefine();
void boardDraw();

int main()

{
    char board[8][8];
    int i,j,row,column;
    int nextMove;

    printf("Please enter the position of the Knight on the board\n");
    scanf("%d%d",&row,&column);
    if(row<1||row>9||column<1||column>9)
    {
        printf("You must enter a value greater than zero");
    }

    boardDefine(board[8][8],i,j,row,column,nextMove);
    boardDraw(board[8][8],i,j);


    return 0;
}

void boardDefine(char board[8][8],int i, int j,int row,int column,int nextMove)
{
    nextMove=1;
    for( j=1;j<=8;j++)
    {
             for(i=1;i<=8;i++)
        {

            if(i==row&&j==column)
            {
                board[i][j]="K ";//Places the Knight to the position that entered by user
            }
            /*From here we are basicly showing where the Knight can move from its current position
            for this we first check that if both row and column values are inside the board or not
            after the L move if not then we put the nextMove value at that adress of the array
            */
            else if(row-1<=8&&row-1>=0&&column+2<=8&&column+2>=0&&i==row-1&&j==column+2)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row-1<=8&&row-1>=0&&column-2<=8&&column-2>=0&&i==row-1&&j==column-2)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row+1<=8&&row+1>=0&&column+2<=8&&column+2>=0&&i==row+1&&j==column+2)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row+1<=8&&row+1>=0&&column-2<=8&&column-2>=0&&i==row+1&&j==column-2)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row-2<=8&&row-2>=0&&column+1<=8&&column+1>=0&&i==row-2&&j==column+1)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row-2<=8&&row-2>=0&&column-1<=8&&column-1>=0&&i==row-2&&j==column-1)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row+2<=8&&row+2>=0&&column-1<=8&&column-1>=0&&i==row+2&&j==column-1)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else if(row+2<=8&&row+2>=0&&column+1<=8&&column+1>=0&&i==row+2&&j==column+1)
            {
                board[i][j]='0'+ nextMove;
                nextMove++;
            }
            else
            {
                board[i][j]="X ";//Places X to the places where Knight cant move.
            }
        }
        printf("\n");
    }

}

//Then we use this function to print
void boardDraw(char board[8][8],int i, int j)
{
    for( j=1;j<=8;j++)
    {
             for(i=1;i<=8;i++)
             {
                 printf("%c",board[i][j]);
             }
             printf("\n");
    }

}

3 个答案:

答案 0 :(得分:0)

您的代码中有几件事情没有按照您认为他们正在做的事情进行。如果没有给你明确的代码(因为这看起来像是一个学校项目),我会给你一些关于如何使你的功能更强大的指示。

  1. 初始化棋盘:您已经知道骑士的位置,所以您应该先将其存放在棋盘上。你的boardDefine函数已经迭代了棋盘中的每个元素,所以如果那个位置不是骑士或骑士可以进入的位置,请尝试存储你用来代表'X'的任何值。
  2. 缩小条件语句:您的if语句比它们需要的要复杂得多。将骑士的位置存储在某处并检查(i,j)是否为有效移动,方法是向I或j加上或减去2,然后从另一个中加上或减去1,如下所示:

    //The '10' can be whatever number you're using to represent the knight
    if(board[i+2][j+1] == 10) {
        board[i][j] == nextMove;
        nextMove++;
    }
    

    还要确保您的电路板的索引始终在0到7之间,而不是1和8.否则,您最终会遇到运行时错误,指出您的索引超出范围。如果i = 6并且您的代码在任何地方执行board[i+2][j],那么您将最终遇到运行时错误,因为8&gt; 7。

  3. 将值分配给您要打印的内容:由于您使用int数组表示您的电路板,因此为了清晰和代码功能,您应该只在数组中存储整数。尝试用int表示骑士和X,当你打印板时,确保在达到int时打印K或X.最后,当您打印电路板时,请读取电路板的值,然后使用电路板中的值代表的字母或数字执行printf。每次从板上读取新值时,都可以使用if或switch进行此操作。否则,您可能会打印一个不打算打印的值。

  4. 希望这有帮助,快乐编码!

答案 1 :(得分:0)

因此,您的代码存在多个问题,我将尝试尽可能多地解决代码运行问题 -

首先,由于您要存储单个可打印字符,因此应将数组类型更改为char而不是int。然后,您将为阵列位置分配单个字符。因此,在分配K时,它将为board[i][j] = 'k';,x将为board[i][j]='x';

由于您现在已将类型更改为char,因此您必须将printf调用更改为

printf("%c ", board[i][j]);

最后,为了分配单个数字,您只能分配nextMove。 您必须指定'0' + nextMove。这样,您将获得与数组中的数字等效的ASCII。

您犯的另一个错误是您已将board[8][8]传递给该函数。 board[8][8]只是表示数组中的单个元素。如果你想传递整个数组,你必须只传递board

最后,当数组被声明为board [8] [8]时,你将循环从1运行到8。声明为arr [x]的任何数组都从0到(x-1)而不是1到x。 所以你的循环应该改为

for (i = 0; i < 8; i++)

和j类似。 休息都可以优化,但现在应该可以正常工作。

答案 2 :(得分:-1)

我不确切地知道你的问题在哪里,但是你尝试过switch语句吗? 它使您的代码简单,例如:

开关(1){

case 1 : cout << '1'; // prints "1"

         break;       // and exits the switch
case 2 : cout << '2';

         // without break it will show 2 and after it 3 until next break

 case 3: cout << '3'; 

}