河北联合大学信息学院联网游戏双升课设Word格式.docx
- 文档编号:22855944
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:25
- 大小:343.38KB
河北联合大学信息学院联网游戏双升课设Word格式.docx
《河北联合大学信息学院联网游戏双升课设Word格式.docx》由会员分享,可在线阅读,更多相关《河北联合大学信息学院联网游戏双升课设Word格式.docx(25页珍藏版)》请在冰豆网上搜索。
2、核心算法思想
首先是功能需求,定义一个牌类,封装一张牌的一些信息,对单个牌的一些操作。
所以这是最基础的。
后面定义的一些对象都是在这个基础上进行操作的。
另外就是游戏中一些规则的制定。
出牌是否符合规则,这里主要包括两点,一个是没有前家出牌的情况下的出牌,一个是有前家出的牌,本家与前家出牌大小规则的制定。
主要是通过牌的张数来判断出牌的可能牌型,然后再看是否符合规则。
比牌大小是在出牌符合规则情况下,对应牌型的大小。
发牌,双升发牌,定义一个集合,用两个循环,一个控制牌的权值,一个控制牌的花色,一张牌就确定下来了,把每张牌加入到集合中,另外再加上大小王。
但是这样生成的牌集合是基本有序的。
对这个集合进行操作,随机生成两个数,这两个数表示要交换集合里面的两张牌的位置,交换一百次。
然后再把这个集合划分四份。
三份相等的,另外一份三张,分别分给四个数组。
双升有四方牌,四个用户,他们都有一些共性,像都包含一个集合啊,都包括出牌,还有如果是地主的话,就要进牌。
操作的需求,在地主点选牌的算法中,我们只要点击每张牌的可见区域,它的状态就会随之变化。
我们通过上图可以发现,每张牌选中之后它会遮盖前面几张牌的可见区域,而后面几张牌会影响自身的可见区域,所以每张牌点选之后与前面几张和后面几张牌有关系。
第一张牌除外,第一张牌选中之后只有它自己的可见区域会发生变化,因为第一张牌前面没有任何牌。
这样当我们选中牌的时候既要改变自身得可见区域也要改变前面几张被选牌的可见区域。
这样在你点选牌的时候根据鼠标坐标,来判断和牌队列中的哪张牌的可见区域碰撞,然后确定牌的索引更改与之对应牌的可见区域就能实现选牌操作。
第一种:
在牌的队列中只有自己被选中,会响应自己的可见区域,和前面一张牌的下部分可见区域。
这种是最简单的,自己被选中的时候,首先改变的正常的可见区域然后+选中之后的可见区域。
第二种:
在牌的队列中会影响其他牌的可见区域
前面三张牌有被选中的(选中之后前面牌的可见区域会被影响)
当前面几张牌中有选中状态的牌,它们的可见区域会被影响,正常的可见区域不会被影响。
而影响的可见区域也只是被改变了,影响的可见区域我们可以用一个公式来表示,当我们选中牌的时候,后面三张牌有有被选中的时候。
我们首先用第一种:
在牌的队列中只有自己被选中的方法来计算出正常的可见区域和可见区域。
三、核心算法流程图
下面给出的是核心算法流程图,根据分析后的程序结构图设计出相应的流程图。
双升的内容主要包括游戏开始,画背景,显示分数和要出的牌;
同时可以响应Esc按键,提示是否退出程序。
当前用户出牌其它用户出牌
图5核心算法流程图
图6核心算法流程图
四、源代码
下面给出的是本次开发的源代码:
Managers模块:
这是本游戏的核心模块之一。
voidGameStart();
//游戏初始化,发牌。
voidSendCard();
//发牌
voidCardsInfo(Cardca[],int&
num,int&
min,int&
type);
//用来得到牌的信息。
到底是炸弹,连牌,还是什么的。
voidPlayS(intmin2,inttype2,intnum2);
//设置与发出声音,用来通知玩家所打的牌的大小与种类。
voidUpdata();
//根据游戏状态的改变,从而设置游戏界面的状态。
Card模块:
记录了一张牌的所有信息,包括大小、类型、是否被玩家选中。
CProgramView模块:
编辑游戏界面
函数:
voidDrawCardOut(intk);
voidDrawLeft();
//绘出剩下的地主的牌,当地主还没决定的时候画的是牌的背面,决定地主
//后画出地主的牌
voidDrawPlayername();
//根据传入的字符串,绘出玩家的名称
voidOnPass();
//点击过牌按钮后的响应函数
voidOnSendCard();
//画出当前玩家所出的牌
intSelectNum(intnum,intmx,intmy);
//判断玩家点牌后具体点的是哪一张
voidDrawOtherCard();
//画出另外两个玩家还剩下的牌,以及
//他们刚刚出牌
voidDrawMyCard();
//画出当前玩家手中牌
voidOnCancel();
//点击退出按钮后的响应函数
voidOnOK();
//点击确定按钮后的响应函数
virtual~CProgramView();
CStringPlayerName[3];
//用来存放三个玩家姓名的字符串
voidPrintAll();
//整体重画
CChat模块:
基本对话框的聊天模块.
CNet模块:
网络控制
CServer模块:
网络主机配置
NetControl模块:
用于设置网络各方面的问题。
函数:
voidStartCards();
voidSendGetReady();
voidSendCards(Card*c,intaction);
NetControl(CProgramView*p);
voidBroadcast(char*pMsg);
voidSendMsg(CNet*pSend,charconst*pMsg);
//发送消息
voidOnSorc();
//网络配置
voidOnSet();
//设置问题
voidOnOpen();
//已经打开网络配置
voidFetchMsg(CNet*pRequest);
//网络信息处理
CNet*ConnectServer();
//网络连接
#include"
Card.h"
//Managers模块:
NetControl.h"
//AddedbyClassView
//#include"
ProgramView.h"
//Managers.h文件
classManagers
{
public:
boolm_CardSound;
voidClearCard();
//是主机则是true不是则为false;
CProgramView*m_pView;
intt;
//重新计时
NetControl*pControl;
voidPlayS(intmin2,inttype2,intnum2);
//0-2游戏玩家出牌
boolDoMsg(intnum,intaction);
voidGameStart();
//游戏初始化,发牌。
boolMainComputer;
//主机Managers();
virtual~Managers();
CardPlayCards[3][20];
//最多20张牌
intPlayerAc;
//这台机器上的玩家
intPlayerMain;
//地主
CardOutCards[20];
//走的牌,一次也最多出20张牌
intOutPlayer;
//走牌的玩家
CardSendleft[4];
//记录剩下的3张牌
intGame_State;
voidUpdata();
//-2游戏没开始
//-1游戏准备中,选地主
intPower;
//计算当前游戏如果农民胜利则每人得的分
intPlayerMaininfo;
//记录有几个玩家选择放弃地主如果都放弃则游戏结束
voidSendCard();
voidSortCard(Cardca[]);
intp[3];
//3-5对应0-2玩家胜利
voidCardsInfo(Cardca[],int&
boolManagers:
:
CheckCard(intpl)
Card*Ca=PlayCards[pl];
//用Ca指针来代替Player[pl],使程序简单容易理解
if(j!
=20)
{
PreOut[j].Num=16;
//表示此后的都没有牌了
}
Ca=PreOut;
//现在把CA指到这里
CardsInfo(Ca,num2,min2,type2);
if(OutCards[0].Num==16)//上次没有人走牌
voidManagers:
SendCard()
inti,j,k;
boolCards[55]={false};
//对应54张扑克,其中Cards[54]做初始化用必须为true;
//其中0-51为4个1-1352是小王53是大王
for(i=0;
i<
3;
i++)
{
Card&
Ca=PlayCards[i][j];
k=54;
//保证必进入While循环进行随机
DoMsg(intnum,intaction)
if(action==1)//唯一用得到前面1个参数的地方
Card&
Ca=PlayCards[PlayerAc][num];
returntrue;
}
elseif(action==3&
&
OutPlayer!
=PlayerAc)
t=30;
Game_State=(Game_State+1)%3;
//直接更改游戏玩家
PlaySound("
res\\不要.wav"
NULL,SND_ASYNC|SND_NODEFAULT);
returnfalse;
}
CardsInfo(Cardca[],int&
type)
friendclassNetControl;
#ifdef_DEBUG
virtualvoidAssertValid()const;
virtualvoidDump(CDumpContext&
dc)const;
#endif
protected:
voidCardReady();
//用来画还没发牌时牌的情况
};
CProgramView.cpp文件
//将按钮点击事件同响应函数联系起来
ON_BN_CLICKED(ID_OK,OnOK)//让ID_OK所指的对象响应单击(ON_BN_CLICKED)事件,事件
CProgramView:
CProgramView()
//TODO:
addconstructioncodehere
pControl=newNetControl(this);
//创建一个指向NetControl的指针
isDrawed=false;
//画发牌了没有,发牌完成了没有
~CProgramView()
if(!
pControl->
m_Isserver)
pControl->
SendMsg(pControl->
m_pSocket,"
退出游戏"
);
else
Broadcast("
deletepControl;
CBUTTON.Creat(_T("
确定"
),//按钮的caption属性,按钮的显示
WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,//按钮也是一种窗体,同样有不同
//风格,通过对常量或运算进行组合,达到一定的效果,这些常量的含义可以参考MSDN
CRect(660,410,765,450),//这个参数指出按钮在视图中左上角和右下角坐标,在
//确定了按钮位置的同时也确定了其大小
this,//这个指针指向按钮这个窗体的父窗体
ID_OK);
//这是刚才为按钮定义的常量,按钮的控制ID
voidCProgramView:
OnOK()
//MessageBox("
你点击了确定按钮"
//改变
m_isReady=true;
m_Isserver)pControl->
m_ready[1]=true;
//判断是否为真
m_Isserver&
pControl->
m_ready[0]&
m_ready[1]&
m_ready[2])
m_ready[0]=false;
//为假的时候要进行判断测试
m_ready[1]=false;
m_ready[2]=false;
if(manager.Game_State>
=0&
manager.Game_State<
3)//判断状态
return;
=3)
manager.Game_State=-2;
//如果为2的时候要进行相应的处理
isgoon=true;
OnCancel()//OnCancel()//响应取消按钮的点击
你点击了取消按钮"
m_Isserver)//是否退出游戏
exit(0);
PrintAll()
{
CDC*pdc=GetDC();
pdc->
BitBlt(0,0,800,600,&
Background,0,0,SRCCOPY);
//开始贴图处理
if(manager.Game_State==-2||manager.Game_State>
=3)
CardReady();
pdc->
SetBkMode(TRANSPARENT);
if(m_isReady)pdc->
TextOut(350,394,"
准备"
//输出准备
if(pControl->
m_ready[0])pdc->
TextOut(220,260,"
//在220,260,"
输出准备
m_ready[2])pdc->
TextOut(530,268,"
if(manager.Game_State==-1)
//设置背景模式
//pdc->
TextOut(545,435,"
if(manager.Game_State>
-1&
manager.Game_State<
3)DrawLeft();
if(isDrawed)DrawCardOut(3);
if(isDrawed)DrawMyCard();
if(isDrawed)DrawOtherCard();
PrintState();
m_isReady)m_ok.Invalidate();
//m_cancel.Invalidate();
m_sendcard.Invalidate();
m_pass.Invalidate();
ReleaseDC(pdc);
函数名称:
CardReady()
函数介绍:
画发牌前牌的摆放
for(inti=0;
54;
BitBlt(300+i*2,220,72,97,&
Mcard,142,384,SRCCOPY);
//函数介绍:
画出当前玩家手中的牌
DrawMyCard()
inti;
for(i=0;
20&
manager.PlayCards[manager.PlayerAc][i].Num<
=15;
if(manager.PlayCards[manager.PlayerAc][i].Num<
14)
{if(manager.PlayCards[manager.PlayerAc][i].Click)
pdc->
BitBlt(100+i*15,480-40,71,96,&
Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-1)*71,manager.PlayCards[manager.PlayerAc][i].Type*96,SRCCOPY);
else
BitBlt(100+i*15,480,71,96,&
}
elseif(manager.PlayCards[manager.PlayerAc][i].Num<
=15)
Mcard,(manager.PlayCards[manager.PlayerAc][i].Num-14)*71,384,SRCCOPY);
}
DrawOtherCard()
//
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 河北 联合 大学 信息 学院 联网 游戏 双升课设