丢沙包游戏(或杀人游戏)用C语言实现:

游戏简述:

  杀人游戏(或者丢沙包游戏),设定一些人(人数为:num)一起玩游戏,从某个指定的人(设定为:start)开始轮流扔沙包,扔沙包人的下一个人为1,每隔固定人数(设定为:step)砸中一个人,则该人被杀退出游戏,到最后一人后重新接第一个人开始计数,依次轮流进行,直到最后只剩下一个人,游戏结束!

游戏代码:

 /***********************************************************************************
简述:
杀人游戏(或者丢沙包游戏),一些人(num)一起玩游戏,从某个指定的人(start)开始
轮流扔沙包,每隔固定人数(step)砸中一个人,该人被杀退出游戏,依次进行,直到最后
只剩下一个人,游戏结束!
Date:
2015.12.05
***********************************************************************************/ #include <stdio.h>
#include <stdlib.h> void show_people(int *people, int num) //打印当前的杀人状况
{
int i;
printf("People alive: ");
for (i = ; i < num; i++)
{
if (i % == )
putchar('\n');
printf("%d\t", *(people + i));
}
printf("\n");
} int check_rest(int *people, int num) //检查剩余人数
{
int i, count = ;
for (i = ; i < num; i++)
{
if (*(people + i) != )
count++;
}
return count;
} void init_people(int *people, int num) //初始化任务位置编号
{
int i;
for (i = ; i < * num; i++)
{
*(people + i) = (i < num) ? (i + ) : (i + - num);
}
} int jump_killed(int *people, int p)
{
while (*( people + p - ) == ) //遇到人被杀掉的位置后跳过
{
p++;
}
return p;
} int check_num(int num, int step, int start) //检查游戏参数的有效性
{
if ( ( num <= ) || ( step <= ) || ( start <= ) )
{
printf("Sorry! Maybe number error!\n");
printf("Press any key to exit!");
return ;
}
if ( ( *num <= step ) || ( start > num ) )
{
printf("Sorry! People number is small than step! Game over!\n");
printf("Press any key to exit!");
return ;
} return ;
} int main (void)
{
int i, num = , step = , start = ;
int *people = NULL;
int rest = , round = ;
int p = ; printf("\nHi! This is a game, that throw bag to kill people!\n");
printf("Now, let's begin the game!\n");
printf("First, enter the number of people in the game(>0): ");
scanf("%d", &num);
printf("Second, enter the step to pull people out(>0&&<num): ");
scanf("%d", &step);
printf("Third, enter one people to start the game(>0&&<num): ");
scanf("%d", &start); if (check_num(num, step, start))
{
getchar();
getchar();
return ;
} people =(int *) malloc( * num * sizeof(int) );//创建两倍人数的内存空间
if (people == NULL) //创建内存失败,退出游戏
return ; printf("\nOk! We have %d people in this game, and we will kill people "\
"from N0:%d people every %d people like this: \n",num, start, step); init_people(people, num); //将游戏中人编号初始化为位置序号
p = start;
rest = check_rest(people, num); while ( rest > )
{
int i = , j = , stemp = ; while ( i < step )
{
if (*( people + p - ) != ) //余下的人中逐个计数
i++;
p++;
p = (p > * num) ? (p - * num) : p; //位置指针超出缓存,调整
p = (p > num) ? (p - num) : p;
p = jump_killed(people, p); //遇到人被杀掉的位置后跳过
} stemp = p - ; //将人的编号和内存位置匹配
round++;
*(people + stemp) = ; //People was killed!
stemp = p > num ? ( stemp - num ) : ( stemp + num );
*(people + stemp) = ;
p = p > num ? ( p - num ) : p;
printf("Round %d: No.%d was killed! \t%d people leave!\n",round, p, rest-);
rest = check_rest(people, num); //清点剩余人数
} for ( i = ; i < num; i++) //游戏结束,找到剩余的最后一个人
{
if (*( people + i ) != )
break;
}
printf("Game over! No.%d people alive!\n", i+); free(people);
getchar();
getchar();
return ;
}

代码简述:

  定义两倍于人数的内存空间作为缓存,每个人按照自己所处的位置进行编号,被杀掉的位置,编号置为零,表示该人已被杀,所有编号不等于零的位置,代表没有被淘汰的人,每一轮清点剩下未被淘汰的人数,游戏依次进行,指导剩下一个人为止。

丢沙包游戏(或杀人游戏)的C语言实现的更多相关文章

  1. hdu2211杀人游戏

    Problem Description 不知道你是否玩过杀人游戏,这里的杀人游戏可没有法官,警察之类的人,只有土匪,现在已知有N个土匪站在一排,每个土匪都有一个编号,从1到N,每次杀人时给定一个K值, ...

  2. 【BZOJ-2438】杀人游戏 Tarjan + 缩点 + 概率

    2438: [中山市选2011]杀人游戏 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1638  Solved: 433[Submit][Statu ...

  3. 杀人游戏(hdu2211)插入法

    杀人游戏 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 【acm】杀人游戏(hdu2211)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2211 杀人游戏 Time Limit: 3000/1000 MS (Java/Others)    M ...

  5. 【BZOJ2438】[中山市选]杀人游戏 Tarjan+概率

    [中山市选]杀人游戏 Tarjan+概率 题目描述 ​ 一位冷血的杀手潜入\(Na\)-\(wiat\),并假装成平民.警察希望能在\(N\)个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...

  6. BZOJ 2438:杀人游戏(tarjan+概率)

    杀人游戏Description一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手. 警察能够对每一个人进行查证,假如查证的对象是平民,他会告诉警察,他认识的人, ...

  7. bzoj2438 杀人游戏 Tarjan强联通

    [bzoj2438][中山市选2011]杀人游戏 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人进行查证,假如查 ...

  8. BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量

    BZOJ_2438_[中山市选2011]杀人游戏 _强连通分量 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个人里面,查出谁是杀手.警察能够对每一个人 ...

  9. bzoj2438: [中山市选2011]杀人游戏(强联通+特判)

    2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...

随机推荐

  1. [React] React Fundamentals: Mixins

    Mixins will allow you to apply behaviors to multiple React components. Components are the best way t ...

  2. C学习笔记之预处理指令

          一.什么是预处理指令            预处理指令是告诉编译器在编译之前预先处理的一些指令,有宏定义,文件包括,条件编译. 预处理指令一般以 # 号开头,能够出如今文件的不论什么地方, ...

  3. HTTP请求、响应报文格式

    HTTP请求报文格式: HTTP请求报文主要由请求行.请求头部.空行以及请求正文4部分组成 1,请求行由3部分组成,分别为:请求方式,URI(注意这里不是URL)以及协议版本组成,之间由空格分隔 请求 ...

  4. modelsim打开.wlf文件的方法(原创)

    运行vsim -c -l vsim.log -wlf vsim.wlf work.tb work.glbl之后,会在不启动modelsim的情况下完成仿真,并且会把仿真波形记录下来(以.wlf文件格式 ...

  5. access应用分享

    我最近开发了一个winform项目,用的是access数据库,当开发成功以后,有些电脑上就能正常运行,有些电脑就无法读取数据库文件,刚开始我以为是权限问题,后来我把安装程序卸载了,装在其它盘中(非C盘 ...

  6. html5 meta标签属性整理

    声明文档使用的字符编码 <meta charset='utf-8'> 声明文档的兼容模式 //指示IE以目前可用的最高模式显示内容<meta http-equiv="X-U ...

  7. 获得服务器硬件信息(CPUID、硬盘号、主板序列号、IP地址等)

    1 // 注意:首先要在项目中添加引用 System.Management using System; using System.Collections.Generic; using System.L ...

  8. 在VM虚拟机中安装centos7

  9. TPL(Task Parallel Library)多线程、并发功能

    The Task Parallel Library (TPL) is a set of public types and APIs in the System.Threading and System ...

  10. windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法

    windows8 8.1 安装完 ubuntu无法挂载 ntfs分区 解决方法: 最近安装完发现8.1系统后,ubuntu无法加载以前的ntfs分区了,特别是我添加到了/etc/fstab里面了 导致 ...