关于一个弱渣是如何学会打德州扑克的故事

讲述了三位学生在紧张的备考期间,共同开发一个德州扑克AI的故事。他们选择了C++作为开发语言,并面临诸多挑战,包括理解游戏规则、设计算法以及解决bug等问题。最终,团队虽未取得理想成绩,但仍收获了宝贵的经验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大概是考数电前一周,59号左右吧……BIG God问我有没有兴趣一起写一个打德州扑克的AI。貌似很有意思啊,那就写吧。然后拉上了MIDDLE God一起写

因为三个人一周之后都有考试,要预习了……所以先简单脑补了一下德州扑克的规则,还有AI在打德州扑克的时候可能的策略。大概知道了是要算各种概率,然后根据概率确定AI的决策。

话说,这时候还完全不明白德州扑克是怎么打啊……只能一边看规则和各种打法一边抱队友大腿了orz……而且之前几乎从来没玩过牌类游戏……

首先商量了一下要用什么语言写。可选的语言有C, C++, Java, Python。因为之前Java写得习惯,而CC++几乎只用来刷题,所以更倾向于用Java写。然而两个队友都不会,而且赶脚Java的效率比较低(以后谁再无脑和我说Java就是比CC++慢我跟谁急……呵呵呵呵真的那么需要榨干机器的性能么)所以自然就用C++了。比赛要求程序在Ubuntu下运行,所以windows环境再次蛋碎了一地……交叉编译没搞过,而且没有运行环境,所以就上虚拟机吧。

考完数电之后,离初赛deadline还剩半个月,开始写大概的框架。通信部分由BIG God负责,我主要写判断牌型和处理各种牌出现的概率(忽然感觉好水……)。MIDDLE God构思程序的决策方式。先是写出了一个策略比较简单的版本,然后继续改进策略,考虑其他玩家可能的牌型。结果后来的版本各种bug没有解决,也没打过之前的版本……所以就按之前的版本交了。

deadline过后几乎忘了这件事。某一个堕落的下午,正在玩极品飞车的时候忽然得知可以复赛了……第一反应是卧槽竟然进复赛了?继续跑了两圈冷静一下,关了游戏,接下来该好好写了。找波哥聊了一下,然后看了知网上找来的论文,打算按这篇论文的思路写。MIDDLE God脑补了另一种方法,貌似很科学,就实现这两种然后交比较好的……没想到这个时候效率就开始锐减。先是笔记本在运行虚拟机的时候各种怒跪……加上论文看不懂,开始有点焦躁了。最后终于决定入新笔记本,水完开箱贴之后就继续撸代码了,先是实现了MIDDLE God的想法,还是打不过初赛交的版本(-_-#)然后一知半解地实现论文里的写法……这时候时间已经不多了。

13号那天还有很多没写……只能晚上熬夜写了。到宾馆之后捋了一下程序的流程,然后强行写到3点,搞定了大部分要用到的函数。第二天早上去复赛现场时候的状态简直日了狗……队友肯定看到我是一脸毛都不知道的表情……10点多的时候奇迹般把所有函数都拼起来了,也可以编译运行了。打葫芦娃不算好,偶尔会很惨……但只有这个了,还是交吧。

最后发生了最狗血的事情……MIDDLE God在瞪眼法debug的时候发现一个函数没有调用,意味着整个学习算法残了……剩十几分钟,终于还是没有搞定这个bug。想撞墙了……幸好没有被队友打。吃午饭的时候说,只能看脸了,毕竟队友这么帅。

然后见识了一下华为研究所的奢侈餐厅,在赛场听了下讲座,然后参观了屌炸天的自动化测试……最后公布成绩的时候果然呵呵,脸也不好……也看到了清华的队伍最后实力逆袭干掉了之前第一的队伍……只能在下面默默膜拜各路大神/*说的好像最后没写残就会打得很好一样……QxQ……求不被打*/

--------------------

算法还没预习竟然在写博客……QAQ

刷题的时候,一个人写一份代码,在单个文件里,不考虑网络通信多线程图形界面等等乱七八糟的问题,只需要和内存打交道,读入规定好格式的数据,按规定的格式输出。重点终究还是算法和解题的思路,程序只是体现思维的工具。(说的好像其他程序就不是一样……)面对面试的算法题很轻松,然而面对各种实际的项目,还是图样图森破了。虽然写Java习惯了,但是仍然完全驾驭不了C/C++。之前习惯了一个jar包搞定一切,面对各种分散的头文件和源文件很凌乱啊……三个人一起写,各种更改也很凌乱啊……没有Git只能手动进行版本控制啊……之前几乎没有多人合作的经验,现在发现多人合作也很不容易……

写程序之前,要先把每个细节想清楚,然后实现整个程序。忽然觉得比较致命的一点是最后在宾馆还有各种新的想法,程序的架构还在变化……难免最后写残了……写出来的代码并不重要,重要的是想明白代码要怎么写出来。

最后程序各种挂掉,然后虚拟机也挂掉的时候才意识到鲁棒性的重要性……

华为的确是个很牛(tu)(hao)的公司,研究所的氛围很不错嗯。不对……这哪里像是研究所啊……

人老了,熬夜熬不动了……还是睡觉吧(o) . z Z

 

编写一个德州扑克的游戏界面涉及到多个方面,包括游戏逻辑、用户交互以及图形界面的设计。在这里,我会提供一个简单的德州扑克游戏界面的框架,使用C++语言来描述它。请注意,这里只讨论概念和界面结构,实际的图形界面实现和游戏逻辑会更加复杂。 首先,德州扑克游戏界面需要能够让玩家看到牌面、下注区、玩家状态等信息。我们可以使用控制台来简单地展示这些信息,如果是图形界面,则需要使用如Qt、SFML、SDL等图形库来实现。 以下是一个简单的德州扑克游戏界面的示例代码框架: ```cpp #include <iostream> #include <string> #include <vector> // 定义扑克牌的结构 struct Card { std::string suit; // 花色 std::string value; // 数值 }; // 定义玩家结构 struct Player { std::string name; std::vector<Card> handCards; // 玩家手中的牌 int chips; // 玩家的筹码 }; // 定义德州扑克游戏界面类 class TexasHoldemUI { public: TexasHoldemUI() { // 初始化玩家 players.resize(9); // 假设最多9名玩家 for (auto& player : players) { player.chips = 1000; // 初始筹码 } } // 显示玩家状态 void displayPlayersStatus() { for (const auto& player : players) { std::cout << "玩家: " << player.name << " 筹码: " << player.chips << std::endl; } } // 显示公共牌 void displayCommunityCards() { std::cout << "公共牌: "; for (const auto& card : communityCards) { std::cout << card.value << card.suit << " "; } std::cout << std::endl; } // 显示玩家手中的牌 void displayPlayerCards() { for (size_t i = 0; i < players.size(); ++i) { std::cout << "玩家 " << i + 1 << " 的手牌: "; for (const auto& card : players[i].handCards) { std::cout << card.value << card.suit << " "; } std::cout << std::endl; } } private: std::vector<Player> players; // 玩家列表 std::vector<Card> communityCards; // 公共牌 }; int main() { TexasHoldemUI德州扑克UI; // 初始化公共牌和玩家手牌(示例代码,实际应由游戏逻辑生成) 德州扑克UI.communityCards.push_back({"♥", "A"}); 德州扑克UI.communityCards.push_back({"♠", "K"}); 德州扑克UI.communityCards.push_back({"♦", "10"}); 德州扑克UI.communityCards.push_back({"♣", "5"}); 德州扑克UI.communityCards.push_back({"♥", "7"}); // 显示玩家状态和牌面 德州扑克UI.displayPlayersStatus(); 德州扑克UI.displayCommunityCards(); 德州扑克UI.displayPlayerCards(); return 0; } ``` 这个示例是一个非常简单的命令行界面展示,实际的德州扑克游戏界面会更复杂,包括下注操作、按钮交互、动画效果等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值