//自己敲一个
//思路
//一、问题描述
//二、基本流程
//三、步骤
//1.菜单界面
//2.创建棋盘
//3.棋盘初始化
//4.打印棋盘
//(1)简陋方法:
//(2)美观方法:
//5.玩家落子
//6.电脑落子
//7.判断胜负
//四、结果演示
//1.玩家胜利
//2.电脑胜利
//3.和棋
#include<stdio.h>
#define ROW 3
#define COL 3//在这里弄方便后期改变
#include<stdlib.h>//rand的头文件
#include<time.h>//time头文件
//放在主函数的上头
void chushihua(char qipan[ROW][COL],int row,int col)
//不理解在这个形参这里居然定义会出现相同变量导致错误
{
//目的实现三子棋的九方格全为空的格式
int i=0,j=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
qipan[i][j]=' ';//放入空格
}
}
}
void dayinqp(char qipan[ROW][COL],int row,int col)
{
int i=0,j=0;
//1.粗略的空棋盘
/*printf("+----+----+----+\n");
for(i=0;i<row;i++)
{
//printf("+----+----+----+\n");
printf("| | | |\n");
printf("+----+----+----+\n");
*/
/*for(j=0;j<col-1;j++)
{
printf("+----+----+----+\n");
printf("| %c | %c | %c |\n",qipan[i][j]);
printf("+----+----+----+\n");
}
}*/
/*//2.有点手法的棋盘
printf("+---+---+---+\n");
for(i=0;i<row;i++)
{
printf("| %c | %c | %c |\n",qipan[i][0],qipan[i][1],qipan[i][2]);
printf("+---+---+---+\n");
}
//这个写法的话,如果改变行和列,打印出来的列依然不会改变只能改变行,因为上面%c已经固定了;
*/
//3.继续优化写法
//思路 是将%c|弄为一个组,前面再弄一个|吧 ,梅达到最后一次记得换行 ,然后在外面补一个分割行
//printf("+---+---+---+\n");
//这个算法可以实现格式各样的格子了
for(j=0;j<col;j++)//这个在首行弄封闭
{
if(j==0)
printf("|");
printf("---");
if(j<col)
printf("+");
}
printf("\n");
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(j==0)//在前面来一个竖线封
printf("|");
//打印一行的数据
printf(" %c ",qipan[i][j]);
if(j<col)
printf("|");
}
printf("\n");
if(i<row)
{
for(j=0;j<col;j++)
{
if(j==0)//前面打印 |封闭
printf("|");
printf("---");
if(j<col)
printf("+");
}
printf("\n");
}
}
}
//玩家落棋
void wanjia(char qipan[ROW][COL],int row,int col)
{
//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
//2.也得考虑 那个位置是否已经下了
int y=0,x=0;
while(1)
{
//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
//printf("请输入你要落棋的位置:(横纵坐标)\n");
printf("玩家1出手\n");
scanf("%d%d",&x,&y);
if(x>=1&&x<=row && y>=1&&y<=col)//在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入
{
//判断这个位置是否为空
if(qipan[x-1][y-1]==' ')//在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
{
qipan[x-1][y-1]='*';
break;
}
else
{
printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
}
}
else
printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
}
}
//int diannao(char qipan[ROW][COL],int row,int col)
/*void diannao(char qipan[ROW][COL],int row,int col)
{
int x=0;
int y=0;
//x=rand()%row;//磨横纵保证范围在0到2的范围
//y=rand()%col;
//这个范围的话已经确定了不用去判断是否超出,只需判断是否为空
while(1)
{
//我知道为啥会卡死,因为这两个随机数放在循环外面,虽然不知道为啥要放在里面,但必须放里面才对
x=rand()%row;//磨横纵保证范围在0到2的范围
y=rand()%col;
//printf("ok\n");//这个拿来调试看看哪步有问题
if(qipan[x][y]==' ')//在这里因为是电脑操作不需要人为因此不用设置x-1形式
{
qipan[x][y]='o';
//printf("ok\n");
break;
//continue;
}
}
//printf("ok\n");
}*/
//玩家2落棋
void wanjia2(char qipan[ROW][COL],int row,int col)
{
//1.接下来就得判断输入的坐标是否在棋盘的范围内,因为下棋的人可能不懂棋盘的范围
//2.也得考虑 那个位置是否已经下了
int y=0,x=0;
while(1)
{
//printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
//printf("请输入你要落棋的位置:(横纵坐标)\n");
scanf("%d%d",&x,&y);
if(x>=1&&x<=row && y>=1&&y<=col)//在这里为啥要大于等于1;因为,程序员非正常人的思维,正常人不懂这个的话,肯定从1开始输入
{
//判断这个位置是否为空
if(qipan[x-1][y-1]==' ')//在这里x-1相当于x=0;也就是让x=0=x=1;对应上面的x=1;
{
qipan[x-1][y-1]='o';
break;
}
else
{
printf("靓仔或者靓女,这个位置已经有人了,到别处坐坐\n");
}
}
else
printf("您输入的坐标并不在棋盘的范围内,请重新输入\n");
}
}
int pingju(char qipan[ROW][COL],int row,int col)
{
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
if(qipan[i][j]==' ')
return 0;
}
}
return 1;
}
char jieju(char qipan[ROW][COL],int row,int col)
{
//赢的也就是四种情况,水平,竖直,左斜,右斜,连三个
int i=0;
for(i=0;i<row;i++)//判断三行
{
if(qipan[i][0]==qipan[i][1] && qipan[i][1]==qipan[i][2] && qipan[i][0]!=' ')
{
return qipan[i][1];
}
}
for(i=0;i<row;i++)//判断竖三列
{
if(qipan[0][i]==qipan[1][i] && qipan[1][i]==qipan[2][i] && qipan[1][i]!=' ')
{
return qipan[1][i];
}
}
//两个对角线
if(qipan[0][0]==qipan[1][1] && qipan[1][1]==qipan[2][2] && qipan[2][2]!=' ')
return qipan[1][1];
if(qipan[2][0]==qipan[1][1] && qipan[1][1]==qipan[0][2] && qipan[0][2]!=' ')
return qipan[1][1];
//判断平局
int a=pingju(qipan,ROW,COL);
if(a==1)
{
return 'p';
}
}
void game()
{
//开始弄棋盘,九宫格的样式,二维数组便于填坐标
printf("2.创建棋盘\n");
char qipan[ROW][COL]={0};//rou行坐标,col纵坐标
printf("3.初始化棋盘\n");
chushihua(qipan,ROW,COL);
printf("4.打印棋盘\n");
dayinqp(qipan,ROW,COL);
printf("5.阿祥落棋\n");
printf("棋盘大小范围为3x3的大小,请勿超出范围\n");
printf("请输入你要落棋的位置:(横纵坐标)\n");
srand((unsigned int)time(0)); //这里不太明白还有加s
char kun;
while(1)
{
//system("cls");
wanjia(qipan,ROW,COL);
//打印一下现在棋盘的情况;
printf("目前棋盘的情况如下表:\n") ;
dayinqp(qipan,ROW,COL);
//判断输赢平,继续
kun=jieju(qipan,ROW,COL) ;
printf("%c\n",kun);
//printf("赢 'y'平'p'继续'j'\n");
if(kun=='*')
break;
if(kun=='p')
break;
//电脑落子,我感觉要用到库函数实现随机填充
//printf("电脑仔出手\n");
printf("玩家2出手\n");
//目前剩四个空格电脑就会死;
//diannao(qipan,ROW,COL);//死在这里
//printf("11\n");
wanjia2(qipan,ROW,COL);
dayinqp(qipan,ROW,COL);
//判断输赢平,继续,每一步都得判断
kun=jieju(qipan,ROW,COL);
if(kun=='o')
break;
if(kun=='p')
break;
}
if(kun=='*')
printf("恭喜,玩家1,您赢了,你干嘛哎哟\n");
if(kun=='o')
//printf("搞笑,连人机都玩不过,奖励回去练习两年半\n");
printf("恭喜,玩家1,您赢了,你干嘛哎哟\n");
if(kun=='p')
printf("恭喜,你两平手\n");
}
void caidan()
{
printf("1.菜单界面实现\n");
printf("******************************\n");
printf("********输入1进入游戏*********\n");
printf("********输入0退出游戏*********\n");
printf("********输入其他奖励再来亿次**\n");
printf("******************************\n");
printf("请作出你的选择\n");
//printf("2.创建棋盘\n");
//chushihua(choose);
}
void zongxt()
{
//do..while 好处是必执行一次,也就是有一次选择;
int choose=1,i=0;//在这里choose需要放在do..while上头,不然无法识别
do
{
caidan();
//在这里设计一个选择只能0和1其他错误重新选择的情况;
/*for( i=0; ;i++)
{
scanf("%d",&choose);
if(choose==0)
{
printf("已退出游戏\n");
break;
//在这里输入0的话就会结束循环;
}
if(choose==1)
{
printf("成功进入游戏\n");
break;
}
if(choose!=0||choose!=1)//或,有一个成立即可,但凡输入的不为0和1就错误
{
printf("输入错误请重新输入:\n");
}
}*/
//我用switch实现
scanf("%d",&choose);
switch(choose)
{
case 1:
printf("成功进入游戏\n");
game();//开始进入游戏板块
break;
case 0:
printf("已退出游戏\n");
break;
default :
printf("输入错误,请重新输入,谢谢配合,不然你自己看着办\n");
break;
}
}
while(choose);//这里需要分号
}
int main()
{
printf("阿祥玩三子棋\n");
zongxt();
printf("阿祥敲完历时两年半\n");
//问题1.电脑玩家死循环,死在电脑玩家函数里面 ,在diannao函数已经解释明白了
//2.结果出不来,这个第一个问题解决这个也可以了
//3.只能是我赢,无法弄好电脑赢的情况,修改
//想法1.双人对战
//2.改为五子棋或者四子棋
//system("pause");
return 0;
}
该文章是一个C语言程序,用于实现一个简单的三子棋游戏。程序包括创建和初始化棋盘、打印棋盘、玩家和电脑轮流落子,以及判断游戏结果(玩家胜利、电脑胜利或和棋)。代码中包含了不同级别的棋盘打印方法,并有对玩家输入的坐标合法性检查。然而,电脑玩家的落子功能尚未完全实现,存在死循环的问题。
633

被折叠的 条评论
为什么被折叠?



