8.5 趣味游戏(1)

8-24 stone.c

  1 #include <stdio.h>
  2 unsigned int *heap; //保存各堆石子的数量
  3 int num;
  4 void Output() //显示各堆石子的状态
  5 {
  6    int i;
  7    printf("各堆剩下的石子数量:\n");
  8    for (i = 1; i <= num; i++)
  9       printf("第%2d堆剩下: %u \n", i, heap[i]);
 10 }
 11 unsigned int remain() //统计剩下的石子总数
 12 {
 13    unsigned int s;
 14    int i;
 15    s = 0;
 16    for (i = 1; i <= num; i++)
 17       s += heap[i];
 18    return s;
 19 }
 20 unsigned int xorall() //按位异或的结果
 21 {
 22    unsigned int s;
 23    int i;
 24    s = 0;
 25    for (i = 1; i <= num; i++)
 26       s ^= heap[i];
 27    return s;
 28 }
 29 int main()
 30 {
 31    unsigned int t;
 32    int i, s, h;
 33    printf("输入石子的堆数:");
 34    scanf("%d", &num);
 35    if(num<2)
 36    {
 37        printf("至少应该有2堆石子!\n");
 38        exit(0);
 39    }
 40    if(!(heap=(unsigned int *)malloc(sizeof(unsigned int)*num)))
 41    {
 42        printf("内存分配失败!\n");
 43        exit(0);
 44    }
 45    for (i = 1; i <= num; i++)
 46    {
 47       printf("输入第%d堆石子的数量:", i);
 48       scanf("%d", &heap[i]);
 49    }
 50    while (remain()) //剩余石子数大于0
 51    {
 52       if (xorall() == 0) //若异或的结果为0
 53       {
 54          for (i = 1; i <= num; i++) //从一堆石子中取一粒
 55          {
 56             if (heap[i] > 0)
 57             {
 58                printf("\n计算机从第%2d堆中拿1粒。\n", i);
 59                heap[i]--;
 60                break;
 61             }
 62         }
 63       }
 64       else
 65       {
 66          for (i = 1; i <= num; i++)
 67          {
 68             s = heap[i] - (xorall() ^ heap[i]); //计算要取的石子数量
 69             if (s > 0)
 70             {
 71                printf("\n计算机从第%2d堆中拿%u粒。\n", i, s);
 72                heap[i] ^= xorall();
 73                break;
 74             }
 75          }
 76       }
 77       if (remain() == 0)
 78       {
 79          printf("\n计算机胜!");
 80          break;
 81       }
 82       Output(); //显示剩余的石堆情况
 83       while (1)
 84       {
 85          printf("\n输入你的选择(堆 数量):");
 86          scanf("%d %u", &h, &t);
 87          if ((h >= 1) && (h <= num) && (heap[h] >= t))
 88          {
 89             heap[h] -= t;
 90             break;
 91          } else
 92             printf("\n输入数据出错,重新输入!\n");
 93       }
 94       if (remain() == 0)
 95       {
 96          printf("\n恭喜你获胜!");
 97          break;
 98       }
 99    }
100    getch();
101    return 0;
102 }

8-25 gameoflife.c

  1 #include <stdio.h>
  2 #define MAXROW 10 //最大行数
  3 #define MAXCOL 10 //最大列数
  4 #define DEAD 0 //死细胞
  5 #define ALIVE 1 //活细胞
  6 int cell[MAXROW][MAXCOL], tempcell[MAXROW][MAXCOL]; //当前生命细胞的状态,一个用于判断当前的细胞的下一个状态
  7 void init(); //初始化细胞数组
  8 int BorderSum(int, int); //统计当前细胞四周的细胞数
  9 void Output(); //输出细胞状态
 10 int main()
 11 {
 12    int row, col,sum1;
 13    char again;
 14    init(); //初始化,输入细胞的位置
 15    Output();   //输出细胞初始状态
 16    printf("按任意键进行转换。\n");
 17    getch();
 18    while (1)
 19    {
 20       for (row = 0; row < MAXROW; row++)
 21       {
 22          for (col = 0; col < MAXCOL; col++)
 23          {
 24             switch (BorderSum(row, col)) //(row,col)单元格四周的生细胞数量
 25             {
 26             case 0:
 27             case 1:
 28             case 4:
 29             case 5:
 30             case 6:
 31             case 7:
 32             case 8:
 33                tempcell[row][col] = DEAD; //将原细胞改为死细胞
 34                break;
 35             case 2:
 36                tempcell[row][col] = cell[row][col]; //保持细胞原样
 37                break;
 38             case 3:
 39                tempcell[row][col] = ALIVE; //将细胞改为活细胞
 40                break;
 41             }
 42          }
 43       }
 44       for (row = 0; row < MAXROW; row++)//复制临时数组到map数组
 45           for (col = 0; col < MAXCOL; col++)
 46              cell[row][col] = tempcell[row][col];
 47       sum1=AliveSum();
 48       if(sum1==0) //若活细胞数量为0
 49           break;//跳出循环
 50       Output(); //输出转换后的细胞状态
 51       printf("共有%d个活细胞。\n",sum1);
 52       printf("\n继续生成下一次细胞的状态(n退出)?");
 53       again = getch();
 54       if (again == ‘N‘ || again == ‘n‘)
 55          break;
 56    }
 57    getch();
 58    return 0;
 59 }
 60 void init() //初始化
 61 {
 62    int row, col;
 63    for (row = 0; row < MAXROW; row++) //先全部初始化为死状态
 64       for (col = 0; col < MAXCOL; col++)
 65          cell[row][col] = DEAD;
 66    printf("生命游戏\n");
 67    printf("输入活细胞的坐标位置,输入(-1 -1)结束:\n");
 68    while (1)
 69    {
 70       scanf("%d %d", &row, &col); //输入行列坐标
 71       if (0 <= row && row < MAXROW && 0 <= col && col < MAXCOL)
 72          cell[row][col] = ALIVE; //保存生细胞
 73       else if (row == -1 || col == -1)
 74          break;
 75       else
 76          printf("输入坐标超过范围。\n");
 77    }
 78 }
 79 int BorderSum(int row, int col) //统计四周细胞数量
 80 {
 81    int count = 0, c, r;
 82    for (r = row - 1; r <= row + 1; r++)
 83    {
 84       for (c = col - 1; c <= col + 1; c++)
 85       {
 86          if (r < 0 || r >= MAXROW || c < 0 || c >= MAXCOL) //超过数组界限
 87             continue; //处理下一个单元格
 88          if (cell[r][c] == ALIVE) //若为活细胞
 89             count++; //增加活细胞的数量
 90       }
 91    }
 92    if (cell[row][col] == ALIVE) //若当前单元格为活细胞
 93       count--; //活细胞总数减1
 94    return count; //返回四周活细胞总数
 95 }
 96 void Output() //输出细胞状态
 97 {
 98    int row, col;
 99    printf("\n细胞状态\n");
100    printf("┌");    //输出项部横线
101    for (col = 0; col < MAXCOL -1; col++)    //输出一行
102       printf("─┬");
103    printf("─┐\n");
104    for (row = 0; row < MAXROW; row++)
105    {
106       printf("│");    //输出行号
107       for (col = 0; col < MAXCOL; col++)    //输出棋盘各单元格中棋子的状态
108       {
109          if (cell[row][col] == ALIVE  )    //活细胞
110             printf("●│");
111          else     //死细胞
112             printf("○│");
113       }
114       printf("\n");
115
116       if (row < MAXROW - 1)
117       {
118          printf("├");    //输出交叉线
119          for (col = 0; col < MAXCOL - 1; col++)    //输出一行
120             printf("─┼");
121          printf("─┤\n");
122       }
123    }
124    printf("└");
125    for (col = 0; col < MAXCOL - 1; col++)    //最后一行的横线
126       printf("─┴");
127    printf("─┘\n");
128 }
129 int AliveSum() //统计生细胞的数量
130 {
131    int row,col,count=0;
132    for (row = 0; row < MAXROW; row++)
133    {
134       for (col = 0; col < MAXCOL; col++)
135       {
136          if(cell[row][col] == ALIVE) //若是活细胞
137              count++; //累加数量
138       }
139    }
140    return count;
141 }
时间: 07-18

8.5 趣味游戏(1)的相关文章

趣味游戏___表示数

问题1:现给三个数,仅用加法运算这三个数字a,b,c,可以表示出从1开始的连续的最大的N(N<=a+b+c).求使N最大时候abc分别是多少?? 例如:1,2,3可以表示到的最大的数为6. 1,2,5可以表示到的最大的数为3. 问题2:现给四个数,依旧按照问题1,此时四个数分别是多少呢? ....... 问题3:现在给N个数呢?? 那么游戏来了,现在地主有一根7CM的金条,他雇佣了一个农民给他种田,需要每天支付1CM 的金条(一天一支付),求刚好付清农民佣金时候,切金条的最少次数为多少??(15

8.5 趣味游戏(2)

8-26 shuffle.c 1 #include <stdio.h> 2 typedef struct card 3 { 4 int Suit; //花色 5 char Number; //牌数 6 }Card; 7 Card card1[52]; //保存每张扑克的花色.数字 8 void ShowCard(); //显示牌 9 void Shuffle(); //洗牌 10 int main() 11 { 12 int i, suit1, temp; 13 suit1 = 2; 14 f

财富。这会是个很有效的趣味游戏!

秘密摘要 ·要吸引金钱,就要专注在富裕.专注于金钱的不足,就不可能在人生中带来更多金钱. ·利用想像力,以及假装你已经拥有你想要的财富是很有帮助的.上演拥有财富的戏码,能让你对金钱的感觉变好:当对金钱有了好的感觉,就会有更多的金钱流入你的人生. ·当下就感觉快乐,是为人生带来财富最快速的方法. ·刻意去看你喜欢的东西,对自己说:“我付得起.我可以买下它.”你就会转变你的想法,对金钱的感觉会变得更好. ·去给予,好让更多金钱进入你的人生.当你慷慨使用金钱.对分享金钱也感觉美好,你等于是在说:“我有

别踩白块儿

相信大家对这个游戏并不陌生.这个游戏可玩性不错,就是有点闹心,一点小错误又得重新来过.可所谓一失足成千古恨啊! 不过我最近在和朋友争论这个游戏里的钢琴音效的问题.我认为那是一首首歌曲的调,他却不这么认为(可能有点笨吧).因为我玩的时候明明可以听到是歌曲的音调,还可以跟着哼出来.这里我搜集了一下这里面的歌曲,有我听出来的,也有我在网上搜的.这些音乐随机出现在一局游戏里,当你足够厉害弹完一首歌曲,它会在随机地出现一首(难道没有尽头?)笔者反正只连续听过两首歌曲.不过随着游戏的进行,节奏越来越快,有些

【读书札记】《怦然心动——情感化交互设计指南》

近期频频有曾经的同学,朋友的朋友托我帮忙给他们做一个站点.我想一个站点嘛,他们要求的也不高,就是简简单单给他们布个局,搞点动态效果,炫一点即可了. 但是随着不断的构思,我越发的感到做一个好的站点,用户友好,界面干净.信息能良好呈现的站点是花费一点时间和精力的. 说到这里也谈到我所示这本书,为什么会看到这本书,我近期突然想到了我第一天看到这本书的情形. 情景:趁着闲暇的时间我来到了图书馆,琪琪(公司的女同事)那天一直在搞论文,我一直在看JavaScript Dom编程指南,这本书也是值得推荐的,很

一种绝对提高开发水平的方法

一.概要 英语对提升软件开发水平非常重要. 如果你英文水平不高,这并不影响你成为一个普通程序员,程序更多是靠逻辑思维. 如果做了多年开发的你发现自己的水平一直上不去,你要提高自己的英文水平了. 我周围的高水平的开发者英文都不差,官方API没问题. 英语是世界上使用最广泛的语言之一,是欧盟.许多国际组织与英联邦国家的官方语言之一.如今英语也是与电脑联系最密切的语言,大多数编程语言都与英语有关系. 英语在软件行业.编程世界里都占有压倒性的优势,它能够帮助人们在关键词和代码库的选择上带来灵感.根据HO

微信公众平台开发(58)自定义菜单

一.自定义菜单概述 自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能.开启自定义菜单后,公众号界面如图所示: 二.申请自定义菜单 个人订阅号只能编辑生成菜单,无法开发.企业订阅号通过微信认证:可以申请到自定义菜单资格 服务号默认有菜单权限. 三.获得AppId 和AppSecert AppId和AppSecret在开发者中心-开发者ID中,可以找到. 四.获得Access Token 用appid和appsecert获得access token,接口为 https://api.

当今游戏大作share的特性大盘点

极品游戏制作时的考虑要素大盘点 不知不觉入坑Steam已近4年,虽然说Steam的毒性让很多人走向一条不归路,但是想我这样即使"中毒"还是很快乐很感恩的.那么本期文章就谈谈我对其中一些优秀作品的共性的一个总结,共列举了共31个特性,其中甚至还有一些还未实现但我很期望的新特性(一定要看到最后哦).这些特性共同成就了一部部优秀的游戏作品,让他们走向IGN的排行榜首页.本文全为知识共享,没有商业意图,那下面就开始吧(排名不分先后). 1.3D画面 一个主流的电子游戏,你首先得是3D游戏吧,至

分享我的微信公众号半年2万粉丝的心得,觉得是pianzi的勿进

方法一:巧妙利用陌陌 陌陌很多人在用,尤其是男人.你最好去注册个女号,而且头像弄得漂亮真实点,更重要的是,你最好在晚上9:00之后发一些自己的留言,并且在个人资料那里留下自己的微信号.我是这么写的:平时上陌陌比较少,交朋友可以加我微信xxxxxx.你看看吧,过几天你的微信好友立马变得好多.好友一多,自然可以很好的帮你推广公众号. 方法二:去一些流量高的论坛发布帖子或是去一些高权重博客投稿 我之前也是做SEO,现在就放在那边,偶尔打理下.我是这么做的,去一些流量比较高的论坛,比如像本论坛的原创专区