- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 C 语言制作一个国际象棋游戏。它需要严格的 c 语言。但我的棋子没有对移动做出应有的 react 。棋子的移动由坐标定义。
我认为问题应该出在这个函数上:
// função mover peça com problema encontrar
int moverPeca(int linOri, int linDes, int colOri, int colDes) {
int mover = 0;
char peca;
//deslocamento vertical e deslocamento horizontal (nº linhas que avança)
int dV = abs(linDes - linOri);
int dH = abs(colDes - colOri);
if ((linOri >= 0 && linOri < 8 && colOri >= 0 && colOri < 8) &&
(linDes >= 0 && linDes < 8 && colDes >= 0 && colDes < 8)) {
peca = xadrez[linOri][colOri];
// definição do movimento apropriado da peça Torre - mexe na vertical e na horizontal quantas casas quiseres
if ((peca == 'T' || peca == 't') && (dV == 0 || dH == 0)) {
mover = 1;
}
// definição do movimento apropriado da peça Bispo - só mexe na diagonal quantas casas quiseres
if ((peca == 'B' || peca == 'b') && (dV == dH)) {
mover = 1;
}
// definição do movimento apropriado da peça Cavalo mexe em L 2/3 ou 3/2
if ( (peca == 'C' || peca == 'c') &&
( (dV == 1 && dH == 2) || (dV == 2 && dH == 1) ) ) {
mover = 1;
}
// definição do movimento apropriado da peça Q Rainha anda de todas as formas H e V
if ( (peca == 'Q' || peca == 'q') &&
( (dV == dH) || (dV == 0) || (dH == 0) ) ) {
mover = 1;
}
// definição do movimento apropriado da peça K REi só anda 1 casa na V ou H ou Diagonal
if ( (peca == 'K' || peca == 'k') &&
( (dV >= 0 && dV <= 1) && (dH >= 0 && dH <= 1 ) ) ) {
mover = 1;
}
// definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal
if ((peca == 'p') && ( (linOri - linDes) == 1) && (dH == 0) ) {
mover = 1;
}
// definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal
if ((peca == 'P') && ( (linDes - linOri) == 1) && (dH == 0) ) {
mover = 1;
}
if (mover) {
xadrez[linDes][colDes] = xadrez[linOri][colOri];
xadrez[linOri][colOri] = ' ';
}
return 1;
}
else {
return 0;
}
}
这是我到目前为止的代码:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
// Matriz de 8 por 8 para fazer os quadrados do jogo
char xadrez[8][8] = {
{ 'T', 'C', 'B', 'Q', 'K', 'B', 'C', 'T'}, //Pretas em maiúsculas
{ 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'},
{ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '},
{ 'p', 'p', 'p', 'p', 'p', 'p', 'p', 'p'},//Brancas em minúsculas
{ 't', 'c', 'b', 'q', 'k', 'b', 'c', 't'}
};
// Função para pintar a tela e o texto dentro dos quadrados
void pintarTelaTexto() {
system("CLS");// serve para limpar a tela
//linha - coluna e r para controle da casa central onde vamos por a letra
int lin, col, r;
for (lin=0; lin < 8; lin++) {
for (r=0; r < 3; r++) {
for (col=0; col < 8; col++) {
//char letra com problema nao aparece na casa central apa
char peca = xadrez[lin][col];
char letra = ((lin + col) % 2 == 0) ? '\xB2' : ' ';
letra = (r == 1 && peca != ' ') ? peca : letra; // operador ternário
if ((lin + col ) % 2 == 0) {
printf("\xB2\xB2%c\xB2\xB2", letra);
}
else {
// %c para inserção da letra
printf(" %c ", letra);
}
}
printf("\n");
}
}
}
// função mover peça com problema encontrar
int moverPeca(int linOri, int linDes, int colOri, int colDes) {
int mover = 0;
char peca;
//deslocamento vertical e deslocamento horizontal (nº linhas que avança)
int dV = abs(linDes - linOri);
int dH = abs(colDes - colOri);
if ((linOri >= 0 && linOri < 8 && colOri >= 0 && colOri < 8) &&
(linDes >= 0 && linDes < 8 && colDes >= 0 && colDes < 8)) {
peca = xadrez[linOri][colOri];
// definição do movimento apropriado da peça Torre - mexe na vertical e na horizontal quantas casas quiseres
if ((peca == 'T' || peca == 't') && (dV == 0 || dH == 0)) {
mover = 1;
}
// definição do movimento apropriado da peça Bispo - só mexe na diagonal quantas casas quiseres
if ((peca == 'B' || peca == 'b') && (dV == dH)) {
mover = 1;
}
// definição do movimento apropriado da peça Cavalo mexe em L 2/3 ou 3/2
if ( (peca == 'C' || peca == 'c') &&
( (dV == 1 && dH == 2) || (dV == 2 && dH == 1) ) ) {
mover = 1;
}
// definição do movimento apropriado da peça Q Rainha anda de todas as formas H e V
if ( (peca == 'Q' || peca == 'q') &&
( (dV == dH) || (dV == 0) || (dH == 0) ) ) {
mover = 1;
}
// definição do movimento apropriado da peça K REi só anda 1 casa na V ou H ou Diagonal
if ( (peca == 'K' || peca == 'k') &&
( (dV >= 0 && dV <= 1) && (dH >= 0 && dH <= 1 ) ) ) {
mover = 1;
}
// definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal
if ((peca == 'p') && ( (linOri - linDes) == 1) && (dH == 0) ) {
mover = 1;
}
// definição do movimento apropriado da peça p peão pode andar 2 casas a 1 vez e depois anda sempre só uma e come na diagonal
if ((peca == 'P') && ( (linDes - linOri) == 1) && (dH == 0) ) {
mover = 1;
}
if (mover) {
xadrez[linDes][colDes] = xadrez[linOri][colOri];
xadrez[linOri][colOri] = ' ';
}
return 1;
}
else {
return 0;
}
}
// MAIN
int main() {
int linOri, linDes, colOri, colDes;
while (1) {
pintarTelaTexto();
printf("Informe a linha e coluna de origem: ");
scanf("%d %d", &linOri, &colOri );
printf("\nInforme a linha e coluna de destino: ");
scanf("%d %d", &linDes, &colDes );
int resultado = moverPeca(linOri, colOri, linDes, colDes);
if (resultado != 1) {
switch (resultado) {
case 9: printf("A peça não pode ser usada assim"); getch(); break;
case 0: printf("\nERRO : Coordenadas Inválidas"); getch(); break;
case 1: break;
}
}
}
getch();
return 0;
}
最佳答案
您的 moverPeca
函数需要按以下顺序输入参数:
int moverPeca(int linOri, int linDes, int colOri, int colDes)
依次为行起点、行终点、列起点和列终点。
但是您正在调用它:
int resultado = moverPeca(linOri, colOri, linDes, colDes);
结果是 colOri
和 linDes
在函数调用中交换。因此,代码不会尝试将 pawn 从 [6,4] 移动到 [5,4],而是尝试将 pawn 从 [6,4] 移动到 [4,4]。
简单的解决方法是像这样声明 moverPeca:
int moverPeca(int linOri, int colOri, int linDes, int colDes)
关于C 语言国际象棋游戏 - 有些棋子不动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997720/
我正在尝试开发一个简单的国际象棋引擎,但我一直在为它的性能而苦苦挣扎。我已经实现了带有alpha-beta修剪和迭代加深的Negamax(没有任何其他启发式方法),但是我无法获得超过3-4层的合理搜索
我目前正在开发国际象棋引擎,目前该引擎一直在工作,但要花很多时间才能产生移动。由于必须生成许多移动,因此检查检测花费的时间最长。 我尝试了很多事情后陷入困境,无法真正弄清楚如何提高效率。这是我的方法:
我正在尝试用 Java 为我的游戏板(国际象棋)建立初始状态。但是,当我运行该程序时,板似乎被翻转了?如果您查看初始状态方法,这就是我希望初始板启动的方式: public void initialBo
我正在尝试实现Knight-Distance中描述的绝对排名文件距离。来自Chess Programming Wiki ,但我对 ints a 和 b 应该在什么地方有点困惑 int knightDi
我一直在研究表格,以便可以使用 html 中的表格创建棋盘。这是我在网上找到的一些代码:HTML 代码: ♜ ♞ ♝ &
我有如下算法来防止玩家选择将其置于检查状态的移动: 假走(通过复制棋盘并在复制的棋盘上工作) 在走法被伪造之后,得到所有合法的对手走法。 如果合法走法之一可以攻击玩家的国王,则不能选择最初伪造的走法。
如果没有图片,这可能有点难以解释,但是,我正在检查国王是否在检查中。为此,我从国王的位置开始向上、向左、向下、向右,然后是所有对角线图案。 为了简化我的代码,我有一个路径检查器方法,它接受起始位置和结
我已经为我的国际象棋引擎实现了带有静态搜索的 alpha-beta 搜索。然而,在大多数情况下,静态搜索占用了总执行时间的 80-90%,正如我的分析器所显示的那样。我的修剪有问题吗? 我已经包含了
我正在编写一个简单的国际象棋游戏。我不会在这里全部发布,但我会为您提供必要的详细信息。 我通过点击一个上面有棋子的方 block 来移动,然后这个方 block 被选中,然后点击我想要棋子的地方移动。
嗨! 我正在尝试为我的国际象棋引擎编写一个 negamax 搜索算法,但我似乎无法让它工作。我以 wikipedias 伪代码为例,但不知何故它没有产生预期的结果。当我用 2 层运行它时,它改变了我的
我正在对国际象棋 AI 进行试验,目前正在尝试检测平局的可能性。 如果出现以下情况,玩家可以要求平局: 在每个玩家的最后 50 步棋中没有吃到或走棋。 相同的棋盘位置出现了 3 次。 因此,程序必须存
我正在用 Java 开发国际象棋程序并考虑以下问题: Rook 部分需要实现直线移动。 Bishop 部分需要实现沿对角线移动。 但是, Queen piece 需要实现上述两种运动模式。 我想不出一
我有一个问题。 我们有无限的棋盘,如何计算 n 次跳跃后你可能发现自己跳跃的一半的数量? 例如: 一次跳跃后我们有8个盒子 两次跳跃后我们有33个盒子 #include using namespace
这个问题已经有答案了: How do I generate all of a knight's moves? (10 个回答) 已关闭 9 年前。 我正在尝试根据当前位置获取骑士可以放置的所有可能位置
好吧,我先承认这个会有点长。我正在为 C# 编写国际象棋引擎,最终目标包括 UCI 实现。我已经做到了,给定一个棋盘,引擎将生成所有有效 Action 的列表;然而,我的评估代码似乎很挣扎,因为在与自
我正在实现一个国际象棋引擎,我已经编写了一个相当复杂的 alpha-beta 搜索例程,其中包含静态搜索和换位表。但是,我观察到一个奇怪的错误。 评估函数使用的是方 block 表,就像这个用于棋子的
我正在编写一个基本的 Java 国际象棋游戏并编写了以下类:Game、Player、Board、Square、Piece(每个特定棋子的父类(super class))和每个特定棋子类(例如 Pawn
我正在为类似于国际象棋的游戏编写 AI。棋盘为 10x10,每面 15 block 都有象棋相似的走法。 游戏中的一切都组织在对象中。瓷砖[][] 瓷砖; 10x10,每个 Tile 都有一个 pie
我正在制作游戏国际象棋,几乎得到了所有东西,但只有一件事:我需要制作它,这样玩家就不可能将棋子移动到检查中。我在解决这个问题时遇到了麻烦。 我现在用伪代码生成有效移动的是:getMoveLocatio
我正在尝试使用 alpha beta 剪枝实现一个国际象棋游戏。以下几乎可以正常工作,但它会返回错误的 Action 。 例如,可能会发生以下情况。 白色(用户)移动,白色王位 - a1/黑色(计算机
我是一名优秀的程序员,十分优秀!