鱼C论坛

 找回密码
 立即注册
查看: 1897|回复: 14

[已解决]请求大神帮我写一个滚动图片抽奖系统

[复制链接]
发表于 2018-3-6 22:44:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
紧急需求一个程序:

1.点击开始键,空白窗口内开始滚动显示图片,每0.5秒显示1张,0.5秒后又显示下一张。
2.点击停止键,窗口停止滚动显示图片,最后一张图片停留在窗口内。

附加需求:可不可以每次都抽到一张图片(类似后门)。

求大神帮忙,处理图片的模块不太会,又急用,谢谢帮助!
最佳答案
2018-3-7 10:42:24
本帖最后由 LargeCat 于 2018-3-7 11:39 编辑

你这个要做的,要花点时间做美工和设计,需要时间的。
我这里有个自己写的,去年准备用的没用,懒的弄,你可以参考一下。最好自己完善一下。

外观逻辑:
每个参与抽奖的员工提交一个自己的图片,
自己给这些图片编号1,2,3,4,,,,,
投影到大屏幕上,不停的随机位置随机出现, 闪动,(python运行了一下,效果闪的也很快,没问题,100多个人的情况下)

主持人准备一个手机当作遥控器,安装Qpython或者任何东西,这里是qpython,用于给主机电脑发送抽奖指令。抽奖嘉宾再手机遥控上按一下抽奖,大屏幕上随机给一个图片并把他放大放到一边,显示他中奖了。
按一次,抽一个人。


程序:
用了cocos2d, 手机和电脑通讯用socket,
美工需要再完善,需要再加个音效,抽奖键按下的时候出一个音效,还有背景音乐。

仅仅只是给你参考,你必须会python, 自己再改改。

只能做到这里了。
只是一个实现的参考。

今年年底的年会可能会做一个给他们用用,到时候再完善了,懒癌很严重。。。。。


电脑主机程序:
  1. import cocos
  2. import pyglet
  3. import random
  4. from cocos.actions import *
  5. import threading

  6. import socketserver
  7. from socketserver import StreamRequestHandler as SRH
  8. from time import ctime

  9. HOST=''
  10. PORT=9999
  11. addr=(HOST, PORT)
  12. signal='x'

  13. class Star(cocos.sprite.Sprite):
  14.     def __init__(self, image):
  15.         super(Star, self).__init__(image)
  16.         self.scale=random.randint(1, 8)/10
  17.         t1=random.randint(1, 10)/10
  18.         t2=random.randint(1, 10)/10
  19.         t3=random.randint(1, 10)/10
  20.         angel=random.randint(90, 180)
  21.         move=FadeIn(t1)+Rotate(angel, t2)+FadeOut(t3)
  22.         self.do(Repeat(move))

  23. class singlePic(cocos.sprite.Sprite):
  24.     def __init__(self, image):
  25.         super(singlePic, self).__init__(image)
  26.         self.scale=1
  27.         
  28. class Servers(SRH):
  29.     def handle(self):
  30.         print('got connection from ',self.client_address)
  31.         while True:
  32.             global signal
  33.             signal1 = self.request.recv(1024).decode('utf-8').strip()
  34.             if signal1:
  35.                 print("RECV from:", self.client_address[0], ctime())
  36.                 signal=signal1
  37.                 break
  38.             else:
  39.                 print('continue to get data...')

  40. class Lucky(cocos.layer.Layer):
  41.     is_event_handler=True
  42.     def __init__(self):
  43.         super(Lucky, self).__init__()
  44.         self.bkg=pyglet.resource.image('bkgrd.jpg')
  45.         self.bkg.width=1360
  46.         self.bkg.height=900
  47.         self.key='AA'
  48.         for i in range(70):
  49.             star=Star('star.png')
  50.             star.position=random.randint(0, 1360), random.randint(0,900)
  51.             self.add(star)
  52.         
  53.         f=open(r'index.txt', 'r')
  54.         line=f.readline().strip()
  55.         
  56.         self.peoples=[]
  57.         while line:
  58.             people=singlePic(line)
  59.             self.add(people)
  60.             self.peoples.append(people)
  61.             line=f.readline().strip()

  62.         self.schedule(self.update)

  63.     def on_key_press(self, key, modifier):    #电脑测试用的代码段
  64.         keyname=pyglet.window.key.symbol_string(key)
  65.         if keyname=='Q':
  66.             self.key=keyname
  67.             people=random.choice(self.peoples)
  68.             self.peoples.remove(people)
  69.             people.position=400, 400
  70.             people.do(ScaleTo(4,2))

  71.     def update(self, dt):   
  72.         global signal
  73.         if str(signal)=='a':
  74.             people=random.choice(self.peoples)
  75.             self.peoples.remove(people)
  76.             people.position=400, 400
  77.             people.do(ScaleTo(4,2))
  78.             signal='x'
  79.         for each in self.peoples:
  80.                 each.position=random.randint(0, 1360), random.randint(0, 900)

  81.     def draw(self):
  82.         self.bkg.blit(0,0)

  83. if __name__=='__main__':
  84.     server = socketserver.ThreadingTCPServer(addr,Servers)
  85.     server_thread = threading.Thread(target=server.serve_forever)
  86.     server_thread.setDaemon(True)
  87.     server_thread.start()
  88.    
  89.     cocos.director.director.init(width=1360, height=900)
  90.     scene=cocos.scene.Scene(Lucky())
  91.     cocos.director.director.run(scene)
复制代码


手机QPYTHON端控制程序 (其实任何能SOCKET发送指令信号的程序APP都行)
  1. import androidhelper
  2. from socket import *

  3. droid = androidhelper.Android()

  4. def vibrate():
  5.   result = droid.vibrate()
  6.   return result.error is None

  7. def lucky():
  8.     title = '抽奖'
  9.     message = ('Click to Run it.')
  10.     droid.dialogCreateAlert(title, message)
  11.     droid.dialogSetPositiveButtonText('Run')
  12.     droid.dialogShow()
  13.     response = droid.dialogGetResponse().result
  14.    
  15.     host = '192.168.43.41'    #查查你电脑主机的ip,修改成主机ip,手机和电脑在同一个局域网wifi下最好了。
  16.     port = 9999
  17.     addr = (host,port)
  18.     client = socket(AF_INET,SOCK_STREAM)
  19.     client.connect(addr)
  20.     client.send(bytes('a\r\n', encoding='utf8'))
  21.     client.close()
  22.     vibrate()
  23.     return True

  24. if __name__ == '__main__':
  25.     while True:
  26.         lucky()
复制代码


一些图片附件:

star.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-7 08:28:15 | 显示全部楼层

回帖奖励 +10 鱼币

用网页写我会,python还不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

 楼主| 发表于 2018-3-7 09:05:42 | 显示全部楼层
像番茄加两个蛋 发表于 2018-3-7 08:28
用网页写我会,python还不会

。。。。。。所问非所答,对提问者根本不负责啊。我就这点鱼币,给出这么多,你这么回复我是不是有点残忍。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 10:42:24 | 显示全部楼层    本楼为最佳答案   

回帖奖励 +10 鱼币

本帖最后由 LargeCat 于 2018-3-7 11:39 编辑

你这个要做的,要花点时间做美工和设计,需要时间的。
我这里有个自己写的,去年准备用的没用,懒的弄,你可以参考一下。最好自己完善一下。

外观逻辑:
每个参与抽奖的员工提交一个自己的图片,
自己给这些图片编号1,2,3,4,,,,,
投影到大屏幕上,不停的随机位置随机出现, 闪动,(python运行了一下,效果闪的也很快,没问题,100多个人的情况下)

主持人准备一个手机当作遥控器,安装Qpython或者任何东西,这里是qpython,用于给主机电脑发送抽奖指令。抽奖嘉宾再手机遥控上按一下抽奖,大屏幕上随机给一个图片并把他放大放到一边,显示他中奖了。
按一次,抽一个人。


程序:
用了cocos2d, 手机和电脑通讯用socket,
美工需要再完善,需要再加个音效,抽奖键按下的时候出一个音效,还有背景音乐。

仅仅只是给你参考,你必须会python, 自己再改改。

只能做到这里了。
只是一个实现的参考。

今年年底的年会可能会做一个给他们用用,到时候再完善了,懒癌很严重。。。。。


电脑主机程序:
  1. import cocos
  2. import pyglet
  3. import random
  4. from cocos.actions import *
  5. import threading

  6. import socketserver
  7. from socketserver import StreamRequestHandler as SRH
  8. from time import ctime

  9. HOST=''
  10. PORT=9999
  11. addr=(HOST, PORT)
  12. signal='x'

  13. class Star(cocos.sprite.Sprite):
  14.     def __init__(self, image):
  15.         super(Star, self).__init__(image)
  16.         self.scale=random.randint(1, 8)/10
  17.         t1=random.randint(1, 10)/10
  18.         t2=random.randint(1, 10)/10
  19.         t3=random.randint(1, 10)/10
  20.         angel=random.randint(90, 180)
  21.         move=FadeIn(t1)+Rotate(angel, t2)+FadeOut(t3)
  22.         self.do(Repeat(move))

  23. class singlePic(cocos.sprite.Sprite):
  24.     def __init__(self, image):
  25.         super(singlePic, self).__init__(image)
  26.         self.scale=1
  27.         
  28. class Servers(SRH):
  29.     def handle(self):
  30.         print('got connection from ',self.client_address)
  31.         while True:
  32.             global signal
  33.             signal1 = self.request.recv(1024).decode('utf-8').strip()
  34.             if signal1:
  35.                 print("RECV from:", self.client_address[0], ctime())
  36.                 signal=signal1
  37.                 break
  38.             else:
  39.                 print('continue to get data...')

  40. class Lucky(cocos.layer.Layer):
  41.     is_event_handler=True
  42.     def __init__(self):
  43.         super(Lucky, self).__init__()
  44.         self.bkg=pyglet.resource.image('bkgrd.jpg')
  45.         self.bkg.width=1360
  46.         self.bkg.height=900
  47.         self.key='AA'
  48.         for i in range(70):
  49.             star=Star('star.png')
  50.             star.position=random.randint(0, 1360), random.randint(0,900)
  51.             self.add(star)
  52.         
  53.         f=open(r'index.txt', 'r')
  54.         line=f.readline().strip()
  55.         
  56.         self.peoples=[]
  57.         while line:
  58.             people=singlePic(line)
  59.             self.add(people)
  60.             self.peoples.append(people)
  61.             line=f.readline().strip()

  62.         self.schedule(self.update)

  63.     def on_key_press(self, key, modifier):    #电脑测试用的代码段
  64.         keyname=pyglet.window.key.symbol_string(key)
  65.         if keyname=='Q':
  66.             self.key=keyname
  67.             people=random.choice(self.peoples)
  68.             self.peoples.remove(people)
  69.             people.position=400, 400
  70.             people.do(ScaleTo(4,2))

  71.     def update(self, dt):   
  72.         global signal
  73.         if str(signal)=='a':
  74.             people=random.choice(self.peoples)
  75.             self.peoples.remove(people)
  76.             people.position=400, 400
  77.             people.do(ScaleTo(4,2))
  78.             signal='x'
  79.         for each in self.peoples:
  80.                 each.position=random.randint(0, 1360), random.randint(0, 900)

  81.     def draw(self):
  82.         self.bkg.blit(0,0)

  83. if __name__=='__main__':
  84.     server = socketserver.ThreadingTCPServer(addr,Servers)
  85.     server_thread = threading.Thread(target=server.serve_forever)
  86.     server_thread.setDaemon(True)
  87.     server_thread.start()
  88.    
  89.     cocos.director.director.init(width=1360, height=900)
  90.     scene=cocos.scene.Scene(Lucky())
  91.     cocos.director.director.run(scene)
复制代码


手机QPYTHON端控制程序 (其实任何能SOCKET发送指令信号的程序APP都行)
  1. import androidhelper
  2. from socket import *

  3. droid = androidhelper.Android()

  4. def vibrate():
  5.   result = droid.vibrate()
  6.   return result.error is None

  7. def lucky():
  8.     title = '抽奖'
  9.     message = ('Click to Run it.')
  10.     droid.dialogCreateAlert(title, message)
  11.     droid.dialogSetPositiveButtonText('Run')
  12.     droid.dialogShow()
  13.     response = droid.dialogGetResponse().result
  14.    
  15.     host = '192.168.43.41'    #查查你电脑主机的ip,修改成主机ip,手机和电脑在同一个局域网wifi下最好了。
  16.     port = 9999
  17.     addr = (host,port)
  18.     client = socket(AF_INET,SOCK_STREAM)
  19.     client.connect(addr)
  20.     client.send(bytes('a\r\n', encoding='utf8'))
  21.     client.close()
  22.     vibrate()
  23.     return True

  24. if __name__ == '__main__':
  25.     while True:
  26.         lucky()
复制代码


一些图片附件:

star.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 10:46:10 | 显示全部楼层
我去,,提示今天上传附件上限,不能传了。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-7 11:20:30 | 显示全部楼层
LargeCat 发表于 2018-3-7 10:42
你这个要做的,要花点时间做美工和设计,需要时间的。
我这里有个自己写的,去年准备用的没用,懒的弄, ...

非常非常感谢,谢了谢了,马上开始研究。我论坛加你好友了,兄弟,麻烦能不能把一些附件传到我的邮箱呢?
1005664328@qq.com
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 11:36:04 | 显示全部楼层
浪里个亮 发表于 2018-3-7 11:20
非常非常感谢,谢了谢了,马上开始研究。我论坛加你好友了,兄弟,麻烦能不能把一些附件传到我的邮箱呢? ...


已发,

可以一起学习,
不建议入cocos2d的坑,资料太少了,我放弃了。。。
要么pygame,要么pyglet,
抽奖的话,你应该是二个屏幕, 电脑主屏幕和舞台大屏幕,建议用pyglet,可以控制2个显示器。抽奖程序投送到舞台大屏幕上。。

我现在懒了,年底再弄这个。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-7 11:37:43 | 显示全部楼层
浪里个亮 发表于 2018-3-7 11:20
非常非常感谢,谢了谢了,马上开始研究。我论坛加你好友了,兄弟,麻烦能不能把一些附件传到我的邮箱呢? ...

抱歉,您目前没有权限添加好友,点击这里查看权限



悲了个剧,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-7 13:55:18 | 显示全部楼层
非常感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 06:26:35 | 显示全部楼层

回帖奖励 +10 鱼币

不错,一起学习,代码好多啊。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 11:05:05 | 显示全部楼层
用pygame写了一个,想了想,后台作弊功能就不帮你写了你如果看的懂,那也就不用我写。
这个代码记得放进全是图片的文件夹,然后把这个代码名字改为‘'图片切换''    按 K停止, 按S继续,
有点粗糙。
  1. import pygame
  2. import sys
  3. from pygame.locals import *
  4. import os
  5. import random

  6. pygame.init()
  7. bg = (255,255,255)
  8. size = width,height = 400,800
  9. clock = pygame.time.Clock()
  10. screen = pygame.display.set_mode(size,RESIZABLE)#以上都是pygame常规布局

  11. group = []
  12. for each in os.listdir('.'): #将文件中图片全部添加进列表
  13.     if each != '图片切换.py':
  14.         group.append(each)
  15.     print(each)

  16. def ini(img):
  17.     global width
  18.     img = pygame.image.load(img).convert()
  19.     pos = img.get_rect()
  20.     pos[0],pos[1] = width,0
  21.     speed = [-50,0]
  22.     return [img,pos,speed] #将传递进的图片名字全部转化成surface对象
  23.         
  24. def move_x():
  25.     img = random.choice(group) #随机选图
  26.     return ini(img)

  27. def control():
  28.     for event in pygame.event.get(): # 以下两个函数决定了,按 K 停止,按 L 继续
  29.         if event.type == pygame.QUIT:
  30.             sys.exit()
  31.         if event.type == KEYDOWN:
  32.             if event.key == K_k:
  33.                 return 1
  34.             elif event.key == K_l:
  35.                 return 2

  36. def control_2(a):
  37.     global aroud
  38.     if a == 1:
  39.         for j in range(len(aroud)):
  40.             aroud[j][2] = [0,0]
  41.     elif a == 2:
  42.         for j in range(len(aroud)):
  43.             aroud[j][2] = [-50,0]
  44.    
  45. def play():
  46.     global width,aroud   #主程序,图片滚动
  47.     P = True
  48.     aroud = [move_x()]
  49.     while True:
  50.         if not P: aroud.pop(0)
  51.         P = True
  52.         f = control()
  53.         if f:
  54.             control_2(f)
  55.         for j in range(len(aroud)):
  56.             aroud[j][1] = aroud[j][1].move(aroud[j][2])
  57.             if aroud[j][1].right < width and len(aroud) <2:
  58.                 aroud.append(move_x())
  59.             if aroud[j][1].right < 0:
  60.                 P = False
  61.         screen.fill(bg)
  62.         for img,pos,speed in aroud:
  63.             screen.blit(img,pos)
  64.         pygame.display.flip()
  65.         clock.tick(200)

  66. play()
  67.         
  68.    
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-10 11:16:17 | 显示全部楼层
截了两张图,是从右到做的转,速度想改的话可以改 ini函数里面的speed的值或者最下面帧率 clock.tick()
,建议tick还是不用改。
1520651563(1).png 1520651534(1).png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-10 13:43:42 | 显示全部楼层
收到收到,一定仔细研究,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-14 11:26:54 | 显示全部楼层
JAY饭 发表于 2018-3-10 11:05
用pygame写了一个,想了想,后台作弊功能就不帮你写了你如果看的懂,那也就不用我写。
这个代码 ...

亲,我问下,ini函数返回的是一个包含三个元素的列表吗?
还有就是变量around代表的是什么啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-14 12:50:08 | 显示全部楼层
浪里个亮 发表于 2018-3-14 11:26
亲,我问下,ini函数返回的是一个包含三个元素的列表吗?
还有就是变量around代表的是什么啊?

是的,ini函数返回的分别surface对象本身,surface对象的rect属性也就是自身位置和自身长宽,surface对象的移动速度。aroud是接收三个属性。其实,是因为我英语很差,想不起旋转的英语怎么描述,就是用around来代替,结果还写成了aroud.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-23 18:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表