所谓三子棋游戏,在有些地方还被叫做井字棋。
现在,让我来为大家讲解三子棋游戏的详细过程;
先看游戏运行:
首先,我将游戏分成了三个部分:
1、text.c //测试三子棋游戏
2、game.h //三子棋游戏的函数声明
3、game.c //三子棋游戏函数的实现
创建好文件后,我们首先在text.c文件中写main函数
头文件include<stdio.h>只放在game.h文件中,再用text.c和game.c调用game.h即可
调用时采用#include "game.h"
这里采用do{}while循环,因为玩家打开程序后,首先看见的是游戏菜单界面(menu)
void menu() //打印菜单界面函数 { printf("***************************\n"); printf("******** 1.play ********\n"); printf("******** 0.exit ********\n"); printf("***************************\n"); printf("***************************\n"); } int main() { int input = 0; do { menu(); //打印菜单 printf("请选择;>"); scanf("%d", &input); switch (input) //采用循环,游戏可以进行多次,直至你输入0 { //表示退出游戏,这也是while循环中括号条件 case 1: //的缘故 game(); break; case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新选择\n"); break; } } while (input); return 0; };
之后也就是输入1 进入游戏模块,游戏的开始
game()函数:
首先给玩家呈现的是一个棋盘
例如
那么想要打印棋盘,首先要明白三子棋要怎样存放,这里我们定义一个数组来存放,
定义数组,首先得让数组初始化,为了方便之后改数据,可以使用全局变量
这里我都放在了game.h文件中,用来函数的声明
game.h
#include <stdio.h> #define ROW 3 #define COL 3
game()函数:
char board[ROW][COL] = { 0 }; //定义数组来储存 init_board(board, ROW, COL); //数组的初始
全部初始化为空格
放在game.c文件中
//初始化棋盘 void init_board(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] = ' '; } } }
同时,在game.h文件中加入声明
void display_board(char board[ROW][COL], int row, int col);
再然后,初始化之后,就要开始打印棋盘了
void display_board(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 player_move(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家下棋\n"); while (1) { printf("请输入你想下的的坐标:>\n"); 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 computer_move(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; } } }
这里采用rand函数,调用ranf函数必须先使用srand函数,这里采用时间,因为时间是在不断变化
在主函数中调用一次即可
接下来讲就是判断游戏状态,比如玩家在对角线,或者每一行、每一列相同就获胜,电脑也是一样,但是还有一种情况就是平局
int is_full(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][j] == ' ') { return 0; } } } return 1; } char is_win(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][1] == board[i][2] && board[i][0]!=' ') { return board[i][0]; } } for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i]!=' ') { return board[0][i]; } } if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ') { return board[0][2]; } if (is_full(board, row, col) == 1) { return 'Q'; } else { return 'C'; } }
最后,我将展示三个文件 的完整代码如下:
text.c
game.c
game.h
文章的最后,谢谢大家的观看,加油!!!





