目录
前言
用C语言写出进阶三子棋程序,电脑会根据玩家的操作进行判断,最大限度的战胜玩家或者平局。那么首先有一个大体框架,可以执行开始游戏,退出游戏,以及输入错误提示,然后进行打印棋盘,玩家和电脑下棋,并判断胜负。
游戏运行效果:
游戏代码:
写在test.c(测试) ,game.c(游戏),game.h(头文件)
1.test.c文件
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void menu()
{
printf("------------------------------------------------------\n");
printf("----------1.开始游戏--------0.退出游戏----------------\n");
printf("------------------------------------------------------\n");
}
void game()
{
int ret = 0;
char arr[ROW][COL] = { 0 };//创建一个数组
Initializ(arr, ROW, COL);//对数组进行初始化
disprint(arr, ROW, COL);//打印棋盘
while (1)
{
Computermove(arr, ROW, COL);//电脑下棋
disprint(arr, ROW, COL);//打印棋盘
ret = Judge_win(arr, ROW, COL);
if (ret != 'C')
{
break;
}
Playermove(arr, ROW, COL);//玩家下棋
disprint(arr, ROW, COL);//打印棋盘
ret = Judge_win(arr, ROW, COL);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret == '#')
{
printf("电脑赢\n");
}
else if (ret == 'Q')
{
printf("平局\n");
}
}
void test()
{
int input = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误\n");
break;
}
} while (input);
}
int main()
{
test();
return 0;
}
2. game.h头文件
#define ROW 3//行
#define COL 3//列
#include<stdio.h>
#include<stdlib.h>//头文件
#include<time.h>
void Initializ(char arr[ROW][COL], int row, int col);//初始化
void disprint(char arr[ROW][COL], int row, int col);//打印
void Playermove(char arr[ROW][COL], int row, int col);//玩家移动
void Computermove(char arr[ROW][COL], int row, int col);//电脑移动
char Judge_win(char arr[ROW][COL], int row, int col);//判断胜负
int Judge_com(char arr[ROW][COL], int row, int col, int z);//电脑判断自己能否赢
int Judge_player(char arr[ROW][COL], int row, int col,int z);//电脑判断玩家是否要赢,进行拦截
3. game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void Initializ(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] = ' ';
}
}
}
void disprint(char arr[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
int j = 0;
printf("------------");
printf("\n");
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
printf("|");
}
printf("\n");
if (i < row - 1)
{
int s = 0;
for (s = 0; s < col; s++)
{
printf("---");
printf("|");
}
printf("\n");
}
}
printf("------------\n");
}
int is_full(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++)
{
if (arr[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
void Playermove(char arr[ROW][COL], int row, int col)//玩家下棋
{
int x = 0;
int y = 0;
int d = 0;
printf("请玩家下棋:>");
while (1)
{
scanf("%d%d", &x, &y);
if (x >= 1 && x <= ROW&&y >= 1 && y <= COL)
{
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;
}
else
{
printf("输入错误,请重新输入:>");
}
}
else
{
printf("输入错误,请重新输入:>");
}
}
}
void Computermove(char arr[ROW][COL], int row, int col)//电脑下棋
{
int x = 0;
int y = 0;
int z = 0;
printf("电脑下棋\n");
z = Judge_com(arr, ROW, COL, z);//电脑判断自己能否赢
while (z == 0)
{
x = rand() % ROW;
y = rand() % COL;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
char Judge_win(char arr[ROW][COL], int row, int col)//判断胜负
{
int i = 0;
//判断3行
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][0];
}
}
//判断三列
for (i = 0; i < col; i++)
{
if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[0][i] != ' ')
{
return arr[0][i];
}
}
//判断2个斜线
if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[0][0] != ' ')
{
return arr[0][0];
}
if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[2][0] != ' ')
{
return arr[0][2];
}
//判断是否下满,是否平局
int len = 0;
len=is_full(arr, ROW, COL);
if (len == 1)
{
return 'Q';
}
else
{
return 'C';
}
}
int Judge_com(char arr[ROW][COL], int row, int col,int z)//电脑判断自己能否胜利
{
while (z == 0)
{
int i = 0;
for (i = 0; i < row; i++)//判断三行是否有两个‘#’
{
if (arr[i][0] == arr[i][1] && arr[i][1] == '#'&&arr[i][2] == ' ')
{
z = 1;
arr[i][2] = '#';
break;
}
if (arr[i][1] == arr[i][2] && arr[i][2] == '#'&&arr[i][0] == ' ')
{
z = 1;
arr[i][0] = '#';
break;
}
if (arr[i][0] == arr[i][2] && arr[i][2] == '#'&&arr[i][1] == ' ')
{
z = 1;
arr[i][1] = '#';
break;
}
}
if (z != 0)
break;
for (i = 0; i < col; i++)//判断三列是否有两个‘#’
{
if (arr[0][i] == arr[1][i] && arr[1][i] == '#'&&arr[2][i] == ' ')
{
z = 1;
arr[2][i] = '#';
break;
}
if (arr[1][i] == arr[2][i] && arr[2][i] == '#'&&arr[0][i] == ' ')
{
z = 1;
arr[0][i] = '#';
break;
}
if (arr[0][i] == arr[2][i] && arr[2][i] == '#'&&arr[1][i] == ' ')
{
z = 1;
arr[1][i] = '#';
break;
}
}
break;
}
while (z == 0)//判断两个竖线是否有两个‘#’
{
if (arr[0][0] == arr[1][1] && arr[1][1] == '#'&&arr[2][2] == ' ')
{
z = 1;
arr[2][2] = '#';
break;
}
if (arr[0][0] == arr[2][2] && arr[2][2] == '#'&&arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '#';
break;
}
if (arr[1][1] == arr[2][2] && arr[1][1] == '#'&&arr[0][0] == ' ')
{
z = 1;
arr[0][0] = '#';
break;
}
if (arr[0][2] == arr[1][1] && arr[1][1] == '#'&&arr[2][0] == ' ')
{
z = 1;
arr[2][0] = '#';
break;
}
if (arr[0][2] == arr[2][0] && arr[0][2] == '#'&&arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '#';
break;
}
if (arr[1][1] == arr[2][0] && arr[1][1] == '#'&&arr[0][2] == ' ')
{
z = 1;
arr[0][2] = '#';
break;
}
break;
}
z = Judge_player(arr, ROW, COL,z);//判断玩家是否要赢,进行拦截
return z;
}
int Judge_player(char arr[ROW][COL], int row, int col,int z)//判断玩家是否要赢,进行拦截
{
while (z == 0)
{
int i = 0;
for (i = 0; i < row; i++)//判断玩家3行
{
if (arr[i][0] == arr[i][1] && arr[i][1] == '*'&&arr[i][2] == ' ')
{
z = 1;
arr[i][2] = '#';
break;
}
if (arr[i][1] == arr[i][2] && arr[i][2] == '*'&&arr[i][0] == ' ')
{
z = 1;
arr[i][0] = '#';
break;
}
if (arr[i][0] == arr[i][2] && arr[i][2] == '*'&&arr[i][1] == ' ')
{
z = 1;
arr[i][1] = '#';
break;
}
}
if (z != 0)
break;
for (i = 0; i < col; i++)//判断玩家3列
{
if (arr[0][i] == arr[1][i] && arr[1][i] == '*'&&arr[2][i] == ' ')
{
z = 1;
arr[2][i] = '#';
break;
}
if (arr[1][i] == arr[2][i] && arr[2][i] == '*'&&arr[0][i] == ' ')
{
z = 1;
arr[0][i] = '#';
break;
}
if (arr[0][i] == arr[2][i] && arr[2][i] == '*'&&arr[1][i] == ' ')
{
z = 1;
arr[1][i] = '#';
break;
}
}
break;
}
while (z == 0)//判断两个斜线
{
if (arr[0][0] == arr[1][1] && arr[1][1] == '*'&&arr[2][2] == ' ')
{
z = 1;
arr[2][2] = '#';
break;
}
if (arr[0][0] == arr[2][2] && arr[2][2] == '*'&&arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '#';
break;
}
if (arr[1][1] == arr[2][2] && arr[1][1] == '*'&&arr[0][0] == ' ')
{
z = 1;
arr[0][0] = '#';
break;
}
if (arr[0][2] == arr[1][1] && arr[1][1] == '*'&&arr[2][0] == ' ')
{
z = 1;
arr[2][0] = '#';
break;
}
if (arr[0][2] == arr[2][0] && arr[0][2] == '*'&&arr[1][1] == ' ')
{
z = 1;
arr[1][1] = '#';
break;
}
if (arr[1][1] == arr[2][0] && arr[1][1] == '*'&&arr[0][2] == ' ')
{
z = 1;
arr[0][2] = '#';
break;
}
break;
}
return z;
}
一.框架部分
使用do...while循环,来实现3种不同的情况:进入游戏,退出游戏,输入错误。
调用一个菜单函数进行选择,选择1进入game()函数,选择0退出游戏,如果不是0或1就提示重新输入。
二.游戏函数实现
在函数内部要进行1.创建二维数组 2.对数组进行初始化,初始化为空格 3.打印数组 4.玩家进行下棋 5.电脑判断后进行下棋 6.判断胜负
1.创建数组并初始化
为了更加直观,数组的行和列用#define定义
初始棋盘什么都不显示,将数组初始化成空格
2.打印数组
所想棋盘为井字,利用|,- 将棋盘打印出来,使用for循环打印出来
3.玩家下棋
所画棋盘是3*3的格子,为3行3列,数组下标是0,1,2,但为了下棋时坐标更为直观,写成1到3,然后在下子时-1就会得到数组下标。
x为行,y为列,下棋时用while(1)死循环,如果输入错误或者重复下一个地方,进行提示,让玩家重新下棋,如果正确就将棋子放到里面,然后跳出循环,让电脑下棋。
4.电脑判断然后下棋
到电脑下棋时,电脑首先要判断自己是否可以胜利,如果已有两个子那么就下到第三个地方,完成3子连起来,然后判断玩家当前棋子,如果有两个就进行拦截,如果以上条件都不成立,那么就生成随机坐标进行下棋,每次下棋之前都进行判断
调用函数来判断,z接收返回值,如果是0,那么条件并不成立,生成随机坐标,如果是1就进行以下操作:
以上判断过之后,进入判断玩家是否要赢的函数,如果玩家在一行,一列,斜线,有两个棋子,电脑判断后进行拦截
5.判断游戏胜负
游戏时,有4种情况,1.平局,2,电脑胜利,3.玩家胜利,4.继续。那么我们定义平局为“Q”,玩家赢为“*”,电脑赢为“#”,平局为“C”。
调用一个判断胜负的函数,利用返回的字符来判断以上情况
最后调用is_full()函数来判断棋盘是否下满,如果下满返回“Q”(平局),否则返回“C”继续下棋
总结
以上就是进阶版三子棋的全部内容了 ,程序还存在不足的地方,欢迎指出,有待改进。