C语言小游戏:和电脑玩21点游戏

初学C++,或者说初学面向对象的编程思想,便写了一个模拟21点游戏的程序,与电脑对弈,似乎没有感觉到电脑的无脑,换言之,虽然我用了很简单的策略判断,但在这个游戏中,电脑仍然表现出一定智能。这里先卖个关子,大家可以自己找找源代码,看看我用了什么策略。
先来看看运行效果:
C语言小游戏:和电脑玩21点游戏
输了,再看一个赢的:
C语言小游戏:和电脑玩21点游戏
你可以在此链接下载本工程的源代码,然后直接打开exe文件先玩一下试试:点此打开网页。本次是在C-Free5中建的工程,但主要的4个文件"class.h", “class_card.cpp”, “class_player.cpp”, “main.cpp”,在任何C++的编译环境中都是可以运行的。

现在讲一下程序的大体思路,整个程序逻辑集中在"class.h"之中:

/ *
* 文件名:class.h
* 作者:于子豪
* 日期:2019-7-31
  */
#include <iostream>
using namespace std;

class card{
    int c[52];//扑克牌
    int n;//扑克牌数量
    public:
    card();
    int putcard();//发牌,返回一张牌
};

class player{
    card *ca;//指向开局的牌的指针
    int a[11];//已有扑克牌
    int n;//扑克牌数量
    int pointN;//点数
    public:
    player();
    int getpoint()const {return pointN;}//返回点数
    int getn(){return n;}
    int* geta(){return a;}
    void tocard(card*p){ca=p;}//用指针指向开局的牌
    void getcard();//要牌
    void showcard();//显示所有牌,"cards:  "
};

class computer:public player{
    public:
    int judge();//判断是否要牌,要则返回1,否则返回0
};

对于一盘21点游戏而言,我们可以抽象出两个对象,其一为"发牌员",其二则是"选手"。如果是和电脑对弈,则对于程序而言需要从"选手"继承出一个"电脑选手"。
"class.h"中说明了这一设计:
card类按顺序存储了52张牌作为全局对象,然后使用putcard()函数随机取牌并发牌,然后去除已发过的牌。
player类存储了牌的引用,即自己的牌等等。其方法包括获取牌,显示等等。
computer类则是player的继承,多出了电脑自己判断是否继续要牌的策略函数。
在main函数中实例化各类并进行调度,实现了21点游戏的运行逻辑:

int main()
{
	cout<<"  *************************************\n";
    cout<<"   welcome to play simple 21point game\n";
    cout<<"  *************************************\n\n";
    cout<<"now it's the beginning,the computer has already gotten a card.\n";
    card card1; player pl; computer com;
    pl.tocard(&card1); com.tocard(&card1);
    
    pl.getcard();
    
	com.getcard(); cout<<"your "; pl.showcard();
	cout<<"your point: "<<pl.getpoint()<<"\n\n";
//游戏内容:
    char putj; 
    while(1)
    {
    	int Jud=0;
    	if(pl.getpoint()>21) {cout<<"you lose!\n"; system("pause");exit(0);} 
    	if(com.getpoint()>21) 
	        {cout<<"computer lose! And you win!\n";system("pause");exit(0);}
		if(com.judge())  {cout<<"the computer get a card.\n\n";com.getcard();}
		else {cout<<"the computer passed.\n\n";Jud++;}
		cout<<"Do you want one more card? 'y' or 'n' :" ;
		cin>>putj;
		if(putj=='y') {
			pl.getcard();
			cout<<"your ";pl.showcard();
			cout<<"your point: "<<pl.getpoint()<<"\n\n";
		}
		else {cout<<"\n";Jud++;}
    	if(Jud==2) break;
    }
    cout<<"***********************************\n";
	cout<<"   the game is end.\n\n";

	cout<<"   computer's ";com.showcard();
	cout<<"   computer's point: "<<com.getpoint()<<"\n\n";
	cout<<"   your ";pl.showcard();
	cout<<"   your point: "<<pl.getpoint()<<"\n\n";
	if(com.getpoint()<pl.getpoint()) cout<<"   you win!\n";
	else if(com.getpoint()>pl.getpoint()) cout<<"   you lose!\n";
	else cout<<"   no one's win.\n";	
	cout<<"***********************************"<<endl;
	system("pause");
    return 0;
}

到这里基本上就说完了整个程序的思路及框架,具体代码可以参考源代码。
【资源下载链接:https://download.csdn.net/download/qq_45467083/11453331
之前买的那个关子现在可以提示一下,在computer类的judeg()函数中,综合考虑当前点数和已有牌数,便可以判断出是否要牌了。

上一篇:校验输入框只能输入数字类型


下一篇:上海市地铁刷卡数据到OD矩阵