你相信吗?用ChatGPT写井字棋游戏仅需几分钟

井字棋

我们先实现一个最基本的使用控制台交互的井字棋游戏。
在这里插入图片描述

为了保持代码整洁,方便后续扩展,我们使用类Board来实现棋盘。除了常规的初始化方法__init__和字符串方法__str__,我们还要判断游戏的胜负、棋子位置的合理性。

main中,我们在while循环中实现两个玩家的交替下棋,直到一方胜利或棋盘满了为止。

代码整体比较简单,只是在判断胜利时需要处理好多个条件。

class Board:def __init__(self, size=3):self.board = [['_' for j in range(size)] for i in range(size)]self.size = sizedef __str__(self):res = ""for row in self.board:temp_row = ""for col in row:temp_row = temp_row + col + '\t'res += str(temp_row) + "\n"return resdef display(self):print(self)def can_set(self, row, col):return 0 <= row < self.size and 0 <= col < self.size and self.board[row][col] == '_'def set_board(self, row, col, mark):if self.can_set(row, col):self.board[row][col] = markelse:print("Invalid input...,")def check_win(self):for row in self.board:if all(x == 'X' for x in row):return "Player 1 wins"elif all(x == 'O' for x in row):return "Player 2 wins"for col in range(self.size):if all(self.board[row][col] == 'X' for row in range(self.size)):return "Player 1 wins"elif all(self.board[row][col] == 'O' for row in range(self.size)):return "Player 2 wins"# Diagonalif all(self.board[i][i] == 'X' for i in range(self.size)) or all(self.board[i][self.size-1-i] == 'X' for i in range(self.size)):return "Player 1 wins"elif all(self.board[i][i] == 'O' for i in range(self.size)) or all(self.board[i][self.size-1-i] == 'O' for i in range(self.size)):return "Player 2 wins"return "No one wins"def is_full(self):return not any(self.board[i][j] == '_' for i in range(self.size) for j in range(self.size))if __name__ == '__main__':size = int(input("Please input the size of the board: "))board = Board(size)board.display()# player 1:X  player 2:  Omarks = ['X', 'O']player = 0while not board.is_full() and board.check_win() == "No one wins":index = input(f"Please player {player+1} input coordinates (row, col): ")try:row, col = index.split(',')row, col = int(row)-1, int(col)-1except ValueError:print("Invalid input. Please input two integers separated by a comma.")continueif board.can_set(row, col):board.set_board(row, col, marks[player])else:print("This cell is already occupied. Please choose another one.")continueplayer = (player + 1) % 2board.display()print(board.check_win())

使用tkinter创建图形界面

在这个程序中,使用了tkinter模块来创建窗口和按钮。每个按钮都由Button类创建,并通过grid()方法来定位。当按钮被点击时,clicked()方法被调用,将其设置为当前玩家的标记,并切换到下一个玩家。每次下棋后,程序会检查游戏是否已结束。如果游戏结束,程序会调用show_winner()方法来显示获胜者或平局信息,并禁用所有按钮。

import tkinter as tkclass TicTacToeGUI:def __init__(self):self.root = tk.Tk()self.root.title("Tic Tac Toe")# 创建9个按钮self.buttons = []for i in range(3):row = []for j in range(3):button = tk.Button(self.root, text="", font=("Helvetica", 24), width=5, height=2, command=lambda row=i, col=j: self.clicked(row, col))button.grid(row=i, column=j)row.append(button)self.buttons.append(row)self.current_player = "X"self.board = [["-", "-", "-"],["-", "-", "-"],["-", "-", "-"]]def clicked(self, row, col):"""当一个按钮被点击时,将其设置为当前玩家的标记,并切换到下一个玩家。"""if self.board[row][col] == "-":self.buttons[row][col].config(text=self.current_player)self.board[row][col] = self.current_playerif self.current_player == "X":self.current_player = "O"else:self.current_player = "X"self.check_game_over()def check_game_over(self):"""检查游戏是否已结束"""for i in range(3):# 检查行if self.board[i][0] != "-" and self.board[i][0] == self.board[i][1] and self.board[i][1] == self.board[i][2]:self.show_winner(self.board[i][0])return# 检查列if self.board[0][i] != "-" and self.board[0][i] == self.board[1][i] and self.board[1][i] == self.board[2][i]:self.show_winner(self.board[0][i])return# 检查对角线if self.board[0][0] != "-" and self.board[0][0] == self.board[1][1] and self.board[1][1] == self.board[2][2]:self.show_winner(self.board[0][0])returnif self.board[0][2] != "-" and self.board[0][2] == self.board[1][1] and self.board[1][1] == self.board[2][0]:self.show_winner(self.board[0][2])return# 检查是否有空格for row in self.board:for cell in row:if cell == "-":return# 如果没有空格,平局self.show_winner("Tie")def show_winner(self, winner):"""显示获胜者或平局信息,并禁用所有按钮。"""if winner == "Tie":message = "It's a tie!"else:message = f"Player {winner} wins!"for row in self.buttons:for button in row:button.config(state="disabled")self.root.title(message)def start(self):"""开始游戏。"""self.root.mainloop()# 运行游戏
game = TicTacToeGUI()
game.start()

人机对战版

这是一个井字游戏的 Python 代码,分别有三个类:BoardAIPlayerGame

Board
这个类代表了游戏的棋盘,有以下方法:

  • __init__(self, size=3):构造函数,初始化棋盘为给定大小的二维列表,初始值为 ‘_’。
  • __str__(self):返回当前棋盘的字符串表示形式。
  • display(self):打印当前棋盘的字符串表示形式。
  • can_set(self, row, col):判断给定位置能否放置棋子。
  • set_board(self, row, col, mark):将给定位置放置给定的标记(‘X’ 或 ‘O’)。
  • check_win(self):判断当前棋局是否已分出胜负,返回 “Player 1 wins”、“Player 2 wins” 或 “No one wins”。
  • is_full(self):判断当前棋盘是否已满。
  • copy(self):返回当前棋盘的副本。

AIPlayer
这个类代表了游戏中的 AI 玩家,有以下方法:

  • __init__(self, mark):构造函数,初始化 AI 玩家的标记(‘X’ 或 ‘O’)。
  • get_best_move(self, board):计算当前 AI 玩家应该下的最佳位置。
  • minimax(self, board, is_maximizing, alpha, beta):计算给定棋盘状态下当前玩家的最大(或最小)得分。

Game
这个类代表了游戏本身,有以下方法:

  • __init__(self, size=3, ai_mode=False):构造函数,初始化游戏的棋盘大小和是否启用 AI 模式。
  • start(self):开始游戏。
    在 start 方法中,游戏会循环进行,直到棋盘已满或有一方获胜。每次循环,根据当前玩家是否是 AI,分别提示玩家输入位置或计算 AI 玩家应该下的位置,然后更新棋盘,交换当前玩家。
class Board:def __init__(self, size=3):self.board = [['_' for j in range(size)] for i in range(size)]self.size = sizedef __str__(self):res = ""for row in self.board:temp_row = ""for col in row:temp_row = temp_row + col + '\t'res += str(temp_row) + "\n"return resdef display(self):print(self)def can_set(self, row, col):return 0 <= row < self.size and 0 <= col < self.size and self.board[row][col] == '_'def set_board(self, row, col, mark):if self.can_set(row, col):self.board[row][col] = markelse:print("Invalid input...,")def check_win(self):for row in self.board:if all(x == 'X' for x in row):return "Player 1 wins"elif all(x == 'O' for x in row):return "Player 2 wins"for col in range(self.size):if all(self.board[row][col] == 'X' for row in range(self.size)):return "Player 1 wins"elif all(self.board[row][col] == 'O' for row in range(self.size)):return "Player 2 wins"# Diagonalif all(self.board[i][i] == 'X' for i in range(self.size)) or all(self.board[i][self.size - 1 - i] == 'X' for i in range(self.size)):return "Player 1 wins"elif all(self.board[i][i] == 'O' for i in range(self.size)) or all(self.board[i][self.size - 1 - i] == 'O' for i in range(self.size)):return "Player 2 wins"return "No one wins"def is_full(self):return not any(self.board[i][j] == '_' for i in range(self.size) for j in range(self.size))def copy(self):new_board = Board(self.size)for i in range(self.size):for j in range(self.size):new_board.board[i][j] = self.board[i][j]return new_boardclass AIPlayer:def __init__(self, mark):self.mark = markdef get_best_move(self, board):best_score = -1000best_move = Nonefor row in range(board.size):for col in range(board.size):if board.can_set(row, col):board_copy = board.copy()board_copy.set_board(row, col, self.mark)score = self.minimax(board_copy, False, -1000, 1000)if score > best_score:best_score = scorebest_move = (row, col)return best_movedef minimax(self, board, is_maximizing, alpha, beta):result = board.check_win()if result == "Player 1 wins":return -1elif result == "Player 2 wins":return 1elif board.is_full():return 0if is_maximizing:best_score = -1000for row in range(board.size):for col in range(board.size):if board.can_set(row, col):board_copy = board.copy()board_copy.set_board(row, col, 'O')score = self.minimax(board_copy, False, alpha, beta)best_score = max(best_score, score)alpha = max(alpha, best_score)if beta <= alpha:breakreturn best_scoreelse:best_score = 1000for row in range(board.size):for col in range(board.size):if board.can_set(row, col):board_copy = board.copy()board_copy.set_board(row, col, 'X')score = self.minimax(board_copy, True, alpha, beta)best_score = min(best_score, score)beta = min(beta, best_score)if beta <= alpha:breakreturn best_scoreclass Game:def __init__(self, size=3, ai_mode=False):self.board = Board(size)self.ai_mode = ai_modeself.player_marks = ['X', 'O']self.player_turn = 0if ai_mode:self.ai_player = AIPlayer(self.player_marks[1])def start(self):print("Starting the game...")self.board.display()while not self.board.is_full() and self.board.check_win() == "No one wins":current_player_mark = self.player_marks[self.player_turn]if self.player_turn == 1 and self.ai_mode:print("AI is thinking...")row, col = self.ai_player.get_best_move(self.board)print(f"AI placed {current_player_mark} at row {row + 1}, col {col + 1}")self.board.set_board(row, col, current_player_mark)else:index = input(f"Please player {self.player_turn + 1} input coordinates (row, col): ")try:row, col = index.split(',')row, col = int(row) - 1, int(col) - 1except ValueError:print("Invalid input. Please input two integers separated by a comma.")continueif not self.board.can_set(row, col):print("This cell is already occupied. Please choose another one.")continueself.board.set_board(row, col, current_player_mark)self.board.display()self.player_turn = (self.player_turn + 1) % 2print(self.board.check_win())if __name__ == '__main__':game = Game(size=3, ai_mode=True)game.start()

说明

第二部分(人机对战)全部由ChatGPT生成(中间经过多次调整),第一部分的代码是ChatGPT在我的代码基础上优化后的结果。
对于简单的问题,ChatGPT通常能给出完美的回答。但对于复杂问题则相对差一些,需要多次修改。此外,ChatGPT无法保证内容的正确性,有时候会给出似是而非的误导性回答。值得一提的是,ChatGPT对代码的理解能力特别强,能很好地给自己的代码加注释(大概是因为代码比较规范,流程相对固定,比较容易学习)。

ChatGPT能提高写代码及其它文字的效率,可以用来

  • 注释代码
  • 写一段简单函数
  • 提供灵感(比如起标题)
  • 写格式比较固定的文字(邮件等)

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

但是,ChatGPT对事实类问题的回答比较离谱:
在这里插入图片描述

在这里插入图片描述

更多ChatGPT的案例可以看看:
ChatGPT评测观察之对话能力|语义理解较准,尚难以摆脱知识整合和逻辑推理困境 https://mp.weixin.qq.com/s/ZjZgMZIXiD966hcFua_gew

ChatGPT是一种生成式预训练transformer(generative pre-trained transformer, GPT),使用有监督学习和强化学习对GPT-3.5进行微调。在两种方法中,人类训练者都用于提高模型的性能。在有监督学习中,模型被提供了对话,训练者在其中扮演了用户和AI助手的双方角色。在强化学习步骤中,人类训练者首先对模型先前创建的响应进行排名。这些排名被用于创建“奖励模型”,…
此外,OpenAI继续收集来自ChatGPT用户的数据,这些数据可以用于进一步训练和微调ChatGPT。用户可以赞或踩他们从ChatGPT收到的响应;在赞或踩时,他们还可以填写一个文本字段以提供额外的反馈。
更多细节可以参考:
维基百科ChatGPT: https://en.wikipedia.org/wiki/ChatGPT
InstructGPT论文: Training language models to follow instructions with human feedback

最后提一下,井字棋的最优策略竟是先占角!
https://www.guokr.com/article/4754

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/11362.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt赋能python:Python小游戏教程:打造属于自己的游戏

Python小游戏教程&#xff1a;打造属于自己的游戏 Python小游戏是一个非常有趣的项目&#xff0c;不仅可以锻炼编程基本功&#xff0c;还可以开发出自己独特的小游戏&#xff0c;提高自己在编程领域的实践能力。下面&#xff0c;我会带领大家逐步学习如何用Python打造属于自己…

ChatGPT编写贪吃蛇小游戏

现在最近对ChatGPT使用越来越热&#xff0c;ChatGPT的出现引发“一次新的社会变革”&#xff0c;不仅仅是输出文本&#xff0c;问答&#xff0c;做PPT、DOC、XMind的脑图&#xff0c;连写代码也是毫不夸张&#xff0c;现在基于ChatGPT3.5模型&#xff0c;使用python语言完成一个…

chatGPT写小游戏1分钟一个,快到起飞

猜数字游戏的规则是电脑随机生成一个1到100之间的整数&#xff0c;玩家需要猜测这个数字是多少&#xff0c;电脑会提示玩家猜的数字是偏大还是偏小&#xff0c;直到猜中为止。下面是代码示例&#xff1a; import randomnum random.randint(1, 100) guess 0 count 0print(&qu…

谷歌创始人亲自下场改代码,ChatGPT让谷歌真慌了

詹士 发自 凹非寺量子位 | 公众号 QbitAI “躺平”多年的创始人亲自改LaMDA代码&#xff0c;谷歌真着急了。 上述情况由福布斯最近曝光。 谢尔盖・布林现已“躬身入局”&#xff0c;亲自写代码。自2019年他和拉里离开一线以来&#xff0c;这还是头一回。 一位内部消息人士介绍&…

能拿 Google 18.3 万美元薪资、堪比 L3 级工程师、可改 78% 的 Bug,势不可挡的 ChatGPT!...

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; ChatGPT 是否会取代软件工程师&#xff1f; 在这项产品引发一场前所未有的 AI 科技浪潮之际&#xff0c;想必无数玩家提出过这样的疑问。对于 ChatGPT 自身而言&#xff0c;它给出的回答非常肯定&#…

ChatGPT逼急谷歌,劈柴发全员信:别慌,迟到也能赢!

源&#xff5c;新智元 谷歌被唱衰多日&#xff0c;劈柴终于出手了&#xff01;他发备忘录鼓励员工&#xff1a;别怕&#xff0c;「迟到也能赢」是咱们公司老传统了。 谷歌CEO劈柴反击了&#xff01;他告诉员工&#xff1a;别慌&#xff0c;咱们迟到也能赢。 最近&#xff0c;谷…

机器学习面试八股准备

Logistic regression LR的完整内容 1. 为什么用sigmoid函数&#xff1f; Sigmoid函数能够把原本的函数压缩在0~1之间&#xff0c;适合作为概率&#xff0c;进而可以分类写成指数族分布的形式后&#xff0c;有sigmoid函数的形式logistic regression服从伯努利分布&#xff0c;根…

ChatGpt对Android面试题总结

前言 在去年大浪潮中&#xff0c;成了失业人员之一&#xff0c;于是各种准备面试&#xff0c;发现面试题网上很多&#xff0c;但是都是很凌乱的&#xff0c;而且一个地方一点&#xff0c;没有一个系统的面试题库&#xff0c;有题库有的没有答案或者是答案很简洁&#xff0c;没有…

chatgpt赋能python:Python到底是免费的吗?

Python到底是免费的吗&#xff1f; Python是一种流行的编程语言&#xff0c;它有可靠性高&#xff0c;易于学习和使用的特点&#xff0c;受到了广泛的欢迎和支持。许多人对Python的使用的最基本问题之一是&#xff1a;“Python是免费的吗&#xff1f;” 在这篇文章中&#xff…

做外贸如何借助WhatsApp实现获客引流和高效转化

01 利用WhatsApp做外贸的五大优势 ①用户量大&#xff0c;全球用户25亿&#xff1b; ②使用手机号码注册使用&#xff0c;也就是说WA账号和手机号天然绑定&#xff0c;有利于外贸人获取和保留客户信息&#xff1b; ③WhatsApp是非常轻便的IM工具&#xff0c;功能和界面非常简…

Android判断世界各国手机号码合法性

之前公司项目只接收国内手机号码注册&#xff0c;所以只用正则表达式判断是否满足即可&#xff0c;后来香港同事、台湾同事想使用我们产品&#xff0c;发现根本没法注册&#xff0c;所以后台添加香港、台湾、澳门手机用户注册支持&#xff0c;所以APP也得添加这些地区手机号码合…

国外手机短信验证码接收神器(转自美国华人网FuninUSA)

【美国华人网综合报道】有时候&#xff0c;在某些平台上&#xff0c;我们可能需要注册一个临时账号。而注册过程中又需要输入手机号进行短信验证&#xff0c;但是我们又不想泄露隐私&#xff0c;所以这时候一些临时短信接收服务便派上了用场&#xff0c;主要是因为申请Email 电…

如何用LLMs来赚钱?基于ChatGPT的商业模式指南

# 背景知识 什么是 LLM &#xff1f; Large Language Model 大规模语言模型&#xff0c;是利用海量文本数据训练出来能够理解自然语言并生成文本内容的深度学习模型。 大模型的经典代表 GPT-3有多大&#xff1f; GPT-3 有1750亿个参数&#xff0c;人脑的神经元数量估计在 1000 …

ChatGPT4高分通过数据库系统工程师(DBA)认证

ChatGPT 已经通过了美国MBA、法律和医学考试&#xff0c;ChatGPT 又通过了数据库系统工程师考试。这次考试使用了2021年的真实试卷&#xff0c;上午的笔试题全部为选择题&#xff0c;总分75分&#xff08;45分通过&#xff09;。 ChatGPT3.5 考了49分&#xff08;勉强通过&…

ChatGPT通过中国数据库系统工程师(DBA)认证?

无论是关注技术的朋友&#xff0c;还是关注A股的朋友们&#xff0c;可能都知道现在ChatGPT流行的程度&#xff0c;可以说势如破竹&#xff0c;很多人都担心&#xff0c;一些重复性非体力劳动的岗位&#xff0c;就快被人工智能替代了。 我的理解是&#xff0c;这个可能性有&…

SQL Chat 更新 - 用户注册,早鸟套餐,GPT-4,新增支持数据库

用户注册和付费套餐 注册用户每月可以问 20 个问题。升级到专业版后&#xff0c;可以提 1000 个问题&#xff0c;目前早鸟尝鲜价 5 美金/月。 支持使用 GPT-4 支持 TiDB Serverless &#x1f33b; 来自 Icemap 支持选择指定的表作为上下文传给 OpenAI 并且还能展示每一个 Tab…

PostgreSQL 数据库跨版本升级常用方案

文章目录 升级方案概述通过逻辑备份与还原进行升级利用 pg_upgrade 工具进行升级使用逻辑复制功能进行升级总结 大家好&#xff0c;我是只谈技术不剪发的 Tony 老师。对于企业而言&#xff0c;将数据库系统升级到新版本通常可以获得更好的性能、更多的功能、最新的安全补丁和错…

从dblink谈起,我们在postgresql中跨库更新数据

dblink(Database Link)数据库链接顾名思义就是数据库的链接&#xff0c;就像电话线一样&#xff0c;是一个通道&#xff0c;当我们要跨本地数据库&#xff0c;访问另外一个数据库表中的数据时&#xff0c;本地数据库中就必须要创建远程数据库的dblink,通过dblink本地数据库可以…

postgresql 数据库小版本更新

postgresql 数据库小版本更新 记录一次pg小版本更新 文章目录 postgresql 数据库小版本更新前言一.下载最新的pg版本 pg11&#xff08;11.18&#xff09;二 pg11.5 升级 pg11.18过程1. 查看当前数据库版本&#xff1a;2. 关闭pg11.5数据库3. 安装pg11.184.修改 配置文件5. 重新…

15、ChatGPT 会让嵌入式工程师失业吗?

ChatGPT 会让嵌入式工程师失业吗&#xff1f; 如果说陈**不怕失业&#xff0c;那么&#xff0c;你觉得ChatGPT 会让嵌入式工程师失业吗&#xff1f; 我们先来看下ChatGPT给出的答案&#xff1a; ChatGPT 作为一款人工智能聊天机器人&#xff0c;不一定会让嵌入式工程师失业。事…