C#编写跳棋程序

从小就喜欢下跳棋..但似乎我们那儿的规则和现在联众上的不同,联众的好像不支持隔空飞(中间有一个子)...刚好又在学C#,所以就拿来练练手...

这个程序已经写了好几个月了..一直没时间去更新它.到目前还是单机版(我原意是做成网络版的)...现在就给大家写一下程序的思路....如果有兴趣进行修改,请发一份修改版给我.谢谢.

总体思路是这样的:
1、每个棋子是一个对象.它的状态包括它左上角点的Point,和棋盘坐标(下面讲).以及是否右移.
2、棋盘坐标的概念,如图,我们把棋盘看成是一个XYZ三轴的面。(程序搁得很久了,我已经记不清具体XYZ是哪根了,不过XYZ是哪根其实是不重要的);

然后开始讲步骤:
1、程序启动,初始化棋盘;
2、设置OnMouseDown.OnMouseDown实际上就是主程序了;
3、跳棋有几种规则...一一写处理方法就可以了。
a)移一步
b)隔子跳一步
c)在中间有子的情况下隔空飞;

其他的请看程序的注释吧。。程序注释还算清楚。(程序里所有涉及网络的代码都是目前没用到的,以前想做网络版时的一点残留代码)

由于我可怜的免费空间不支持rar文件下载,我只好改成txt上传,请点右键用下载工具下载,并改为rar的;

(第一遍上传时由于服务器问题没有传上图片,现补上.)

如有意见,欢迎指教: AppleDotnet@hotmail.com

http://ssave.myrice.com/jc.txt

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
以下是一个简单的跳棋AI程序,使用C语言编写: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> #define BOARD_SIZE 8 #define EMPTY 0 #define BLACK 1 #define WHITE 2 #define BLACK_KING 3 #define WHITE_KING 4 int board[BOARD_SIZE][BOARD_SIZE] = { {0, 1, 0, 1, 0, 1, 0, 1}, {1, 0, 1, 0, 1, 0, 1, 0}, {0, 1, 0, 1, 0, 1, 0, 1}, {EMPTY, 0, EMPTY, 0, EMPTY, 0, EMPTY, 0}, {0, EMPTY, 0, EMPTY, 0, EMPTY, 0, EMPTY}, {2, 0, 2, 0, 2, 0, 2, 0}, {0, 2, 0, 2, 0, 2, 0, 2}, {2, 0, 2, 0, 2, 0, 2, 0} }; int get_color(int x, int y) { return board[x][y] & 3; } int is_king(int x, int y) { return board[x][y] & 4; } void set_king(int x, int y) { board[x][y] |= 4; } void unset_king(int x, int y) { board[x][y] &= ~4; } void print_board() { int x, y; printf(" 0 1 2 3 4 5 6 7\n"); for (y = 0; y < BOARD_SIZE; y++) { printf("%d ", y); for (x = 0; x < BOARD_SIZE; x++) { switch (board[x][y]) { case EMPTY: printf(". "); break; case BLACK: printf("b "); break; case WHITE: printf("w "); break; case BLACK_KING: printf("B "); break; case WHITE_KING: printf("W "); break; } } printf("\n"); } } int is_jump_possible(int x, int y, int dx, int dy) { int color = get_color(x, y); int opponent_color = (color == BLACK || color == BLACK_KING) ? WHITE : BLACK; int x2 = x + 2 * dx; int y2 = y + 2 * dy; if (x2 < 0 || x2 >= BOARD_SIZE || y2 < 0 || y2 >= BOARD_SIZE) { return 0; } if (get_color(x2, y2) != EMPTY) { return 0; } if (get_color(x + dx, y + dy) != opponent_color) { return 0; } return 1; } int is_move_possible(int x, int y, int dx, int dy) { int color = get_color(x, y); int x2 = x + dx; int y2 = y + dy; if (x2 < 0 || x2 >= BOARD_SIZE || y2 < 0 || y2 >= BOARD_SIZE) { return 0; } if (get_color(x2, y2) != EMPTY) { return 0; } if (color == BLACK) { if (dy != 1) { return 0; } } else if (color == WHITE) { if (dy != -1) { return 0; } } else if (color == BLACK_KING || color == WHITE_KING) { if (dy != 1 && dy != -1) { return 0; } } if (abs(dx) != 1) { return 0; } return 1; } int is_jump_available(int color) { int x, y, dx, dy; for (y = 0; y < BOARD_SIZE; y++) { for (x = 0; x < BOARD_SIZE; x++) { if (get_color(x, y) == color) { for (dy = -2; dy <= 2; dy += 4) { for (dx = -2; dx <= 2; dx += 4) { if (is_jump_possible(x, y, dx, dy)) { return 1; } } } } } } return 0; } int is_move_available(int color) { int x, y, dx; for (y = 0; y < BOARD_SIZE; y++) { for (x = 0; x < BOARD_SIZE; x++) { if (get_color(x, y) == color) { for (dx = -1; dx <= 1; dx += 2) { if (is_move_possible(x, y, dx, color == BLACK || color == BLACK_KING ? 1 : -1)) { return 1; } } } } } return 0; } void do_jump(int x, int y, int dx, int dy) { int x2 = x + 2 * dx; int y2 = y + 2 * dy; board[x2][y2] = board[x][y]; board[x][y] = EMPTY; board[x + dx][y + dy] = EMPTY; if (y2 == 0 && get_color(x2, y2) == BLACK) { set_king(x2, y2); } if (y2 == BOARD_SIZE - 1 && get_color(x2, y2) == WHITE) { set_king(x2, y2); } } void do_move(int x, int y, int dx, int dy) { int x2 = x + dx; int y2 = y + dy; board[x2][y2] = board[x][y]; board[x][y] = EMPTY; if (y2 == 0 && get_color(x2, y2) == BLACK) { set_king(x2, y2); } if (y2 == BOARD_SIZE - 1 && get_color(x2, y2) == WHITE) { set_king(x2, y2); } } void get_possible_jumps(int x, int y, int jumps[][2], int *n_jumps) { int color = get_color(x, y); int dx, dy; int count = 0; for (dy = -2; dy <= 2; dy += 4) { for (dx = -2; dx <= 2; dx += 4) { if (is_jump_possible(x, y, dx, dy)) { jumps[count][0] = dx; jumps[count][1] = dy; count++; } } } *n_jumps = count; } void get_possible_moves(int x, int y, int moves[][2], int *n_moves) { int color = get_color(x, y); int dx; int count = 0; for (dx = -1; dx <= 1; dx += 2) { if (is_move_possible(x, y, dx, color == BLACK || color == BLACK_KING ? 1 : -1)) { moves[count][0] = dx; moves[count][1] = color == BLACK || color == BLACK_KING ? 1 : -1; count++; } } *n_moves = count; } void make_random_move(int color) { int x, y, n_jumps, n_moves, i, j; int jumps[12][2], moves[4][2]; for (;;) { x = rand() % BOARD_SIZE; y = rand() % BOARD_SIZE; if (get_color(x, y) == color) { get_possible_jumps(x, y, jumps, &n_jumps); get_possible_moves(x, y, moves, &n_moves); if (n_jumps > 0) { i = rand() % n_jumps; do_jump(x, y, jumps[i][0], jumps[i][1]); if (!is_jump_available(get_color(x + 2 * jumps[i][0], y + 2 * jumps[i][1]))) { break; } x += 2 * jumps[i][0]; y += 2 * jumps[i][1]; get_possible_jumps(x, y, jumps, &n_jumps); if (n_jumps == 0) { break; } } else if (n_moves > 0) { i = rand() % n_moves; do_move(x, y, moves[i][0], moves[i][1]); break; } } } } int get_winner() { int x, y, n_black, n_white, n_black_kings, n_white_kings; n_black = n_white = n_black_kings = n_white_kings = 0; for (y = 0; y < BOARD_SIZE; y++) { for (x = 0; x < BOARD_SIZE; x++) { switch (board[x][y]) { case BLACK: n_black++; break; case WHITE: n_white++; break; case BLACK_KING: n_black_kings++; break; case WHITE_KING: n_white_kings++; break; } } } if (n_black == 0 && n_black_kings == 0) { return WHITE; } if (n_white == 0 && n_white_kings == 0) { return BLACK; } return EMPTY; } int main() { srand(time(NULL)); int turn = BLACK; while (get_winner() == EMPTY) { print_board(); if (is_jump_available(turn)) { make_random_move(turn); } else if (is_move_available(turn)) { make_random_move(turn); } turn = (turn == BLACK) ? WHITE : BLACK; } int winner = get_winner(); if (winner == BLACK) { printf("Black wins!\n"); } else if (winner == WHITE) { printf("White wins!\n"); } else { printf("Tie!\n"); } return 0; } ``` 该程序使用随机策略进行决策,即在可行的跳跃和移动中随机选择一个。它还包括检查跳跃和移动的有效性以及升级普通棋子为王棋子的功能。程序在控制台上打印出当前棋盘,并在有胜者时输出结果。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值