到底那里错了?????

ruoruo138 2008-11-08 05:41:30
取奇数游戏{ 该游戏规则如下: 操作者先输入一个奇数 N( <200)表示N个石
子. 设计算机为 A 方,操作者为 B 方, 双方轮流取石子,每次取1-3个. 最后取
到石子总数为奇数的一方获胜. 编制程序使计算机有较多的获胜机会,
}
unit lxw022;
type
setab=set of 0..200;
var
evena,evenb,odda,oddb:setab;
i,j,n,na,nb,k,kz,r,t:integer;
ab,ll:char;
procedure init0(var n:integer);
begin
clrscr;
gotoxy(1,1);
writeln('***************************************');
writeln(' 取奇数游戏 规则如下: ');
writeln(' 1.操作者先输入一个奇数 N( <200).');
writeln(' 2.设计算机为 A 方,操作者为 B
方,双方轮流取数,每次取1-3个.');
writeln(' 3.最后取到奇数的一方为胜方. ');
writeln('***************************************');
n:=400;
while not odd(n)or(n>200) do
begin
gotoxy(10,7);
writeln('输入一个奇数 N( <200):');
gotoxy(10,8); readln(n);
end;
end;
procedure prt1;
begin
gotoxy(1,17);
writeln(' 总计 计算机已取得 操作手已取得 剩余
');
gotoxy(50,19);
writeln(' ');
gotoxy(1,19);
writeln(' ',n,' ',na,' ',nb,
' ',r);
end;
procedure prt2(var ll:char);
begin
gotoxy(10,21);
if odd(na) then writeln('可惜, 你输了!')
else writeln ('祝贺你的成功!');
gotoxy(10,22);
writeln('再玩一次吗 ? (Y/N)');
gotoxy(10,23); readln(ll);
end;
procedure aget(var r,t,na:integer);
var k,kz:integer;
begin
kz:=0; k:=0;
while (k <3)and(kz=0)and(k <r) do
begin
k:=k+1;
if (not odd(na+k))and(r-k in evena) then
begin kz:=1; t:=k end;
if (odd(na+k))and(r-k in odda) then
begin kz:=1; t:=k end;
end;
if kz=0 then t:=1;
gotoxy(50,14);
writeln(' 计算机这次取 ',t,' 个.');
na:=na+t; r:=r-t;
end;
procedure bget(var r,t,nb,i:integer);
begin
t:=0;
while not(t in[1,2,3])or(t>r) do
begin
gotoxy(30,13); writeln(' ');
gotoxy(2,13);
writeln('第',i:2,' 轮: 输入你的选择 (1/2/3) 并且不得超过 ',r);
gotoxy(5,14); write(' ');
gotoxy(5,14); readln(t); gotoxy(20,14);
if not(t in[1,2,3])or(t>r)
then write('数据错! 请重新输入.')
else write(' ');
end;
nb:=nb+t; r:=r-t;
end;
begin{main}
ll:='y';
while (ll='Y')or(ll='y') do
begin{2}
init0(n);
r:=n;
{ 1. 建立获胜策略集 EVENA,EVENB,ODDA,ODDB }
evena:=[4,5]; evenb:=[0,1,2,3];
odda:=[0,1]; oddb:=[2..5];
for i:=6 to n do
begin{3}
nb:=0;
if not odd(i) then nb:=1;
kz:=0; k:=0;
while (k <3)and(kz=0) do

begin
k:=k+1;
if odd(nb+k)and (i-k in odda) then kz:=1;
if (not odd(nb+k))and(i-k in evena) then kz:=1;
end;
if kz=0
then evena:=evena+[i]
else evenb:=evenb+[i];
nb:=0;
if odd(i) then nb:=1;
kz:=0; k:=0;
while (k <3)and(kz=0) do
begin
k:=k+1;
if odd(nb+k)and (i-k in odda) then kz:=1;
if (not odd(nb+k))and(i-k in evena) then kz:=1;
end;
if kz=0
then odda:=odda+[i]
else oddb:=oddb+[i];
end;{3}
{ 2. 开始取数. }
na:=0; nb:=0; t:=0; ab:=' ';
while not (ab in ['a','b','A','B']) do
begin
gotoxy(10,9);
writeln('输入: "谁先开始 (A/B) ?" A: 计算机, B:操作手.');
gotoxy(10,10); readln(ab);
end;
i:=1;
if (ab='B')or(ab='b') then bget(r,t,nb,i);
repeat
if r>0 then
begin {5}
aget(r,t,na);
prt1;
if r>0 then bget(r,t,nb,i);
i:=i+1;
end;{5}
until r=0;
gotoxy(3,16); writeln(' 最后结果:');
prt1; prt2(ll);
end{2}
end.{main}


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

end.
...全文
71 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
elegant87 2008-11-08
  • 打赏
  • 举报
回复
这不是Delphi吗?怎么跑到这里了呢?
BaihowFF 2008-11-08
  • 打赏
  • 举报
回复
没认错的话应该是pascal.....
可惜我电脑上连Delphi都没有了...帮不了你了....
nhycf 2008-11-08
  • 打赏
  • 举报
回复
注意这里是C++
ruoruo138 2008-11-08
  • 打赏
  • 举报
回复
用WIN/TC运行不了
lzr4304061988012 2008-11-08
  • 打赏
  • 举报
回复
......

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧