使用C语言编写三子棋小游戏:
首先进行分析:
1.需要将游戏实现分为三个部分:头文件,函数功能实现,游戏组合测试。
2.游戏可以循环进行,不必多次打开,可采用 do...while循环结构。
3.游戏为电脑和玩家对弈
4.游戏棋盘为3*3格式,需使用二维数组,并初始化棋盘,显示棋盘内容。
具体实现步骤:
头文件:
将需要多次使用的变量在头文件里定义,从而达到两个文件可以共同使用。
将功能实现函数在头文件里声明,让主文件可以调用这些函数。
//头文件引用----避免两个文件多次引用相同头文件
#include <stdio.h>
#include <stdlib.h>
#include <time.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); //判断输赢
int IsFull(char board[ROW][COL], int row, int col); //判断平局
游戏功能函数:
根据需求进行函数定义,完成游戏所需功能
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//初始化棋盘函数
void InitBoard(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) //遍历二维数组,将其设置为 空格
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
//打印棋盘
void DisplayBoard(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
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;
printf("玩家请走->\n");
while (1) {
printf("请输入坐标:");
scanf("%d %d", &x, &y); //玩家输入坐标
if (x >= 1 && x <= row && y >= 1 && y <= col) { //判断坐标是否合法
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 row, int col) {
printf("电脑下棋->\n");
while (1) {
int x = rand() % row; //获取随机值
int y = rand() % col;
if (board[x][y] == ' ') { //判断坐标是否占用
board[x][y] = '#';
break;
}
}
}
//判断平局
int IsFull(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) {
for (j = 0; j < col; j++) {
if (board[i - 1][j - 1] == ' ') //棋盘没满返回‘0’
return 0;
}
}
return 1;
}
//判断游戏输赢
char IsWin(char board[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < row; i++) { //判断每行是否三个相同
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
return board[i][1];
}
for (j = 0; j < col; j++) { //判断每列
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[1][j] != ' ')
return board[1][j];
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ') {
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') {
return board[1][1];
}
int n = IsFull(board, ROW, COL); //判断是否平局,由 n 接收返回值
if (n == 1)
return 'Q';
return 'C';
}
游戏主体运行:
将游戏功能进行整合,从而达到游戏实现。
1.首页:采用打印简单首页和提示选项
void menu() {
printf("* * * * 三 子 棋 * * * *\n"); //首页实现
printf("* * * * 按 1 进入游戏 * * * *\n");
printf("* * * * 按 0 退出游戏 * * * *\n");
printf("* * * * * * * * * * * * * * *\n");
}
2.主函数内容:
int main() {
int input = 0;
srand((unsigned int) time (NULL)); //获取时间戳
do {
menu();
printf("请选择是否进入游戏:");
scanf("%d",&input); //选择是否进入游戏
switch (input) {
case 1 :
printf("即将进入游戏\n");
game(); //调用游戏实现函数进入游戏
break;
case 0 :
printf("退出游戏\n");
break;
default :
printf("没有该选项,请重新选择\n");
break;
}
} while (input); //根据input的值判断是否循环------根据玩家选项是否结束
return 0;
}
3.游戏实现函数的调用:
void game() {
char ret = 0; // 存储 IsWin() 返回值
char board[ROW][COL]; //存储数据----二维数组
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 != 'C')
break;
ComputerMove(board, ROW, COL); //电脑下棋
DisplayBoard(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '*') { //判断输赢
printf("恭喜玩家赢得游戏\n");
DisplayBoard(board, ROW, COL);
}
else if (ret == '#') {
printf(" 很遗憾,电脑赢了\n");
DisplayBoard(board, ROW, COL);
}
else
printf("平局!\n");
}
最终效果: