Created
March 8, 2022 09:58
-
-
Save Macesuted/3cdc69de7a1bf9fc86e4b21f20328fa6 to your computer and use it in GitHub Desktop.
LG5380 Code
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <bits/stdc++.h> | |
using namespace std; | |
enum chess //棋子种类 | |
{ | |
NA, //无(这个位置是空的) | |
captain, //王 | |
guard, //士 | |
elephant, //象 | |
horse, //马 | |
car, //车 | |
duck, //鸭 | |
soldier //兵 | |
}; | |
enum belong_type //记录每颗棋子属于何方的类型 | |
{ | |
RED, //属于红方 | |
BLUE, //属于蓝方 | |
NOT //不属于任何一方(即没有棋子) | |
}; | |
const int walk_set[2] = {1, -1}; //移动中会使用到的集合 | |
const string rank_string[2] = {"red", "blue"}; //输出棋子属于哪方时会用到的 | |
const string chess_string[8] = {"NA", "captain", "guard", "elephant", "horse", "car", "duck", "soldier"}; | |
//输出棋子名称时会用到的 | |
chess board[10][9]; //棋盘,每一位上保存这一位的棋子种类 | |
belong_type belong[10][9]; //保存棋盘上每一位上的棋子属于哪方 | |
bool CHECK_MATE, GAME_OVER; //将军局面,和游戏是否结束 | |
int CAPTAIN_X[2], CAPTAIN_Y[2]; //存放双方的王的坐标 | |
bool captian_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x + walk_set[x], to_y = start_y; | |
if (end_x == to_x && end_y == to_y) | |
{ | |
CAPTAIN_X[belong[start_x][start_y]] = end_x; | |
CAPTAIN_Y[belong[start_x][start_y]] = end_y; | |
return true; | |
} | |
} | |
for (int y = 0; y < 2; y++) | |
{ | |
int to_x = start_x, to_y = start_y + walk_set[y]; | |
if (end_x == to_x && end_y == to_y) | |
{ | |
CAPTAIN_X[belong[start_x][start_y]] = end_x; | |
CAPTAIN_Y[belong[start_x][start_y]] = end_y; | |
return true; | |
} | |
} | |
return false; | |
} | |
bool guard_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x + walk_set[x], to_y = start_y + walk_set[x]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x + walk_set[x], to_y = start_y + walk_set[!x]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
return false; | |
} | |
bool elephant_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
for (int x = 0; x < 2; x++) | |
for (int y = 0; y < 2; y++) | |
{ | |
if (belong[start_x + walk_set[x]][start_y + walk_set[y]] != NOT) | |
continue; | |
int to_x = start_x + (walk_set[x] << 1), to_y = start_y + (walk_set[y] << 1); | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
return false; | |
} | |
bool horse_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
for (int x = 0; x < 2; x++) | |
for (int y = 0; y < 2; y++) | |
{ | |
if (belong[start_x + walk_set[x]][start_y] != NOT) | |
continue; | |
int to_x = start_x + (walk_set[x] << 1), to_y = start_y + walk_set[y]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
for (int x = 0; x < 2; x++) | |
for (int y = 0; y < 2; y++) | |
{ | |
if (belong[start_x][start_y + walk_set[y]] != NOT) | |
continue; | |
int to_x = start_x + walk_set[x], to_y = start_y + (walk_set[y] << 1); | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
return false; | |
} | |
bool car_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
if (start_x == end_x) | |
{ | |
bool check = true; | |
for (int y = min(start_y, end_y) + 1; y < max(start_y, end_y); y++) | |
check &= belong[start_x][y] == NOT; | |
if (check) | |
return true; | |
} | |
if (start_y == end_y) | |
{ | |
bool check = true; | |
for (int x = min(start_x, end_x) + 1; x < max(start_x, end_x); x++) | |
check &= belong[x][start_y] == NOT; | |
if (check) | |
return true; | |
} | |
return false; | |
} | |
bool duck_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
for (int x = 0; x < 2; x++) | |
for (int y = 0; y < 2; y++) | |
{ | |
if (belong[start_x + (walk_set[x] << 1)][start_y + walk_set[y]] != NOT || | |
belong[start_x + walk_set[x]][start_y] != NOT) | |
continue; | |
int to_x = start_x + (walk_set[x] << 1) + walk_set[x], to_y = start_y + (walk_set[y] << 1); | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
for (int x = 0; x < 2; x++) | |
for (int y = 0; y < 2; y++) | |
{ | |
if (belong[start_x + walk_set[x]][start_y + (walk_set[y] << 1)] != NOT || | |
belong[start_x][start_y + walk_set[y]] != NOT) | |
continue; | |
int to_x = start_x + (walk_set[x] << 1), to_y = start_y + (walk_set[y] << 1) + walk_set[y]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
return false; | |
} | |
bool soldier_move(int start_x, int start_y, int end_x, int end_y) | |
{ | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x + walk_set[x], to_y = start_y; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x, to_y = start_y + walk_set[x]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x + walk_set[x], to_y = start_y + walk_set[x]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
for (int x = 0; x < 2; x++) | |
{ | |
int to_x = start_x + walk_set[x], to_y = start_y + walk_set[x ^ 1]; | |
if (end_x == to_x && end_y == to_y) | |
return true; | |
} | |
return false; | |
} | |
bool choose(int start_x, int start_y, int end_x, int end_y) | |
{ | |
switch (board[start_x][start_y]) | |
{ | |
case captain: | |
return captian_move(start_x, start_y, end_x, end_y); | |
break; | |
case guard: | |
return guard_move(start_x, start_y, end_x, end_y); | |
break; | |
case elephant: | |
return elephant_move(start_x, start_y, end_x, end_y); | |
break; | |
case horse: | |
return horse_move(start_x, start_y, end_x, end_y); | |
break; | |
case car: | |
return car_move(start_x, start_y, end_x, end_y); | |
break; | |
case duck: | |
return duck_move(start_x, start_y, end_x, end_y); | |
break; | |
case soldier: | |
return soldier_move(start_x, start_y, end_x, end_y); | |
break; | |
} | |
return false; | |
} | |
bool work(int start_x, int start_y, int end_x, int end_y, belong_type turn) | |
{ | |
if (GAME_OVER || belong[start_x][start_y] != turn || belong[end_x][end_y] == turn) | |
return false;//游戏结束,或者这颗棋子不是自己的,或者目的地有自己的棋子 | |
if (!choose(start_x, start_y, end_x, end_y)) | |
return false;//如果不能移动 | |
chess moved_chess = board[end_x][end_y];//存放被移走的棋子 | |
board[end_x][end_y] = board[start_x][start_y]; | |
belong[end_x][end_y] = belong[start_x][start_y]; | |
board[start_x][start_y] = NA; | |
belong[start_x][start_y] = NOT; | |
if (moved_chess == captain)//如果王被移走,游戏结束 | |
GAME_OVER = true; | |
CHECK_MATE = false;//开始准备判定将军局面 | |
for (int i = 0; i < 10; i++) | |
for (int j = 0; j < 9; j++) | |
if (belong[i][j] != NOT)//如果有棋子,我们直接判断它是否能攻击到对方王的位置 | |
CHECK_MATE |= choose(i, j, CAPTAIN_X[!belong[i][j]], CAPTAIN_Y[!belong[i][j]]); | |
printf("%s %s;%s;%s;%s\n", rank_string[turn].c_str(), chess_string[board[end_x][end_y]].c_str(), | |
moved_chess == NA ? "NA" : (rank_string[!turn] + " " + chess_string[moved_chess]).c_str(), | |
CHECK_MATE ? "yes" : "no", GAME_OVER ? "yes" : "no");//输出 | |
return true; | |
} | |
void restart(void) | |
{ | |
for (int i = 0; i < 10; i++) | |
for (int j = 0; j < 9; j++) | |
belong[i][j] = NOT; | |
board[0][4] = board[9][4] = captain; | |
board[0][3] = board[0][5] = board[9][3] = board[9][5] = guard; | |
board[0][2] = board[0][6] = board[9][2] = board[9][6] = elephant; | |
board[0][1] = board[0][7] = board[9][1] = board[9][7] = horse; | |
board[0][0] = board[0][8] = board[9][0] = board[9][8] = car; | |
board[2][0] = board[2][8] = board[7][0] = board[7][8] = duck; | |
board[3][0] = board[3][2] = board[3][4] = board[3][6] = board[3][8] = | |
board[6][0] = board[6][2] = board[6][4] = board[6][6] = board[6][8] = soldier; | |
belong[0][0] = belong[0][1] = belong[0][2] = belong[0][3] = belong[0][4] = belong[0][5] = belong[0][6] = belong[0][7] = belong[0][8] = | |
belong[2][0] = belong[2][8] = belong[3][0] = belong[3][2] = belong[3][4] = belong[3][6] = belong[3][8] = RED; | |
belong[9][0] = belong[9][1] = belong[9][2] = belong[9][3] = belong[9][4] = belong[9][5] = belong[9][6] = belong[9][7] = belong[9][8] = | |
belong[7][0] = belong[7][8] = belong[6][0] = belong[6][2] = belong[6][4] = belong[6][6] = belong[6][8] = BLUE; | |
CAPTAIN_X[RED] = 0; | |
CAPTAIN_Y[RED] = 4; | |
CAPTAIN_X[BLUE] = 9; | |
CAPTAIN_Y[BLUE] = 4; | |
GAME_OVER = false; | |
return; | |
} | |
int main() | |
{ | |
int Q; | |
scanf("%d", &Q); | |
restart(); | |
belong_type turn = RED; | |
while (Q--) | |
{ | |
int start_x, start_y, end_x, end_y; | |
scanf("%d%d%d%d", &start_x, &start_y, &end_x, &end_y); | |
if (work(start_x, start_y, end_x, end_y, turn)) | |
if (turn == RED) //回合变化 | |
turn = BLUE; | |
else | |
turn = RED; | |
else | |
puts("Invalid command"); //不合法操作 | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment