目录
一、三子棋游戏的实现逻辑
1.玩家进入游戏菜单
2.玩家输入选择:进入游戏or离开游戏or选择错误,重新选择
3.玩家进入游戏,开始落子
4.电脑落子
5.判断胜负
6.选择是否继续游戏
二、三子棋游戏的具体实现
1.打印菜单界面
//打印菜单
void menu()
{
printf("******************\n");
printf("*****请选择:******\n");
printf("*****1.play*******\n");
printf("*****0.exit*******\n");
printf("******************\n");
}
2.初始化棋盘
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] = ' ';
}
}
}
3.打印棋盘
//打印棋盘
void display(char board[ROW][COL], int row, int col)
{
int i = 0;
printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
for ( i = 1; i < row ; i++)
{
printf("-----------\n");
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
}
}
4.玩家下棋
//玩家落子-'o'
void playermove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("玩家落子\n");
while (1)
{
printf("请输入棋子坐标: ");
scanf("%d %d", &x, &y);
//1.判断输入坐标是否在棋盘内
//2.判断输入坐标是否被占用
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'o';
break;
}
else
{
printf("该位置已被占用,请重新输入!\n");
}
}
else
{
printf("输入坐标不在棋盘范围内,请重新输入!\n");
}
}
}
4.判断胜负
//判断棋盘是否被填满
//返回1-是,返回0-否
int isfull(char board[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
//返回'o'-玩家赢
//返回'*'-电脑赢
//返回'Q'-平局
//返回'C'-继续游戏
char iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
//1.判断横行的情况
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];
}
}
//2.判断纵列情况
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//3.判断斜对角线情况
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
//4.判断是否平局
if (isfull(board, ROW, COL) == 1)
{
return 'Q';
}
return 'C';
}
5.电脑下棋
//电脑落子-'*'
//电脑随机落子
void computermove(char board[ROW][COL], int row, int col)
{
printf("电脑落子\n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
6.游戏逻辑的实现
void game()
{
char board[ROW][COL] = { 0 };
char ret = 0;
//1.初始化棋盘
initboard(board, ROW, COL);
//2.打印棋盘
display(board, ROW, COL);
while (1)
{
//3.玩家落子,打印棋盘,判断输赢
playermove(board, ROW, COL);
display(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//4.电脑落子,打印棋盘,判断输赢
computermove(board, ROW, COL);
display(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
//5.判断输赢
if (ret == 'o')
{
printf("玩家赢\n");
}
if (ret == '*')
{
printf("电脑赢\n");
}
if (ret == 'Q')
{
printf("平局\n");
}
}
注意事项:
1.使用宏定义棋盘的行、列,方便以后修改;
2.每写完一个函数运行一次,防止出现错误;
3.注意break的使用。
三、三子棋游戏的分文件编写
头文件game.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//宏定义棋盘行列
#define ROW 3
#define COL 3
//函数声明
void menu();
void game();
void display(char board[ROW][COL], int row, int col);
void initboard(char board[ROW][COL], int row, int col);
void playermove(char board[ROW][COL], int row, int col);
int isfull(char board[ROW][COL], int row, int col);
char iswin(char board[ROW][COL], int row, int col);
void computermove(char board[ROW][COL], int row, int col);
源文件game.c
#include"game.h"
void game()
{
char board[ROW][COL] = { 0 };
char ret = 0;
//1.初始化棋盘
initboard(board, ROW, COL);
//2.打印棋盘
display(board, ROW, COL);
while (1)
{
//3.玩家落子,打印棋盘,判断输赢
playermove(board, ROW, COL);
display(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
//4.电脑落子,打印棋盘,判断输赢
computermove(board, ROW, COL);
display(board, ROW, COL);
ret = iswin(board, ROW, COL);
if (ret != 'C')
{
break;
}
}
//5.判断输赢
if (ret == 'o')
{
printf("玩家赢\n");
}
if (ret == '*')
{
printf("电脑赢\n");
}
if (ret == 'Q')
{
printf("平局\n");
}
}
//打印菜单
void menu()
{
printf("******************\n");
printf("*****请选择:******\n");
printf("*****1.play*******\n");
printf("*****0.exit*******\n");
printf("******************\n");
}
//初始化棋盘
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 display(char board[ROW][COL], int row, int col)
{
int i = 0;
printf(" %c | %c | %c \n",board[i][0], board[i][1], board[i][2]);
for ( i = 1; i < row ; i++)
{
printf("-----------\n");
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
}
}
//玩家落子-'o'
void playermove(char board[ROW][COL], int row, int col)
{
int x = 0, y = 0;
printf("玩家落子\n");
while (1)
{
printf("请输入棋子坐标: ");
scanf("%d %d", &x, &y);
//1.判断输入坐标是否在棋盘内
//2.判断输入坐标是否被占用
if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
{
if (board[x - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = 'o';
break;
}
else
{
printf("该位置已被占用,请重新输入!\n");
}
}
else
{
printf("输入坐标不在棋盘范围内,请重新输入!\n");
}
}
}
//判断棋盘是否被填满
//返回1-是,返回0-否
int isfull(char board[ROW][COL], int row, int col)
{
int i = 0, j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
//判断输赢
//返回'o'-玩家赢
//返回'*'-电脑赢
//返回'Q'-平局
//返回'C'-继续游戏
char iswin(char board[ROW][COL], int row, int col)
{
int i = 0;
//1.判断横行的情况
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];
}
}
//2.判断纵列情况
for (i = 0; i < col; i++)
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')
{
return board[1][i];
}
}
//3.判断斜对角线情况
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[2][0] == board[1][1] && board[1][1] == board[0][2] && board[1][1] != ' ')
{
return board[1][1];
}
//4.判断是否平局
if (isfull(board, ROW, COL) == 1)
{
return 'Q';
}
return 'C';
}
//电脑落子-'*'
//电脑随机落子
void computermove(char board[ROW][COL], int row, int col)
{
printf("电脑落子\n");
while (1)
{
int x = rand() % 3;
int y = rand() % 3;
if (board[x][y] == ' ')
{
board[x][y] = '*';
break;
}
}
}
源文件test.c
//三子棋游戏
#include"game.h"
int main()
{
int choice = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("玩家请选择: ");
scanf("%d", &chose);
switch (choice)
{
case 1:
game(); break;
case 0:
printf("您已离开游戏!\n"); break;
default:
printf("输入错误,请重新选择!\n"); break;
}
} while (choice);
return 0;
}