基于ActionScript3.0的单机版双人对战贪食蛇

基于ActionScript3.0的单机版双人对战贪食蛇,规则如下:

  1. 左侧玩家用ASDW控制方向,右侧玩家用方向键控制方向
  2. 吃到食物后,自身长度加一
  3. 撞到对方的身子,自己死;撞到对方的尾巴,对方死;撞到头忽略
  4. 撞到自己忽略
  5. 撞到墙,自己死

游戏源码地址: https://github.com/codinglonglong/FightingSnake

游戏下载地址: https://github.com/codinglonglong/FightingSnake/raw/master/%E8%B4%AA%E9%A3%9F%E8%9B%87%E5%AF%B9%E6%88%98.zip

基于mqtt的json格式消息推送

基于文章 https://codinglonglong.github.io/posts/ji-yu-mqttde-xiao-xi-tui-song/ ,我们进一步改进测试程序。

t2上

编写并启动消息接收端。

import paho.mqtt.client as mqtt
import json

def on_connect(client, userdata, flags, rc):
    client.subscribe("test")

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))
    message = json.loads(msg.payload.decode("utf-8"))
    print(message["1"])
    print(message["2"])

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
try:
    client.connect("172.16.0.111", port=1883)
    client.loop_forever()
except KeyboardInterrupt:
    client.disconnect()

t3上

编写并启动消息发送端。

import paho.mqtt.client as mqtt
import time
import json
client = mqtt.Client()
client.connect("172.16.0.111")
topic = "test"
payload = {1:"hi", 2:"hihi"}
for i in range(10):
    client.publish(topic, json.dumps(payload))
    time.sleep(1)

基于mqtt的消息推送

t1上

1、安装mosquitto服务器。

>> apt install wget
>> wget http://mosquitto.org/files/source/mosquitto-1.4.11.tar.gz
>> tar zxvf mosquitto-1.4.11.tar.gz
>> cd mosquitto-1.4.11
>> apt install libc-ares-dev uuid-dev libwebsockets-dev libssl-dev
>> make binary
>> make install
>> vi /etc/profile
export PATH=/usr/local/bin:$PATH
>> source /etc/profile
>> useradd -m mosquitto

2、启动mosquitto服务。

>> mosquitto

t2上

1、安装mosquitto的Python客户端。

>> pip3 install paho-mqtt

2、编写并启动消息接收端。

import paho.mqtt.client as mqtt
import json

def on_connect(client, userdata, flags, rc):
    client.subscribe("test")

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
try:
    client.connect("172.16.0.111", port=1883)
    client.loop_forever()
except KeyboardInterrupt:
    client.disconnect()

t3上

1、安装mosquitto的Python客户端。

>> pip3 install paho-mqtt

2、编写并启动消息发送端。

1
2
3
4
5
import paho.mqtt.publish as publish
host = "172.16.0.111"
topic = "test"
payload = "hi"
publish.single(topic, payload, qos=1, hostname=host)

还可以这样写

1
2
3
4
5
6
7
8
9
import paho.mqtt.client as mqtt
import time
client = mqtt.Client()
client.connect("172.16.0.111")
topic = "test"
payload = "hi"
for i in range(10):
    client.publish(topic, payload)
    time.sleep(1)

注意

要先启动消息接收端,再启动消息发送端。如果分别在两个主机上启动消息接收端和消息发送端,那么就可以实现即时通讯了。

安装Deepin和RemixOS双系统

RemixOS是PC版的Android,可以运行一部分Android应用。

RemixOS下载地址: https://sourceforge.net/projects/remix-os/

1、在Windows上,下载RemixOS安装包,解压缩,用Remix_OS_for_PC_Installation_Tool制作RemixOS安装U盘。

2、将安装U盘插入Deepin所在的笔记本(基于Ubuntu的发行版同理)。

3、启动Deepin,在根目录下创建文件夹Remix(这里需要管理员权限)。

4、在Remix中创建目录DATA(用来存放数据)。

5、把U盘上的内容全部拷贝到Remix目录中。

6、修改引导文件。

>> sudo gedit /etc/grub.d/40_custom
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'Remix OS For PC' --class android-x86{
    set root=(hd0,3)
    linux /Remix/kernel root=/dev/sda3/Remix androidboot.hardware=remix_cn_x86_64 androidboot.selinux=permissive quiet DATA=/Remix/DATA SRC=/Remix nomodeset
    initrd /Remix/initrd.img
}
>> sudo grub-install 40_custom
>> sudo update-grub
>> sudo reboot

经过反复试验,RemixOS总是卡在开机的Logo画面上,两年前,我在同一个笔记本上安装RemixOS时是正常进入系统的。这次放了两个小时都没有进去,也没有任何提示信息……目前估计是系统镜像的问题,网上提到同样问题的人也很多……当前系统的版本是B2016112101。

如果有哪位大神解决了这个问题,可以顺便告诉我一下,非常感谢。

联系方式在“联系我” https://codinglonglong.github.io/posts/lian-xi-wo/ 页面中。

注意

1、(hd0,3)指的是第0号硬盘的第3号分区。

2、引导文件不要轻易加空格。

联系我

我是谁不重要,重要的是我活过……

我是 写程序的龙龙 ,邮箱地址: codinglonglong@126.com

喜欢编程,做过网站,用过爬虫,研究过大数据,在个性化推荐上发过Paper……

喜欢外语,很少交流,做开发不能不看英文,看动漫不能不学日语……

喜欢音乐,学习钢琴,一只手很流畅,两只手正在练……

喜欢围棋,入门十年,现在依然很菜……弈城ID:myl1991

编程教会我创造,外语教会我积累,音乐教会我放松,围棋教会我从容 ……

喜欢的事情还很多, 就像孩子一样,充满着对这个世界的未知和好奇,并且很享受这种状态,因为总可以找到下一步的路 ……

ZeroMQ的三种基本通信模型

安装ZeroMQ的Python支持

apt install python3-pip
pip3 install pip --upgrade -i http://pypi.doubanio.com/simple/
pip3 install pyzmq -i http://pypi.doubanio.com/simple/

第一种模型:“请求-回复”模型

服务端:

import zmq
import time
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
    message = socket.recv_string()
    print("receive request: ", message)
    time.sleep(1)
    reply = "World"
    socket.send_string(reply)
    print("send reply: ", reply)

客户端:

1
2
3
4
5
6
7
8
9
import zmq
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://172.16.0.111:5555")
for request in range(1, 10):
    print("send request: ", request)
    socket.send_string("Hello")
    message = socket.recv_string()
    print("receive reply: ",  message)

第二种模型:“发布-订阅”模型

服务端:

import zmq
import time
from zmq.utils.strtypes import asbytes
context = zmq.Context()
socket = context.socket(zmq.PUB)
socket.bind("tcp://*:5000")
topics = [b"a", b"b"]
while True:
    msg = "Hello, a"
    socket.send_multipart([topics[0], asbytes(msg)])
    time.sleep(0.1)
    msg = "Hello, b"
    socket.send_multipart([topics[1], asbytes(msg)])
    time.sleep(0.5)

客户端:

import time
import zmq
context = zmq.Context()
socket = context.socket(zmq.SUB)
socket.connect("tcp://172.16.0.111:5000")
socket.setsockopt_string(zmq.SUBSCRIBE, "a")
while True:
    topic, msg = socket.recv_multipart()
    print(topic)
    print(msg)

第三种模型:“平行管道”模型

服务端:

import zmq
import random
import time
context = zmq.Context()
sender = context.socket(zmq.PUSH)
sender.bind("tcp://*:5000")
sink = context.socket(zmq.PUSH)
sink.connect("tcp://172.16.0.113:5001")
print("Press Any Key to Start")
_ = input()
sink.send_string("0")
totalsec = 0
for task in range(100):
    workload = random.randint(1, 100)
    totalsec = totalsec + workload
    sender.send_string(str(workload))
print("Total Expected Time: " + str(totalsec) + "s.")

执行端:

import sys
import time
import zmq
context = zmq.Context()
receiver = context.socket(zmq.PULL)
receiver.connect("tcp://172.16.0.111:5000")
sender = context.socket(zmq.PUSH)
sender.connect("tcp://172.16.0.113:5001")
while True:
    s = receiver.recv_string()
    time.sleep(int(s)*0.001)
    sender.send_string("")

汇总端:

import sys
import time
import zmq
context = zmq.Context()
receiver = context.socket(zmq.PULL)
receiver.bind("tcp://*:5001")
s = receiver.recv_string()
print(s)
start = time.time()
for task in range(100):
    s = receiver.recv_string()
end = time.time()
print("Total Elapsed Time: " + str((end-start)*1000) + "s.")

运行结果:

https://github.com/longlongpicture/myblogpicture/raw/master/zeromq_worker.png

总结

  1. “请求-回复”模型就好比两个人聊天。
  2. “发布-订阅”模型就好比听FM。
  3. “平行管道”模型就好比MapReduce。