网络游戏开发期末报告docxWord文件下载.docx
- 文档编号:20023849
- 上传时间:2023-01-16
- 格式:DOCX
- 页数:36
- 大小:103.78KB
网络游戏开发期末报告docxWord文件下载.docx
《网络游戏开发期末报告docxWord文件下载.docx》由会员分享,可在线阅读,更多相关《网络游戏开发期末报告docxWord文件下载.docx(36页珍藏版)》请在冰豆网上搜索。
引爆的玩家打成平局。
否则,将余下的各玩家的总分与庄家的总分做比较,如果玩家的总分大于圧家的总分,则玩家获胜。
如果二者的总分和同,则玩家与庄家打成平局。
第一章设计要求
1.1问题描述
本次C++课程设计题Fl是“21点网络纸牌游戏”,系统的主要功能是娱乐游戏,有一个庄家和多个玩家一起玩这个游戏,玩家设法使自己的牌达到总分21并要比电脑开的点数大而且不超过这个数值。
扑克牌的分值取它们的面值°
J,Q,K分别是11,12和13分。
1.2要求分析
编写程序实现游戏,该程序是模拟古老的“21点纸牌游戏”,实现一对多的网络游戏。
要求游戏过程屮任意一玩家牌的点数之和超过21点,则自动出局;
在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
第二章总体设计
总体设计结构图
第三章详细设计
3.1数据库类型设计
☆扑克牌类
■分值
■花色
☆玩家类
■姓名:
人类玩家,对方玩家
■玩家的已分配的扑克牌数组
■卅前局的得分
■状态标志:
正常,爆牌,不要牌
■总得分
☆数据同步结构体
■初始扑克牌数组,52张待分配的扑克牌
■玩家的行动类型:
-1游戏开始;
0要牌;
1不要牌
3.2•游戏引擎类设计
☆数据成员
■扑克牌数组,保存52张待分配的扑克牌
■人类玩家和对方玩家
■当前应发扑克牌的编号
■游戏进行状态
♦游戏进行屮
♦人类玩家爆牌
♦对方玩家爆牌
♦人类玩家获胜
♦对方玩家获胜
♦平局
♦等待对方行动
♦Server:
己获取网络连接;
Client:
己建立网络连接
■套接字:
侦听套接字,连接套接字(游戏数据发送)
☆对外接口和方法
■开始游戏
■人类玩家要牌
■人类玩家不要牌
■侦听
♦初始化,等待连接
■连接
♦初始化,建立连接
■网络消息处理
♦FDACCEPT
♦FDCONNECT♦FD_READ
•三种消息类型:
游戏初始化;
玩家要牌;
玩家不要牌
3.3.主要功能流程图
侦听
开始游戏
连接
迎輛划綽已
引分餌磯課
3.4•显示层的设计
☆基于Win32或者MFC单文档程序
■通过菜单,按钮等进行游戏操作,调用引擎层的对外接口函数
♦开始游戏
♦要牌
♦不要牌
♦等待连接
♦连接
■窗口绘制
♦获取为前游戏数据和状态,在屏幕上输出状态提示信息
♦在屏幕上显示玩家己分配的扑克牌的图形
第四章编码实现
4丄21点游戏网络版代码
#include<
iostream.h>
#include<
stdlib.h>
#include<
conio.h>
time.h>
voidreplayfchar&
ans);
〃询问是否继续玩牌
voidhit(int&
total);
〃要一张牌
voiddeal(int&
player,int&
cpujnt&
playerturns,int&
cputurns);
〃为计算机和玩家各发两张牌
voidBET(int&
bet,int&
money);
〃下注
voidprint(intwins,intlose,intdraw,intmoney);
〃输出最示结果
voidrules();
〃输出规则
voidresults(intplayer,intcpujntbet,int&
money,int&
draw,int&
win,int&
lose);
〃判断输赢
intrandom(longhi,longlo)〃取两个参数Z间的随机数
{
intran;
srand((unsigned)time(NULL));
ran=rand()%(hi-(lo-1))+lo;
return(ran);
}
voidwait(intmilli)〃暂停milli亳秒
clock_tstart;
start==clock();
while((clock()-start)<
milli);
)
voidpause()〃暂停,任按一-键继续
cout«
"
任安一键继续"
«
end1;
getch();
intmain()
intplayer=0,cpu=0,win=O,lose=0,draw=O,playerturns=O,cputurns=0,money=O,bet;
charans;
system(”cis”);
〃执行系统命令,清屏
rules();
H\t\t\t请问是否玩牌:
"
;
cin»
ans;
if((ans==y)II(ans==丫))〃检查输入是否为Yes
H\t\t\t你的赌本为100美元H«
endl;
〃起始的赌本
money=100;
n\t\t\tH;
pause();
//暂停,任安一键继续
1
else
return(O);
do
system("
cls"
);
if(money<
0)〃看看有无赌木
H对不起,你没赌M<
TH«
〃若赌本输光,结束稈序return(O);
BET(bet,money);
〃下注的程序
deal(player,cpu,playerturns,cputurns);
〃给玩家和计算机各发两张牌
n\t\t\t你是想要牌(H)还是等待(S):
”;
〃询问是否要牌
cin»
if((ans==h)II(ans==H))〃如果玩家要牌
playerturns++;
〃玩家手中的牌数增加一张
if(playerturns>
5)〃判断玩家手屮的牌数是否超过5张
-\t\t\t你手屮不能超过5张牌“;
〃若超过,则不能继续要牌
if((playerturns<
6)&
&
(ans=='
h'
))〃判断是否符合玩家要牌的条件
hit(player);
〃调用发牌程序
while((ans=='
)II(ans=='
H'
));
〃继续询问玩家是否要牌
for(;
(cpu<
16)&
(cputurns<
6);
cputurns++)〃计算机开始要牌的条件{
\t\t\t计算机要了一张牌u«
hit(cpu);
endlvvendl;
n\t\t\t计算机的牌面为:
cpu«
〃输出计算机的牌血的总点数
\t\t\t你的牌面为:
n«
player«
〃输出玩家牌面的总点数
endl;
results(player,cpu,bet,money,draw,win,lose);
〃判断输贏
replay(ans);
while((ans==*y'
Y'
print(win,lose,draw,money);
〃游戏结朿,输出结果
,\t\t\t\t,'
;
voidrules()〃游戏规则
H\t\tWELCOMETOTHEGAMEM«
n\t\t\tHEREARESOMESIMPLERULESn«
cout«
\t\t\tI:
YouCanonlyhaveamaxof5cards.n«
\t\t\t2:
Ifyoubustyouautomaticallylose.H«
H\t\t\t3:
Ifyouwinyouwindoublewhatyoubet.°
\t\t\t4:
TheDealerstopsatorafter16.M«
n\t\t\t\t"
money)〃接收玩家下注
n\t\t\t你现在有:
$"
money«
n\t\t\t你要下的赌注是:
”;
bet;
if(bet<
0)
bet=bet*-l;
money=money・bet;
cpu,int&
cputurns)〃为计算机和玩家各发两张牌
intplayercard1,playercard2,cpucard1,cpucard2;
playerturns=2;
cputurn=2;
playercard1=random(13,l);
〃取得13与1Z间的随机数
H\n\t\t\tDEALINGHANDM«
wait(350);
〃等待350ms
playercard2=random(13,l);
vvait(150);
cpucard1=random(13,l);
wait(35O);
cpucard2=random(13,l);
if(playercardl>
10)//若牌面的点数大于10,按半点來计点数
playercard1=0.5;
if(playercard2>
10)
playercard=0.5;
if(cpucard1>
cpucard1=0.5;
if(cpucarc!
2>
cpucard2=0.5;
player=playercard1+playercard2;
〃玩家两张牌的总点数cpu=cpucard1+cpucard2;
〃计算机两张牌的总点数cout«
\t\t\t现在你的牌面点数是:
player«
['
plHyercardl«
]'
'
,[M«
playercard2«
H\t\t\t计算机有一张"
cpucard1vv”显示"
endI;
[*]"
«
cpucardl«
H]'
//计算机隐藏一张牌面
total)〃要一张牌
intcard;
card=random(13,I);
if(card>
=10)
card=10;
total=total+card;
〃牌点总数
M\t\t\t牌面是:
H«
card«
〃输出牌面
\t\t\t总的牌面是:
total«
〃输出总点数
〃判断一局
voidresults(intplayer,intcpu,intbet,int&
money,im&
lose)
的结果
if(cpu==player)〃平局
\t\t\t平局"
draw++;
if(player>
21)〃玩家超过21点
\t\t\t很遗憾,你输了"
vvendl;
lose++;
if(cpu<
player)〃玩家赢了
\n\t\t\t恭喜你,你赢T”;
money=money+(bet*2);
〃赌木加上双倍的赌注
win++;
if(cpu>
21)〃计算机超过21点
coutvv"
\t\t\t计算机输TH«
if(player<
21)
\n\t\t\t恭喜你,你赢了"
win++;
if(cpu>
player)〃计算机赢了
H\t\t\t很遗憾,你输了H«
voidreplay(char&
ans)〃询问是占再玩一局
〃输岀最示结果
\n\t\t\t你是否想再玩一局:
cin»
voidprint(intwinsjntlose,intdraw.intmoney)
n\t\t\t\t赢的次数:
winsvvendl;
\t\t\t\t输的次数:
Iose«
\t\t\t\t平局的次数:
M«
draw«
n\t\t\t\t你的赌木:
4.2.21点游戏单机版代码
1、21Poker,cpp
//21Poker,cpp:
定义应用程序的入口点。
#inelude
stdafx.h〃
#include
〃21Poker.h〃
(Tamehngine.h
^defineMAX^LOADSTRTNG100
//全局变量:
GameEnginegameEngine;
HDCimagemDC;
TCHARszTextOut[MAXJ.OADSTRING];
HINSTANCEhlnst;
//当前实例
TCHARszTitle[MAX_LOADSTRING];
//标题栏文本
TCHARszWindowC1ass[MAXJ.OADSTRTNG];
//此代码模块屮包含的函数的前向声明:
//主窗口类名
ATOM
MyRegisterClass(HINSTANCEhlnstance);
LRESULTCALLBACK1NTPTRCALLBACKvoid
void
WndProc(HWND,UINT,WPARAM,LPARAM);
About(HWXD,U1NT,WPARAM,LPARAM);
ShowGamelnformation(intstatelD,HWNDhWnd);
ShowImage(HWXDhWnd);
ShowBG(HWNDhWnd);
intAP1ENTRY
tWinMain(HINSTANCEhlnstance,
H1NSTANCEhPrevInstance,
LPTSTRlpCmdLine,intnCmdShow)
UNREFERENCEDPARAMETER(hPrevInstance);
UNREFERENCEDPARAMETER(IpCmdLine);
//TODO:
在此放置代码。
MSGmsg;
HACCELhAccelTable;
//初始化全局¥
符串
_tcscpy(szTextOut,T("
请选择开始游戏或者直接退出"
));
LoadString(hInstance,IDSAPPTITLE,szTitle,MAXLOADSTRING);
LoadString(hInstance,IDCMY21POKER,szWindowClass,MAXLOADSTRING);
MyRegisterClass(hInstanee);
//执行应用稈序初始化:
if(!
Initlnstanee(hlnstance,nCmdShow))
returnFALSE;
hAccelTable=LoadAccelerators(hlnstance,MAKEINTRESOURCE(IDCMY21POKER));
//主消息循环:
while(GetMessage(&
msg,NULL,0,0))
TranslateAccclerator(msg.h\vnd,hAccelTable,&
msg))
TranslateMessage(&
msg);
DispatchMessage(&
return(int)msg.wParam;
//
//函数:
MyRegisterClass()
//目的:
注册窗口类。
//注释:
//仅当希望
//此代码与添加到Windows95屮的“RegisterClassEx”
//函数Z前的Win32系统兼容时,才需要此函数及其用法。
调用此函数I•分重要,
//这样应用稈序就可以获得关联的
//“格式正确的”小图标。
ATOMMyRegisterClass(HINSTANCEhlnstance)
WNDCLASSEXwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex・style
=CSHREDRAWCSVREDRAW;
wcex・lpfnWndProc
=WndProc;
wcex・cbClsExtra
=0;
wcex・cbWndExtrs
=o;
wcex・hlnstance
=hlnstanee;
wcex・hlcon
=LoacIIcon(hlnstance,MAKEINTRESOL'
RCE(1DIMY21P0KER));
wcex・hCursor
=LoadCursor(NULL,1DCARROW);
wcex・hbrBackground
=(HBRUSH)(COLORWINDOW+1);
wcex・lpszMcnuNamc
=MAKEINTRESOURCE(IDCMY21POKER);
wcex・lpszCldssNamc
二szWindowClass;
wcex・hlconSm
二Loadicon(wcex.hlnstance,MAKE1NTRESOURCE(IDISMALL));
returnRegisterClassEx(&
wcox);
InitInstance(HINSTANCE,int)
//目的:
保存实例句柄并创建主窗口
//注释:
//在此函数屮,我们在全局变量屮保存实例旬柄并
//创建和显示主稈序窗口。
BOOLInitInstance(HINSTANCEhlnstance,intnCmdShow)
f
HWNDhWnd;
hlnst=hlnstance;
//将实例句柄存储在全局变量屮
hWnd=CreateWindow(szWindowClass,szTitle,WSOVERLAPPEDWINDOW,
CWUSEDEFAULT,0,CWUSEDEFAULT,0,NULL,NULL,hlnstance,NULL);
if(!
hWnd)
!
MoveWindow(hWnd,10,10,600,480,true);
ShowWindow(hWnd,nCmdShow);
UpclateWindow(hWnd);
returnTRUE;
////函数:
WndProc(HWXD,UINT,WEARAM,LPARAM)
处理主窗口的消息。
//WMCOMMAND-处理应用程序菜单
//WMPAINT-绘制主窗口
//WMDESTROY-发送退出消息并返冋
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAM1Param)f
intwmld,wmEvent;
PAINTSTRUCTps;
HDChdc;
switch(message)
caseWMCOMMAND:
wmld=LOWORD(wParam);
wmEvcnt=HIWORD(wParam);
//分析菜单选择:
switch(wmld)
case1DMABOUT:
Dialog
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络游戏 开发 期末 报告 docx