下面我将为你设计一个"吃洋葱小游戏"的Python实现方案,使用Pygame库开发。这个游戏模拟吃洋葱的过程,玩家需要收集不同种类的洋葱以获得高分,同时避免吃到辣椒。
🧅 吃洋葱小游戏 - Python实现方案
🎮 1. 游戏设计概念
- 游戏目标:玩家控制角色吃掉尽可能多的洋葱获得高分
- 核心机制:
- 洋葱从屏幕上方随机下落
- 玩家左右移动角色接住洋葱
- 不同洋葱有不同分值(普通洋葱+10,红洋葱+20,紫洋葱+50)
- 辣椒会扣减生命值
- 生命值耗尽游戏结束
先安装洋葱
打开链接--->高级
配置 浏览器如何连接互联网。
配置成127.0.0.1 7890 socket5(配置 洋葱浏览器如何连接互联网)
D:\Tor Browser\Browser\TorBrowser\Data\Tor里面有一个torrc文件然后配置一下
# 基本配置
DataDirectory D:\Tor Browser\Browser\TorBrowser\Data\Tor
GeoIPFile D:\Tor Browser\Browser\TorBrowser\Data\Tor\geoip
GeoIPv6File D:\Tor Browser\Browser\TorBrowser\Data\Tor\geoip6
# 控制端口配置
ControlPort 9051
CookieAuthentication 1
# 启用网络
DisableNetwork 0
Flask代码:
from flask import Flask, render_template_string
from stem.control import Controller
import os
from threading import Thread
import logging
import time
import socket
import subprocess
app = Flask(__name__)
# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
# HTML模板
HTML_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
<title>Tor Hidden Service</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
background-color: #f0f0f0;
}
.container {
background-color: white;
padding: 20px;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
h1 {
color: #333;
}
</style>
</head>
<body>
<div class="container">
<h1>欢迎访问服务</h1>
<p>这是一个通过服务网站。</p>
<p>当前时间: {{ current_time }}</p>
</div>
</body>
</html>
"""
@app.route('/')
def index():
from datetime import datetime
return render_template_string(HTML_TEMPLATE, current_time=datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
def check_tor_running():
"""检查Tor是否正在运行"""
try:
# 尝试连接到Tor的SOCKS端口(9150)来检查Tor是否运行
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
result = sock.connect_ex(('127.0.0.1', 9150))
sock.close()
return result == 0
except:
return False
def start_tor_browser():
"""启动Tor Browser"""
try:
tor_path = "D:\\Tor Browser\\Browser\\TorBrowser\\Tor\\tor.exe"
if os.path.exists(tor_path):
subprocess.Popen([tor_path])
logger.info("正在启动...")
time.sleep(10) # 等待启动
return True
except Exception as e:
logger.error(f"启动失败: {str(e)}")
return False
def start_hidden_service():
max_retries = 3
retry_count = 0
while retry_count < max_retries:
try:
# 检查Tor是否运行
if not check_tor_running():
logger.error("未运行")
if not start_tor_browser():
logger.error("无法启动")
return
logger.info("正在尝试连接到控制端口...")
# 连接到Tor控制端口
controller = Controller.from_port(port=9051)
# 尝试不同的认证方法
try:
controller.authenticate()
except Exception as auth_err:
logger.error(f"认证失败: {str(auth_err)}")
# 尝试使用cookie认证
cookie_path = "D:\\Tor Browser\\Browser\\TorBrowser\\Data\\Tor\\control_auth_cookie"
if os.path.exists(cookie_path):
with open(cookie_path, 'rb') as f:
cookie_data = f.read()
controller.authenticate(cookie_data)
else:
raise Exception("无法找到认证cookie文件")
logger.info("成功连接到Tor控制端口")
# 获取当前目录并创建隐藏服务目录
hidden_service_dir = os.path.join(os.getcwd(), 'hidden_service')
os.makedirs(hidden_service_dir, exist_ok=True)
# 使用单独的命令添加隐藏服务配置
response = controller.msg('SETCONF HiddenServiceDir="{0}" HiddenServicePort="80 127.0.0.1:5000"'.format(
hidden_service_dir.replace('\\', '/')))
if response.is_ok():
logger.info("成功设置隐藏服务")
# 给Tor一些时间来生成密钥和hostname文件
logger.info("等待生成密钥和地址...")
# 等待20秒,确保hostname文件被创建
max_wait = 20
hostname_file = os.path.join(hidden_service_dir, 'hostname')
for i in range(max_wait):
if os.path.exists(hostname_file):
break
time.sleep(1)
logger.info(f"等待hostname文件生成...({i+1}/{max_wait}秒)")
# 从文件读取onion地址
if os.path.exists(hostname_file):
try:
with open(hostname_file, 'r') as f:
onion_address = f.read().strip()
logger.info(f"隐藏服务地址: {onion_address}")
except Exception as e:
logger.error(f"读取hostname文件失败: {str(e)}")
else:
logger.warning("未找到hostname文件,请稍后手动查看hidden_service目录")
logger.info(f"隐藏服务目录: {hidden_service_dir}")
logger.info(f"网站可通过Tor Browser访问: {onion_address}")
return # 成功后退出
else:
raise Exception(f"设置隐藏服务失败: {response.str()}")
except Exception as e:
logger.error(f"尝试 {retry_count + 1}/{max_retries} 失败: {str(e)}")
# 检查具体错误类型
if isinstance(e, socket.error):
logger.error("网络错误: 请检查是否正在运行,以及端口9051是否可访问")
retry_count += 1
if retry_count < max_retries:
logger.info("等待5秒后重试...")
time.sleep(5)
else:
logger.error("请确保:")
logger.error("1. 已经启动")
logger.error("2. torrc 文件已正确配置")
logger.error("3. 控制端口 9051 可访问")
logger.error("4. 检查端口占用情况:")
try:
subprocess.run(["netstat", "-ano", "|", "findstr", "9051"], shell=True)
except:
pass
# 最后一次尝试从文件读取
hostname_file = os.path.join(os.getcwd(), 'hidden_service', 'hostname')
if os.path.exists(hostname_file):
try:
with open(hostname_file, 'r') as f:
onion_address = f.read().strip()
logger.info(f"从文件获取的隐藏服务地址: {onion_address}")
logger.info(f"隐藏服务已创建,但连接过程中出现错误")
logger.info(f"你可以通过访问:{onion_address}")
except:
pass
if __name__ == '__main__':
# 在后台线程中启动隐藏服务
hidden_service_thread = Thread(target=start_hidden_service)
hidden_service_thread.daemon = True
hidden_service_thread.start()
# 启动Flask应用
app.run(host='127.0.0.1', port=5000)
123