日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python代码300行程序_Python:游戏:300行代码实现俄罗斯方块

發布時間:2024/10/8 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python代码300行程序_Python:游戏:300行代码实现俄罗斯方块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文代碼基于 python3.6 和 pygame1.9.4。

五子棋比起我之前寫的幾款游戲來說,難度提高了不少。如果是人與人對戰,那么,電腦只需要判斷是否贏了就可以。如果是人機對戰,那你還得讓電腦知道怎么下。

我們先從簡單的問題來看。

開端

畫棋盤

首先肯定是要畫出棋盤來,用 pygame 畫出一個 19 × 19 或 15 × 15 的棋盤并不是什么難事,這在之前的文章中已經多次用到,就不贅述了。

畫棋子

需要說一下的是畫棋子,因為沒找到什么合適的棋子圖片,所以只要自己來畫棋子。

我們用 pygame.draw.circle 畫出來的圓形是這樣的:

鋸齒狀十分明顯,pygame.draw 中有畫抗鋸齒直線的函數 aaline,但是并沒有 aacircle 這樣的函數來畫一個抗鋸齒的圓。

這里就需要用到 pygame.gfxdraw 啦。pygame.gfxdraw 目前還僅是實驗版本,這意味著這個 api 可能會在以后的 pygame 版本中發生變化或消失。

要繪制抗鋸齒和填充形狀,請首先使用函數的aa *版本,然后使用填充版本。例如:

col = (255, 0, 0)

surf.fill((255, 255, 255))

pygame.gfxdraw.aacircle(surf, x, y, 30, col)

pygame.gfxdraw.filled_circle(surf, x, y, 30, col)

我們用這個方法在棋盤上畫一個棋子試試看。

可以看到效果已明顯改善。

落子

落子需要判斷鼠標事件,當鼠標左鍵點擊,獲取鼠標點擊的位置,然后根據棋盤的位置,計算出棋子落在棋盤的位置。

while true:

for event in pygame.event.get():

if event.type == quit:

sys.exit()

elif event.type == mousebuttondown:

pressed_array = pygame.mouse.get_pressed()

if pressed_array[0]: # 鼠標左鍵點擊

mouse_pos = pygame.mouse.get_pos()

click_point = _get_clickpoint(mouse_pos)

勝利判定

當一子落下,如何判定是否勝利?

可以肯定的是,當某一子落下的時候,如果出現了 5 連,那么落下的這顆子必定在這條 5 連線上。那么這個問題就可以簡化了,我們無需全盤掃描,只需要在落子位置上橫豎撇捺掃描一下,判斷是否出現 5 連即可。

我們定義一個棋盤類,類中實例化一個 19 × 19 的二維數組,初始值皆為 0,表示空,用 1 表示黑子,2 表示白子。這個類對外提供一個落子方法 drop,接收參數落子方和落子坐標,如果落子后勝利,則返回勝利者,否則返回 none。

chessman = namedtuple('chessman', 'name value color')

point = namedtuple('point', 'x y')

black_chessman = chessman('黑子', 1, (45, 45, 45))

white_chessman = chessman('白子', 2, (219, 219, 219))

offset = [(1, 0), (0, 1), (1, 1), (1, -1)]

class checkerboard:

def __init__(self, line_points):

self._line_points = line_points

self._checkerboard = [[0] * line_points for _ in range(line_points)]

def _get_checkerboard(self):

return self._checkerboard

checkerboard = property(_get_checkerboard)

# 判斷是否可落子

def can_drop(self, point):

return self._checkerboard[point.y][point.x] == 0

def drop(self, chessman, point):

"""

落子

:param chessman: 黑子/白子

:param point:落子位置

:return:若該子落下之后即可獲勝,則返回獲勝方,否則返回 none

"""

print(f'{chessman.name} ({point.x}, {point.y})')

self._checkerboard[point.y][point.x] = chessman.value

if self._win(point):

print(f'{chessman.name}獲勝')

return chessman

# 判斷是否贏了

def _win(self, point):

cur_value = self._checkerboard[point.y][point.x]

for os in offset:

if self._get_count_on_direction(point, cur_value, os[0], os[1]):

return true

def _get_count_on_direction(self, point, value, x_offset, y_offset):

count = 1

for step in range(1, 5):

x = point.x + step * x_offset

y = point.y + step * y_offset

if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:

count += 1

else:

break

for step in range(1, 5):

x = point.x - step * x_offset

y = point.y - step * y_offset

if 0 <= x < self._line_points and 0 <= y < self._line_points and self._checkerboard[y][x] == value:

count += 1

else:

break

return count >= 5

這里我定義了一個偏移量,我們一共要計算橫豎撇捺 4 條線,任意一條線出現 5 連就算獲勝。計算方法實際上是一樣的,只是方向不同,所以定義一個偏移量數組,不同的偏移量表示不同的方向,這樣就可以利用循環來實現了,節省了很多代碼。

電腦落子

這就是全篇的重頭戲了,要怎么教電腦下五子棋。

首先聲明,我用的是相對傳統的方式,不是深度學習。

五子棋就是要實現 5 連,所以,一開始,我的想法是:將所有連線保存在一個數組中,落子的時候選擇最長的連線落子。但這樣有個問題解決不掉,如何讓電腦識別“三三”呢?

后來網上看到篇文章,使用的方法是:遍歷棋盤上的空位,計算每一個位置其橫豎撇捺 8 個方向上是否有己方的子,有一個就加 10 分,最后選得分最高的位置落子。

這樣不太嚴謹,寫出來的電腦估計水平很菜,但是這個思路卻是對的,落子就是要找到最值得的地方,那么我們干脆對每一個可落子的地方來做一個評估,選出最優解。

這里我們需要了解一下五子棋的幾種基本棋形:連五,活四,沖四,活三,眠三,活二,眠二。

連五

顧名思義,五顆同色棋子連在一起,贏了。

活四

四顆同色棋子連在一起,并且左右兩邊都沒有對方棋子阻擋,有兩個連五點。

沖四

四顆同色棋子連在一起,并且一邊有對方棋子阻擋,或者四顆棋子不是連的,當中有個空擋,這時只有一個連五點。

活三、跳活三

活三:三顆同色棋子連在一起。

總結

以上是生活随笔為你收集整理的python代码300行程序_Python:游戏:300行代码实现俄罗斯方块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久久久久久久久久久久久久久久 | 哪里可以免费看av | 欧美日韩卡一卡二 | 国产叼嘿视频在线观看 | 免费黄色激情视频 | 国产精品久久无码 | 天天做天天射 | 波多野结衣一区二区三区在线 | www.久草.com| 风流少妇 | 午夜两性视频 | 人人爽人人 | 亚洲ⅴ国产v天堂a无码二区 | 欧美女人一区二区 | 一级片视频免费观看 | 800av免费在线观看 | 日韩精品国产精品 | 亚洲区一区二区 | 九九热免费在线 | 六月丁香婷婷激情 | 免费香蕉视频 | 精品一区电影 | 97操操 | 亚洲欧美国产视频 | 免费在线观看你懂的 | 成人在线视频一区二区 | 日本免费在线观看视频 | 好吊色欧美一区二区三区视频 | 98色| 69xav| 日韩一级视频在线观看 | 97精品人人妻人人 | 欧美无砖区 | 永久免费看片在线播放 | 精品日韩一区二区三区四区 | 免费a大片 | 欧美激情国产日韩精品一区18 | 亚洲一级中文字幕 | 最新免费av网站 | 专业操老外 | 奇米影视第四色7777 | 亚洲精品成人 | 特级淫片裸体免费看 | 含羞草一区二区 | 亚洲综合第一 | 伊人国产视频 | 午夜精品网站 | 我们的2018在线观看免费高清 | 亚州黄色 | 久久精品店 | 我把护士日出水了视频90分钟 | 亚洲成人精品久久 | 波多野结衣一区二区在线 | 国产国语性生话播放 | 69免费视频| 日日弄天天弄美女bbbb | 日本理论中文字幕 | 日韩中文字幕在线观看视频 | 波多野结衣高清电影 | avtt亚洲| 96视频在线观看 | 久久五月天综合 | 欧美韩国日本一区 | 中日韩av电影 | 欧美a网站| 天天摸天天做天天爽水多 | 一级黄色美女 | 欧美又粗又深又猛又爽啪啪九色 | 毛片毛片毛片毛片毛片毛片毛片毛片毛片 | 91网在线播放 | 麻豆精品一区二区 | 精品一区二区三区在线观看视频 | 波多野结衣av中文字幕 | 亚洲免费视频一区 | 亚洲精品一区三区三区在线观看 | 老汉av网站| 狠狠鲁狠狠干 | 日韩免费黄色片 | 国产毛片毛片毛片 | 精品国产一区二区三区四区阿崩 | 日韩一二三四区 | 亚州国产精品 | 亚洲图片 自拍偷拍 | 国产福利视频在线 | 一本色道久久综合熟妇 | 亚洲永久精品ww.7491进入 | 国产精品入口日韩视频大尺度 | 国产视频一区二区 | 精品久久久中文字幕 | 国产成人无码一区二区三区在线 | 91呦呦 | av无线看 | 国产调教 | 日韩女优在线播放 | 成人免费在线播放视频 | 日本欧美一区二区三区不卡视频 | 亚洲欧美另类自拍 | 亚洲天堂网在线视频 | www.日韩高清 |