這個丹麥小哥的項目火了!他用Python寫了個遊戲機

2021-01-19 腳本之家

開源最前線(ID:OpenSourceTop) 猿妹編譯

連結:https://www.reddit.com/r/Python/comments/g484d4/today_im_releasing_pyboy_v100_a_game_boy_emulator/、https://github.com/Baekalfen/PyBoy/


最近有一個叫PyBoy的開源項目火了,原因是它使用了Python 2.7重新將那些在GameBoy上的上古遊戲的整個模擬器實現了出來。



利用現代技術重新實現上古遊戲一直是一件相當有意思的事情,大家都知道,Game Boy是任天堂公司在1989年發售的第一代可攜式遊戲機,對於一群80/90後來說,Gameboy是他們童年裡不可或缺的一部分,有的人可能忘記了,但是提起《口袋妖怪》,很多人應該就能想起來了。




除此之外,PyBoy支持通過API編寫腳本,還添加了類型定義,使其可以使用Cython編譯軟體,從而獲得與用C和C++編寫的模擬器相媲美的性能。



目前,PyBoy在Github上標星2.6K,累計Fork有 239 個(Github地址:https://github.com/Baekalfen/PyBoy/wiki/Scripts,-AI-and-Bots)PyBoy 被設計成通過 Python 訪問,因此支持並鼓勵人們做實驗研究,對機器人和AI感興趣的人都可以嘗試一下。創建者正在構建特定於遊戲的包裝器,目前,這些包裝器可讓程式設計師與俄羅斯方塊和超級瑪麗進行交互,而不需要對 Game Boy 有深入的了解。具體你可以參考該文檔:https://docs.pyboy.dk。說到這裡,不得不提的是,創建這個項目的是一個丹麥小哥,早在2015年,PyBoy就已經是一個大學項目,目前,創建者還想學習和嘗試更多奇特的功能,根據大學項目的研究,他們向模擬器添加了倒回功能,也就是說,你可以在任何遊戲中倒回時間。PyBoy可作為Python中的對象加載。這意味著它可以從另一個腳本初始化,並可以由該腳本控制和探測。看一下gamewrapper_tetris.py與遊戲互動的原始「機器人」。所有外部組件都可以在PyBoy文檔中找到,以下是從屏幕讀取數據的簡短演示。該代碼也可以在gamewrapper_mario.py以下位置找到:


import os
import sys

from pyboy import PyBoy, WindowEvent

# Makes us able to import PyBoy from the directory below
file_path = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0, file_path + "/..")

# Check if the ROM is given through argv
if len(sys.argv) > 1:
    filename = sys.argv[1]
else:
    print("Usage: python mario_boiler_plate.py [ROM file]")
    exit(1)

quiet = "--quiet" in sys.argv
pyboy = PyBoy(filename, window_type="headless" if quiet else "SDL2", window_scale=3, debug=not quiet, game_wrapper=True)
pyboy.set_emulation_speed(0)
assert pyboy.cartridge_title() == "SUPER MARIOLAN"

mario = pyboy.game_wrapper()
mario.start_game()

assert mario.score == 0
assert mario.lives_left == 2
assert mario.time_left == 400
assert mario.world == (1, 1)
assert mario.fitness == 0 # A built-in fitness score for AI development
last_fitness = 0

print(mario)

pyboy.send_input(WindowEvent.PRESS_ARROW_RIGHT)
for _ in range(1000):
    assert mario.fitness >= last_fitness
    last_fitness = mario.fitness

    pyboy.tick()
    if mario.lives_left == 1:
        assert last_fitness == 27700
        assert mario.fitness == 17700 # Loosing a live, means 10.000 points in this fitness scoring
        print(mario)
        break
else:
    print("Mario didn't die?")
    exit(2)

mario.reset_game()
assert mario.lives_left == 2

pyboy.stop()


如果在加載了Super Mario Land ROM的情況下運行上述代碼,則將在下面獲得類似圖片和終端的列印輸出。請注意,Mario的形狀顯示為索引0、1、16和17。



Super Mario Land: World 1-1
Coins: 0
lives_left: 2
Score: 0
Time left: 400
Level progress: 251
Fitness: 0
Sprites on screen:
Sprite [3]: Position: (35, 112), Shape: (8, 8), Tiles: (Tile: 0), On screen: True
Sprite [4]: Position: (43, 112), Shape: (8, 8), Tiles: (Tile: 1), On screen: True
Sprite [5]: Position: (35, 120), Shape: (8, 8), Tiles: (Tile: 16), On screen: True
Sprite [6]: Position: (43, 120), Shape: (8, 8), Tiles: (Tile: 17), On screen: True
Tiles on screen:
     0   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19
____________________________________________________________________________________
0  | 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339 339
1  | 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320 320
2  | 300 300 300 300 300 300 300 300 300 300 300 300 321 322 321 322 323 300 300 300
3  | 300 300 300 300 300 300 300 300 300 300 300 324 325 326 325 326 327 300 300 300
4  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
5  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
6  | 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300 300
7  | 300 300 300 300 300 300 300 300 310 350 300 300 300 300 300 300 300 300 300 300
8  | 300 300 300 300 300 300 300 310 300 300 350 300 300 300 300 300 300 300 300 300
9  | 300 300 300 300 300 129 310 300 300 300 300 350 300 300 300 300 300 300 300 300
10 | 300 300 300 300 300 310 300 300 300 300 300 300 350 300 300 300 300 300 300 300
11 | 300 300 310 350 310 300 300 300 300 306 307 300 300 350 300 300 300 300 300 300
12 | 300 368 369 300 0   1   300 306 307 305 300 300 300 300 350 300 300 300 300 300
13 | 310 370 371 300 16  17  300 305 300 305 300 300 300 300 300 350 300 300 300 300
14 | 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352 352
15 | 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353 353


👇🏻👇🏻👇🏻


 

相關焦點

  • 用Python寫Gameboy模擬器,還能訓練AI模型:丹麥小哥大學項目火了
    這款遊戲機距離首次發布已過去了 30 年時間,不過人們對於它的熱情卻絲毫不減。昨天,一款利用 Python 編寫的 Gameboy 模擬器在社交網絡上吸引了人們的廣泛關注。爺的青春回來了?作者在 Reddit 上發出的帖子迅速獲得了上千點讚。
  • python初學者必看的學習路線 Python是近幾年比較火的程式語言
    Python是近幾年比較火的程式語言之一,因為人工智慧的火爆,讓很多人都想從事python開發。很多零基礎學員在學習python的時候都會走一些彎路,下面小編就為大家分享python學習路線圖,幫助零基礎學員在學習的時候少走彎路。 很多人都在問Python學習步驟應該如何安排?
  • 零基礎快速入門python教程,結合新手練習的5大項目
    I am repeatingI am repeatingI am repeating>>>適合Python初學者的5大項目在練手項目的選擇上,還存在疑問?不知道要從哪種項目先下手?首先有兩點建議:最好不要寫太應用的程序練手,要思考什麼更像是知識,老只會寫寫爬蟲是無用的,但是完全不寫也不行。對於練手的程序,要注意簡化和抽象,但是如果簡化不得當的話,很容易看幾篇教程就被懶得下手了。接下來就給大家介紹幾種適合新手的練手項目。
  • 讓騰訊大佬告訴你,寫python到底用什麼IDE合適
    比如說,你喜歡使用Notebook,這不能說有大佬推薦你使用pycharm,你就馬上放棄Notebook,或者今天突然 vs code這個IDE火起來來,你就立馬轉戰vscode剝開IDE的功能說,你真的喜歡用嗎,你用的習慣嗎,每個IDE都有自身的優點,使用什麼IDE關鍵在自己,即便是你覺得自己使用的IDE
  • GitHub 上適合新手的開源項目(Python 篇)
    >Go 篇Java 篇JavaScript 篇本期是 Python 篇,下面我將從 HG 推薦過的 197 個 Python 開源項目中,精心篩選出 7 個最適合 Python 新手學習和把玩的開源項目
  • 如何用 Python 寫一個安卓 APP ?
    寫的居多,但是肯定也是一個很偷懶的選擇,而且實在不想學習 Java,再者,就編程而言已經會的就 Python與Golang(註:Python,Golang水平都一般),那麼久Google了一下Python 寫安卓的 APP 的可能性,還真行。
  • 如何使用Visual Studio工具創建python項目
    python一般情況下,我們使用Visual Studio進行C#、C++和C語言項目進行開發。隨著工具不斷完善,現在也可以進行python項目開發了。那麼,如何在Visual Studio 2019工具上創建python項目?操作步驟:1、通過快捷方式或電腦開始菜單,雙擊打開Visual Studio 2019工具
  • 教你學習:Python-100-Days-01
    教你學習:Python-100-Days-01 本項目是參考項目內容,進行個人理解,和原有項目有出入,如想了解詳情,請自行百度去搜索項目為什麼用Python?python是腳本語言,學習簡單。包含很多環境的數學包,可以簡化我們的開發,方便我們數學計算。未來是數據的時代,java和python是必須要會的語言,是人工智慧和大數據的基礎。
  • 微軟最強 Python 自動化工具開源了!不用寫一行代碼!
    前言 最近,微軟開源了一款非常強大的 Python 自動化依賴庫:playwright-python 它支持主流的瀏覽器,包含:Chrome、Firefox、Safari、Microsoft Edge 等,同時支持以無頭模式、有頭模式運行 playwright-python 提供了同步、異步的
  • python爬蟲100個入門項目
    >8一鍵生成微信個人專屬數據報告(了解你的微信社交歷史)9一鍵生成QQ個人歷史報告10微信公眾號文章爬蟲11新浪微博爬蟲分享(一天可抓取 1300 萬條數據)12新浪微博分布式爬蟲分享13python爬蟲的時候對Json數據的解析66秒爬,python爬蟲中的多線程,多進程,協程67爬取下來的數據怎麼保存?
  • 從內外兩個角度解析Python為什麼這麼火
    電腦程式設計語言,已經如今的主流程式語言之一,也是近幾年最為火熱的計算機程式語言,而Python是1991年就發布了的,並不是一門新出現的程式語言,為什麼最近卻越來越火呢和教育行業的發展有很大關係,2018年開始python已經加入到全國計算機等級二級考試的大家庭,有部分高校已經把Python作為校內計算機語言的必修或選修課程之一!另外很多人想憑藉python語言進行職業轉行,從而催熱python職業教育培訓的發展,從而反過來帶火了python。
  • Python和Java語言,新手應該先學哪個
    我先表明下自己的觀點,java和python這兩門語言,都要學習,但是,要有先後順序。強烈推薦先學習java。java是個嚴謹、高效的程式語言,出道20餘年,在編程兵器排行榜上,常年佔據前三。至於python語言,現在火得不行,全宇宙都知道的程式語言,吸引了不少人的眼球,各大培訓機構的標語都是大數據+python+人工智慧了,這些趁熱點的標語你看看就行了,別當真,當真你就輸了。python是個腳本語言,極其靈活,極其好學,既然這麼好,為啥不學呢?其實在編程界裡,語言的靈活,其潛臺詞就是失控。
  • Python入門項目,從不會編程到完成這個小遊戲,也就兩天時間
    還在啃書本學python嗎?為什麼不試試用有趣的小遊戲來學編程?自己開發的遊戲,既能活學活用python,又能找回學習的自信。Python版本:3.6.4需要的相應模塊:cocos2d模塊;pyaudio模塊;包括其他的python自帶模塊
  • 詳解學習python的十一個步驟
    技巧2:寫出來當你作為一個新的程式設計師在你的旅程中進步時,你可能會懷疑你是否應該做筆記。是的,你應該!事實上,研究表明,用手記筆記最有利於長期保持。這對於那些致力於成為全職開發者的人來說是特別有益的,因為許多採訪將涉及在白板上編寫代碼。一旦開始處理小項目和程序,手工編寫也可以幫助您在移動到計算機之前規劃代碼。
  • 0基礎入門Python學習步驟如何安排?
    所以既然你決定了要學習python,那麼就需要先下一個決心,至少決定要做為自己的主力語言。 python是全能語言,社區龐大,有太多的庫和框架。你只需要找到合適的工具來實現想法,省去了造輪子的精力。 coder可以寫儘可能少的代碼來實現同等的功能。「人生苦短,我用python」是至理名言。
  • Python編程:開發工具(IDE)大匯總(附官方下載)
    最近有多位讀者留言,諮詢更便捷、高效的python編程開發工具(IDE),本文就給大家介紹四款業內常用的python軟體開發工具,並簡單介紹下每款軟體的特點,便於讀者按需選擇合適的學習軟體!二、VS Code IDE簡介—四星推薦VS Code全寫為Visual Studio Code,是微軟開發的現代Web和雲應用的跨平臺原始碼編輯器,在安裝相應的擴展包後可具備強大的編程開發能力!VS Code運行界面:
  • 這8個Python練手小項目,輕鬆易學
    Kaggle 實戰之波士頓房價預測友情提示:初學者需要先學習關於數據清理的基本知識,再來接觸本項目喔。這個項目將使用Dean de cock在kaggle上發布的波士頓住房數據來完成回歸預測。2.用邏輯回歸實現分類這個項目來自Python-Bayesian分析異步社區。主要說明了邏輯回歸的基本概念,然後由線性回歸擴展到邏輯回歸的反向連結函數的概念,利用邏輯回歸對虹膜問題進行分類。4. NumPy 百題大衝關Numpy是Python語言的擴展庫。
  • 開課吧:Python是什麼意思?為什麼有那麼多人學Python?
    python非常容易上手,而且能幹很多事情,WEB開發,機器學習人工智慧,數據分析,量化投資,爬蟲等,基本可以應用到各行各業,而且大家都在做基於PYTHON的庫,使得PYTHON語言變成一門直接拿來就能用的語言,更像一種工具了,比如機器學習,可能理論很複雜,但是實際在PYTHON中僅僅幾行代碼就能實現,不用花太多時間用在碼代碼上面,python 現在是越來越火
  • 今天,丹麥丹佛斯集團第8個項目籤約落戶海鹽!
    今天,丹麥丹佛斯集團偉肯(中國)電氣傳動有限公司籤約落戶海鹽縣武原街道。縣委書記陳玲芳,丹佛斯中國區總裁徐陽等參加籤約儀式。 一起來了解項目吧! 偉肯(中國)電氣傳動有限公司主要從事變頻器研發、設計與製造,2021年將實現銷售3億元。
  • python 爬蟲學習路線:從入門到進階
    本文依舊需要有一些python基礎,至少要求掌握python語法。前置條件:python開發環境首先,學習python爬蟲,需要會:自己安裝python,python庫以及自己的編輯器。這個前置條件呢,在涼拌以前的文章寫過,這裡涼拌就不再贅述,不會的同學可以點下面的連結看一看。奉上連結: