C语言版井字棋.docx
《C语言版井字棋.docx》由会员分享,可在线阅读,更多相关《C语言版井字棋.docx(15页珍藏版)》请在冰点文库上搜索。
![C语言版井字棋.docx](https://file1.bingdoc.com/fileroot1/2023-7/1/ecccf3e7-b6ea-4688-b4b4-bc229266cf49/ecccf3e7-b6ea-4688-b4b4-bc229266cf491.gif)
C语言版井字棋
十五、井字棋
【问题描述】
设计一个井字棋的游戏程序
【基本要求】
游戏规则是:
从一个空的棋盘开始,人为x一方,计算机为o一方,人机双方轮流放置棋子,人下的时候,字符x将被放入棋盘中指定的位置,轮到计算机下时,程序将扫描棋盘,并将字符o放入扫描到的第一个空格,某一方有3枚棋子占据了一横行、一竖行或一对角线则获胜,若整个棋盘被占满还没有一方获胜则为和局。
截图:
代码:
//@authorGXU-pengcheng
#include
#include
#include
voidHelp();//帮助
intPlay(charplayer,intchoice);//对弈
voidInit();//初始化棋盘
voidDisplay();//打印棋盘
voidBlack(intchoice);//黑棋
voidWhite(intchoice);//白棋
voidBlock(intchoice);//添加选择框
voidClear(intchoice);//清空之前的选择框
intJudge(intchoice,charsymbol);//判断输赢返回值0为无结果,1为获胜,2为平局
intFuncx(intchoice);//将标号转换为行号
intFuncy(intchoice);//将标号转换为列号
voidEnd(charsymbol);//结束
intFound();//返回第一个没有棋子的位置的编号
chara[31][64];//用数组存放棋盘和棋子,a[行][列]
intb=0;//棋子个数
intmain(){
charplayer;
intchoice;
system("title井字棋");//设置标题
system("modeconcols=64lines=35");//设置窗口大小
system("color70");//设置颜色
while
(1){
printf("\n\n\n\n\n\n\t\t\t井\t字\t棋");
printf("\n\n\n\n\n\n\n\n\t\t\t1.玩家先手\n\n\t\t\t2.电脑先手\n\n\t\t\t3.帮助\n\n\t\t\t4.退出\n\n\n\n\n\t\t请输入:
");
player=getch();
if(player=='1'){
Init();
Block(5);
choice=5;
Play(player,choice);
}elseif(player=='2'){
Init();
Play(player,choice);
}elseif(player=='3'){
Help();
getch();
system("cls");
continue;
}elseif(player=='4'){
return0;
}else{
printf("\n\n\t\t输入错误请重新输入!
");
Sleep(1000);
system("cls");
continue;
}
}
return0;
}
voidHelp(){
system("cls");
printf("\n\n\n\n\n\n\n\n\n\t\t\t帮助\n\n\n");
printf("\t'W'上移,'S'下移,'A'左移,'D'右移\n\n");
printf("\t\t游戏中按'4'退出");
printf("\n\n\n\n\t\t按任意键退出");
}
intPlay(charplayer,intchoice){//对弈
charget;
charsymbol;
intc=0;//Judge得出的结果
while
(1){
system("cls");//每次循环清屏一次
Display();
if(player=='1'){//玩家下棋
while
(1){//确定要下的位置
if((get=getch())!
=''){
if(get=='4'){
system("cls");
return0;
}elseif((get=='w'||get=='W')&&choice-3>=1){
Clear(choice);
choice=choice-3;
}elseif((get=='s'||get=='S')&&choice+3<=9){
Clear(choice);
choice=choice+3;
}elseif((get=='a'||get=='A')&&(choice+2)/3==(choice+1)/3){
Clear(choice);
choice-=1;
}elseif((get=='d'||get=='D')&&(choice-1)/3==choice/3){
Clear(choice);
choice+=1;
}else{
continue;
}
Block(choice);
system("cls");
Display();
}
else{
if(a[((choice-1)/3)*10+2][((choice-1)%3)*21+4]!
=''){
printf("该位置已有其他棋子!
");
continue;
}else{
Clear(choice);
break;
}
}
}//while结束
b++;
Black(choice);
player='0';
symbol='#';
}//if结束
else{//电脑下棋
choice=Found();
Block(choice);
b++;
White(choice);
player='1';
symbol='*';
}
if((c=Judge(choice,symbol))!
=0){//判断输赢
if(c==2)
symbol='=';
c=0;
End(symbol);
break;
}
}
return0;
}
voidInit(){//初始化棋盘
intx=0,y=0;
inti='1';
for(x=0;x<31;x++)
{
for(y=0;y<64;y++)
{
if((y==Funcy
(1)||y==Funcy
(2)||y==Funcy(3)||y==Funcy
(2)+Funcy(3)))
{
if(x==Funcx
(1)||x==Funcx(4)||x==Funcx(7)||x==Funcx(4)+Funcx(7))
a[x][y]='+';
else
a[x][y]='|';
}
elseif(x==Funcx
(1)||x==Funcx(4)||x==Funcx(7)||x==Funcx(4)+Funcx(7))
a[x][y]='-';
else
a[x][y]='';
}
}
//for(x=1;x<=7;x=x+3)//在每个格子的左上角添加序号,范围1~9
//{
//for(y=1;y<=3;y++)
//{
//a[(Funcx(x)+1)][(Funcy(y)+1)]=i;
//i++;
//}
//}
}
voidDisplay(){//打印棋盘
intx=0,y=0;
for(x=0;x<31;x++)
{
for(y=0;y<64;y++)
{
printf("%c",a[x][y]);
}
}
}
voidBlock(intchoice){//添加选择框
intx,y;
for(x=Funcx(choice)+1;x{
for(y=Funcy(choice)+2;yif(x==Funcx(choice)+1||x==Funcx(choice)+9)
{
if(y==Funcy(choice)+2||y==Funcy(choice)+19)
a[x][y]='+';
elseif(yFuncy(choice)+14)
a[x][y]='-';
}
elseif(xFuncx(choice)+6)
if(y==Funcy(choice)+2||y==Funcy(choice)+19)
a[x][y]='|';
}
}
voidClear(intchoice){//清空选择框
intx,y,i;
for(i=1;i<=9;i++){
if(a[Funcx(choice)+1][Funcy(choice)+2]=='+'&&i!
=choice){
for(x=Funcx(choice)+1;x{
for(y=Funcy(choice)+2;yif(x==Funcx(choice)+1||x==Funcx(choice)+9)
{
if(y==Funcy(choice)+2||y==Funcy(choice)+19)
a[x][y]='';
elseif(yFuncy(choice)+14)
a[x][y]='';
}
elseif(xFuncx(choice)+6)
if(y==Funcy(choice)+2||y==Funcy(choice)+19)
a[x][y]='';
}
}
}
}
voidBlack(choice){//添加黑棋
intx,y;
for(x=Funcx(choice)+2;x{
for(y=Funcy(choice)+4;yif(x==Funcx(choice)+2||x==Funcx(choice)+8)
a[x][y]='#';
elseif(y==Funcy(choice)+4||y==Funcy(choice)+17)
a[x][y]='#';
}
}
voidWhite(choice){//添加白棋
intx;
intd=4;
for(x=Funcx(choice)+2;x<=Funcx(choice)+8;x++)
{
a[x][Funcy(choice)+d]='*';
a[x][Funcy(choice)+20-d]='*';
d=d+2;
}
}
intJudge(intchoice,charsymbol){//判断输赢返回值0为无结果,1为获胜,2为平局
if(
(
(a[Funcx(choice)+2][Funcy(choice)+4]==a[Funcx(choice+3)+2][Funcy(choice)+4]
&&a[Funcx(choice+3)+2][Funcy(choice)+4]==a[Funcx(choice+6)+2][Funcy(choice)+4])
||
(a[Funcx(choice)+2][Funcy(choice)+4]==a[Funcx(choice)+2][Funcy(choice+1)+4]
&&a[Funcx(choice)+2][Funcy(choice+1)+4]==a[Funcx(choice)+2][Funcy(choice+2)+4])
)
||
a[Funcx(5)+2][Funcy(5)+4]==symbol
&&
(
(a[Funcx
(1)+2][Funcy
(1)+4]==a[Funcx(5)+2][Funcy(5)+4]
&&a[Funcx(5)+2][Funcy(5)+4]==a[Funcx(9)+2][Funcy(9)+4])
||
(a[Funcx(3)+2][Funcy(3)+4]==a[Funcx(5)+2][Funcy(5)+4]
&&a[Funcx(5)+2][Funcy(5)+4]==a[Funcx(7)+2][Funcy(7)+4])
)
)
return1;
if(b==9)
return2;
return0;
}
intFuncx(intchoice){//将标号转换为行号
return(((choice-1)/3)%3)*10;
}
intFuncy(intchoice){//将标号转换为列号
return((choice-1)%3)*21;
}
voidEnd(charsymbol){//结束
system("cls");
Display();
if(symbol=='*')
printf("\t\t\t电脑胜利!
\n\n");
elseif(symbol=='#')
printf("\t\t\t玩家胜利!
\n\n");
else
printf("\t\t\t平局!
\n\n");
b=0;
printf("\t\t\t按任意键返回菜单");
getch();
system("cls");
}
intFound(){//返回第一个没有棋子的位置的编号
inti;
for(i=1;i<=9;i++)
{
if(a[Funcx(i)+2][Funcy(i)+4]=='')
returni;
}
}
如有侵权请联系告知删除,感谢你们的配合!