资源描述
课程设计实验报告书
程序名:二十一点游戏
班级: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];
展开阅读全文