1,过程

蜘蛛纸牌大家玩过没有?之前的电脑上自带的游戏,用他来摸鱼过的举个手。

但是现在的电脑上已经没有蜘蛛纸牌了。所以……

可不可以自己做一个呢?
想法有了,实践开始。

首先,应该怎么写?首选的方案就是pygame和numpy。

最后选了numpy。一是因为作者用电脑的时间比较短,没有时间力,而手机的在线编译器可以用numpy,不能用pygame。二是因为之前了解过numpy,但是pygame当时都没安装,是昨天才安装完毕的三是因为想挑战一下自己。下次可以试试用pygame。

所以一个动都没动过numpy的小白开始努(作)力(死)。

从10月30日写到11月9日,中间提问了14个问题,查询了大约五十多个资料,修复了20多个bug,很感谢回答我的问题的人。

numpy有一个缺点就是只能输入输出,自己要移动哪些牌,移动到哪里,很耗费时间,于是把三次输入硬生生压缩成了一次,有些难理解,并且对于被盖住的牌,只能用数字99表示了。整体有些出入。

中间有一次写了四五个小时代码,结果手残点到返回主页了没保存,心态崩了

还好还是完成了。如果程序运行有bug,可以指出

游戏规则见代码里

2,思路

整体思路:

1,创造空矩阵a,在0,1,2,3行和第四行的0,1,2,3列变成99牌,定义函数qipai来起一列牌。创建列表pai,并通过询问难度来定义不同的牌。
2,定义函数shan0,为了美观和不占地方,将矩阵a的全0行删除
3,操作移动,用input询问要移动的牌,信息:移动的牌在第几列?第几行到第几行?要移动到哪一列?之后将范围里的牌存储到列表yidong里并清0,再依次赋值到移动到的那一列。期间的错误操作如移动的牌顺序不相接,移动之后的位置不相接等,通过扣得分处罚(绝对不是因为作者懒不想再返回原位置)
4,操作看规则,print无脑就行
5,操作翻99牌,循环从下往上侦测,当侦测到99牌将这个位置在pai里随机赋值,做出错误操作处理
6,操作起牌,调用函数就行
7,操作收牌,从下往上侦测是否有x.01,如果有,则开始侦测上面的牌是否按规律排列,按照规律则依次变成0,否则继续侦测x.01作出没有可收牌的处理
8,完善,修改bug,设置开始和结束语

3,配置

首先要python是必不可少的,其次是numpy模块。

快捷键win+R,输入cmd进入终端。如果没有pip包给爷上网查下载(bushi,输入pip install numpy安装,安装完成之后输入:

import numpy

numpy.zeros((3,3))

如果报错则是没安装,输出了一个3x3的矩阵则成功安装了。

4,代码

import random#导入随机数模块import numpy as np#导入numpy模块def qipai():#定义函数qipai,用来起一行牌xunhuan=40jiange=1for xunhuan1 in range(0,10):#一列一列侦测while xunhuan == xunhuan:#死循环xunhuan=xunhuan-1#xunhuan自减,if a[xunhuan][xunhuan1] != 0:#如果xunhuan行不是零,侦测到其他数字chu=a[xunhuan+1][xunhuan1]=random.choice(pai)#将他的上一行变成pai里面的任意一个并用变量储存pai.remove(chu)#删除这一个数break#侦测下一列if xunhuan == 0:#如果检测到了最后还没有数字就是这一列没有数字chu=a[0][xunhuan1]=random.choice(pai)#在0行随机发放数字并用变量储存pai.remove(chu)#删除这一个数break#侦测下一列xunhuan=40#变量变换def shan0():#删除矩阵中所有0行o = np.sum(a == 0, axis=1)liebiao = []for xunhuan2 in range(len(o)):q = o.tolist()[xunhuan2]if q == 10:liebiao.append(xunhuan2)#问的大佬,我也看不懂global newa#全局变量newa=np.delete(a,liebiao,0)#newa为删除零行后的a,仅仅是显示作用,改变在a上改变print("正在发牌")a=np.zeros((40,10))#40x10的全0矩阵nandu=int(input("请选择难度,简单输入1,中等输入2,困难输入3"))#选择难度if nandu == 1:#简单难度pai=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12,1.13]#一种花色pai=pai*8#自乘elif nandu == 2:#中等难度pai=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12,1.13,2.01,2.02,2.03,2.04,2.05,2.06,2.07,2.08,2.09,2.10,2.11,2.12,2.13]#两种花色pai=pai*4#自乘elif nandu == 3:#困难难度pai=[1.01,1.02,1.03,1.04,1.05,1.06,1.07,1.08,1.09,1.10,1.11,1.12,1.13,2.01,2.02,2.03,2.04,2.05,2.06,2.07,2.08,2.09,2.10,2.11,2.12,2.13,3.01,3.02,3.03,3.04,3.05,3.06,3.07,3.08,3.09,3.10,3.11,3.12,3.13,4.01,4.02,4.03,4.04,4.05,4.06,4.07,4.08,4.09,4.10,4.11,4.12,4.13]#四种花色pai=pai*2#自乘print("难度设置完毕")for xunhuan in range(0,10):a[0][xunhuan]=99xunhuan=0for xunhuan in range(0,10):a[1][xunhuan]=99xunhuan=0for xunhuan in range(0,10):a[2][xunhuan]=99xunhuan=0for xunhuan in range(0,10):a[3][xunhuan]=99a[4][0]=99a[4][1]=99a[4][2]=99a[4][3]=99#设置99牌站位dh=0s=0chu=0t=0xunhuan=0jiange=0xunhuan1=0zuobi=0defen=1000qi=5lie3=0ktsfwl=0wuyong=0zuobima=0#初始化变量qipai()#开局起牌while 1 == 1:#死循环shan0()#删除0行if defen <= 0:#得分变成0时游戏失败print("得分为0,游戏失败!!!")print(3/0)#没啥好方法了,让他自己报错吧print(newa,"\n")#输出牌局print("    0     1     2     3     4     5     6     7     8     9")#输出索引间距print("目前得分:",defen)#说目前的得分if np.where(a!=0)[0].shape[0]==0:#如果矩阵为全0break#游戏成功,退出死循环caozuo,lie1,hang1,hang2,lie2 =map(int,input("输入5个数字,不知道规则请输入2 0 0 0 0(用索引形式)\n").split())#询问操作并执行命令,规则见上if caozuo == 1: #要移动牌  if a[hang1][lie1] != 0 and a[hang2+1][lie1] == 0:#hang1和hang2不等于零且hang2的下面没有牌才执行移动if a[hang2][lie1] != 0:xunhuan=hang1#将hang1到hang2的牌保存到yidongyidong=[]#空列表while xunhuan <= hang2:#开始侦测yidong.append(a[xunhuan][lie1])#添加这个数a[xunhuan][lie1]=0#将这个数变成0xunhuan=xunhuan+1#自增xunhuan=0if len(yidong) != 1:#yidong的长度不是1才执行规律侦测while xunhuan < len(yidong)-1:#-1是因为后面有yidong[xunhuan+1],为了不越界wuyong=yidong[xunhuan]-yidong[xunhuan+1]-0.01sxc=f'{wuyong:.3f}'#大佬教的浮点数四舍五入三位,前面的牌-后面的牌-0.01=x.00时if str(sxc)[:-3]!='000':defen=defen-50#defen减50print("移动的牌不按规律排列,作弊次数+1")break#侦测到作弊xunhuan=xunhuan+1xunhuan=0while xunhuan == xunhuan:#死循环侦测,从上往下if a[xunhuan][lie2] != 0:#侦测到不为0xunhuan=xunhuan+1#侦测下一行else:#此时xunhuan是该列最后一个数字所在行数的下一行xunhuan=xunhuan-1#切换到上一行,该数字if a[0][lie2] != 0:#矩阵这一列的0行不是0ktsfwl=0dh=a[xunhuan][lie2]#dh变成该数字在的位置else:#若是0,则是直接移动ktsfwl=1xunhuan1=0while xunhuan1 < len(yidong):#xunhuan1为yidong的长度时geduan=yidong[xunhuan1]#赋值a[xunhuan+1+xunhuan1][lie2]=geduanxunhuan1=xunhuan1+1#xunhuan自增if ktsfwl == 1:#0行是0,取消侦测,直接退出print("移动成功")defen=defen-5breakwuyong=dh-a[xunhuan+1][lie2]-0.01sxc=f'{wuyong:.3f}'#这一行减移动的首个数字减0.01的差为x.00if str(sxc)[-3:] =='000': print("移动成功")defen=defen-5#移动成功breakelif str(a[xunhuan+1][lie2])[:-2] =='.1' and str(dh)[:-3]=='.11':#如果是.11和.1相接也是移动成功defen=defen-5print("移动成功")breakelse:#两种情况都不是print("移动的位置不相接,作弊次数加一")defen=defen-50zuobi=zuobi+1#判断作弊breakcontinue#下一次操作else:print("请输入正确的范围")defen=defen-10continueelse:print("请输入正确的范围")defen=defen-10continueif caozuo == 2:#查看规则时print("规则:共有104个数字,10组,数字的小数点前代表花色,小数点后代表点数,牌只能放在比他数值大0.01,花色任意 的牌上,将一样花色的牌按照13到1的顺序排列再输入5即可消除这一组牌")print("下面的x指输入的第二个数字,y是第三个,z是第四个,w是第五个")print("将8组牌全部消除则胜利。其中移动牌是将在第x列的第y到第z行的牌移动到第w列,翻99牌则是翻x列标注99的牌,下面没牌之后才能翻。起一行牌则是起一行备用的牌,一行牌会覆盖在下面,共5组。消除牌则是将x列13到1顺序排列并同样花色的牌全部消除")print("第一个数字如果移动牌输入1,看规则输入2,翻99牌输入3,起牌输入4,消除牌输入5")print("按照上面的要求输入五个数字,用空格隔开,输入行列要用索引形式,如果用不到第2,3,4,5个数字输入0")print("得分初始为1000,正常操作-5,犯规操作-50,错误操作-10,若得分为0则游戏失败,消除一次牌+500")print("索引是啥给爷自己查,懒得写")continue#下一次操作if caozuo == 3:#翻99牌时xunhuan=6#因为只有5行上面会有99牌,节省时间if a[0][lie1] != 99:#0行都不是99牌,错误操作print("该列没有99牌")defen=defen-10continue#下一次操作while xunhuan >= 0:#循环检测第一个99牌print("a")xunhuan=xunhuan-1#自减if a[xunhuan][lie1] == 99:#检测到99牌chu=a[xunhuan][lie1]=random.choice(pai)#将99牌的位置随机发放牌pai.remove(chu)#删除该数字print("已经揭牌")defen=defen-5break#跳出循环elif a[xunhuan][lie1] != 0:#检测到不是0也不是99的数print("99牌下面还有其他的牌")#下面还有其他的牌defen=defen-10breakcontinue#下一次操作if caozuo == 4:#起牌if qi == 0:#如果牌堆没牌了print("已经没有牌可以起了")defen=defen-10else:#牌堆有牌qipai()#执行函数qipaiprint("已经为您起牌")qi=qi-1#自减牌堆数量defen=defen-5continue#下一次操作if caozuo == 5:#消除牌xunhuan=40#从40行往下检测jiange=2#定义while xunhuan == xunhuan:#开始检测jiange=0if xunhuan==11:#已经不够13张牌时还没有x.01print("没有可以消除的牌")defen=defen-10breakxunhuan=xunhuan-1#自减wuyong=a[xunhuan][lie1]-0.01sxc=f'{wuyong:.3f}'#sxc为上减下减0.01if str(sxc)[-3:] == '000':#出现x.01xunhuan1=xunhuan#此时xunhuan为x.01所在行数while xunhuan1 == xunhuan1:#死循环检测上-下是否为0.01if xunhuan1==xunhuan-12:#12次后没有发现错误xunhuan2=0#消除成功while xunhuan2<=12:#依次消除a[xunhuan-xunhuan2][lie1]=0#x.01在的行数依次减1,2…后的行数为0xunhuan2=xunhuan2+1#自增jiange=0#jiange为0,是因为正确运行跳出循环的breakwuyong=a[xunhuan1-1][lie1]-a[xunhuan1][lie1]-0.01sxc=f'{wuyong:.3f}'if str(sxc)[-5:]=='0.000':#循环侦测上下差值-0.01是否为0xunhuan1=xunhuan1-1#自减else:#这个0.01上面并不按规律排列jiange=1#是因为不按规律排列而退出循环breakif jiange == 0:#侦测是因为什么跳出循环,如果因为正确操作print("已经移除")defen=defen+500break#非正确操作接着检测continue#检测结束后继续下一次操作#退出循环,游戏胜利print("恭喜获胜")print("您目前的得分为",defen,"作弊了",zuobi,"次,游戏结束!")#报成绩

四,结束语

总之还是比(磕)较(磕)顺(绊)畅(绊)地完成了。如果代码有错误或者可以优化的地方,一定一定要指出,谢谢。

接下来打算去学习turtle库,出一个新的作品,谢谢智齿

---------------------------------------------------------------end-------------------------------------------------------------

用python整个活(2)——用numpy做一个蜘蛛纸牌相关推荐

  1. python字节码执行函数_做一个字节码追踪器,从内部理解 Python 的执行过程

    最近我在研究 Python 的执行模型.我对 Python 内部的东西挺好奇,比如:类似 YIELDVALUE 和 YIELDFROM 此类操作码的实现:列表表达式.生成器表达式以及一些有趣的Pyth ...

  2. python七彩同心圆_用pygame做一个简单的python小游戏---七彩同心圆

    用pygame做一个简单的python小游戏---七彩同心圆 用pygame做一个简单的python小游戏-七彩同心圆 这个小游戏原是我同学python课的课后作业,并不是很难,就简单实现了一下,顺便 ...

  3. 用C#做一个简单纸牌游戏的程序

    小子不才学C#没多久,想做个窗体纸牌游戏玩,但是窗体应用懂得不多,只能在控制命令台上进行游戏设计,希望有大神能帮我设计这个窗体程序,或者推荐好的窗体设计资料,谢谢了,控制命令台程序如下: namesp ...

  4. python 搭建登陆系统,用Python连接操作MySQL数据库,做一个简单的用户登录注册系统...

    我们可以很容易地用Python实现一个用户登录系统,相信这即使是对编程新手来说也是小菜一碟. 作为Python的小萌新,今天我想记录下来的是如何实现一个连接了MySQL数据库的用户登录注册系统,它的效 ...

  5. 《python语言程序设计》第2章第3题python 用class init 一起来做一个英尺变米的程序

    代码如下,下面我们试着来分析. # 此处建立了一个类,转变成米. class cha_feet_to_meters:# 函数在类里叫做方法.# init 里有四个意思,"自身",& ...

  6. 使用Python中内置tkinter模块做一个简易的计算器

    当前环境: windows + python3.7 + tkinter 模块 一.总体规划 1.需要用到的模块有  tkinter 2.tkinter 模块中需要用到的知识点有: 2.1.创建主窗口 ...

  7. python全1向量_python – Numpy – 总结一个向量列表

    解决方案1 ​​np.add.reduce() 您可以使用np.add的reduce属性: a = np.array([100, 100]) b = np.array([200, 200]) c = ...

  8. Python网络爬虫爬取招聘数据(利用python简单零基础)可做可视化

    爬取Boss直聘相关的招聘数据 一.相关需求分析 1.目的 二.直聘网页结构分析 1.网页相关值的查找 2.网页的下一页规律查找 三.Python相关的第三库介绍 1.Urllib的介绍 (1)url ...

  9. python文件运行哪一个_如何使一个python文件运行另一个?

    本问题已经有最佳答案,请猛点这里访问. 如何创建一个python文件来运行另一个? 例如,我有两个.py文件.我想运行一个文件,然后让它运行另一个.py文件. docs.python.org / / ...

最新文章

  1. 搜狗研究员:详解基于深度学习的语音分离
  2. 移动应用发展远超Web 谷歌苹果将主导世界?联网的发展才刚刚开始
  3. 使数据区“可执行”的几种常规办法
  4. java generate()_Java IntStream generate()用法及代码示例
  5. ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
  6. 【解题报告】2020蓝桥杯B组模拟 计蒜客 结果填空:苹果
  7. nodejs在cmd提示不是内部或外部命令解决方法
  8. git lfs mac 安装_mac安装homebrew
  9. python lambda表达式及用法_Python:lambda表达式和yield关键字理解与使用讲解
  10. iPhone 13系列或将涨价?业内人士:可能性不大,原因有这几点
  11. Mybatis编写初始化Dao代码
  12. JBuilder 2005 Enterprise注册破解
  13. re -12 buuctf [Zer0pts2020]easy strcmp
  14. 闲置交易,二手交易,二手商城,同城交易,社交商城类APP源码
  15. electron 通过nodejs的winre库实现软件开机自启动
  16. 【EmailCamel外贸邮件群发】邮件到达收件箱系列文章05:免费公共邮箱作为发件人的限制
  17. PTA:一帮一(C语言)
  18. 蛋白质相互作用系列:GN快速算法
  19. [附源码]java毕业设计海雨市高校实验设备报修系统
  20. 细分市场或成为OA产品同质化的救星|企服三会系列报道

热门文章

  1. auto.js 公众号自动签到
  2. 培训4个月编程学什么比较好_编程,开放式硬件以及4月的更多新文章
  3. 文档文件等网页端预览功能
  4. 串口硬盘和并口硬盘的区别
  5. netty 拆包和粘包 (三)
  6. android 事例源码 搜集
  7. oracle实体视图日志,Oracle案例02——ORA-12034: SCOTT.USER_TABLE 上的实体化视图日志比上次刷新后的内容新...
  8. 课程设计:通讯录系统(数据库)
  9. 苹果手机的专用充电宝有哪些?苹果官方授权无线充电宝推荐
  10. 6-75 绘制多叶玫瑰线