丢沙包游戏(或杀人游戏)用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. Sql Server2005 Transact-SQL 窗口函数(OVER)

    1.简介: SQL Server 2005中的窗口函数帮助你迅速查看不同级别的聚合,通过它可以非常方便地累计总数.移动平均值.以及执行其它计算.窗口函数功能非常强大,使用起来也十分容易.可以使用这个技 ...

  2. Hibernate关联关系映射

    1.  Hibernate关联关系映射 1.1.  one to one <class name="Person"> <id name="id" ...

  3. dubbo与spring mvc

    安装 一.本地服务     1.定义服务接口: (该接口需单独打包,在服务提供方和消费方共享) public interface CustomerService { public String get ...

  4. 【点滴积累】通过特性(Attribute)为枚举添加更多的信息

    转:http://www.cnblogs.com/IPrograming/archive/2013/05/26/Enum_DescriptionAttribute.html [点滴积累]通过特性(At ...

  5. 各种会义PPT

    http://vdisk.weibo.com/s/dBzv2siaHK2H http://vdisk.weibo.com/wap/u/3460619722 https://yunqi.aliyun.c ...

  6. 从源码角度深入理解Toast

    Toast这个东西我们在开发中经常用到,使用也很简单,一行代码就能搞定: 1: Toast.makeText(", Toast.LENGTH_LONG).show(); 但是我们经常会遇到这 ...

  7. Java实现简单选择排序

    package select; import java.util.Scanner; /*采用最简单的选择方式:从头到尾扫描序列找出最小的记录和第一个记录交换,接着在剩下的记录中继续这种选择和交换,最终 ...

  8. 【MDCC技术大咖秀】Android内存优化之OOM

    大神分析的很全面,所以就转过来保存一份,转自:http://www.csdn.net/article/2015-09-18/2825737/1 以下为正文: Android的内存优化是性能优化中很重要 ...

  9. Es6 之for of

    能工摹形,巧匠窃意. -- 毕加索 2016-10-10 <!DOCTYPE HTML> <html> <head> <script src="tr ...

  10. java gui可见即可得

    http://www.eclipse.org/windowbuilder/ http://download.eclipse.org/windowbuilder/WB/release/R20130927 ...