基于单循环链表实现俄罗斯轮盘赌游戏(C语言实现)
完成链表的学习后,作为一个小实践项目实现俄罗斯轮盘赌。
轮盘赌游戏基于单循环链表实现,使用C语言的rand函数生成随机数,注意要不断更新随机数种子。
俄罗斯轮盘赌,想必很多人都听说过,一种残忍的赌博游戏。游戏的道具是一把左轮手枪,
其规则也很简单:在左轮手枪中的 6 个弹槽中随意放入一颗或者多颗子弹,在任意旋转转轮之后,关上转轮。
游戏的参加者轮流把手枪对着自己,扣动扳机:中枪或是怯场,即为输的一方;坚持到最后的即为胜者。
实践项目同轮盘赌类似,游戏规则:n 个参加者排成一个环,每次由主持向左轮手枪中装一颗子弹,并随机转动关上转轮,游戏从第一个人开始,轮流拿枪;中枪者退出赌桌,退出者的下一个人作为第一人开始下一轮游戏。直至最后剩余一个人,即为胜者。要求:模拟轮盘赌的游戏规则,找到游戏的最终胜者。
c语言代码实现:注意这里使用的delete节点函数参数用pos(位置)而不是ele(元素值)比较恰当
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<signal.h> //signal()
#include<string.h>
#include<sys/stat.h>
#include<time.h>
#include<stdarg.h>#if 1
#define INFO_DEBUG "%d lines in "__FILE__", complie time is "__TIME__" "__DATE__" \n",__LINE__
#define ADI_RUN_ERROR 1
#define ADI_NULL_POINTER -1
#define ADI_OK 0
#define ADI_PRINT printf("[%s][%d]:",__FUNCTION__,__LINE__);printf
#define ADI_ASSERT(c,prt,ret) if(c) {printf(prt);return ret;}
#endif/*
俄罗斯轮盘赌,想必很多人都听说过,一种残忍的赌博游戏。游戏的道具是一把左轮手枪,
其规则也很简单:在左轮手枪中的 6 个弹槽中随意放入一颗或者多颗子弹,在任意旋转转轮之后,关上转轮。
游戏的参加者轮流把手枪对着自己,扣动扳机:中枪或是怯场,即为输的一方;坚持到最后的即为胜者。
本节实践项目同轮盘赌类似,游戏规则:n 个参加者排成一个环,每次由主持向左轮手枪中装一颗子弹,并随机转动关上转轮,游戏从第一个人开始,轮流拿枪;
中枪者退出赌桌,退出者的下一个人作为第一人开始下一轮游戏。直至最后剩余一个人,即为胜者。要求:模拟轮盘赌的游戏规则,找到游戏的最终胜者。
*/typedef struct list{int elem;struct list *next;
}list;#define PARAM_FAIL -1
#define P_NULL -2
#define SUCCESS 0
#define SIZE_GUN 6 //弹容量6发/*初始化:只创建头结点*/
list* initList()
{list *head = (list*)malloc(sizeof(list));if(NULL==head) {printf("NULL");return head;}head->next = head;return head;
}/*pos从0开始,pos=0为第一个*/
/*如果循环链表插入操作指定插入位置pos,会麻烦些,如下,如果不指定位置,默认插入到最后,会比较简单*/
int insertList(list *list_insert,int elem,int pos)
{int i=0;if(NULL == list_insert){ADI_PRINT("err NULL\n");return P_NULL;}list *head = list_insert;//取头指针while(i<pos && list_insert != head->next){head = head->next;i++;//i比head快一个,i=1时head指向的是第0个元素}if((list_insert==head->next)&&(i<pos))//已经到链表尾部,但是pos>i,说明指定的插入位置超过了链表的末尾位置{ADI_PRINT("pos = %d, list's last = %d,pos>i,insert err!\n",pos,i);return PARAM_FAIL;}else{list *node = (list*)malloc(sizeof(list));if(NULL==node) {printf("NULL");return P_NULL;}node->next = head->next;node->elem = elem;head->next = node;ADI_PRINT("insert elem = %d\n",elem);}return SUCCESS;
}/*pos从0开始,pos=0为第一个*/
int replaceList(list *list_insert,int elem,int pos)
{int i=0;if(NULL == list_insert){ADI_PRINT("err NULL\n");return P_NULL;}list *head = list_insert;//取头指针while(i<pos && list_insert != head->next){head = head->next;i++;//i比head快一个,i=1时head指向的是第0个元素}if(list_insert==head->next)//已经到链表尾部,说明指定的修改位置超过了链表原有大小{ADI_PRINT("pos = %d, list's last = %d,change err!\n",pos,i);return PARAM_FAIL;}else{head->next->elem = elem;ADI_PRINT("change elem = %d,pos = %d\n",elem,pos);}return SUCCESS;
}/*指定删除元素的值*/
/*
int delList(list *list_insert,int elem)
{if(NULL == list_insert){ADI_PRINT("err NULL\n");return P_NULL;}list *head = list_insert;while(list_insert != head->next){if(elem == head->next->elem){list *del = head->next;head->next = head->next->next;free(del);ADI_PRINT("del ele = %d\n",elem);return SUCCESS;}head = head->next;}ADI_PRINT("can not find ele = %d\n",elem);return PARAM_FAIL;
}
*//*指定删除元素的位置*/
int delList(list *list_insert,int pos)
{if(NULL == list_insert){ADI_PRINT("err NULL\n");return P_NULL;}list *head = list_insert;int i = 0;while(list_insert != head->next){if(pos == i){list *del = head->next;head->next = head->next->next;ADI_PRINT("del pos = %d,ele = %d\n",pos,del->elem);free(del);return SUCCESS;}head = head->next;i++;}ADI_PRINT("can not find pos = %d\n",pos);return PARAM_FAIL;
}/*pos为在链表中的位置,ele为待查找的元素*/
int findList(list *listFind,int ele,int *pos)
{if(NULL == listFind){ADI_PRINT("err NULL\n");return P_NULL;}int i = 0;list *head = listFind;while(listFind != head->next){if(ele == head->next->elem){*pos = i;return SUCCESS;}i++;head = head->next;}ADI_PRINT("can not find ele = %d\n",ele);return PARAM_FAIL;
}int printList(list *list_prt)
{if(NULL == list_prt){ADI_PRINT("err NULL\n");return P_NULL;}int i = 0;list *head = list_prt;while(head != list_prt->next){ list_prt = list_prt->next;ADI_PRINT("list[%d] = %d\n",i,list_prt->elem);i++;}return SUCCESS;
}/*return 队列的大小*/
int sizeList(list *list_size)
{if(NULL == list_size){ADI_PRINT("err NULL\n");return P_NULL;}int i = 0;list *head = list_size;while(head != list_size->next){ list_size = list_size->next;i++;}return i;
}int main()
{int ret = 0;int rand_gun = 0;//子弹在弹夹中的位置int kill_id = 0; //本次要被kill的人在队列中的位置list *list_test = initList();if(NULL == list_test){ADI_PRINT("err \n");return P_NULL;}/*初始化一个20人的队列*/for(int i=0;i<20;i++){ret = insertList(list_test,i,i);if(SUCCESS != ret) {ADI_PRINT("insert err\n");return PARAM_FAIL;}}printList(list_test);int size_man = sizeList(list_test);//还活着的人数while(1 != sizeList(list_test))//剩最后一个人{srand((int)time(0));//time函数得到的时间只能精确到秒,循环处理太快,秒没有发生变化,导致随机数都是一样的,所以每次产生随机数要在后面进行sleeprand_gun = rand()%(SIZE_GUN-1);//生成0-5的随机数对应子弹位置,弹容量6发kill_id += rand_gun;if(kill_id >=size_man) {kill_id = kill_id-size_man;}ADI_PRINT("rand_gun = %d,size_man=%d,kill_id = %d\n",rand_gun,size_man,kill_id);ret = delList(list_test,kill_id);sleep(1);size_man--;}ADI_PRINT("FINAL IS %d\n",list_test->next->elem);return SUCCESS;
}
基于单循环链表实现俄罗斯轮盘赌游戏(C语言实现)相关推荐
- 线性表:7.C语言链表实现俄罗斯轮盘赌小游戏
俄罗斯轮盘赌,想必很多人都听说过,一种残忍的赌博游戏.游戏的道具是一把左轮手枪,其规则也很简单:在左轮手枪中的 6 个弹槽中随意放入一颗或者多颗子弹,在任意旋转转轮之后,关上转轮.游戏的参加者轮流把手 ...
- 数据结构课程设计:约瑟夫生者死者游戏(c++实现、单循环链表、输出死者姓名和编号、附可执行源代码)
1.1设计内容: 有N个旅客同乘一条船,因为严重超载,加上风高浪大,危险万分:因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难:无奈,大家只得同意这种办法,并议定N个人围成一圈,由第 ...
- 【数据结构作业—01】用单循环链表解决约瑟夫问题
实验作业一:线性表(链表) 1. 用单循环链表解决约瑟夫问题. 问题描述: 一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务.旅行社安排这些旅客围成一个圆圈,从帽子中取出一张纸条,用上 ...
- 排队枪毙游戏c语言,基于C语言实现的约瑟夫生者死者游戏
1 项目简介 约瑟夫生者死者游戏的大意是:30个旅客同乘一条船,因为严重超载,加上风高浪大危险万分:因此船长告诉乘客,只有将全船一半的旅客投入海中,其余人才能幸免于难.无奈,大家只得统一这种方法,并议 ...
- 查找算法——俄罗斯轮盘赌算法(看谁运气不好)
俄罗斯轮盘赌的基本思想 俄罗斯轮盘赌(Russian roulette)是一种残忍的赌博游戏.俄罗斯轮盘赌的赌具是左轮手枪]和人的性命.俄罗斯轮盘赌的规则很简单:在左轮手枪的六个弹槽中放入一颗或多颗子 ...
- 转:高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
高层游戏引擎--基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之外的其他游戏系统.意念才学疏陋,望众位前辈不吝赐教.由于代码质量不高. ...
- 高层游戏引擎——基于OGRE所实现的高层游戏引擎框架
技术文档(Document) 来自:noslopforever的专栏 高层游戏引擎--基于OGRE所实现的高层游戏引擎框架 这是意念自己的毕业论文,在一个具体的实践之中,意念主要负责的是物件和GUI之 ...
- c语言用链表实现成绩管理系统,C语言基于单链表得学生成绩管理系统
前言 传说中讲课通俗而不庸俗,说话风流而不下流的小编又来了哦,今天的主要内容是:C语言基于单链表得学生成绩管理系统.首先给年夜家总结下为什么你们学习C语言会觉得难,尤其是对单链表这块,主要原因得是因为 ...
- 数据结构-单循环链表(C语言代码)
数据结构纯属新手,小白一枚,欢迎批评指正! 下面这个图是接下来要实现的单循环链表! 直接上代码OVO! 定义结构体 typedef struct Node {int data; //数据域struct ...
最新文章
- js比较两个String字符串找出不同,并将不同处高亮显示
- JavaScript实现cartesianProduct笛卡尔乘积算法(附完整源码)
- spss数据_spss数据分析软件
- myBatis之事务管理
- Windows 7技巧之Telnet组件消失之迷
- QT——QT4.8.5安装与配置
- 统计MOOC证书 (15 分)
- ReadOnlyDictionary之应用场景
- azure云数据库_在Azure SQL数据库中实现动态数据屏蔽
- Spark重要概念提出时间戳和原因
- java从入门到放弃段子_搞笑GIF段子:学习是不可能学习的从入门到放弃
- java 定时任务的实现_Java定时任务实现的几种方式
- Excel:sumifs函数
- 生成二维码与条形码的各种方法
- vba 批量生成条形图代码
- AI万物生成技术,颠覆内容传统创作模式 | iBrandUp 职位内推
- 配置完dcom需要重启计算机,DCOM电脑自动重启(win7系统一直反复重启)
- 基于易语言,PC端微信多开
- 关于Unity特效未播放完的问题
- 怎么在word里标上标和下标?
热门文章
- win10 20H2 下QQ,TIM 无法访问个人文件夹 个人文件夹将被保存到“我的文档
- LRU原理和Redis实现——一个今日头条的面试题
- 武侠乂服务器位置在哪,武侠乂TheSwordsmenX秘宝位置在哪?秘宝位置汇总图文一览...
- sql中的列变行、行变列操作
- 有关军事混合智能的思考
- 怎么回事?网传熊猫直播本月申请破产?3月18日关停所有服务器
- scp 拷贝的两种方法
- Windows 10 自动登录
- android 小米手机没有sim卡,无法安装apk 解决方法
- 重庆计算机一级考试2016年,重庆计算机一级考试真题2016年最新(笔试+上机).doc