C语言编程学习笔记(鹏版)2021/8/5
三子棋游戏 //放函数声明#define ROW 3 //可以在这里更改行数
#define COL 3 //更改列数
#include<stdio.h>
#include<stdlib.h> //srand生成随机数的头文件
#include<time.h> // time生成时间戳的头文件
void InitBoard(char board,int row,int col);
void DisplayBoard(char board,int row,int col);
void PlayerMove(char board,int row,int col);
void ComputerMore(char board,int row,int col);
char IsWin(char board,int row,int col);
//放函数定义
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h" //引用.h里的文件
void InitBoard(char board,int row,int col) //函数实现
{
int i=0;
int j=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
board=’ ’; //将棋盘初始化
}
}
}
void DisplayBoard(char board,int row,int col) //实现棋盘的外观
{
int i=0;
for(i=0;i<row;i++) //定位所有行
{
int j=0;
for(j=0;j<col;j++) //定位循环里的第一列
{
printf(" %c ",board); //创建一个 | | ......的棋盘第一行样子
if(j<col-1) //记得去掉最后一列|保证棋盘美观性
printf("|");
}
printf("\n"); //承接上面的行转入下一行
if(i<row-1) //同样去掉最下面的一行---
{
for (j=0;j<col;j++) //定位棋盘的第二行---|---|---......
{
printf("---");
if(j<col-1) //定位循环里的第二列
printf("|");
}
printf("\n"); //换行,此时已经将重复的两行模板建好,进入之后的循环就
可以一直循环显示出上面第一行与第二行的内容
}
}
}
void PlayerMove(char board,int row,int col)
{
int x=0;
int y=0;
printf("玩家操作:\n");
while(1)
{
printf("请输入要下的坐标:");
scanf("%d%d",&x,&y);
//下面判断x,y坐标合法性
if(x>=1&&x<=row&&y>=1&&y<=col) //考虑到玩家一般使用从1开始的坐标
,所以将程序里的0对应玩家输入的
1(用户友好)
{
if(board==’ ’) //检查该位置是否被下过子了
{
boardy-1]=’*’;
break; //落子成功,跳出while
}
else
{
printf("该坐标被占用");
}
}
else
{
printf("坐标非法,请重新输入!\n");
}
}
}
void ComputerMove(char board,int row,int col)
{
int x=0;
int y=0;
printf("电脑走:\n");
while(1)
{
x=rand()%row; // 将随机数变化为在row的范围内
y=rand()%col; //同理
if(board==’ ’) //此处是判断电脑选出的坐标是否没有被落过子
;这里的x,y是系统生成的具有0的坐标,所
以不用和上面玩家一样减一
{
board=’#’; //电脑落子
break;
}
}
}
int IsFull(char board,int row,int col) //返回1表示满了0是没有
{
int i=0;
int j=0;
for(i=0;i<row;i++)
{
for(j=0;j<col;j++)
{
if(board==’ ’)
{
return 0; //没有满
}
}
}
return 1; //满了
}
char IsWin(char board,int row,int col) //判断是否有三子相连
{
int i=0;
//判断平行相邻的三个框内是否图案一致
for(i=0;i<row;i++)
{
if(board==board&&board==board&&board!=’ ')
{
return board;
}
}
//判断水平相邻的三个框内是否图案一致
for(i=0;i<col;i++)
{
if(board==board&&voard==board&&board!=’ ’)
{
return board;
}
}
//判断右斜或左斜相邻的三个框内是否图案一致
if(board==board&&board==board&&board!=’ ')
return board;
if(board==board&&board==board&&board!=’ ')
return board;
//判断是否平局
if(1==IsFull(board,ROW,COL))
{
return 'O’;
}
return 'X’;
}
//测试
#define _CRT_SECURE_NO_WARNINGS 1 //解除不安全警告,也可全文件都定
义,方法之前有
#include<stdio.h>
#include"game.h" //引用自定义的头文件里的ROW与COL
void menu()
{
printf("****************************\n");
printf("****1.play*******2.exit*******\n");
printf("****************************\n");
}
void game()
{
char ret=0; //用来接收IsWin的返回值
char board={0}; //创建数组,存放棋盘信息
InitBoard(board,ROW,COL); //初始化棋盘(进入空白棋盘的创建函数)
DisplayBoard(board,ROW,COL); //打印棋盘(将空白棋盘改变为初始的棋盘)
while (1)
{
PlayerMove(board,ROW,COL); //玩家下棋
DisplayBoard(board,ROW,COL); //打印棋盘
ret=IsWin(board,ROW,COL); //判断玩家是否赢
if(ret!=’X’) //判断是否应该继续下棋
{
break;
}
ComputerMove(board,ROW,COL); //电脑下棋
DisplayBoard(board,ROW,COL); //再次打印棋盘
ret=IsWin(board,ROW,COL); //判断电脑是否赢
//所以此处的IsWin要可以判断四种结果:玩家胜利(*)
,电脑胜利(#),平局(O),继续(X)
if(ret!=’X’)
{
break;
}
}
if(ret==’*’)
{
printf("玩家胜利\n");
}
else if(ret==’#’)
{
printf("电脑胜利\n");
}
else
{
printf("平局\n");
}
}
void test()
{
int input=0;
srand((unsigned int)time(NULL)); // time返回时间戳作为随机数;int作用为
强制转化为整型
do
{
menu();
printf("请输入选择:");
scanf("%d",&input);
switch(input)
{
case 1:
game();
printf("三子棋\n");
break;
case 2:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
}while (input); //如果input为真(除0外的数字)则循环继续,反之
,结束循环
}
int main()
{
test();
return 0;
}文档来源:51CTO技术博客https://blog.51cto.com/u_15293084/3309749
页:
[1]