int[][] board;
public boolean validMove(int fromRow, int fromCol, int toRow, int toCol) {
if (pieceAt(toRow, toCol) != EMPTY) {
return false;
} else if (fromRow - toRow == 0 && fromCol - toCol != 0) {
return true;
} else if (fromCol - toCol == 0 && fromRow - toRow != 0) {
// Trying to add piece collision code
for (int i = fromRow; i < toRow; i++) {
if (pieceAt(toCol, i) != EMPTY)
return false;
}
return true;
} else {
return false;
}
}
我的问题是试图创建碰撞检测,如果另一个片段是在它不应该能够通过它的方式,但我的代码目前可以。有人能帮我做这个吗?
尝试下面的代码。它很天真(也没有经过测试),但我认为它应该像现在这样工作。而且我认为它很好地说明了这个想法(见评论)。它是用C语言编写的,但我相信您可以很容易地将其转换为Java(或您使用的任何语言)。
bool validMove(int fromRow, int fromCol, int toRow, int toCol)
{
int i;
// Attempt to move to the same cell
if (fromRow == toRow && fromCol == toCol)
return false;
// Collision detection
if (fromRow == toRow) {
// Horizontal move
if (fromCol < toCol) {
// Move right
for (i = fromCol + 1; i <= toCol; ++i)
if (pieceAt(fromRow, i) != EMPTY)
return false;
} else {
// Move left
for (i = fromCol - 1; i >= toCol; --i)
if (pieceAt(fromRow, i) != EMPTY)
return false;
}
} else if (fromCol == toCol) {
// Vertical move
if (fromRow < toRow) {
// Move down
for (i = fromRow + 1; i <= toRow; ++i)
if (pieceAt(i, fromCol) != EMPTY)
return false;
} else {
// Move up
for (i = fromRow - 1; i >= toRow; --i)
if (pieceAt(i, fromCol) != EMPTY)
return false;
}
} else {
// Not a valid rook move (neither horizontal nor vertical)
return false;
}
return true;
}
编辑
您还可以使用Toon Krijthe提出的方法,通过减少条件语句计数来优化代码。其主要思想是使用“delta”值(dx
/dy
)来递增或递减单元格索引。在这种情况下,应该显式地检查目标单元格。
bool validMove(int fromRow, int fromCol, int toRow, int toCol)
{
int i;
// Attempt to move to the same cell
if (fromRow == toRow && fromCol == toCol)
return false;
// Collision detection
if (fromRow == toRow) { // Horizontal move
int dx = (fromCol < toCol) ? 1 : -1;
for (i = fromCol + dx; i != toCol; i += dx)
if (pieceAt(fromRow, i) != EMPTY)
return false;
} else if (fromCol == toCol) { // Vertical move
int dy = (fromRow < toRow) ? 1 : -1;
for (i = fromRow + dy; i != toRow; i += dy)
if (pieceAt(i, fromCol) != EMPTY)
return false;
} else { // Not a valid rook move
return false;
}
// Return true if destination cell is free
return pieceAt(toRow, toCell) == EMPTY;
}
本文向大家介绍C++程序设计-五子棋,包括了C++程序设计-五子棋的使用技巧和注意事项,需要的朋友参考一下 前言:很多刚刚接触编程的人都不知道怎么下手编写程序,特别是学习了新的知识点,不知道有什么用,那么本文将以简单的存储结构及简单的运算,条件语句,分支语句,循环语句结合,带来一个双人对战版五子棋,这是一个简单的模型,实现了五子棋最最基本的功能,还有好多地方需要补全,如边界问题,设计问题,游戏逻辑
我列出了这两种游戏的相似之处,目的是可能将其扩展到国际象棋,但对我的设计提出质疑。 相似点 件-物料(行、列)在板上的位置 板-nxn片格 游戏-包含棋盘和玩家列表 播放机-播放机名称 差异 在checkers中,您可以在不同的方向上移动,因此我创建了一个名为Checker的独立抽象类,它继承了Piece,并实现了一个返回pieces移动的Moveable接口。所以棋子和国王必须实施这个方法,提供
Javascript 程序设计以 ECMAScript 5.1 为标准,从基本语法到原理深入,理解和编写Javascript程序。核心内容有语言简介、调试器、类型系统、内置对象、基本语法、变量作用域、闭包、面向对象编程等。
C 程序设计
Microsoft Windows操作系统是美国微软公司研发的一套操作系统,它问世于1985年,起初仅仅是Microsoft-DOS模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。
我用Java编写国际象棋程序时,有一个GameLauncher类和一个包含所有其他类的Game类,因为所有这些类都需要访问表示棋盘上棋子的Game实例变量。这些内部类是Player、BoardPanel(一个JPanel)、Piece和所有其他Piece子类(Rook、Horse、Bishop、King等)。 我想知道实现这一点的标准方法是将类作为游戏的内部类(从而允许它们直接访问游戏的对象)还是