三子棋、井字棋 -python版本代码-C语言版本代码
三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏分为两边对战,两边依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利,而对方就算输了,但是三子棋在很多时间会出现和棋的局面。https://i-blog.csdnimg.cn/direct/8a552e3aa3a249f29da36578e001b2a1.png
废话不多说,直接上代码,好用请给个三连关注谢谢,我的B站是技术宅学长的个人空间-技术宅学长个人主页-哔哩哔哩视频 (bilibili.com)
#作者:技术宅学长(CSDN、B站、抖音均为该ID)
#电赛交流1群:586475593
#电赛交流2群:878095340
#电赛交流3群:873779462
#电赛交流4群:208635284
#电赛交流5群:903429622
import random
# 定义棋盘大小和玩家符号
ROWS, COLS = 3, 3
PLAYER_X = 'X'#玩家
PLAYER_O = 'O'#电脑AI
EMPTY = ' '
# 函数:打印棋盘
def print_board(board):
for row in board:
print(" | ".join(row))
print("-" * 9)
# 函数:检查当前状态是否是结束状态(胜负或平局)
def check_game_over(board):
# 检查行和列
for i in range(ROWS):
if board == board == board != EMPTY:# 检查行
return board
if board == board == board != EMPTY:# 检查列
return board
# 检查对角线
if board == board == board != EMPTY:# 主对角线
return board
if board == board == board != EMPTY:# 副对角线
return board
# 检查是否平局
if all(board != EMPTY for i in range(ROWS) for j in range(COLS)):
return "Draw"
# 游戏未结束
return None
# 函数:实现Minimax算法来找到最优的下棋位置
def minimax(board, depth, is_maximizing):
result = check_game_over(board)
if result == PLAYER_X:
return -1# X赢了
elif result == PLAYER_O:
return 1# O赢了
elif result == "Draw":
return 0# 平局
if is_maximizing:
best_score = -float('inf')
for i in range(ROWS):
for j in range(COLS):
if board == EMPTY:
board = PLAYER_O
score = minimax(board, depth + 1, False)
board = EMPTY
best_score = max(score, best_score)
return best_score
else:
best_score = float('inf')
for i in range(ROWS):
for j in range(COLS):
if board == EMPTY:
board = PLAYER_X
score = minimax(board, depth + 1, True)
board = EMPTY
best_score = min(score, best_score)
return best_score
# 函数:让电脑选择最优的下棋位置
def computer_move(board):
best_move = None
best_score = -float('inf')
for i in range(ROWS):
for j in range(COLS):
if board == EMPTY:
board = PLAYER_O
score = minimax(board, 0, False)
board = EMPTY
if score > best_score:
best_score = score
best_move = (i, j)
board]] = PLAYER_O
# 主函数:控制游戏流程
def main():
board = [ for _ in range(ROWS)]
current_player = PLAYER_O#设置先行玩家PLAYER_X为人,PLAYER_O为AI
print("欢迎使用三子棋程序!")
print_board(board)
while True:
if current_player == PLAYER_X:
row = int(input("请输入你要下的行 (0, 1, 2) :"))
col = int(input("请输入你要下的列 (0, 1, 2) :"))
if board == EMPTY:
board = PLAYER_X
current_player = PLAYER_O
else:
print("移动错误,当前位置有棋,请重下")
continue
else:
print("AI走棋")
computer_move(board)
current_player = PLAYER_X
print_board(board)
game_result = check_game_over(board)
if game_result:
if game_result == "Draw":
print("平局!")
else:
if game_result == 'O':
print(f" AI获胜!")
else:
print(f" 恭喜你获胜!")
break
if __name__ == "__main__":
main() #include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define ROWS 3
#define COLS 3
#define PLAYER_X 'X'
#define PLAYER_O 'O'
#define EMPTY ' '
// 打印棋盘
void print_board(char board) {
for (int i = 0; i < ROWS; ++i) {
printf(" %c | %c | %c \n", board, board, board);
if (i != ROWS - 1) {
printf("---|---|---\n");
}
}
}
// 检查游戏是否结束(胜负或平局)
char check_game_over(char board) {
// 检查行和列
for (int i = 0; i < ROWS; ++i) {
if (board == board && board == board && board != EMPTY) {
return board;
}
if (board == board && board == board && board != EMPTY) {
return board;
}
}
// 检查对角线
if (board == board && board == board && board != EMPTY) {
return board;
}
if (board == board && board == board && board != EMPTY) {
return board;
}
// 检查是否平局
bool is_draw = true;
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
if (board == EMPTY) {
is_draw = false;
break;
}
}
if (!is_draw) {
break;
}
}
if (is_draw) {
return 'D'; // 平局
}
return ' '; // 游戏未结束
}
// Minimax算法实现
int minimax(char board, int depth, bool is_maximizing) {
char result = check_game_over(board);
if (result == PLAYER_X) {
return -1; // X赢了
} else if (result == PLAYER_O) {
return 1; // O赢了
} else if (result == 'D') {
return 0; // 平局
}
if (is_maximizing) {
int best_score = -1000; // 初始最小值
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
if (board == EMPTY) {
board = PLAYER_O;
int score = minimax(board, depth + 1, false);
board = EMPTY;
best_score = score > best_score ? score : best_score;
}
}
}
return best_score;
} else {
int best_score = 1000; // 初始最大值
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
if (board == EMPTY) {
board = PLAYER_X;
int score = minimax(board, depth + 1, true);
board = EMPTY;
best_score = score < best_score ? score : best_score;
}
}
}
return best_score;
}
}
// 计算并返回电脑的最优下棋位置
void computer_move(char board) {
int best_score = -1000;
int best_move_row = -1;
int best_move_col = -1;
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
if (board == EMPTY) {
board = PLAYER_O;
int score = minimax(board, 0, false);
board = EMPTY;
if (score > best_score) {
best_score = score;
best_move_row = i;
best_move_col = j;
}
}
}
}
board = PLAYER_O;
}
// 主函数:控制游戏流程
int main() {
char board;
char current_player = PLAYER_X;//先落子玩家,PLAYER_X为玩家,PLAYER_O为电脑
// 初始化棋盘
for (int i = 0; i < ROWS; ++i) {
for (int j = 0; j < COLS; ++j) {
board = EMPTY;
}
}
// 游戏循环
while (true) {
// 打印当前棋盘状态
printf("\nCurrent board:\n");
print_board(board);
// 检查游戏是否结束
char game_result = check_game_over(board);
if (game_result != ' ') {
if (game_result == 'D') {
printf("It's a draw!\n");
} else {
printf("%c wins!\n", game_result);
}
break;
}
// 根据当前玩家决定下棋
if (current_player == PLAYER_X) {
int row, col;
printf("\nEnter row number (0, 1, 2) for your move: ");
scanf("%d", &row);
printf("Enter column number (0, 1, 2) for your move: ");
scanf("%d", &col);
if (board == EMPTY) {
board = PLAYER_X;
current_player = PLAYER_O;
} else {
printf("Invalid move! That position is already taken. Try again.\n");
continue;
}
} else {
printf("\nComputer's turn:\n");
computer_move(board);
current_player = PLAYER_X;
}
}
return 0;
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]