家人们,进击的菜鸟又学到一个三子棋游戏,很好玩;不要被代码的数量所困惑,一个算法一个算法的实现,真的不是很难,虽然当代码出错的时候会有崩溃的感觉,但是代码运行成功后,还是非常有成就感的。非常建议从主函数出发,然后根据函数调用的顺序找思路。
整体思路是:游戏菜单选择——>数组初始化——>打印棋盘——>玩家下棋,电脑下棋——>判断输赢情况
#define _CRT_SECURE_NO_WARNINGS 1
//定义行数和列数
#define R 3
#define C 3
#include <time.h>//time函数
#include <stdlib.h>//srand函数
#include <stdio.h>
//不管开始输入的值是什么,都会给棋盘初始化
void Initboard(char board[R][C],int r, int c)
{
int i=0;
int j=0;
{ for(i=0;i<r;i++)
for(j=0;j<c;j++)
{
board[i][j]=' ';
}
}
}
//前后空格,中间数据 | |
//打印---| ---|---|---
//打印---| ---|---|---
//前后空格,中间数据 | |
void dayinboard(char board[R][C],int m,int n)
{
int i=0;
int j=0;
for(i=0;i<m;i++)
{
//打印空里面的数据加右边的"|"
for(j=0;j<n;j++)
{printf(" %c ",board[i][j]);
if(j<n-1)//表示不要最后一列的"|"
printf("|");}
printf("\n");//表示打印一行就换行
if(i<m-1)//最后一行不用打印"---"
{
//打印"---|"
for(j=0;j<n;j++)
{ printf("---");
if(j<n-1)//表示不要最后一列的"|"
printf("|");
}}
printf("\n"); //打印完一行就换行;
}
}
//玩家下子;
void playmove(char board[R][C],int o,int p)
{
int x,y;
printf("玩家走:>\n");
while(1)
{
printf("请输入要下的坐标: > ");
scanf("%d%d",&x,&y);
//判断x,y坐标的合法性;玩家下意识的认为第一个格子的坐标为(1,1),而实际的数组坐标为(0,0)
if(x>=1&&x<=o && y>=1&&y<=p)
{
if(board[x-1][y-1]==' ')
{board[x-1][y-1]='*';
break;
}
else
printf("该坐标已被占用\n");
}
else
{
printf("没有此坐标,请重新输入\n");
}
}
}
//电脑随机下子;
void computermove(char board[R][C],int d,int e )
{
//电脑随机走
int x,y;
printf("电脑走:>\n");
while(1)
{
x=rand()%d;//随机坐标的行;
y=rand()%e;//随机坐标的列;
if(board[x][y]==' ')
{board[x][y]='#';
break;}
}
}
//返回1表示棋盘满了;
int full(char board[R][C],int m,int n)
{
int x,y;
for(x=0;x<m;x++)
{
for(y=0;y<n;y++)
{if(board[x][y]==' ')
{return 0;}//没有满
}
}
return 1;//满了
}
//判断输赢的情况,'*'代表玩家赢了,'#'代表电脑赢了,'P'代表平局,'G'表示继续游戏;
char win(char board[R][C],int f,int i)
{
int j=0;
int k=0;
//行有三个一样的棋子
for(j=0;j<f;j++)
{if(board[j][0]==board[j][1] && board[j][1]==board[j][2] && board[j][1] !=' ')
{ return board[j][0];}
}
//列有三个一样的棋子
for(k=0;k<i;k++)
{
if(board[0][k]=board[1][k] && board[1][k]==board[2][k] && board[1][k]!=' ')
{return board[0][k];}
}
//两个对角线
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board [1][1] !=' ')
{return board[1][1];}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1] != ' ')
{return board[1][1];}
//判断是否平局
if(full(board,R,C)==1)
{ return 'P';}
return 'G';
}
//显示游戏菜单界面
void mune()
{
printf("*************************\n");
printf("****** 1.play 0.exit*****\n");
printf("*************************\n");
}
void game()
{
char ret=0;
char board[R][C]={0};//数组存放走出的棋盘信息,然后初始赋值为0;
Initboard( board, R , C);//初始化棋盘;
dayinboard( board,R ,C);//打印棋盘;
while(1)//下棋
{
//玩家下棋
playmove(board,R ,C);
dayinboard(board,R ,C);//打印棋盘;
ret= win(board,R,C);//判断玩家是否赢
if(ret !='G')
{
break;
}
//电脑下棋
computermove(board,R,C);//传行和列,生成随机数下表时控制它的范围
dayinboard(board,R ,C);//打印棋盘;
ret=win(board,R,C);//判断电脑是否赢
if(ret !='G')
{
break;
}
}
if(ret=='*')
{printf("玩家赢\n");}
else if(ret=='#')
{printf("电脑赢\n");}
else
{printf("平局\n");}
}
void xuanze()//游戏选择
{
int input=0;
srand((unsigned int) time (NULL));//time函数的参数给空指针,然后将返回类型强制转换成整型;
do
{
mune();
printf("请选择: >");
scanf("%d",&input);
switch(input)
{
case 1:
{printf("请开始游戏\n");
game();
break;}
case 0:
{printf("退出游戏\n");
break;}
default:
{printf("选择错误,请重新选择\n");
break;}
}
}
while(input);
}
//主函数以上都是函数调用;
int main()
{
xuanze();
return 0;
}