收藏 分销(赏)

二十一点游戏设计报告-学位论文.doc

上传人:可**** 文档编号:2156619 上传时间:2024-05-21 格式:DOC 页数:20 大小:224KB 下载积分:10 金币
下载 相关 举报
二十一点游戏设计报告-学位论文.doc_第1页
第1页 / 共20页
二十一点游戏设计报告-学位论文.doc_第2页
第2页 / 共20页


点击查看更多>>
资源描述
课程设计实验报告书 程序名:二十一点游戏 班级:12计算机科学与技术一班 指导老师:韩静 小组成员:刘宇、徐含、叶安江 二十一点游戏设计报告 一、 问题描述: 要求支持键盘操作以及计算机的自动判断,并能够在界面上及时准确的显示当前牌面、点数,实现得分的自动加减及显示。 二、功能分析: 二十一点游戏需解决的问题包括: 1、 游戏开始、进行、结束过程中的界面设计,以及发牌等动画的显示。 2、 产生随机的牌点以及显示在牌面。 3、 如何利用键盘实现开牌、要牌等操作。 4、 如何实现发牌的动画效果。 5、 如何实现筹码的录入以及玩家赌金的自动加减。 6、 如何保存赌金的数值,以便于下次开始游戏时能够显示最新的赌金。 三、 程序设计: 1、 程序设计总体结构:首先,初始化进入图形模式,提示按键开始游戏。开始游戏,进入游戏的主题部分,处理程序实现过程中的各种事件和函数。在处理过程中,判断游戏是否结束。若未结束,从开始界面处执行程序,若结束,则跳出循环,结束游戏。 初始化参数 开始界面、动画 开始游戏 处理和实现游戏进行过程中的的各种事件和功能 游戏结束?? 关闭图形模式 否 是 主函数为: main() { int num1,num2,i,p; char index; p=1; kaishijiemian(); /*调用开始界面的函数*/ gundong(); /*调用滚动函数*/ while(p==1){ dujin(1); /*读取赌金*/ youxijiemian(); /*进入游戏界面*/ srand((unsigned)time(NULL )); for(i=1;i<=10000;i++){ num1=rand()%52; num2=rand()%52; index=pai[num1]; pai[num1]=pai[num2]; pai[num2]=index; } fapai(); /*发牌函数*/ panduan(); /*判断函数*/ dujin(2); /*保存赌金*/ ky=bioskey(0); switch(ky){ case Key_Esc: p=0;break; default: p=1;break;} } closegraph(); } 2、 界面设计 开始界面: 游戏界面: 结束界面: 3、 函数设计: 本程序由一个主函数,13个子函数,共14个函数组成。 函数间相互关系如下图: 初始化参数 开始游戏 gongdong() kaishi() 开始界面、动画 dujin(1)读取赌金 youxijiemian()( 1<J<5&&ky=Key_Y? 是 否 jisuanWJ() WJ() wanjiapai() fapai() 处理事件与实现功能 jisuanDN() diannaopai() Computerds>16? jisuanDN() DN() 是 是 panduan() playerds p=1??? dujin(1)保存赌金 jieshu(n) 游戏结束 Computerds 关闭图形模式 否 详细描述: 文件名 函数原型 函数功能 函数处理 21dian .c kaishi() 创建游戏的进入界面 通过绘图、画线、填色、显示数字等生成界面 gundong() 从进入界面到切到游戏界面时产生一段动画 youxijiemian() 游戏进行时的背景,其上显示各种提示以及筹码、赌金等 对玩家键入的键码、定义的值进行分析判断,通过绘图、画线、填色、显示数字等生成游戏界面 fapai() 游戏进行中发牌的总控制 通过对WJ()、DN()、wanjiapai()、 diannaopai()、jisuanWJ()、jisuanDN()等函数的调用,实现对发牌的总控制 panduan() 比较玩家、电脑的点数大小,并计算出相应的赌金 对fapai()函数中传递来的playerds、computerds进行判断,判定游戏的胜负,并改变money的值 jieshu() 显示双方点数。提示游戏操作,生成游戏结果 通过绘图、画线、填色、显示数字等生成界面, WJ() DN() 对游戏过程中玩家和电脑的进行操作,便于融入程序,起过渡作用 wanjiapai(int g) diannaopai(int h) 绘制游戏过程中的牌以及显示点数 通过对movebar、 movebar1的调用实现图形化牌、牌点 jisuanWJ ()、 jisaunDN() 计算牌的点数,并赋值到computerds、playerds中 通过一系列的比较,得出双方的牌点数 四、 小组分工 全部的图形界面、及动画设计 刘宇 文件部分,以及键值框的设计 徐含 主函数以及除图形函数、文件部分以外的子函数 叶安江 五、 源代码: #include<bios.h> #include<graphics.h> #include<math.h> #include<dos.h> #include<stdlib.h> #include<stdio.h> #include<time.h> #include<conio.h> #define Key_Esc 0x11b #define Key_Enter 0x1c0b #define Key_Y 0x1579 #define Key_N 0x316e int winner; /*胜者数*/ int playerds,computerds; /*玩家、电脑的点数*/ char player[6]; char computer[4]; int money=2000; int wager; /*下注的赌金*/ int ky; int j,m; int paishu; void kaishi(); /*定义开始动画*/ void gundong(); void youxijiemian(); void fapai(); /*定义发牌函数*/ void panduan(); /*定义判断函数*/ void dujin(int b); /*定义读取、保存赌金的函数*/ void WJ(); /*有关玩家电脑操作的函数*/ void DN(); void wanjiapai(int g); /*玩家和电脑的发牌动画*/ void diannaopai(int h); void jisuanWJ(); /*计算玩家和电脑的点数*/ void jisuanDN(); void jieshu(int n); /*游戏结束动画*/ char pai[54]={'A','2','3','4','5','6','7','8','9','10','J','Q','K', 'A','2','3','4','5','6','7','8','9','10','J','Q','K', 'A','2','3','4','5','6','7','8','9','10','J','Q','K', 'A','2','3','4','5','6','7','8','9','10','J','Q','K','\0'}; main(){ int num1,num2,i,p; char index; p=1; kaishi(); gundong(); while(p==1) { dujin(1); /*读取赌金*/ youxijiemian(); /*进入游戏界面*/ srand((unsigned)time(NULL )); /*洗牌*/ for(i=1;i<=10000;i++) { num1=rand()%52; num2=rand()%52; index=pai[num1]; pai[num1]=pai[num2]; pai[num2]=index; } fapai(); /*发牌函数*/ panduan(); /*判断函数*/ dujin(2); /*保存赌金*/ ky=bioskey(0); switch(ky){ case Key_Esc: p=0;break; default: p=1;break;} } closegraph(); } /*调用开始动画*/ void kaishi() { int graphdriver,graphmode; graphdriver=DETECT; initgraph(&graphdriver,&graphmode,""); cleardevice(); setbkcolor(9); setviewport(10,10,630,470,2); /*开图视口*/ setfillstyle(1,2); setcolor(YELLOW); floodfill(80,80,15); ellipse(20,20,45,45,20,10); settextstyle(2,0,9); setfillstyle(3,7); floodfill(20,20,8); setfillstyle(1,10); floodfill(21,300,1); setcolor(6); ellipse(300,80,0,360,120,70); settextstyle(0,0,2); outtextxy(190,75,"Welcome Game!"); setviewport(100,200,540,380,0); setcolor(2); setfillstyle(1,12); rectangle(20,20,420,120); floodfill(50,100,2); settextstyle(4,0,3); setcolor(YELLOW); outtextxy(110,60,"Press any key to continue!"); getch(); } /*调用滚动函数*/ void gundong() { int x,y; setcolor(5); outtextxy(150,90,"Have a good time!"); ky=bioskey(0); if(ky==Key_Esc) closegraph(); setcolor(7); for(x=0;x<80;x++) { for(y=0;y<10;y++){ /*改变滚动条速度*/ line(-200,x+y*60-200,600,x+y*60-200); delay(500); } } clearviewport(); } /*调用赌金保存、读取函数*/ void dujin(int b) { FILE *fp; if(b==1) { if((fp=fopen("a.txt","r"))==NULL){ settextstyle(TRIPLEX_FONT,HORIZ_DIR,2); outtextxy(120,60,"What a pity!You rocord is lost!"); } fscanf(fp ,"%d",&money); if(fclose(fp)){ settextstyle(TRIPLEX_FONT,HORIZ_DIR,2); outtextxy(120,60,"What a pity!Can not save the money.");} } if(b==2) { if((fp=fopen("a.txt","r="))==NULL){ settextstyle(TRIPLEX_FONT,HORIZ_DIR,2); outtextxy(120,60,"What a pity!You rocord is lost!"); } fprintf(fp,"%d",money); if(fclose(fp)){ settextstyle(TRIPLEX_FONT,HORIZ_DIR,2); outtextxy(120,60,"What a pity!Can not save the money."); } } } /*调用游戏界面*/ void youxijiemian() { int x,y,p,graphdriver,graphmode; char s[30]; /*存放转换数据类型的数组*/ char a[8][2]={{0}}; x=0;p=0; graphdriver=DETECT; initgraph(&graphdriver,&graphmode,""); cleardevice(); setbkcolor(GREEN); setcolor(LIGHTGRAY); setfillstyle(1,YELLOW); arc(250,10,220,320,220); setcolor(7); setfillstyle(1,9); arc(250,10,220,320,200); setcolor(LIGHTGRAY); line(500,2,500,477); line(500,240,640,240); settextstyle(DEFAULT_FONT,HORIZ_DIR,2); outtextxy(178,30,"COMPUTER"); outtextxy(194,280,"PLAYER"); outtextxy(20,360,"MONEY"); outtextxy(540,65,"KEY"); outtextxy(20,250,"WAGER"); settextstyle(TRIPLEX_FONT,HORIZ_DIR,2); outtextxy(524,105,"Enter is Start"); outtextxy(524,135,"Esc is Quit"); outtextxy(524,165,"Y is Yes"); outtextxy(524,195,"N is No"); rectangle(20,380,90,420); setfillstyle(1,6); settextstyle(0,0,1); setcolor(YELLOW); sprintf(s,"%d",money); outtextxy(30,395,s); rectangle(20,275,90,310); settextstyle(2,0,5); setfillstyle(1,5); settextstyle(0,0,1); settextstyle(TRIPLEX_FONT,HORIZ_DIR,2); a[x][0]=getch(); /*输入筹码*/ while(a[x][0]!=13||x==0) { if(a[x][0]>='0'&&a[x][0]<='9'){ outtextxy(25+x*8,295,a[x]); x++; } a[x][0]=getch(); if(x==7&&a[x][0]!=13) a[x][0]=65; } for(y=0;y<x;y++) p=p*10+(a[y][0]-'0'); } /*调用发牌函数*/ void fapai(){ int i; int h,g; h=g=2; /*开始各发两张牌*/ player[0]=pai[0]; player[1]=pai[1]; paishu=2; computer[0]=pai[5]; computer[1]=pai[6]; j=1; m=1; for(i=0;i<2;i++){ wanjiapai(g);g++;} for(i=0;i<2;i++){ diannaopai(h);h++;} j=2; while(j<5&&ky!=Key_N) /*显示提示,询问玩家是否要牌*/ { setcolor(RED); settextstyle(DEFAULT_FONT,HORIZ_DIR,2); outtextxy(524,300,"CHOOSE"); settextstyle(TRIPLEX_FONT,HORIZ_DIR,3); outtextxy(510,330," Do you want "); outtextxy(510,350,"another card?"); outtextxy(510,385,"Yes or No?"); ky=bioskey(0); /*根据指令,决定是否发牌*/ switch(ky) { case Key_Y:{ player[j]=pai[j]; wanjiapai(g); g++; j++; paishu++; break;} case Key_N:{ DN(); break;} default: break; } jisuanDN(m); /*计算电脑牌的点数*/ } WJ(); /*对玩家牌的操作*/ } void wanjiapai(int g) /*玩家发牌动画*/ { int x,y,d; char s[1]; void movebar1(int bar); d=0; if(g!=2) { for(x=17;x>(d+5);x--){ movebar1(x * 20); d++;} setcolor(14); rectangle((g-3)*20+200,340,(g-3)*20+250,420); setcolor(GREEN); line((g-4)*20+250,341,(g-4)*20+250,419); setfillstyle(1,5); floodfill((g-3)*20+205,350,14); setcolor(14); settextstyle(1,0,1); sprintf(s,"%c",player[j]); outtextxy((g-3)*20+205,360,s); } if(g==2) { for(x=17;x>5;x--){ movebar1(x*20);} setcolor(14); rectangle((g-3)*20+200,340,(g-3)*20+250,420); setcolor(GREEN); setfillstyle(1,5); floodfill((g-3)*20+205,350,14); setcolor(14); settextstyle(1,0,1); sprintf(s,"%c",player[0]); outtextxy((g-3)*20+205,360,s);} } void movebar1(int bar) /*玩家牌 设窗口并画填色牌*/ { setcolor(14); rectangle(bar+90,340,bar+140,420); setfillstyle(8,13); floodfill(bar+91,350,14); delay(50000); setfillstyle(1,2); floodfill(bar+91,350,14); setcolor(2); rectangle(bar+90,340,bar+140,420); } /*玩家的操作*/ void WJ() { playerds=0; for(j=0;j<paishu;j++) jisuanWJ(j); } void jisuanWJ(int j){ if(player[j]=='A') { playerds=playerds+11; if(playerds>21) playerds=playerds-10; } if(player[j]=='1') playerds=playerds+1; if(player[j]=='2') playerds=playerds+2; if(player[j]=='3') playerds=playerds+3; if(player[j]=='4') playerds=playerds+4; if(player[j]=='5') playerds=playerds+5; if(player[j]=='6') playerds=playerds+6; if(player[j]=='7') playerds=playerds+7; if(player[j]=='8') playerds=playerds+8; if(player[j]=='9') playerds=playerds+9; if(player[j]=='10') playerds=playerds+10; if(player[j]=='J') playerds=playerds+10; if(player[j]=='Q') playerds=playerds+10; if(player[j]=='K') playerds=playerds+10; } /*电脑发牌动画*/ void diannaopai(int h) { int x,c,y; char s[1]; void movebar(int bar); char pai[5]; c=0; if(h!=2) { h=2-h; for(x=1;x<(10-c);x++){ movebar(x * 20); c++;} setcolor(14); rectangle((h+4)*20+200,60,(h+4)*20+250,140); setcolor(GREEN); line((h+5)*20+200,61,(h+5)*20+200,139); setfillstyle(1,5); floodfill((h+4)*20+205,65,14); setcolor(14); settextstyle(1,0,1); sprintf(s,"%c",computer[m]); outtextxy((h+4)*20+240,80,s); } if(h==2) { h=h-2; for(x=1;x<10;x++) movebar(x * 20); setcolor(14); rectangle((h+4)*20+200,60,(h+4)*20+250,140); setcolor(GREEN); setfillstyle(8,13); floodfill((h+4)*20+205,70,14); setcolor(14); } } void movebar(int bar) /*电脑牌 设窗口并画填色牌*/ { setcolor(14); rectangle(bar+90,60,bar+140,140); setfillstyle(8,13); floodfill(bar+91,70,14); delay(50000); setfillstyle(1,2); floodfill(bar+91,70,14); setcolor(2); rectangle(bar+90,60,bar+140,140); } /*电脑的操作*/ void DN() { int h; computerds=0; for(m=0;m<=1;m++) jisuanDN(m); if(computerds<=16) { computer[2]=pai[7];
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 学术论文 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服