计算思维报告.docx
《计算思维报告.docx》由会员分享,可在线阅读,更多相关《计算思维报告.docx(17页珍藏版)》请在冰豆网上搜索。
计算思维报告
课程实验报告
课程名称:
计算思维
专业班级:
学号:
姓名:
指导教师:
报告日期:
计算机科学与技术学院
1.实验用c语言编写米子棋......................1
1.1实验目的与内容.......................1
1.2实验原理与方案.......................1
1.3实验测试与结果.......................1
2.实验总结与评价..........................2
附录实验源程序代码清单.......................3
1实验用c语言编写米子棋
1.1实验目的与内容
目的:
学会使用计算思维相关知识解决具体问题,并从中体会它的运用。
内容:
用c语言编写一个“米字棋”程序,要求如下:
(1)双人游戏,玩家与计算机轮流走棋,每次选一个可以移动的位置走棋,每次只能横向或竖向走一步;
(2)一方棋子在某对角线成一条直线就算赢;(3)棋盘可用矩阵标示。
1.2实验原理与方案
原理:
使用数组表现棋局,利用枚举法编写计算机下棋算法。
方案:
(1)利用“自顶向下,逐步求精”的结构化程序设计思路,将程序分成四个部分:
主体部分,打印棋局部分,玩家下棋部分,计算机下棋部分。
(2)利用数组记录棋局,根据数组不同的值打印出相应的棋子或空处,再加上利用循环结构打印的棋盘,最后达到将棋局可视化的目的。
(3)利用数组记录棋局,通过使数组的值做出与玩家输入的值相对应的变化并记录这种变化的方式,达到记录玩家的走棋。
(4)利用对下棋策略的枚举设计计算机下棋的算法,使计算机以非完全随机的拥有一定胜率的方式做出“下棋”操作,同样地,使用数组记录棋局。
(5)将其余三个部分在主体部分中联接,并在其中设计了判断胜负的代码,最终实现了实验的要求。
1.3实验测试与结果
测试结果如图一图二所示:
图一图二
2实验总结与评价
棋局得到了良好的体现,达到了可视化的目的。
计算机也以原先的目标进行“下棋”操作。
但是计算机的”智能“还有待提高。
总的来说,较成功地完成了实验内容和要求,但在算法特别是计算机下棋方面还有改进的余地。
附录实验源程序代码清单
#include
#include
#include
#include
voidprint_whole(chara[3][3]);
voidstep(charp[3][3]);
intmachine_o(chara[3][3]);
intmain(void)
{
charnine[3][3];
inti;
for(i=0;i<3;i++)
nine[0][i]='X';
for(i=0;i<3;i++)
nine[1][i]='';
for(i=0;i<3;i++)
nine[2][i]='O';
print_whole(nine);
printf("start!
(UjustcontrolX)\n");//开始走棋
while(!
((nine[0][0]==nine[1][1])&&(nine[1][1]==nine[2][2])&&nine[1][1]!
='')&&!
((nine[0][2]==nine[1][1])&&(nine[1][1]==nine[2][0])&&nine[1][1]!
=''))
{
step(nine);
system("cls");
print_whole(nine);
if(((nine[0][0]==nine[1][1])&&(nine[1][1]==nine[2][2])&&nine[1][1]!
='')||((nine[0][2]==nine[1][1])&&(nine[1][1]==nine[2][0])&&nine[1][1]!
=''))
{
printf("youwin!
\n\n\n\n");
return0;
}
printf("\nnowit'sturnformachine!
\n");
if(machine_o(nine))
{
print_whole(nine);
printf("computerwin!
\n\n\n\n");
return0;
}
else
print_whole(nine);
}
return0;
}
voidprint_whole(chara[3][3])
{
intt,k;
printf("1");
printf("2");
printf("3");
printf("\n");
for(t=0;t<3;t++)
{
printf("%d",t+1);
for(k=0;k<3;k++)
{
printf("%6c",a[t][k]);
}
printf("\n");
}
}
//显示进行到哪里了
voidstep(charp[3][3])
{
inta,b;
printf("writedownthecoordsas'x,x'!
\n");
scanf("%d,%d",&a,&b);
if(a<=3&&a>0&&b<=3&&b>0&&p[b-1][a-1]=='X')
{
intc,d;
printf("whichcoordstomoveas'x,x'?
\n");
scanf("%d,%d",&c,&d);
if(c<=3&&c>0&&c<=3&&c>0)
{
intt=a+b-c-d;
if(((t==1)||(t==-1))&&(p[d-1][c-1]==''))
{
p[b-1][a-1]='';
p[d-1][c-1]='X';
}
else
printf("\nError1!
\n");
}
else
printf("\nError2!
\n");
}
else
printf("\nError3!
\n");
}
//按规则行棋
intmachine_o(chara[3][3])
{
intstep=0,judge=1;
char*three_a[3],*three_b[3];
{
three_a[0]=&a[0][0];
three_a[1]=&a[1][1];
three_a[2]=&a[2][2];
three_b[0]=&a[0][2];
three_b[1]=&a[1][1];
three_b[2]=&a[2][0];
}
//用于讨论能产生胜负的五个格,两边的斜行分开考虑
if(a[1][1]=='')
{
intsu_i;
char*surround[4];
surround[0]=&a[0][1];
surround[1]=&a[1][0];
surround[2]=&a[1][2];
surround[3]=&a[2][1];
for(su_i=0;su_i<4;su_i++)
{
if(*surround[su_i]=='O')
{
*surround[su_i]='';
a[1][1]='O';
}
}
step++;
}
//如果可能,抢先占据中间的位置
else
{
{
intwin_a,win_b,count,what;
for(win_a=0,count=0;win_a<3;win_a++)
{
if(*three_a[win_a]=='O')
count++;
else
what=win_a;
}
if(count==2)
{
if(what==0&&*three_a[what]=='')
{
if(a[0][1]=='O')
{
a[0][1]='';
*three_a[what]='O';
return1;
}
if(a[1][0]=='O')
{
a[1][0]='';
*three_a[what]='O';
return1;
}
}
if(what==2&&*three_a[what]=='')
{
if(a[2][1]=='O')
{
a[2][1]='';
*three_a[what]='O';
return1;
}
if(a[1][2]=='O')
{
a[1][2]='';
*three_a[what]='O';
return1;
}
}
}
//win_a's
for(win_b=0,count=0;win_b<3;win_b++)
{
if(*three_b[win_b]=='O')
count++;
else
what=win_b;
}
if(count==2)
{
if(what==0&&*three_b[what]=='')
{
if(a[0][1]=='O')
{
a[0][1]='';
*three_b[what]='O';
return1;
}
if(a[1][2]=='O')
{
a[1][2]='';
*three_b[what]='O';
return1;
}
}
if(what==2&&*three_b[what]=='')
{
if(a[2][1]=='O')
{
a[2][1]='';
*three_b[what]='O';
return1;
}
if(a[1][0]=='O')
{
a[1][0]='';
*three_b[what]='O';
return1;
}
}
}
}
//如果可以获胜,就去获胜
{
intwin_a,win_b,count,what;
for(win_a=0,count=0;win_a<3;win_a++)
{
if(*three_a[win_a]=='X')
count++;
else
what=win_a;
}
if(count==2)
{
if(what==0&&*three_a[what]=='')
{
if(a[0][1]=='O')
{
a[0][1]='';
*three_a[what]='O';
return0;
}
elseif(a[1][0]=='O')
{
a[1][0]='';
*three_a[what]='O';
return0;
}
}
if(what==2&&*three_a[what]=='')
{
if(a[2][1]=='O')
{
a[2][1]='';
*three_a[what]='O';
return0;
}
elseif(a[1][2]=='O')
{
a[1][2]='';
*three_a[what]='O';
return0;
}
}
}
//win_a's
for(win_b=0,count=0;win_b<3;win