首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >国际象棋(骑士)运动,避免下棋

国际象棋(骑士)运动,避免下棋
EN

Stack Overflow用户
提问于 2017-01-13 06:12:22
回答 2查看 498关注 0票数 0

我正在做一个非常简单的国际象棋程序,它只是动作,没有得分或任何东西。我正在制作骑士运动,我已经完成了一部分,但我被困在如何避免骑士离开棋盘。R=行,c=列,v=电路板(8x8)

我的代码:

代码语言:javascript
复制
public static boolean[][] knightMoves(int r, int c, boolean[][] v){
    if(r <= 7 && c >= 0) v[r+2][c-1] = true;
    if(r <= 7 && c >= 0) v[r+1][c-2] = true;

    if(r <= 7 && c >= 0) v[r+2][c+1] = true;
    if(r <= 7 && c >= 0) v[r+1][c+2] = true;

    if(r <= 7 && c >= 0) v[r-2][c-1] = true;
    if(r <= 7 && c >= 0) v[r-1][c-2] = true;

    if(r <= 7 && c >= 0) v[r-2][c+1] = true;
    if(r <= 7 && c >= 0) v[r-1][c+2] = true;

    return v;
}

任何帮助都将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2017-01-13 06:27:21

这实际上是几年前ACM编程竞赛中的一道题。所以最小的代码行数是这样的:

代码语言:javascript
复制
boolean check(int r, int c) {
    return r<8 && r>= 0 && c < 8 && c>=0;
}

然后,您可以检查(x,y)中的每个潜在移动,以查看它是否有效:

代码语言:javascript
复制
if check(x+1, y+2) ...
if check(x+2, y+1) ...
if check(x-1, y+2) ...
if (check(x-2, y+1) ...
if check(x+1, y-2) ...
if check(x+2, y-1) ...
if check(x+1, y+2) ...
if (check(x+2, y+1) ...

哪里..。是你为合法行动所做的。如果"v“是你的冲浪板,你从(x,y)开始,这些可能是

代码语言:javascript
复制
if (check(x+1, y+1))
   v(x+1, y+1) = true;  // indicated knight can move there
票数 0
EN

Stack Overflow用户

发布于 2017-01-25 23:54:39

我在国际象棋引擎中使用的技术是在启动时预先生成所有骑士的走法,这样我只需要知道骑士在哪个方块上,我就可以通过一个数组查找生成所有可能的骑士走法,例如:

代码语言:javascript
复制
// Pre-generated knight moves
public static final long[] KNIGHT_MOVES = new long[] {
    0b00000000_00000000_00000000_00000000_00000000_00000010_00000100_00000000L,
    0b00000000_00000000_00000000_00000000_00000000_00000101_00001000_00000000L,
    0b00000000_00000000_00000000_00000000_00000000_00001010_00010001_00000000L,
    // ... etc.

所以,如果我的骑士在e4上,我只需要KNIGHT_MOVES4*8+3,位模式给了我从那个方块开始的所有走法。如果你正在写一个国际象棋引擎,这是你想要的最快的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41623929

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档