草庐IT

chatgpt写程序-python小游戏-2048-pygame

Brinshy 2023-03-28 原文

闲的没事,用chatpgt弄了个小游戏,2048,利用pygame实现,无额外贴图。

只需要告诉他写个python游戏2048,只用pygame实现,不要额外贴图。然后在他暂停后说请继续,最后会有一些bug,把报错告诉他,慢慢改,10分钟就可以完成。

效果如下图:

 

 

 

 

具体代码如下:

  1 import pygame
  2 import random
  3 
  4 # 游戏界面的尺寸
  5 WIDTH = 400
  6 HEIGHT = 400
  7 
  8 # 游戏界面的背景颜色
  9 BACKGROUND_COLOR = (187, 173, 160)
 10 TEXT_COLOR = (119, 110, 101)
 11 GAME_OVER_COLOR = (0, 0, 0)
 12 
 13 # 格子的尺寸和间距
 14 CELL_SIZE = 80
 15 CELL_MARGIN = 10
 16 TILE_SIZE = 100
 17 TILE_MARGIN = 10
 18 GAME_OVER_FONT_SIZE = 72
 19 SIZE = 500
 20 
 21 # 数字方块的颜色和字体
 22 TILE_COLORS = {
 23     0: (204, 192, 179),
 24     2: (238, 228, 218),
 25     4: (237, 224, 200),
 26     8: (242, 177, 121),
 27     16: (245, 149, 99),
 28     32: (246, 124, 95),
 29     64: (246, 94, 59),
 30     128: (237, 207, 114),
 31     256: (237, 204, 97),
 32     512: (237, 200, 80),
 33     1024: (237, 197, 63),
 34     2048: (237, 194, 46),
 35     4096: (174, 207, 48)
 36 }
 37 pygame.font.init()
 38 TILE_FONT = pygame.font.SysFont("Arial", 40, bold=True)
 39 
 40 
 41 def draw_text(surface, text, color, x, y):
 42     """
 43     在指定位置绘制文本
 44     """
 45     text_surface = TILE_FONT.render(text, True, color)
 46     text_rect = text_surface.get_rect()
 47     text_rect.center = (x, y)
 48     surface.blit(text_surface, text_rect)
 49 
 50 
 51 def draw_tile(surface, x, y, value):
 52     """
 53     在指定位置绘制数字方块
 54     """
 55     color = TILE_COLORS[value]
 56     pygame.draw.rect(surface, color, (x, y, CELL_SIZE, CELL_SIZE))
 57     if value != 0:
 58         text_color = (255, 255, 255) if value < 8 else (119, 110, 101)
 59         draw_text(surface, str(value), text_color, x + CELL_SIZE / 2, y + CELL_SIZE / 2)
 60 
 61 
 62 def draw_board(surface, board):
 63     """
 64     绘制游戏界面上的数字方块
 65     """
 66     for row in range(4):
 67         for col in range(4):
 68             x = col * CELL_SIZE + (col + 1) * CELL_MARGIN
 69             y = row * CELL_SIZE + (row + 1) * CELL_MARGIN
 70             draw_tile(surface, x, y, board[row][col])
 71 
 72 
 73 def generate_tile(board):
 74     """
 75     在空白格子中随机生成数字方块
 76     """
 77     available_cells = []
 78     for row in range(4):
 79         for col in range(4):
 80             if board[row][col] == 0:
 81                 available_cells.append((row, col))
 82     if available_cells:
 83         row, col = random.choice(available_cells)
 84         board[row][col] = 2
 85         return True
 86     else:
 87         return False
 88 
 89 
 90 def move_tiles(board, direction):
 91     """
 92     根据方向移动数字方块
 93     """
 94     moved = False
 95     if direction == "left":
 96         for row in range(4):
 97             for col in range(1, 4):
 98                 if board[row][col] != 0:
 99                     for k in range(col):
100                         if board[row][k] == 0 and no_obstacles(board, row, k, row, col):
101                             board[row][k] = board[row][col]
102                             board[row][col] = 0
103                             moved = True
104                             break
105                         elif board[row][k] == board[row][col] and no_obstacles(board, row, k, row, col):
106                             board[row][k] *= 2
107                             board[row][col] = 0
108                             moved = True
109                             break
110     elif direction == "right":
111         for row in range(4):
112             for col in range(2, -1, -1):
113                 if board[row][col] != 0:
114                     for k in range(3, col, -1):
115                         if board[row][k] == 0 and no_obstacles(board, row, col, row, k):
116                             board[row][k] = board[row][col]
117                             board[row][col] = 0
118                             moved = True
119                             break
120                         elif board[row][k] == board[row][col] and no_obstacles(board, row, col, row, k):
121                             board[row][k] *= 2
122                             board[row][col] = 0
123                             moved = True
124                             break
125     elif direction == "up":
126         for col in range(4):
127             for row in range(1, 4):
128                 if board[row][col] != 0:
129                     for k in range(row):
130                         if board[k][col] == 0 and no_obstacles(board, k, col, row, col):
131                             board[k][col] = board[row][col]
132                             board[row][col] = 0
133                             moved = True
134                             break
135                         elif board[k][col] == board[row][col] and no_obstacles(board, k, col, row, col):
136                             board[k][col] *= 2
137                             board[row][col] = 0
138                             moved = True
139                             break
140     elif direction == "down":
141         for col in range(4):
142             for row in range(2, -1, -1):
143                 if board[row][col] != 0:
144                     for k in range(3, row, -1):
145                         if board[k][col] == 0 and no_obstacles(board, row, col, k, col):
146                             board[k][col] = board[row][col]
147                             board[row][col] = 0
148                             moved = True
149                             break
150                         elif board[k][col] == board[row][col] and no_obstacles(board, row, col, k, col):
151                             board[k][col] *= 2
152                             board[row][col] = 0
153                             moved = True
154                             break
155     return moved
156 
157 
158 def no_obstacles(board, row1, col1, row2, col2):
159     """
160     判断两个位置之间是否有障碍物(即是否有数字方块)
161     """
162     if row1 == row2:
163         for col in range(col1 + 1, col2):
164             if board[row1][col] != 0:
165                 return False
166     elif col1 == col2:
167         for row in range(row1 + 1, row2):
168             if board[row][col1] != 0:
169                 return False
170     return True
171 
172 
173 def game_over(board):
174     """
175     判断游戏是否结束
176     """
177     for row in range(4):
178         for col in range(4):
179             if board[row][col] == 0:
180                 return False
181     for row in range(4):
182         for col in range(3):
183             if board[row][col] == board[row][col + 1]:
184                 return False
185     for col in range(4):
186         for row in range(3):
187             if board[row][col] == board[row + 1][col]:
188                 return False
189     return True
190 
191 
192 def add_new_tile(board):
193     # 查找所有空白的方格
194     empty_tiles = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]
195 
196     # 如果没有空白的方格,返回 False
197     if len(empty_tiles) == 0:
198         return False
199 
200     # 随机选择一个空白的方格,并随机放入数字 2 或 4
201     row, col = random.choice(empty_tiles)
202     board[row][col] = random.choice([2, 4])
203 
204     return True
205 
206 
207 def get_tile_color(value):
208     colors = {
209         2: (238, 228, 218),
210         4: (237, 224, 200),
211         8: (242, 177, 121),
212         16: (245, 149, 99),
213         32: (246, 124, 95),
214         64: (246, 94, 59),
215         128: (237, 207, 114),
216         256: (237, 204, 97),
217         512: (237, 200, 80),
218         1024: (237, 197, 63),
219         2048: (237, 194, 46),
220     }
221     return colors.get(value, (0, 0, 0))
222 
223 
224 def get_font_size(value):
225     if value < 100:
226         return 64
227     elif value < 1000:
228         return 48
229     else:
230         return 36
231 
232 
233 def main():
234     # 初始化游戏界面
235     pygame.init()
236     screen = pygame.display.set_mode((SIZE, SIZE))
237     pygame.display.set_caption("2048 Game")
238 
239     # 初始化游戏板
240     board = [[0] * 4 for i in range(4)]
241     add_new_tile(board)
242     add_new_tile(board)
243 
244     while True:
245         # 处理事件
246         for event in pygame.event.get():
247             if event.type == pygame.QUIT:
248                 pygame.quit()
249                 sys.exit()
250             elif event.type == pygame.KEYDOWN:
251                 moved = False
252                 if event.key == pygame.K_LEFT:
253                     moved = move_tiles(board, "left")
254                 elif event.key == pygame.K_RIGHT:
255                     moved = move_tiles(board, "right")
256                 elif event.key == pygame.K_UP:
257                     moved = move_tiles(board, "up")
258                 elif event.key == pygame.K_DOWN:
259                     moved = move_tiles(board, "down")
260                 if moved:
261                     add_new_tile(board)
262 
263         # 绘制游戏界面
264         screen.fill(BACKGROUND_COLOR)
265         for row in range(4):
266             for col in range(4):
267                 x = col * TILE_SIZE + TILE_MARGIN * (col + 1)
268                 y = row * TILE_SIZE + TILE_MARGIN * (row + 1)
269                 tile_color = get_tile_color(board[row][col])
270                 pygame.draw.rect(screen, tile_color, (x, y, TILE_SIZE, TILE_SIZE))
271                 if board[row][col] != 0:
272                     font_size = get_font_size(board[row][col])
273                     font = pygame.font.Font(None, font_size)
274                     text = font.render(str(board[row][col]), True, TEXT_COLOR)
275                     text_rect = text.get_rect()
276                     text_rect.center = (x + TILE_SIZE / 2, y + TILE_SIZE / 2)
277                     screen.blit(text, text_rect)
278 
279         # 判断游戏是否结束
280         if game_over(board):
281             font = pygame.font.Font(None, GAME_OVER_FONT_SIZE)
282             text = font.render("Game Over!", True, GAME_OVER_COLOR)
283             text_rect = text.get_rect()
284             text_rect.center = (SIZE / 2, SIZE / 2)
285             screen.blit(text, text_rect)
286 
287         pygame.display.update()
288 
289 
290 if __name__ == "__main__":
291     main()

 

有关chatgpt写程序-python小游戏-2048-pygame的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  3. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  4. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  5. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  6. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  7. ruby-on-rails - Rails 应用程序中的 Rails : How are you using application_controller. rb 是新手吗? - 2

    刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr

  8. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  9. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  10. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

随机推荐