用c语言实现一个三子棋的小游戏,玩家和电脑的对弈,那么思路是:首先创建出一个二维数组的棋盘,然后创建出电脑的行走方式,因此需要创建出一个范围以内的随机数,然后判断输赢,就可以实现这个程序。
那么接下来就开始实现这个游戏;
首先:,作为游戏的初始框架
#define _CRT_SECURE_NO_WARNINGS
#include"" //引用自己创建的game函数,要用双引号
void menu() //创建菜单
{
printf(" \n");
printf(" \n");
printf(" 1,play 0,exit \n");
printf(" \n");
}
void game() //游戏的内容
{
char ret = 0;//创建返回值
char board[row][col] = { 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 != '$')
{
break;
}
computermove(board, row, col);//电脑下棋
displayboard(board, row, col);
//判断电脑输赢
ret = iswin(board, row, col);
if (ret != '$')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else
{
printf("平局\n");
}
}
void test() //test函数内容
{
rand((unsigned int)time(NULL));//生成随机值
int input = 0; //创建输入值
do
{
menu(); //引用菜单
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择:\n");
break;
}
} while (input);//面跳出了,如果input非零就继续循环
}
int main()
{
test();//引用test函数
return 0;
}
这里为框架内的函数的实现,也是最重要的地方
#define _CRT_SECURE_NO_WARNINGS
#include""//因为下面的行和列定义在.h函数中,要引用过来
//函数的实现
void initboard(char board[row][col], 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 displayboard(char board[row][col], int v, int m)//创建出棋盘的长相
{
int a = 0;//定义行
for (a = 0; a < v; a++) //只用打印行的内容,每循环一次下一行,与列无关
{
printf(" %c | %c | %c \n",board[a][0],board[a][1],board[a][2]);//第a行下标为0的元素,第a行下标为1的元素
if(a<v-1)//只打印前两行,最后一行不用打印
printf("---|---|---\n");//第一次循环打印的内容
}
}
*/
//优化
//按列打印
void displayboard(char board[row][col], int v, int m)//创建出棋盘的长相
//1,打印出第一行
{
int a = 0;//定义行
for (a = 0; a < v; a++)
{
int b = 0;//定义列
for (b = 0; b < m; b++)
{
printf(" %c ", board[a][b]); //打印第一行 ,空格,字符,空格
if (b < m - 1) //小于最后一次循环
printf("|"); //分隔符
}
printf("\n");
//2,打印出第一行下面的分割线
if (a < v - 1) //打印第一行下面的分割线
{
for (b = 0; b < m; b++)
{
printf("---");
if (b < m - 1)
printf("|");
}
printf("\n");
}
}
}
//玩家输入
void playermove(char board[row][col], int r, int c)
{
int x = 0; //横坐标
int y = 0; //纵坐标
printf("玩家走:\n");
while (1)
{
printf("请输入坐标:\n");
scanf("%d%d", &x, &y); //输入坐标x,y
if (x >= 1 && x <= r && y >= 1 && y <= c) //输入值的合法性 ,&&为并且,都得要同时满足条件
{
if (board[x - 1][y - 1] == ' ')//数组的角度是下标,所以减一与输入的值对等,等于空格说明里面没有棋子
{
board[x - 1][y - 1] = '*';//满足条件可以输入*
break;//落子成功跳出去
}
else
{
printf("该坐标已被占用\n");
}
}
else
{
printf("坐标非法,请重新输入!\n");//继续循环
}
}
}
//电脑输入
void computermove(char board[row][col], int n, int m)
{
int x = 0;
int y = 0;
printf("电脑走:\n");
while (1)
{
x = rand() % n;//随机值横坐标的余数
y = rand() % m;//随机值纵坐标得到余数
if (board[x][y] == ' ')//如果下的位置是空格
{
board[x][y] = '#';//坐标位置为&
break;//可以输入就跳出
}
}
}
//返回1代表棋盘满了
//返回0代表棋盘没满
int isfull(char board[row][col], int z, int x)
{
int i = 0;
int j = 0;
for (i = 0; i < z; i++)
{
for (j = 0; j < x; j++)
{
if (board[i][j] == ' ')
{
return 0;//没满
}
}
}
return 1;//满了
}
//判断输赢
char iswin(char board[row][col], int f, int g)
{
int i = 0;
//判断横3行
for (i = 0; i < f; i++)
{
//第一行的第一个等于第二行的第一个等于第三行的第一个 第一个不能等于空格 并且代表都要满足
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];//返回上面的随便一个都可以,因为都有满足
}
}
//判断竖3列
for (i = 0; i < g; i++)
{
//第一列的第一个等于第二列的第一个等于第三列的第一个 第一个不能等于空格 并且代表都要满足
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];//返回上面的随便一个都可以,因为都有满足
}
}
//判断斜着的
// 两种斜法
//第一列的第一个第二列的第二个第三列的第三个
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[0][2] != ' ')
return board[1][1];//返回上面的随便一个都可以,因为都有满足
//判断平局
if (1 == isfull(board, row, col))//判断平局函数
{
return'&';
}
return'$';
}
最后便是函数的声明:
//函数的声明引用
#include<>//一起引用,不要有两个主函数
//为随机值引用头文件
#include<>
#include<>
#define row 3 //定义行
#define col 3 //定义列
//创建棋盘
void initboard(char board[row][col], int r, int c);//棋盘的初始数据
void displayboard(char board[row][col], int v, int m);//棋盘的模型
//输入数据
void playermove(char board[row][col], int r, int c);//玩家输入
void computermove(char board[row][col], int n, int m);//电脑输入
//判断输赢
//4种情况 返回
// 玩家赢--'*'
// 电脑赢--'#'
// 平局 --'&'
// 继续 --'$'
char iswin(char board[row][col], int f, int g);//返回的字符,char类型
int isfull(char board[row][col], int z, int x);
以上便是这个与电脑对弈的三子棋程序的实现,当然如果取消电脑的行走,再创建一个玩家,那么也可以实现一个玩家与玩家间的对弈。以上便是这个程序的实现。