一:基本的思路
1,菜单界面选择开始游戏、退出游戏
2,创建、初始化棋盘
3,打印棋盘
循环
4,玩家下棋
4,判断输赢
5,电脑下棋
6,判断输赢
参考流程图如下:
二:步骤
1 菜单
void menu() {
printf("****************************************\n");
printf("************** 1.play ******************\n");
printf("************** 0.exit ******************\n");
printf("****************************************\n");
}
2 创建、初始化棋盘
使用3行3列的二维数组来实现棋盘
#define ROW 3
#define LIE 3
初始化函数
void initboar (char board[ROW][LIE], int row, int lie) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < lie; j++) {
board[i][j] = ' ';
}
}
}
3 打印棋盘
void Display(char board[ROW][LIE], int row, int lie) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < lie; j++) {
printf(" %c ", board[i][j]);
if (j < lie- 1) {
printf("|");
}
}
printf("\n");
if(i<row-1){
for (int x = 0; x < row; x++) {
printf("---");
if (x < lie - 1) {
printf("|");
}
}
printf("\n");
}
}
}
运行结果测试:
4 玩家下棋
‘*’ 表示玩家的棋子
玩家输入坐标,并且需要在坐标范围内否则重新输入。
void playermove(char boar[ROW][LIE],int row,int lie) {
printf("请玩家下棋,请输入坐标中间用空格隔开>:\n");
while (1)
{
int x, y;
scanf("%d %d", &x, &y);
//坐标是否合法
if (x >=0 && x <= row && y > 0 && y <= row) {
//坐标是否可落字
if (boar[x-1][y-1] == ' ') {
boar[x-1][y-1] = '*';
break;
}
else
{
printf("该位置已被落子,请重新输入>:\n");
}
}
else
{
printf("您的落子超出棋盘,请重新输入>;\n");
}
}
}
5 电脑落子
电脑需随机产生坐标下棋,用到rand,并使用时间戳。
void computermove(char boar[ROW][LIE], int row, int lie) {
printf("电脑下棋>:\n");
while (1)
{
int x, y;
x = rand() % row;//下棋范围0- row-1
y = rand() % lie;//下棋范围0- lie-1
if (boar[x][y] == ' ') {
boar[x][y] = '#';
break;
}
}
}
6 判断输赢
'*'表示玩家胜利
'#'表示电脑胜利
'Q'表示平局
'C'表示继续
使用isfull函数判断是否平局
int isfull(char boar[ROW][LIE], int row, int lie) {
int flag = 1;
for (int i = 0; i < row; i++) {
for (int j = 0; i < lie; j++) {
if (boar[i][j] == ' ') {
flag = 0;
break;
}
}
}
return flag;
}
char iswin(char boar[ROW][LIE], int row, int lie) {
//赢
for (int i = 0; i < row; i++) {
// 列
if (boar[i][0]==boar[i][1]&& boar[i][2] == boar[i][1]&&boar[i][0]!=' ')
{
return boar[i][0];
}
// 行
if (boar[0][i] == boar[1][i] && boar[0][i] == boar[2][i] && boar[0][i] != ' ')
{
return boar[0][i];
}
//对角线
if (boar[0][0] == boar[1][1] && boar[2][2] == boar[1][1]&&boar[0][0]!=' ') {
return boar[0][0];
}
if (boar[0][2] == boar[1][1] && boar[1][1] == boar[2][0] && boar[1][1]!= ' ')
{
return boar[1][1];
}
}
//平局
if (isfull(boar,ROW,LIE)) {
return 'Q';
}
//继续
return 'C';
}
三 代码实现
分为三个部分 头文件部分 game.h 函数实现部分game.c 主函数部分test.c
头文件部分game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define ROW 3
#define LIE 3
void initboar(char board[ROW][LIE], int row, int lie);//数据初始化
void Display(char[ROW][LIE], int row, int lie);//打印棋盘
//下棋操作
void playermove(char boar[ROW][LIE], int row, int lie);//玩家下棋
void computermove(char boar[ROW][LIE], int row, int lie);//电脑下棋
char iswin(char boar[ROW][LIE], int row, int lie);//判断输赢
int isfull(char boar[ROW][LIE], int row, int lie);//判断是否满栈
函数实现部分game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu() {
printf("****************************************\n");
printf("************** 1.play ******************\n");
printf("************** 0.exit ******************\n");
printf("****************************************\n");
}
void initboar (char board[ROW][LIE], int row, int lie) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < lie; j++) {
board[i][j] = ' ';
}
}
}
void Display(char board[ROW][LIE], int row, int lie) {
for (int i = 0; i < row; i++) {
for (int j = 0; j < lie; j++) {
printf(" %c ", board[i][j]);
if (j < lie- 1) {
printf("|");
}
}
printf("\n");
if(i<row-1){
for (int x = 0; x < row; x++) {
printf("---");
if (x < lie - 1) {
printf("|");
}
}
printf("\n");
}
}
}
void playermove(char boar[ROW][LIE],int row,int lie) {
printf("请玩家下棋,请输入坐标中间用空格隔开>:\n");
while (1)
{
int x, y;
scanf("%d %d", &x, &y);
//坐标是否合法
if (x >=0 && x <= row && y > 0 && y <= row) {
//坐标是否可落字
if (boar[x-1][y-1] == ' ') {
boar[x-1][y-1] = '*';
break;
}
else
{
printf("该位置已被落子,请重新输入>:\n");
}
}
else
{
printf("您的落子超出棋盘,请重新输入>;\n");
}
}
}
void computermove(char boar[ROW][LIE], int row, int lie) {
printf("电脑下棋>:\n");
while (1)
{
int x, y;
x = rand() % row;//下棋范围0- row-1
y = rand() % lie;//下棋范围0- lie-1
if (boar[x][y] == ' ') {
boar[x][y] = '#';
break;
}
}
}
int isfull(char boar[ROW][LIE], int row, int lie) {
int flag = 1;
for (int i = 0; i < row; i++) {
for (int j = 0; i < lie; j++) {
if (boar[i][j] == ' ') {
flag = 0;
break;
}
}
}
return flag;
}
char iswin(char boar[ROW][LIE], int row, int lie) {
//赢
for (int i = 0; i < row; i++) {
// 列
if (boar[i][0]==boar[i][1]&& boar[i][2] == boar[i][1]&&boar[i][0]!=' ')
{
return boar[i][0];
}
// 行
if (boar[0][i] == boar[1][i] && boar[0][i] == boar[2][i] && boar[0][i] != ' ')
{
return boar[0][i];
}
//对角线
if (boar[0][0] == boar[1][1] && boar[2][2] == boar[1][1]&&boar[0][0]!=' ') {
return boar[0][0];
}
if (boar[0][2] == boar[1][1] && boar[1][1] == boar[2][0] && boar[1][1]!= ' ')
{
return boar[1][1];
}
}
//平局
if (isfull(boar,ROW,LIE)) {
return 'Q';
}
//继续
return 'C';
}
主函数部分test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
void game() {
char ret;
char board[ROW][LIE] = { 0 };
initboar(board, ROW, LIE);
//打印棋盘
Display(board, ROW, LIE);
//下棋
while (1)
{
//玩家下棋
playermove(board,ROW,LIE);
Display(board, ROW, LIE);
ret=iswin(board, ROW, LIE);
if (ret != 'C')//判断是否结束
break;
//电脑下棋
computermove(board, ROW, LIE);
Display(board, ROW, LIE);
ret=iswin(board, ROW, LIE);
if (ret != 'C')
break;
}
if (ret = '*') {
printf("恭喜玩家获胜\n");
}
else if(ret='#')
{
printf("恭喜电脑获胜\n");
}
else
{
printf("平局\n");
}
}
int main() {
srand((unsigned int)time(NULL));
int input = 0;
do{
menu(); //打印菜单
printf("请选择:\n");
scanf("%d", &input);//选择
switch (input)
{
case 0:
printf("亲爱的玩家您好,您已退出游戏\n");//退出游戏
break;
case 1: //玩游戏
printf("进入井字棋游戏。\n");
game();
break;
default://选择错误
printf("亲爱的玩家您的选择错误,请重新选择。\n");
break;
}
} while (input);
}
四 结果演示
玩家胜利测试:
电脑胜利测试 :
平局测试:存在问题等待各位大佬发现问题