C++课程设计---21点纸牌游戏程序
- 格式:doc
- 大小:72.00 KB
- 文档页数:11
实用标准文案实验报告课程名称:C语言程序设计实验项目:21点扑克牌游戏设计专业班级:电子信息工程实验室号:信息205 实验组号:xx 实验时间:2010-5-4 批阅时间:指导教师:成绩:沈阳工业大学实验报告(适用计算机程序设计类)专业班级:电子信息工程0902 学号:姓名:实验名称:21点扑克牌游戏附件A 沈阳工业大学实验报告(适用计算机程序设计类)专业班级:电子信息工程0902 学号:姓名:实验步骤或程序:(我所做的程序是作弊程序改动已经加粗)#include<time.h>#include<stdio.h>#include<conio.h>#include<stdlib.h>void Wait_f(int);void Pause_f();/*暂停,按任意键继续*/int Random_f(long ,long );/*返回两个参数之间的随机数*/void Replay_f(char *);/*询问是否重开一局*/void Hit_f(int *);/*发一张牌*/void Deal_f(int *,int *,int *,int *);/*双方各发两张牌*/void Bet_f(int *,int *);/*接受下注的数目*/void Print_f(int ,int ,int ,int );/*打印结果*/void Rules_f();/*显示游戏规则*/void Results_f(int ,int ,int ,int *,int *,int *,int *);/*统计结果(输赢平)*/void Hit_f2(int * npTotal,int a);int nnn;int main(){int nPlayer=0,nCpu=0,nWin=0,nLose=0,nDraw=0,nPlayerTurns=0, nCpuTurns=0,nMoney=0,nBet;/* nPlayer——玩家手中全部牌的点数和,nPlayerTurns——玩家手中牌的数量*/char chAnswer;char mmm;int a;system("cls");/*执行系统命令“清屏”*/Rules_f();printf("\t\t\tWOULD YOU LIKE TO PLAY? ");scanf("%c",&chAnswer);if((chAnswer=='y')||(chAnswer=='Y')){printf("\t\t\tI WILL LET YOU START WITH $100\n");nMoney=100;printf("\t\t\t");Pause_f();}else{return(0);}do{system("cls");if(nMoney<0){printf("Your broke\n");return(0);}Bet_f(&nBet,&nMoney);/*接受下注的数目*/Deal_f(&nPlayer,&nCpu,&nPlayerTurns,&nCpuTurns);/*双方各发两张牌*/ printf("\t\t\tWould you want to cheat? yes or no?");scanf("%c",&mmm);if((mmm=='y')||(mmm=='Y')){printf("%d",nnn);printf("\t\t\twhich card do you want?");scanf("%d",&a);}system("cls");do{printf("\t\t\tWould You Like To Hit or Stay :");/*询问玩家是否接着要牌*/scanf(" %c",&chAnswer);if((chAnswer=='h')||(chAnswer=='H')){nPlayerTurns++;/*计算总牌数*/if(nPlayerTurns>5)/*看是否允许再要牌*/{printf("\t\t\tYou Can't Have more than 5 cards");}}if((nPlayerTurns<6)&&(chAnswer=='h')){printf("\n");if((mmm=='y')||(mmm=='Y'))Hit_f2(&nPlayer,a);else Hit_f(&nPlayer);/*为玩家发一张牌*/}}while((chAnswer=='h')||(chAnswer=='H'));for(;(nCpu<16)&&(nCpuTurns<6);nCpuTurns++)/*计算机要牌的条件*/{printf("\n");printf("\t\t\tThe Dealer Takes A Card");Hit_f(&nCpu);/*为计算机发一张牌*/}printf("\n\n");printf("\t\t\tThe Dealer Has A Total: %d\n", nCpu);/*显示总点数*/printf("\t\t\tYou Have A Total Of: %d\n", nPlayer);printf("\n");Results_f(nPlayer,nCpu,nBet,&nMoney,&nDraw,&nWin,&nLose);/*计算最后的结果(统计输赢平的局数)*/Replay_f(&chAnswer);/*询问是否重开一局*/}while((chAnswer=='y')||(chAnswer=='Y'));Print_f(nWin,nLose,nDraw,nMoney);/*打印最后结果*/printf("\n");printf("\t\t\t\t");return(0);}void Rules_f() /*这个函数显示游戏规则*/{printf("\t\t WELCOME TO ISAAC SHAFFERS BLACK JACK GAME\n");printf("\t\t\t HERE ARE SOME SIMPLE RULES\n");printf("\t\t\t1:You Can only have a max of 5 cards.\n");printf("\t\t\t2:If you bust you automatically lose.\n");printf("\t\t\t3:If you win you win double what you bet");printf("\t\t\t4:The Dealer stops at or after 16.\n");printf("\t\t\t\t");getchar();}void Bet_f(int* npBet,int* npMoney) /*该函数接受玩家下注,并计算赌资的总数*/{system("cls");printf("\t\t\tYOU HA VE:$%d\n",*npMoney);printf("\t\t\tHow Much Do You Wish To Bet:");scanf("%d",npBet);if(*npBet<0){*npBet=*npBet*(-1);}*npMoney=*npMoney-*npBet;}void Deal_f(int* npPlayer,int*npCpu,int*npPlayeReturns,int *npCpuReturns)/*该函数是给计算机与玩家各发两张牌*/{int nPlayerCard1,nPlayerCard2,nCpuCard1,nCpuCard2;*npPlayeReturns=2;*npCpuReturns=2;nPlayerCard1=Random_f(13,1);printf("\n\t\t\tDEALING HAND\n");getchar();Pause_f();nPlayerCard2=Random_f(13,1);Pause_f();nCpuCard1=Random_f(13,1);Pause_f();nCpuCard2=Random_f(13,1);if (nPlayerCard1>=10){nPlayerCard1=10;}if (nPlayerCard2>=10){nPlayerCard2=10;}if (nCpuCard1>=10){nCpuCard1=10;}if (nCpuCard2>=10){nCpuCard2=10;}*npPlayer=nPlayerCard1+nPlayerCard2;*npCpu=nCpuCard1+nCpuCard2;printf("\t\t\tYOU HA VE a total of:%d\n",*npPlayer);printf("[%d]", nPlayerCard1);printf("[%d]",nPlayerCard2);printf("\n");printf("\t\t\tThe DEALER HAS A %d SHOWING",nCpuCard1);printf("\n");printf("[*][%d]",nCpuCard1);nnn=nCpuCard2;}void Hit_f(int * npTotal) /* 发一张牌,返回点数之和*/{int nCard;nCard=Random_f(13,1);if(nCard>=10){nCard=10;}* npTotal=* npTotal+nCard;printf("\t\t\tThe card is a :%d\n", nCard);printf("\t\t\tTotal is :%d\n", * npTotal);}void Results_f(int nPlayer,int nCpu,int nBet,int * npMoney,int * npDraw,int* npWin,int * npLose)/*统计结果(输赢平及输赢平的局数)*/ {if(nCpu==nPlayer){printf("\t\t\tIT WAS A DRAW HOUSE WINS\n");++* npDraw;}if(nPlayer>21){printf("\t\t\tYou Bust\n");++* npLose;}else{if(nCpu<nPlayer){printf("\n\t\t\tYOU WIN");*npMoney=*npMoney+(nBet*2);++* npWin;}}if(nCpu>21){printf("\t\t\tDealer Bust\n");if(nPlayer<=21){printf("\n\t\t\tYOU WIN");++* npWin;*npMoney=*npMoney+(nBet*2);}}else{if(nCpu>nPlayer){printf("\t\t\tYOU LOSE\n");++* npLose;}}}void Replay_f(char *chpAns) /*询问是否重开一局*/ {printf("\n\t\tWould You Like To Play This Game Again:");scanf("%c",chpAns);}void Print_f(int nWins,int nLose,int nDraw,int nMoney){printf("\t\t\t\tWINS:%d\n", nWins);printf("\t\t\t\tLOSE:%d\n", nLose);printf("\t\t\t\tDRAWS:%d\n",nDraw);printf("\t\t\t\tMONEY:%d\n",nMoney);}void Wait_f(int nMilli){int nStart1,nStart2;for(nStart1=0;nStart1<nMilli*100;nStart1++)for(nStart2=0;nStart2<nMilli*100;nStart2++){;}}void Pause_f(){printf("Press Any Key To Continue");getchar();}int Random_f(long lBigNumber, long lSmallNumber) /*选择两个参数之间的随机数*/{int nRan;srand((unsigned)time(NULL));nRan=rand()%(lBigNumber-(lSmallNumber-1))+lSmallNumber;return(nRan);}void Hit_f2(int * npTotal,int a) /* 发一张牌,返回点数之和*/{int nCard;nCard=a;if(nCard>=10){nCard=10;}* npTotal=* npTotal+nCard;printf("\t\t\tThe card is a :%d\n", nCard);printf("\t\t\tTotal is :%d\n", * npTotal);}。
#include<iostream.h>#include<stdlib.h>#include<conio.h>#include<time.h>#include<iostream.h>#include<string.h>class Game{public:Game(){win=0,lose=0,draw=0,playerturns=0,cputurns=0,money=100,bet=0;player=0,cpu=0;char answer1[]="123456";strcpy(answer,answer1);char answer2[]="654321";strcpy(daan,answer2);};void rules();//显示规则void BET(); //下注void deal();//交易void run(Game &);//进行异常处理void hit1();//拿下一牌void hit2();//确保庄家不会爆庄并且点数大于16void print();//打印出最后结果void results();//最后的胜利结果void check();//检查是否爆庄Game operator=(Game &d);//运算符重载void replay(char &ans);//是否进行新一轮的游戏void clean();//清屏void wait(int);void pause();int GetInt(int,int);int random(long,long);private:int playerturns,cputurns,money;int win,lose,draw,bet;float player,cpu;char answer[7];char daan[7];};//---------------------------------------------------------------------------------------void Game::wait(int milli){clock_t start;start=clock();while( ( clock()-start ) < milli );}//========================================================= void Game:: pause(){cout<<"Press Any Key To Continue"<<endl;getch();}//=========================================================int Game::GetInt(int L=0,int H=100){int ent;cout<<"Please Enter A Number Between "<<L<<" and "<<H<<endl;cin>>ent;while((ent<L)||(ent>H)){cout<<"Error"<<endl;cout<<"Value must be between "<<L<< " and "<<H<<endl;cin>>ent;}return(ent);}//==========================================================int Game::random(long hi,long lo)//随机抽牌{int ran;srand((unsigned)time(NULL));ran=rand()%(hi-(lo-1))+lo;return(ran);}//============================================================= void Game::rules(){cout<<"\t\t\t *********欢迎使用21点游戏软件*********"<<endl;cout<<endl;cout<<endl;cout<<"\t\t\t 游戏规则:"<<endl;cout<<endl;cout<<"\t\t\t ※①:每轮游戏你最多只可以有5牌。
C语言21点游戏#include#include#include#include#includeint Bookies_score=1000,/*庄家金币*/Rlayer_score=1000;//玩家金币int Bookiesscore=0,/*庄家当前点数*/Rlayerscore=0;//玩家当前点数int Random,/*玩家随机数*/Randoms;//庄家随机数int Bets_P;//玩家下注int Card;//是否发牌int i=1;int s=1;int main(void){Star_interface();//开始界面getch();system("CLS");//---------------------------------以下为产生玩家随机数发牌代码Judge_WorL();//输或者赢函数}//------------以下开始界面int Star_interface(){int i;system("color 9B");printf("\t\t\t C语言游戏:二十一点\n");printf("\n\n\n\n\n\n\n");printf(" 〓〓〓〓〓〓〓〓");printf("\n 〓\n 〓〓〓〓〓〓〓〓〓〓〓〓〓〓\n 〓\n 〓\n");printf(" 〓〓〓〓〓〓〓〓\n");printf("\n\n");printf("\t\t\t ①:查看规则②:开始游戏\n\n");printf("\t\t\t 制作人:小二\n\n");printf("\t\t\t 版本号:1.0\n\t\t\t");scanf("%d",&i);switch(i){case 1:system("CLS");printf("\t\t\t 二十一点游戏规则\n\n\n\t 介绍:手中所有的牌点数之和不超过21点,谁更接近21点,就赢得游戏。
《C语言课程设计》题目:程序设计基础课程设计班级:姓名:指导教师:所属系部:电子科学与技术系2009年 6 月24 日21点游戏设计1 游戏规则此游戏,原则上是可以由不限定的人数来玩,但是随着参与人数的增加,在最后成绩的比较方面会比较的繁琐,不像两个人之间的比赛结果那么明显,所以也应该将参与人数控制在一定的范围之内。
确定参与人数后,系统会随机为每个人发三张牌,然后计算这三张牌的和进行比较。
如果这三张牌的和大于21,则此人将会输掉比赛,除非其他人的和也大于21(即假若每个人的三张牌的和都大于21时,该局为平局,打成平手)。
如果有的和大于21,有的和小于21,则大于21的人输掉比赛,再比较小于21的部分,谁的三张牌的和最接近21,则谁是该局的赢家。
一局玩完后,玩者可以根据自己情况进行选择是否要再玩一局。
若选择再玩时,系统会再进行下一次的循环。
2 程序算法○1由系统随机产生几组随机数,每组3个随机数。
○2计算每一组的三个随机数的和。
○3比较每组和的大小。
○4得出比赛结果3 关键算法流程图总体框架4 程序代码/* Note:Your choice is C IDE */#include <stdlib.h>#include <stdio.h>#include <time.h>#define N 5main( ){int i,t,flag, j,m;int b[8],a[3*N];char c;b[1]=0;flag=1;while (flag) //控制循环{srand(time(NULL)); /scanf("%d",&j); //用j控制组数for(t=0;t<3*j;t++) //产生几组随机数{if (t%3==0)printf("\n");a[t]=rand()%13+1;printf("%5d",a[t]);}printf("\n");for(i=1;i<=j;i++) //求每组随机数的和{for(t=3*(i-1);t<3*i;t++)b[i]=b[i]+a[t];printf("b[%d]=%d\n",i,b[i]);b[i+1]=0;}printf("\n");{for(t=1;t<j;t++) //对和的大小进行排序for(i=1;i<=j-t;i++)if(b[i]>b[i+1]){m=b[i+1];b[i+1]=b[i];b[i]=m;}for (i=1;i<=j;i++)printf("%5d",b[i]);}printf("\n");for (i=1;i<=j;i++) //得出结论if(b[i]>21){printf("这一局为第%d个人赢\n是否再玩一局,若输入'Y'则继续游戏,输入'N'结束游戏\n",i-1);getchar(); //与while语句是一个系统c=getchar();if(c=='Y')flag=1;elseflag=0;}}}5在程序设计中,出现的问题和解决方案:由于是多组数据之间的比较,首先在同时产生几组随机数时遇到障碍,产生随机数的代码是从网上搜索得到的,再加上一些修改,达到所需的要求,同时有一些小的细节是在老师帮助下完成的。
21点游戏程序设计说明一、功能:一个21点小游戏,游戏开始时,如下第一张截图显示,然后按下开始,再按下发牌,就会庄贤两家各发两张牌,庄家有一张牌是盖着的,接下来贤家根据自己的点数决定要不要据需要牌。
如果点数大于21点则这一句就输了,扣25块的金额,如果按不要,且没大于21点,则庄家盖着的牌翻过了,然后庄贤两家的点数进行比较,谁的点数最接近21点则谁赢这一局。
二、主要实现方法:定义发牌函数:fapai()来产生一张牌,通过然后将牌所对应的图片通过pictureBox.ImageLocation =..............放入pictureBox中。
添加两个timer空间,timer1来控制发牌时庄贤两家各发的两种牌。
Timer2 控制当贤家点击不要之后庄家是否继续要牌,所以根据人的思维,在timer2中,只有当庄家的点数小于16点时才继续要牌,否则则不要了,与贤家进行比较,定义了两个函数showwin()和showloss()分别来显示输了个赢了一局。
然后还有check()和comper()两个函数,check()来检查发牌和要牌过程中庄家和贤家的点数是否大于了21点。
Comper()函数则用来最后庄贤两家的分数进行比较时看谁的分数更接近21点。
还添加了一个规则窗体来显示游戏规则。
运行截图:程序源代码:using System;using System.Collections.Generic; using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;namespace _1点游戏vs2005版{public partial class Form1 : Form{public Form1(){InitializeComponent();label4.Text = moneyNew.ToString();}private void Form1_Load(object sender, EventArgs e){button1.Hide();button2.Hide();button3.Hide();button4.Show();}Random ra = new Random();string str;int count1 = 0;int timer1count = 0;int timer2count = 0;int num;int score_Zhuang = 0;int score_Xian = 0;string jpg = ".jpg";string dizhi = "image\\";int money = 100;int moneyNew = 100; //通过改money和moneyNew可改初始的钱数;string pcdi;规则f1 = new规则();public void fapai(){pai = ra.Next(1, 5);if (pai == 1){num = ra.Next(1, 14);str = "m" + num.ToString();if (num == 1)num = 11;if (num == 11){str = "mj";num = 10;}if (num == 12){str = "mq";num = 10;}if (num == 13){str = "mk";num = 10;}}if (pai == 2){num = ra.Next(1, 14);str = "f" + num.ToString();if (num == 1)num = 11;if (num == 11){str = "fj";num = 10;}if (num == 12){str = "fq";num = 10;}if (num == 13){str = "fk";num = 10;}if (pai == 3){num = ra.Next(1, 14);str = "h" + num.ToString();if (num == 1)num = 11;if (num == 11){str = "hj";num = 10;}if (num == 12){str = "hq";num = 10;}if (num == 13){str = "hk";num = 10;}}if (pai == 4){num = ra.Next(1, 14);str = "r" + num.ToString();if (num == 1)num = 11;if (num == 11){str = "rj";num = 10;}if (num == 12){str = "rq";num = 10;}if (num == 13){str = "rk";num = 10;}}}public void restart() //重新开始{score_Zhuang = 0;score_Xian = 0;label1.Text = "0";count1 = 0;timer2count = 0;button1.Hide();button2.Hide();button3.Hide();label4.Text = money.ToString();if (money <= 0){MessageBox.Show("Game Over! You Loss!");newGamer();button3.Hide();money = moneyNew;label4.Text = money.ToString();}if (money >= 2 * moneyNew){MessageBox.Show("Congratulations! You Win!");newGamer();button3.Hide();money = moneyNew;label4.Text = money.ToString();}label6.Text = "0";button4.Show();}void showwin(){MessageBox.Show("你赢了25元!\n继续吗?", "你赢了这盘!", MessageBoxButtons.YesNo);money += 25;restart();}void showloss(){MessageBox.Show("你输了25元!\n继续吗?", "你输了这盘!", MessageBoxButtons.YesNo);money -= 25;restart();}void check(int i, int j){if (i > 21){showwin();}if (j > 21){showloss();}}void comper(int i, int j){if (i > j){showloss();}else if (i < j){showwin();}else{MessageBox.Show("平局");restart();}}private void timer1_Tick_1(object sender, EventArgs e) //控制刚开始发牌时发的四张牌。
数学与计算机学院课程设计说明书课程名称: 面向对象程序设计-课程设计课程代码: 8404101题目: 21点的扑克牌游戏年级/专业/班: 09/软件工程/1班学生姓名:学号: 312009*********开始时间:2011 年06 月13日完成时间:2011 年06月21 日课程设计成绩:指导教师签名:年月日目录1 引言 (1)1.1问题的提出 (1)1.2任务与分析 (1)2 程序的主要功能 (2)2.1新建用户功能 (2)2.2判断密码功能 (2)2.3判断进程功能 (2)2.4显示功能 (2)2.5获得牌的功能 (2)2.6初始化功能 (2)3 程序运行平台 (3)4 总体设计 (4)5 程序类的说明 (5)6 模块分析 (6)6.1新建用户模块 (6)6.2显示模块 (6)6.3判断密码模块 (8)6.4判断游戏进程模块 (10)6.5获得一张牌模块 (11)6.6初始化模块 (12)7 系统测试 (13)8 结论 (16)参考文献 (17)摘要随着计算机的普及,计算机游戏逐渐进入了这个时代,本次利用学到的c++编写了一个21点的扑克牌游戏,该游戏具有新建用户,判断牌等功能关键词:21点的扑克牌游戏;计算机;1 引言1.1 问题的提出设计一个21点的扑克牌游戏,玩家一共可以要5张牌,但如果牌的点数超过21,则暴了,自动出局;在不超过21点的情况下,玩家与庄家比牌的点数大小,大者为赢。
1.2任务与分析(1) 将所有的函数与相应的数据封装到类中。
(2) 程序中一共有13张扑克牌可以随机抽取,大于10的点数全部为半点:只需设计随机取下一张牌的成员函数时使用if语句判定牌的点数是否大于10,大于10的牌对其重新赋值为0.5即可。
(3) 要求庄家永远不会暴庄,即庄家可以查看下一张牌,若大于21点,则拒绝,当然,在游戏规则上不能泄露这点秘密:在函数中首先随机产生下一张牌,接着用条件语句判定原有点数与新牌的点数之和是否大于21点,然后决定是否取牌。
1.1 问题描述本次C++课程设计题目是“21点纸牌游戏”,系统的主要功能是娱乐游戏,有电脑和玩家一起玩这个游戏,玩家设法使自己的牌达到总分21并要比电脑开的点数大而且不超过这个数值。
扑克牌的分值取它们的面值。
J,Q,K 分别是5,6和6分。
1.2 要求分析编写程序实现游戏,该程序是模拟古老的21点扑克牌游戏,实现1对1的人机大战。
要求游戏过程中任意一方牌的点数之和超过21点,则自动出局;在不超过21点的情况下,玩家下注由电脑随机发牌与庄家比累积牌的点数的大小,大者为赢家。
2 总体设计2.1 总体功能框图2.2主要算法流程图3. 详细设计程序流程图。
图2-1 算法流程图3程序清单及注释// 21点游戏.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"#include<iostream>#include<math.h>#include<time.h>using namespace std;int x=1;int mima;int rand(int n ); //声明bool win();bool win1();bool win2();//定义变量win为逻辑型变量void money(); //运行赌注int main(){cout<<"\t※※※※※※※※※※欢迎进入21点※※※※※※※※※※\n\n";cout<<"\t\t 游戏规则:\n";cout<<endl;cout<<"\t\t 1.玩家最多可下赌注1~100;\n";cout<<endl;cout<<"\t\t 2.如果牌点数的总数超过21点则暴点,自动判数;\n";cout<<endl;cout<<"\t\t 3.计算机方在大于等于16点时不再要牌。
c 21点游戏课程设计一、课程目标知识目标:1. 学生理解21点游戏的规则,掌握基本的算牌策略。
2. 学生掌握概率的基本概念,并能应用于21点游戏中。
3. 学生理解期望值在游戏决策中的应用。
技能目标:1. 学生能够运用加减法进行快速计算,提高心算能力。
2. 学生能够通过分析概率,制定有效的21点游戏策略。
3. 学生能够通过小组合作,进行游戏实践,提高沟通与协作能力。
情感态度价值观目标:1. 学生培养对数学的兴趣,认识到数学在生活中的实际应用。
2. 学生在游戏中学会遵守规则,培养良好的竞技精神。
3. 学生通过游戏体验,理解风险与决策的重要性,形成正确的价值观。
课程性质:本课程为实践性较强的数学应用课程,结合学生年级特点,注重培养学生的实际操作能力和团队协作能力。
学生特点:六年级学生具备一定的数学基础和逻辑思维能力,好奇心强,喜欢挑战性游戏。
教学要求:教师应引导学生将所学数学知识应用于游戏中,激发学生的学习兴趣,提高学生的实践能力。
同时,注重培养学生的情感态度价值观,使学生在游戏中学会遵守规则,形成正确的价值观。
通过分解课程目标为具体学习成果,便于后续教学设计和评估。
二、教学内容1. 游戏规则介绍:讲解21点游戏的基本规则,包括游戏目标、牌的点数计算、牌的组合方式及游戏流程。
2. 算牌策略学习:分析游戏中的概率问题,引导学生学习基本的算牌策略,如“牌型概率”、“牌数概率”等。
3. 概率与期望值:结合课本中概率知识,讲解期望值在21点游戏中的应用,让学生了解如何通过期望值来判断游戏策略的优劣。
4. 实践操作:组织学生进行小组实践,让学生在游戏中运用所学知识,提高心算能力和决策能力。
5. 教学内容安排和进度:- 第一课时:游戏规则介绍,算牌策略学习;- 第二课时:概率与期望值讲解,实践操作指导;- 第三课时:学生实践,总结经验,交流心得。
6. 教材章节关联:- 《数学》课本:概率章节,结合课本知识进行讲解;- 《实践活动手册》:设计实践任务,让学生在课后进行练习。
#include<iostream.h>#include<stdlib.h>#include<conio.h>#include<time.h>#include<iostream.h>#include<string.h>class Game{public:Game(){win=0,lose=0,draw=0,playerturns=0,cputurns=0,money=100,bet=0;player=0,cpu=0;char answer1[]="123456";strcpy(answer,answer1);char answer2[]="654321";strcpy(daan,answer2);};void rules();//显示规则void BET(); //下注void deal();//交易void run(Game &);//进行异常处理void hit1();//拿下一牌void hit2();//确保庄家不会爆庄并且点数大于16void print();//打印出最后结果void results();//最后的胜利结果void check();//检查是否爆庄Game operator=(Game &d);//运算符重载void replay(char &ans);//是否进行新一轮的游戏void clean();//清屏void wait(int);void pause();int GetInt(int,int);int random(long,long);private:int playerturns,cputurns,money;int win,lose,draw,bet;float player,cpu;char answer[7];char daan[7];};//---------------------------------------------------------------------------------------void Game::wait(int milli){clock_t start;start=clock();while( ( clock()-start ) < milli );}//========================================================= void Game:: pause(){cout<<"Press Any Key To Continue"<<endl;getch();}//========================================================= int Game::GetInt(int L=0,int H=100){int ent;cout<<"Please Enter A Number Between "<<L<<" and "<<H<<endl;cin>>ent;while((ent<L)||(ent>H)){cout<<"Error"<<endl;cout<<"Value must be between "<<L<< " and "<<H<<endl;cin>>ent;}return(ent);}//==========================================================int Game::random(long hi,long lo)//随机抽牌{int ran;srand((unsigned)time(NULL));ran=rand()%(hi-(lo-1))+lo;return(ran);}//========================================================== ===void Game::rules(){cout<<"\t\t\t *********欢迎使用21点游戏软件*********"<<endl;cout<<endl;cout<<endl;cout<<"\t\t\t 游戏规则:"<<endl;cout<<endl;cout<<"\t\t\t ※①:每轮游戏你最多只可以有5牌。
"<<endl;cout<<"\t\t\t ※②:如果你的点数超过21将输掉这轮游戏。
"<<endl;cout<<"\t\t\t ※③:高级玩家可以看下一牌。
"<<endl;cout<<"\t\t\t ※④:胜利者将得到2倍的注金。
"<<endl;cout<<"\t\t\t ※⑤:庄家牌点数不会小于16点。
"<<endl;cout<<"\t\t\t";pause();}//---------------------------------------------------------------------------------------void Game::BET()//下注{system("cls");//执行系统命令clscout<<"\t\t\t你的资本:$"<<money<<endl;cout<<"\t\t\t你想下多少赌注?: ";cin>>bet;if(bet<=0){cout<<"对不起,输入有误";exit(0);}if(money-bet<0){cout<<"对不起,你没有那么多钱!:("; //sees if your brokeexit(0);}money-=bet;}//----------------------------------------------------------------------------------------void Game::deal()//发前两牌{int playercard1,playercard2,cpucard1,cpucard2;float ccard1,ccard2,pcard2,pcard1;playerturns=2;//开始给玩家发两牌cputurns=2;//庄家也发两牌playercard1=random(13,1);//在1到13中找出一个随机数cout<<"\n\t\t\t正在洗牌,请稍候......"<<endl;wait(500);playercard2=random(13,1);wait(500);cout<<"["<<playercard1<<"]";cout<<"["<<playercard2<<"]";if(playercard1>10)//大于十的牌点数全部置为0.5{pcard1=0.5,player=pcard1,playercard1=0;}if(playercard2>10)//大于十的牌点数全部置为0.5{pcard2=0.5,player+=pcard2,playercard2=0;}player+=playercard1+playercard2;//总点数cout<<"\t\t\t你现在的点数为:"<<player<<endl;cout<<endl;cpucard1=random(13,1);//调用函数wait(350);cpucard2=random(13,1);//调用函数cout<<"\t\t\t庄家有一"<<cpucard1<<" 为正面牌!"<<endl;cout<<"[*] "<<" ["<<cpucard1<<"]";if(cpucard1>10)//大于十的牌点数全部置为0.5{ccard1=0.5,cpu=ccard1,cpucard1=0;}if(cpucard2>10)//大于十的牌点数全部置为0.5{ccard2=0.5,cpu+=ccard2,cpucard2=0;}cpu+=cpucard1+cpucard2;//总的点数cout<<endl;}//----------------------------------------------------------------------------------------void Game::run(Game &c2)//进行异常处理{char ans;do{int m=0;system("cls");//执行系统命令clsc2.clean();//进行新的一轮游戏!c2.check();//检验是否爆庄c2.BET(); //进行下注c2.deal(); //洗牌do{if(playerturns==5)cout<<"已达最大牌数,不能再要牌了,请按任意键看你的总的点数!"<<endl;do{try{ //开始捕获异常处理cout<<"\t\t\t你愿意继续吗?(hit愿意,stay否):";m=0; //可以没有的!但把下面的if语句改一下就必须有了cout<<flush;//刷新流cin>>ans;cin.ignore(20,'\n');//把输入行中的其余字符取空,以便后面的输入从新一轮开始if((ans=='h')||(ans=='H')||(ans=='s')||(ans=='S')) break;else throw ans;//产生异常事件}catch(char)//开始处理异常机制{cout<<"你的输入有误!:(请重新输入"<<endl;m=1;}catch(...){cout<<"你的输入有误!:(请重新输入"<<endl;m=2;}}while(m!=0);if((ans=='h')||(ans=='H')){playerturns++;if(playerturns>5){cout<<"\t\t\t你不能多于5牌!"<<endl;}}if((playerturns<6)&&(ans=='h')){cout<<endl;c2.hit1();}}while((ans=='h')||(ans=='H'));for(;(cpu<16)&&(cputurns<6);cputurns++){cout<<endl;cout<<"\t\t\t庄家得到一牌!"<<endl;c2.hit2(); //calls hit function}cout<<endl;cout<<endl;cout<<"\t\t\t庄家的点数为:"<<cpu<<endl; //显示庄家的总点数cout<<"\t\t\t你的点数为:"<<player<<endl;//显示玩家的总点数cout<<endl;c2.results(); //看你是否赢了c2.replay(ans);}while((ans=='y')||(ans=='Y'));}void Game::hit1()//取下一并把它加入总和{int card=0,copycard=0,bet1=0;float cards=0;card=random(13,1);copycard=card;char ans,s1[100];cout<<"如果您是普通玩家请按n."<<endl;cout<<"如果您是高级玩家或超级玩家请按y."<<endl;cin>>ans;label1: if(ans=='y'||ans=='Y'){cin.ignore(20,'\n');//把输入行中的其余字符取空,以便后面的输入从新一路轮开始cout<<"请输入特别玩家的6位密码:";cin.getline(s1,7);//提取密码if(!strcmp(s1,answer)){cout<<"\t\t\t这牌是:"<<copycard<<endl;cout<<"是否加注(y or n)?\n";cin>>ans;if(ans=='y'||ans=='Y'){cout<<"你的现金还有$"<<money<<endl;cout<<"你要加多少注?(你也可以不加)";cin>>bet1;if(money-bet1<0){cout<<"你没有足够的赌注";}money=money-bet1;bet+=bet1;cout<<"\t\t\t你的总点数为:"<<player<<endl;}else{if(cards==0.5)player-=cards;else player-=copycard;cout<<"\t\t\t你的总点数为:"<<player<<endl;}}else{if(strcmp(s1,daan)==0){cout<<endl;cout<<"现在计算机的总牌点为:"<<cpu<<endl;cout<<"您的总牌点为:"<<player<<endl;float card;card=(float)random(13,1);if(card>10) card=0.5;cout<<"下牌面是:"<<"["<<card<<"]"<<endl;cout<<"您想要什么牌?请输入牌点数:";cin>>card;if(card>10) card=0.5;cout<<endl;cout<<"您要的牌为"<<"["<<card<<"]"<<endl;player=player+card;//牌点总数cout<<"总的牌面是:"<< player<<endl;//输出总点数cout<<endl;}else{cout<<"对不起,你输入的密码错误!不能看牌"<<endl;cout<<"是否再次输入密码(yes or no)?"<<endl;cin>>ans;if(ans=='y'||ans=='Y')goto label1;else{cout<<"\t\t\t总点数是:"<<player<<endl;}}}}else{if(card>10){cards=0.5,card=0;};player+=cards+card;cout<<"\t\t\t总点数为:"<<player<<endl;}}//-----------------------------------------------------------------void Game::hit2()//确保庄家不会爆庄并且点数大于16{int card=0,copycard=0;float cards=0;card=random(13,1);//调用函数copycard=card;cout<<"这牌是:"<<card;if(card>10){cards=0.5,card=0;};cpu=cpu+cards+card;if(cpu>21){if(cards==0)cpu-=copycard;//当card小于10但总数大于21时执行else cpu-=cards; //当card大于10且点数大于21时执行cout<<"\t\t\t总点数为:"<<cpu<<endl;}if(cpu<16)//确保庄家点数大于等于16{cpu=16;cout<<"\t\t\t总点数是:"<<cpu<<endl;}}//---------------------------------------------------------------------void Game::results()//找出赢家{if(cpu==player){cout<<"\t\t\t点数一样,你们平了!"<<endl;draw++;money+=bet;}if(player>21){cout<<"\t\t\t啊哦,你爆了!:("<<endl;lose++;}else{if(cpu<player){cout<<"\n\t\t\t恭喜你,你赢了!:)";money=money+(bet*2);win++;}}if(cpu>21){cout<<"\t\t\t恭喜你,庄家爆了!:)"<<endl;if(player<21){cout<<"\n\t\t\t恭喜你,你赢了!:) ";win++;money=money+(bet*2);}}else{if(cpu>player){cout<<"\t\t\t不好意思,你输了!:("<<endl;lose++;}}}//--------------------------------------------------------------------- Game Game::operator=(Game &d)//保留上一轮的一些数据{Game t;t.win+=d.win,t.lose+=d.lose,t.draw=+d.draw,t.playerturns=0,t.cputurns=0,t.money+=d.mon ey,t.player=0,t.cpu=0;return t;}//---------------------------------------------------------------------void Game::clean()//清零{win=this->win,lose=this->lose,draw=this->draw,playerturns=0,cputurns=0,money=this-> money,bet=0,player=0,cpu=0;}//---------------------------------------------------------------------void Game::replay(char &ans)//是否继续游戏{cout<<"\n\t\t\t你是否想继续游戏(yes or no)?";cin>>ans;}//---------------------------------------------------------------------void Game::check(){if(money<=0) //检查钱的多少{cout<<"对不起,你输光了,你不能玩了!:("<<endl; //sees if your broke }}//---------------------------------------------------------------------void Game::print()//打印最后结果{void sign();cout<<"\t\t\t\t赢:"<<win<<endl;cout<<"\t\t\t\t负:"<<lose<<endl;cout<<"\t\t\t\t平:"<<draw<<endl;cout<<"\t\t\t\t余额:"<<money<<endl;cout<<"\t\t\t\t使用"<<endl;if(money<=-1000)cout<<"\t\t\t你输的真惨啊!:("<<endl;}//---------------------------------------------------------------------int main(){Game c2;char ans;.. system("cls"); //执行系统命令clsc2.rules();//调用函数cout<<"\t\t\t游戏可以开始了吗?(yes or no):";cin>>ans;if((ans == 'y')||(ans=='Y')) //看你是否想要进行游戏{cout<<"\t\t\t你现在拥有的赌本为$100!"<<endl; //设定起始赌金//cout<<"\t\t\t"<<flush;//刷新流// pause();}else //如果否退出游戏{return(0);}c2.run(c2);//进行游戏c2.print();//输出最后结果cout<<endl;cout<<"\t\t\t\t";return(0);}。