永发信息网

C语言高手进!~C语言高手进!~C语言高手进!~

答案:3  悬赏:0  手机版
解决时间 2021-05-06 01:43
  • 提问者网友:一抹荒凉废墟
  • 2021-05-05 01:30

1. ( 取棋子 ) 设有N颗棋子,由人和计算机轮流从中取走若干颗。每方每次最多取K颗,最少取1颗 (K值不能超过总数的一半,也不能小于1)。

屏幕输入提示:

(1) 输入竞赛规则:A. 取最后一颗棋子的那一方为败.

B. 取最后一颗棋子的那一方为胜.

(2) 总共有多少颗棋子?

(3) 一次最多取几颗?

(4) 谁先取?

(5) 每个回合都应显示: A. 你取几颗?

B. 我取走......颗,还剩......颗.

(6) 竞赛过程中发生违例时,打印出: 竞赛无法进行下去!

(7) 竞赛结束后打印:

I win!(我胜!)或 You win!(你胜!)。

同学急着要!~做出前四问就可以了!~当然最好能做全!~

最佳答案
  • 五星知识达人网友:荒野風
  • 2021-05-05 01:36
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <setjmp.h>
#include <ctype.h>

jmp_buf jbenv;


#define SEL_ERROR 1
#define N_EROOR 2
#define K_ERROR 3
#define RANGE_ERROR 4

void errorHandler()
{
int f = 0;
switch( setjmp( jbenv ) )
{
case SEL_ERROR: printf( "选择有误!\n" ); f = 1; break;
case N_EROOR: printf( "总数n不能小于0!\n" ); f = 1; break;
case K_ERROR: printf( "k不在限定范围之内!\n" ); f = 1; break;
case RANGE_ERROR: printf( "输入有误, 竞赛无法继续!\n" ); f = 1; break;
}
if ( f ) exit( 1 );
}

#define YOUFIRST 1
#define COMFIRST 0
#define LASTWIN 1
#define LASTLOST 0

void getRule( int* winMode, int* _n, int* _k, int* whoFirst )
{
int c, n, k, r;
printf( "竞赛规则设定:\n" );
printf( "A.取最后一颗棋子的那一方为败.\n" );
printf( "B.取最后一颗棋子的那一方为胜.\n" );
printf( "请选择:" );

c = toupper( getchar() );
if ( c != 'A' && c != 'B')
longjmp( jbenv, SEL_ERROR );
*winMode = c == 'A' ? LASTLOST : LASTWIN;

printf( "总共有多少棋子?请输入棋子的总数n:" );
r = scanf( "%d", &n );
if ( !r || n <= 0 )
longjmp( jbenv, N_EROOR );
*_n = n;

printf( "每次最多能取多少颗?请输入数量k(1<=k<=n/2):" );
r = scanf( "%d", &k );
if ( !r || k <= 0 || k > n/2 )
longjmp( jbenv, K_ERROR );
*_k = k;

printf( "谁先取?(A:you,B:com):" );
while ( getchar() != '\n' );
c = toupper( getchar() );
if ( c != 'A' && c != 'B')
longjmp( jbenv, SEL_ERROR );
*whoFirst = c == 'A' ? YOUFIRST: COMFIRST;
}

void comFetch( int* n, int* k )
{
int f = rand() % *k + 1;
f = f > *n ? *n : f;
printf( "com取走了%d颗,还剩下%d颗\n", f, *n -= f );
}

void youFetch( int* n, int* k )
{
int f, r;
printf( "you要取几颗?请输入[1..%d]:", *k );
r = scanf( "%d", &f );
if ( !r || f <= 0 || f > *k || f > *n )
longjmp( jbenv, RANGE_ERROR );
printf( "you取走了%d颗,还剩下%d颗\n", f, *n -= f );
}

#define YOU 1
#define COM 0

int main()
{
int winMode, whoFirst, n, k, lastTurn;
char* win, *lost;

errorHandler();
getRule( &winMode, &n, &k, &whoFirst );
srand( time( 0 ) );

printf( "\nGAME START!!\n\n" );
if ( whoFirst == COMFIRST ) {
comFetch( &n, &k );
lastTurn = COM;
}
while ( n != 0 ) {
youFetch( &n, &k );
lastTurn = YOU;
if ( n == 0 ) break;
comFetch( &n, &k );
lastTurn = COM;
}
printf( "\nGAME STOP!!\n\n" );
if ( winMode == lastTurn ) {
win = "YOU"; lost = "COM";
} else {
win = "COM"; lost = "YOU";
}
printf( "%s WIN!\n", win );
printf( "%s LOST!\n", lost );
return 0;
}

全部回答
  • 1楼网友:往事隔山水
  • 2021-05-05 03:14

设置个char g_str[50] = "比赛规则";

设置个int g_all = 100; //总数

一次最多取 g_all / 2;

random() %1; //0为玩家先 1为电脑先 种子自己看了

设置个int 保存玩家或电脑每次取的棵数;

while()主循环,为归写个函数,如果发生或游戏结束跳出;

最后判断谁取的最后一枚谁胜,打印出来

  • 2楼网友:逃夭
  • 2021-05-05 02:33
这题N要符合N=n*K+1就可以了 你也没有给定值 不知道怎么入手
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯