目录
一、三子棋游戏
游戏分为双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子连成一条线的一方则视为胜利者。
二、游戏实现
这里我们使用C语言进行三子棋的简单实现。三子棋简易棋盘可以抽象成二维数组的平面展示图,在基于二维数组之上,对输出的棋盘进行简单的装饰,优化其输出界面。
1、具体实现说明
这里我们采用模块化设计
使用模块化设计可以提高代码质量和可靠性,同时也提高代码的可维护性和可升级性
这里我们分三个模块来实现三子棋游戏,分别为:
game.h //游戏的声明
text.c //用来测试游戏
game.c //游戏的实现
1、在屏幕上打印一个游戏初始界面让玩家选择进行游戏或者退出游戏,并且通过循环语句让玩家达到可以重复多次玩游戏的效果
2、 使用函数将数组元素都初始化为空格
3、将棋盘打印出来
4、接受玩家的输入,将玩家下棋位置打印出来,判断胜负情况
5、电脑随机在棋盘上下棋,再将电脑下棋打印出来,判断胜负情况、
2、游戏效果展示
三、具体实现及部分代码
我们先设计一个游戏初始界面:
void menu()
{
printf("|--------------------|\n");
printf("| *** 1:play *** |\n");
printf("| *** 0:exit *** |\n");
printf("|--------------------|\n");
}
在text.c文件中写入main()函数,在main()函数中调用text()函数用来实现三子棋游戏。将上面写的初始化界面函数写入text()函数中,且通过switch语句判断玩家输入是否正确
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);
}
编写一个game()函数,game()函数里面即为三子棋的实现过程
void game()
{
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);//初始化函数
Displayboard(board, ROW, COL);//打印棋盘
char ret = 0;
while (1)
{
Playermove(board, ROW, COL);//玩家下棋
Displayboard(board, ROW, COL);//打印棋盘
ret = Iswin(board, ROW, COL);//判断输赢,并用ret接受
if (ret != 'C')
{
break;//这里的ret为判断输赢函数的返回值,C是自己设定的
//在判断输赢函数中,返回C则继续下棋,返回Q则平局
//返回 O 则电脑赢,返回 X 则玩家赢
//不返回C说明游戏结束,则在下方判断具体结果
}
Computermove(board, ROW, COL);//电脑下棋
Displayboard(board, ROW, COL);//打印棋盘
ret = Iswin(board, ROW, COL);//判断输赢,并用ret接受
if (ret != 'C')
{
break;
}
}
首先使用函数将数组元素都初始化为空格
//初始化函数,数组元素都初始化为空格
void Initboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
接着我们下面的棋盘使用代码打印出来
代码如下:
//打印棋盘
void Displayboard(char board[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 ", board[i][j]);
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[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
printf("请输入想要下棋的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL && board[x - 1][y - 1] == ' ') //坐标合法
{
board[x - 1][y - 1] = 'X';
break;
}
else //坐标非法
{
printf("坐标错误,请重新输入!\n");
}
}
}
在玩家下棋的过程中需要判断即将要下棋的位置是否已经被使用过,若使用过则需要重新输入一个坐标
电脑下棋:
//电脑下棋
void Computermove(char board[ROW][COL], int row, int col)
{
int x = 0;//0~row-1
int y = 0;//0~col-1
while (1)
{
x = rand() % row;//rand() 函数会随机生成0~32767之间的数字
y = rand() % col;//rand() %row和col即随机生成0~2,
if (board[x][y] == ' ')
{
printf("电脑下棋:\n");
board[x][y] = 'O';
break;
}
}
}
电脑下棋需使用rand函数,生成0~2的随机数字,即可以随机生成九宫格里面的坐标
判断输赢部分
//判断是否平局
//下满棋盘返回1,未下满则返回0
int Isfull(char board[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 (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
char Iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
//判断行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
//判断是否平局
if (Isfull(board, ROW, COL) == 1)
{
return 'Q';
}
//若都不满足上方条件语句,则表示继续游戏
return 'C';
}
四、完整代码
game.h部分
#pragma once
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define ROW 3//行
#define COL 3//列
//初始化函数
void Initboard(char board[ROW][COL], int row, int col);
//打印棋盘
void Displayboard(char board[ROW][COL], int row, int col);
//玩家下棋
void Playermove(char board[ROW][COL], int row, int col);
//电脑下棋
void Computermove(char board[ROW][COL], int row, int col);
//判断输赢
char Iswin(char board[ROW][COL], int row, int col);
text.c部分
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "game.h"
void menu()
{
printf("|--------------------|\n");
printf("| *** 1:play *** |\n");
printf("| *** 0:exit *** |\n");
printf("|--------------------|\n");
}
void game()
{
char board[ROW][COL] = { 0 };
Initboard(board, ROW, COL);//初始化函数
Displayboard(board, ROW, COL);//打印棋盘
char ret = 0;
while (1)
{
Playermove(board, ROW, COL);//玩家下棋
Displayboard(board, ROW, COL);//打印棋盘
ret = Iswin(board, ROW, COL);//判断输赢,并用ret接受
if (ret != 'C')
{
break;//这里的ret为判断输赢函数的返回值,C是自己设定的
//在判断输赢函数中,返回C则继续下棋,返回Q则平局
//返回 O 则电脑赢,返回 X 则玩家赢
//不返回C说明游戏结束,则在下方判断具体结果
}
Computermove(board, ROW, COL);//电脑下棋
Displayboard(board, ROW, COL);//打印棋盘
ret = Iswin(board, ROW, COL);//判断输赢,并用ret接受
if (ret != 'C')
{
break;
}
}
if (ret == 'Q')
{
printf("平局!\n");
}
if (ret == 'X')
{
printf("玩家赢!\n");
}
if (ret == 'O')
{
printf("电脑赢!\n");
}
}
void test()
{
int input = 0;
do
{
menu();
srand((unsigned int)time(NULL));
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;
}
game.c部分
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//初始化函数,数组元素都初始化为空格
void Initboard(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void Displayboard(char board[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 ", board[i][j]);
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[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:\n");
printf("请输入想要下棋的坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW && y >= 1 && y <= COL && board[x - 1][y - 1] == ' ') //坐标合法
{
board[x - 1][y - 1] = 'X';
break;
}
else //坐标非法
{
printf("坐标错误,请重新输入!\n");
}
}
}
//电脑下棋
void Computermove(char board[ROW][COL], int row, int col)
{
int x = 0;//0~row-1
int y = 0;//0~col-1
while (1)
{
x = rand() % row;//rand() 函数会随机生成0~32767之间的数字
y = rand() % col;//rand() %row和col即随机生成0~2,
if (board[x][y] == ' ')
{
printf("电脑下棋:\n");
board[x][y] = 'O';
break;
}
}
}
//判断是否平局
//下满棋盘返回1,未下满则返回0
int Isfull(char board[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 (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
char Iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
//判断行
for (i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][0] == board[i][2] && board[i][0] != ' ')
{
return board[i][0];
}
}
//判断列
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[0][i] == board[2][i] && board[0][i] != ' ')
{
return board[0][i];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[0][0] == board[2][2] && board[0][0] != ' ')
{
return board[0][0];
}
if (board[0][2] == board[1][1] && board[0][2] == board[2][0] && board[0][2] != ' ')
{
return board[0][2];
}
//判断是否平局
if (Isfull(board, ROW, COL) == 1)
{
return 'Q';
}
//若都不满足上方条件语句,则表示继续游戏
return 'C';
}
以上就是三子棋函数的实现途径,如果诸位有什么不懂的地方,可以一起在评论区探讨解决
That's it.