C语言学习-三子棋的实现(第一次写博客)
##写代码的理念和分块化思路很重要##
1.在VS编译器中,可以实现头文件和源文件分开编辑(好处:防源代码泄露)如果想要在源文件中引用自己格式为:#include"源文件名.h"
2.例如三子棋,可以将要实现的每个模块写成一个函数。
3.三子棋的实现是涉及函数,数组,随机数等知识的简单应用,以下是代码供参考
头文件 代码
。
#pragma once//表示在编译的时候这个文件只被包含一次,减少整个编译过程中打开文件的次数
#define _CRT_SECURE_NO_WARNINGS 1
#define ROW 3
#define COL 3//这种写法的好处是后面如果有需要改大小,不需要逐个修改,只需要在此位置更改数据
void game();
void Init_coordinate(char arr[ROW][COL],int row,int col);//
void Display_coordinate(char arr[ROW][COL],int row,int col);
void change_humanbeings(char[ROW][COL], int row, int col);
void change_robot(char[ROW][COL],int row, int col);
char victory(char arr[ROW][COL], int row, int col);
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
游戏函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"//引用我们自己写的头文件
//要实现的功能,实现电脑和人每下一次棋,打印一次棋盘
//1.游戏控制函数
void game()
{
char coordinate[ROW][COL] = { 0 };
Init_coordinate(coordinate,ROW,COL);
Display_coordinate(coordinate, ROW, COL);
char ret;
//开始运行
while (1)
{
change_humanbeings(coordinate, ROW, COL);
Display_coordinate(coordinate, ROW, COL);
ret=victory(coordinate, ROW, COL);
if (ret != 'c')
{
break;
}
printf("机器人下棋:\n");
change_robot(coordinate,ROW,COL);
Display_coordinate(coordinate, ROW, COL);
ret=victory(coordinate, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '#')
{
printf("玩家赢\n");
}
if (ret == '*')
{
printf("电脑赢\n");
}
if (ret == 'q')
{
printf("平局\n");
}
Display_coordinate(coordinate, ROW, COL);
}
//2.棋盘坐标的初始化
void Init_coordinate(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';
}
}
}
//3.打印棋盘坐标函数
void Display_coordinate(char arr[ROW][COL],int row,int col)
{
int i = 0;
//打印数据
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ",arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
//打印分割信息
if (i < row - 1)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");
}
}
}
//4.人工下棋写入
void change_humanbeings(char arr[ROW][COL],int row,int col)
{
int row_1 = 0;
int col_1 = 0;
printf("玩家下棋:\n");
printf("请输入对应的坐标:->");
while (1)
{
scanf("%d %d", &row_1, &col_1);
if (row_1 >= 1 && row_1 <= ROW && col_1 >= 1 && col_1 <= COL)
{
if (arr[row_1 - 1][col_1 - 1] == ' ')
{
arr[row_1 - 1][col_1 - 1] = '#';
break;
}
else
{
printf("坐标被占用,请重新输入:->");
}
}
else
{
printf("坐标非法,请重新输入:->");
}
}
}
//5.机器下棋写入
void change_robot(char arr[ROW][COL],int row, int col)
{
printf("电脑下棋:->\n");
while (1)
{
int input_1 = rand() % ROW;
int input_2 = rand() % COL;
if (arr[input_1][input_2]==' ')
{
arr[input_1][input_2] = '*';//有一个问题,随机如果一直随一个数据怎么办,效率太低
break;
}
}
}
//判断是否胜利函数
//要求:判断谁赢了,如果没有赢继续
char victory(char arr[ROW][COL],int row, int col)
{
int i = 0;//先判断行
for (i = 0; i < row; i++)
{
if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2]&&arr[i][0]!=' ')
{
return arr[i][1];
}
}
int m = 0;//判断列
for (m = 0; m < col; m++)
{
if (arr[0][m] == arr[1][m] && arr[1][m] == arr[2][m]&&arr[0][m]!=' ')
{
return arr[1][m];
}
}
//判断对角线
if (arr[0][0] == arr[1][1] && arr[1][1]== arr[2][2] && arr[0][0]!=' ')
{
return arr[1][1];
}
if (arr[2][0] == arr[1][1] && arr[1][1] == arr[0][2] && arr[2][0] != ' ')
{
return arr[1][1];
}
//判断是否平局
int j = 0;
int z = 0;
for (j = 0; j < row; j++)
{
for (z = 0; z < col; z++)
{
if (arr[j][z] == ' ')
{
return 'c';
}
}
}
return 'q';
}
主函数
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("**********************************\n");
printf("*************1.play***************\n");
printf("*************0.exit***************\n");
printf("**********************************\n");
printf("请输入:->");
}
int main()
{
//while+if的写法
/*while (1)
{
int input;
scanf("%d",&input);
if (input == 0)
{
printf("选择错误");
game();
}
else if (input == 1)
{
printf("三子棋\n");
break;
}
else
{
printf("选择错误,请重新输入");
continue;
}
}*/
//do_while + switch的写法
int input=0;
srand((unsigned int)time(NULL));//设置随机数
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
printf("三子棋\n");
game();
break;
case 0:
printf("已退出\n");
break;
default:
printf("选择错误");
break;
}
} while (input);//while语句,条件判断:非0为真
return 0;
}
涉及随机数知识:
关于c语言设置随机数
1使用函数rand()—头文件为<stdlib.h>—伪随机数意味着生成的数字是随机数,但是是固定的数字,不会发生变化
1.
2.还需要使用srand()函数设置随机数的起点----但是使用这两个函数会导致只有一个随机数产生如下图所示,srand()函数,返回值为unsigned int
3.如果想要让srand()函数产生改变的量,需要用到时间戳函数time()函数—这个函数的返回值是一个time_t类型的指针,所以需要强制转换类型为(unsigned int)time_t(NULL)4.想要输出结果为0-100之间的随机数,我们可以让rand()%100达到这个效果