家乡的一种棋牌游戏

进来无事,想起了家乡的一种棋牌游戏,只记得小时候玩觉得蛮有趣,呵呵,现在想起就有一种用程序实现它的冲动,

呵呵,有想法就行动了,鉴于此款游戏由多人组合才能进行,所以还是选择C/S结构开发,考虑服务器端会完成多位用

户请求,采用完成端口模型处理服务器端口连接。不多说,首先看游戏玩法规则,如下

1.游戏以  4,5,6,7,8,9,10,J,Q,K,A,2,3,大小王 的顺序分大小,4最小,王最大

2.游戏一开始必须以方块4所得者出牌,且第一次出牌必须打出方块4(可以打出多张4,但方块4必须出)

3.游戏中要是出多张牌的话,只能出同一牌值的牌(如,可以出三个5,但不能出三个5带一张或者一对)

4.要吃上家牌的话,必须要牌值大于上家的,且花色要一样(如果上家除了一个 红心4与梅花4一起,那么必须要大于牌

   值的 红心与梅花 例红心5 梅花5  ,或者同牌值的大牌吃,如 黑桃 4与 方块4可以出 花色按 黑桃 红心 梅花 方块

   顺序分大小,黑桃最大, 如黑桃4可以吃梅花4)

5.所有出牌都要大于上家牌(除第一次出牌以外),王可以吃任何牌,不需要判断花色,但是出牌的数量要一致,如上家是

   出两个 4,那么要用王吃的话也必须出两个王,简单的说就是一个王只能吃一张牌,且大王能吃小王

好了,暂时就想到这么多了,规则大概就这些,开始吧。

关于网络间的通讯采用的是TCP/IP连接,各消息间的传递我采用了枚举来区别,及数据头就是要传达的消息类型,如下枚举

enum msgType{
WS_LOG      = 1 ,        // 登陆
WS_SIT      = 2 ,        // 请求坐下
WS_PLVIEW   = 3 ,        // 用户列表
WS_COMEIN   = 4 ,        // 进入房间
WS_RELLY    = 5 ,        // 准备
WS_OUTROOM  = 6 ,        //离开房间
WS_GAMESTAR = 7 ,        //开始游戏
WS_GAMECARD = 8 ,        // 发牌
WS_OUTCARD  = 9 ,        // 出牌
WS_PASSCARD = 10         // 不出
};

程序使用VC6.0开发,服务器端为 win32控制台应用程序(由于没那么多时间去编辑用户窗口,且考虑到控制台程序为效率

最高程序,所以就用它来吧),客户端为win32应用程序,整个游戏过程为几张图片实现,为实现每张牌的显示及大小的判

断,需要专门做一个类,为此我做了如下这么一个类,它可办忙实现了好多功能,呵呵,体积虽然小,但还是有用滴,整

个游戏的关键也还是在牌这个类,其他的就是按部就班的游戏规则了,只要程序按游戏规则走了,那就可以玩了,好了,

做好的东西就先上一下了(由于初步完成而已,其中还有很多需要优化的,后期在来了,起初为了方便测试,没做数据库,

有时间在完成这些步骤了) ;如下连接 http://download.csdn.net/detail/mojiewen2006/4286031 ,后期的修改暂不放上来了,

CSDN不让删除,太多了不好

用到的图片如下

 

class Card // 牌类
{
public:
 Card(){m_select=false;}
 void SetPos(int xpos,int ypos) // 设置坐标位置
 {
  m_xpos=xpos;
  m_ypos=ypos;
 }
 int GetValue(){return m_card;}
 bool IsSelect(){return m_select;}
 int GetxPos() // 获取x坐标
 {
  return m_xpos;
 }
 int GetyPos() // 获取y坐标
 {
  return m_ypos;
 }
 int GetxFrame() // 获取图片所在x块
 {
  return m_xframe;
 }
 int GetyFrame() // 获取图片所在y块
 {
  return m_yframe;
 }
 void Onclick(int xpos,int ypos,bool lastcard=false); // 鼠标单击判断
 void IntToPos(int card);  // 设置牌值
 Card& operator = (const Card&  other);  //重载=号,用于排序
 bool operator< (const Card& other) ; // 重载此运算符只为排序牌值及后面的出牌判断,不做其他用
 
private:
 int m_card;  // 牌的数值
 int m_xpos;  // 牌显示x坐标
 int m_ypos;  // 牌显示y坐标
 bool m_select; // 牌是否被选中,用于出牌判断
 int m_xframe; // 对应图片坐标x位置
 int m_yframe; // 对应图片坐标y位置
 int m_split; // 大小区分
};

如下为它的一些函数

Card& Card::operator = (const Card&  other)  //重载=号,用于排序
{
 m_card=other.m_card;  // 牌值
 m_xframe=other.m_xframe ; // 对应图片中的x轴块
 m_yframe=other.m_yframe ; // 对应图片中的y轴块
 m_xpos=other.m_xpos; // 显示的x坐标
 m_ypos=other.m_ypos ; // 显示的y坐标
 m_select=other.m_select ; // 图片是否被选中
 m_split=other.m_split ; // 以什么值分开区别牌的大小
 return *this;
}

bool Card::operator< (const Card& other)  // 重载此运算符只为排序牌值及后面的出牌判断,不做其他用
{
 if(4==m_yframe)  // 假如在大猫或小猫一行
 {
  if(m_yframe==other.m_yframe) // 假如另一张牌也是王
  {
   if(m_xframe<other.m_xframe )
    return true;
   else
    return false;
  }
  else // if(m_xframe>other.m_xframe )
  {
   return false;
  }
 }
 else if(4==other.m_yframe) // 假如第二张牌为王
 {
  return true;
 }
 else   // 两张牌都不是王
 {
  if(m_split>=m_xframe) // 从4分开大小
  {
   if(m_split>=other.m_xframe) // 另一张牌也是在 1,2,3内
   {
    if(m_xframe<other.m_xframe) // 假如小于
    {
     return true;
    }
    else if(m_xframe==other.m_xframe) // 假如牌面相等
    {
     if(m_yframe<other.m_yframe) // 判断花色
      return true ;
     else
      return false;
    }
    else // 假如大于
    {
     return false;
    }     
   }
   else if(m_split<other.m_xframe)
   {
    return false;
   }
  }
  else  // 假如牌值不在1,2,3内
  {
   if(m_split<other.m_xframe) // 另一张牌也不在 1,2,3内
   {
    if(m_xframe<other.m_xframe) // 假如小于
    {
     return true;
    }
    else if(m_xframe==other.m_xframe) // 假如牌面相等
    {
     if(m_yframe<other.m_yframe) // 判断花色
      return true ;
     else
      return false;
    }
    else // 假如大于
    {
     return false;
    }     
   }
   else if(m_split>=other.m_xframe) // 另一张牌在1,2,3内
   {
    return true;
   }
  }
 }
 return true;
}

void Card::Onclick(int xpos,int ypos,bool lastcard)
{
 if(!lastcard) // 是否最后一张牌,需要特殊处理,此处为不是最后一张牌
 {
  if(m_select)  // 假如选中,开始判断
  {
   if( (m_xpos<xpos && xpos<(m_xpos + bmCard.GetWidth ()) && m_ypos<ypos && ypos<(m_ypos + CardSpace ) )
    || (m_xpos<xpos && xpos<(m_xpos + CardSpace) && m_ypos < ypos && ypos< (m_ypos + bmCard.GetHeight ()))
    )
   {
    m_xpos=m_xpos;
    m_ypos=m_ypos+CardSpace;  // 将原来的坐标向下移
    m_select=!m_select;
   }
  }
  else // 假如之前未选中
  {
   if (m_xpos<xpos && xpos<(m_xpos + CardSpace) && m_ypos<ypos && ypos<(m_ypos + bmCard.GetHeight ()) )
   {
    m_xpos=m_xpos;
    m_ypos=m_ypos - CardSpace;  // 将原来的坐标向上移
    m_select=!m_select;
   }
  }
 }
 else // 如果是最后一张牌
 {
  if(m_select)  // 假如选中,开始判断
  {
   if(m_xpos<xpos && xpos<(m_xpos + bmCard.GetWidth ()) && m_ypos<ypos && ypos<(m_ypos + bmCard.GetHeight () ))
   {
    m_xpos=m_xpos;
    m_ypos=m_ypos+CardSpace;  // 将原来的坐标向下移
    m_select=!m_select;
   }
  }
  else // 假如之前未选中
  {
   if (m_xpos<xpos && xpos<(m_xpos + bmCard.GetWidth ()) && m_ypos<ypos && ypos<(m_ypos + bmCard.GetHeight ()) )
   {
    m_xpos=m_xpos;
    m_ypos=m_ypos - CardSpace;  // 将原来的坐标向上移
    m_select=!m_select;
   }
  }
 }
}

void Card::IntToPos(int card)
{
 m_card=card;
 m_split=2;
 m_xframe=(card-1)%13;
 m_yframe=(card-1)/13;

 

程序最终执行结果为

1.服务器


 

 2.客户端

登陆


登陆后


游戏中


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1619441.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C#棋牌游戏(如斗地主)

C#棋牌游戏 需求代码块定义枚举定义Card类定义CardLibrary类*定义Player类Main函数中实现结果展示 需求 需要定义Card类&#xff0c;该类包含特征&#xff1a; 每张牌的名字; 花色:红心、方块、梅花、黑桃; 牌号:1- 10、J、Q、K、小王、大王定义牌库CardLibrary类&#xff0c;…

自助棋牌室

1项目模块:商家模块(店铺展示、包厢展示、订单、订单搜索、店铺搜索) 用户模块(登录、注册、预约、充值、更换头像、续单、退单) 2项目技术:前端:js、jquery、vue2、vue3、后端:jdbc、java、servlet、mybatis 3功能实现: I 登录功能实现: 主要通过前后端交互实现,前后端实现流…

算法通过村第四关-栈白银笔记|手写栈操作

文章目录 前言1. 栈的基础概要1.1 栈的特征1.2 栈的操作1.3 Java中的栈 2. 栈的实现&#xff08;手写栈&#xff09;2.1 基于数组实现2.2 基于链表实现2.3 基于LinkedList实现 总结 前言 提示&#xff1a;我自己一个人的感觉很好 我并不想要拥有你 除非你比我的独处更加宜人 --…

【问题解决】无法加载文件 C:\Users\PJW\AppData\Roaming\npm\hpm.ps1,因为在此系统上禁止运行脚本

问题&#xff1a; PS Y:\BearPi-HM_Nano> hpm dist hpm : 无法加载文件 C:\Users\PJW\AppData\Roaming\npm\hpm.ps1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_Execution_Policie…

intellj 无法运行程序

RT 在写作业的时候&#xff0c;导入老师项目&#xff0c;但是无法执行文件。 在这里插入图片描述 在项目模块中&#xff0c;添加内容根。添加目标源文件夹&#xff0c;解决问题。

【报错】nrm : 无法加载文件 …路径… ,因为在此系统上禁止运行脚本。

原因&#xff1a;核心是power shell的安全策略&#xff0c;将 nrm 命令视为了不安全脚本&#xff0c;不允许执行。只需要放开权限就行。 解决&#xff1a;通过管理员权限运行power shell&#xff0c;然后输入命令 set-ExecutionPolicy RemoteSigned 示例&#xff1a; 选择“是”…

com.android.phone已停止运行怎么解决方法,com.android.phone进程意外停止/已停止运行的原因及解决方法...

com.android.phone已停止怎么解决?小编带来了com.android.phone进程意外停止解决方法&#xff0c;有机友表示当手机刷机或root后就会出现“进程com.android.phone已停止”提示&#xff0c;不妨试一试下文的解决方法哦~ --原因 出现这种情况表明你的手机运行环境出现了比较大的…

在运行Android程序出现“×××已停止运行”

在运行Android程序时出现“已停止运行”的情况&#xff0c;点击“重新打开应用”后又提示“屡次停止运行”&#xff0c; 发现在Logcat中有这么一行提示&#xff1a;“Caused by: java.lang.NullPointerException: Attempt to invoke virtual method android.view.View android.…

无法加载文件 ,因为在此系统上禁止运行脚本

1 问题 在打开cmd命令行文件或者某个shell时&#xff0c;运行某个文件失败&#xff0c;并且显示无法加载文件 &#xff0c;因为在此系统上禁止运行脚本。可能是因为你当前的shell窗口权限不够导致&#xff0c;可以先打开管理员权限的shell之后&#xff0c;修改脚本运行的策略即…

因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170 中的 about_Execution_Policies

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; npm安装包后无法使用&#xff0c; 例如&#xff1a;npm install -g json-server 安装成功后 使用json-server命令 报错&#xff0c;如果没有安装过此包&#xff0c;一般会提示不是内部或者外部命令 问…

windows 已停止這個裝置,因為它發生了問題。

您的電腦在接入外接式裝置時出現" Windows 已停止這個裝置&#xff0c;因為它發生了問題。 (代碼 43)"&#xff0c;如何解決&#xff1f; 一般情況下&#xff0c;是由於裝置非正常接入所引起的裝置驅動程式出現故障的錯誤&#xff0c;此時多插拔幾次即可解決。但如果…

Windows启动和停止jar包命令

一、windows启动jar包命令 命令放到 bat文件中 1、普通启动 title XXX chcp 65001 java -Dfile.encodingutf-8 -jar XXX.jar加上-Dfile.encodingutf-8后&#xff0c;不乱码 加上chcp 65001后&#xff0c;日志的中文不乱码 注&#xff1a;这种方式启动后&#xff0c;窗口不能…

因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?Link ID=135170 中的 about_Execution_Policies

出现的问题描述 在 Pycharm 的虚拟环境中&#xff0c;打开终端&#xff0c;有红字提示 重点关注的就是在此系统上禁止运行脚本 这是因为PowerShell的执行策略不允许运行脚本 有两种方法可以解决 解决办法 方法一&#xff1a;修改PowerShell的执行策略 以管理员方式运行Powe…

无法加载文件,因为在此系统上禁止运行脚本。

1.vscode报错,nodemon :因为在此系统上禁止运行脚本。 注意:不仅仅适用于nodemon报错,报在此系统上禁止运行脚本的错都可以用以下方法解决 2.报错原因分析:windows 为了安全,默认的执行策略为 Restricted,因此需要将执行策略设置为 RemoteSigned 即可 3.解决方法 步骤: 1.…

四种方式解决idea中出现 运行配置停止之前未连接应用程序服务器原因:无法在 localhost:1099 处 ping 服务器

出现这种问题的原因很多 第一种&#xff1a;项目结构那里没有选JDK 第二种&#xff1a;Tomcat版本和JDK版本不兼容&#xff0c;这就要我们手动更改Tomcat或者JDK版本了 我们先查看自己的Tomcat版本&#xff0c;首先点开黄色那个圈&#xff0c;照着图片依次进行 这里一定要点进…

IE浏览器卡死提示是否停止运行此脚本的解决办法

IE浏览器经常卡死&#xff0c;报是否停止运行此脚本&#xff0c;严重影响使用体验&#xff0c;下面小编教大家怎么解决这个问题&#xff0c;供大家参考&#xff01; 1、启动IE浏览器&#xff0c;点击上方菜单栏位的工具&#xff0c;如下图所示 2、在工具栏位选择internet选项&a…

2023 江苏省研究生数学建模 A 题思路

2023年江苏省研究生数学建模科研创新实践大赛A题新型抗癌药物研究模型探索靶向治疗是治疗肿瘤疾病的一种重要方法&#xff0c;它具有针对性强、疗效显著等特点。现有的靶向药物通常针对特定的基因突变靶点&#xff0c;容易出现耐药性。目前&#xff0c;一种由癌症诱发的血管新生…

磁盘区号 linux,DOS下确定活动主分区和最后分区的区号和盘符的工具

Ghost自动备份时&#xff0c;活动主分区、最后分区号与盘符的确定思路和批处理 使用了第三方软件minitow(for win)/minito(for dos)&#xff0c;软件下载及使用可去dos联盟。 一、windows下解决方案 (一)思路 1&#xff0c;用minitow获得硬盘信息。实例如下&#xff1a; &#…

(转)Windows7轻松备份--“Windows7一键恢复”简明教程

http://gghost.cn/help/win7gghost/ Windows7轻松备份--“Windows7一键恢复”简明教程1. Windows7一键恢复简介Windows7一键恢复是基于ghost(v11.02)和grub4dos的系统备份和还原工具&#xff0c;具有良好的兼容性和易用性。专为Windows 7量身打造&#xff0c;支持32位及64位系…

安装系统之六 U盘装GHOST WIN7教程

第一步 将准备好的u启动u盘启动盘插在电脑usb接口上&#xff0c;然后重启电脑&#xff0c;在出现开机画面时通过u盘启动快捷键进入到u启动主菜单界面&#xff0c;选择【02】U启动Win8PE标准版&#xff08;新机器&#xff09;选项&#xff1a; 第二步&#xff1a; 进入pe系统u…