一、思路总概
-
创建一个二维数组作为棋盘,用来表示棋局状态。可以使用 char 类型的二维数组,其中每个元素表示棋盘对应位置的状态,例如 '*' 表示玩家的棋子,'#' 表示电脑的棋子,' ' 表示空位置。
-
编写一个函数来初始化棋盘,将所有位置都设置为空。
-
编写一个函数来打印当前的棋盘状态,以可视化形式展示给玩家。
-
编写一个函数来判断是否达到游戏结束的条件。游戏继续,平局,获胜。
-
编写一个函数来处理玩家的落子操作。根据玩家输入的坐标,判断该位置是否合法(即是否为空),如果合法则将对应位置设置为玩家的棋子,并更新棋盘状态,再次打印棋盘。
-
编写一个函数来模拟电脑的落子操作。可以采用简单的随机策略,在空位置中随机选择一个落子点,并将该位置设置为电脑的棋子。
-
编写一个主循环,不断交替执行以下操作:打印当前棋盘状态、让玩家落子、判断游戏是否结束。如果游戏结束,则输出胜利者或平局,并结束游戏。
二、代码实现
1、头文件(这里命名为game.h)
#pragma once
#define ROW 3
#define COL 3
#define WIN_COUNT 3
#include <stdio.h>
#include <stdbool.h>
void Initboard(char board[ROW][COL], int row, int col);
void Printboard(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);
bool isGameOver(char board[ROW][COL], int row, int col);
2、游戏所用到的函数
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
//初始化数组
void Initboard(char board[ROW][COL],int row,int col)
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
board[i][j] = ' ';
}
//打印棋盘
void Printboard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (j < col - 1)
printf(" %c |",board[i][j]);
else
printf(" %c ",board[i][j]);
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
if (j < col - 1)
printf("---|");
else
printf("---");
}
printf("\n");
}
}
}
void Playermove(char board[ROW][COL], int row, int col)
{
printf("请输入棋子坐标(行 列):");
input:
scanf("%d %d", &row, &col);
if (board[row - 1][col - 1] == ' ')
board[row - 1][col - 1] = '*';
else
{
printf("请输入有效的棋子坐标\n");
Printboard(board, ROW, COL);
goto input;
}
}
void Computermove(char board[ROW][COL], int row, int col)
{
while (1)
{
int x = rand() % row;
int y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
bool isGameOver(char board[ROW][COL],int row,int col) {
// 检查行、列和对角线
for (int i = 0; i < ROW; i++) {
for (int j = 0; j <= ROW - WIN_COUNT; j++) {
bool win = true;
for (int k = 0; k < WIN_COUNT - 1; k++) {
if (board[i][j + k] == ' ' || board[i][j + k] != board[i][j + k + 1]) {
win = false;
break;
}
}
if (win)
return true;
}
for (int j = 0; j <= ROW - WIN_COUNT; j++) {
bool win = true;
for (int k = 0; k < WIN_COUNT - 1; k++) {
if (board[j + k][i] == ' ' || board[j + k][i] != board[j + k + 1][i]) {
win = false;
break;
}
}
if (win)
return true;
}
}
for (int i = 0; i <= ROW - WIN_COUNT; i++) {
for (int j = 0; j <= ROW - WIN_COUNT; j++) {
bool win = true;
for (int k = 0; k < WIN_COUNT - 1; k++) {
if (board[i + k][j + k] == ' ' || board[i + k][j + k] != board[i + k + 1][j + k + 1]) {
win = false;
break;
}
}
if (win)
return true;
}
}
for (int i = 0; i <= ROW - WIN_COUNT; i++) {
for (int j = ROW - 1; j >= WIN_COUNT - 1; j--) {
bool win = true;
for (int k = 0; k < WIN_COUNT - 1; k++) {
if (board[i + k][j - k] == ' ' || board[i + k][j - k] != board[i + k + 1][j - k - 1]) {
win = false;
break;
}
}
if (win)
return true;
}
}
// 检查是否平局
bool full = true;
for (int i = 0; i < ROW; i++) {
for (int j = 0; j < ROW; j++) {
if (board[i][j] == ' ') {
full = false;
break;
}
}
}
if (full)
return true;
return false;
}
3、主函数
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
int main()
{
char board[ROW][COL];
Initboard(board, ROW, COL);
while (!isGameOver(board,ROW,COL)) {
Printboard(board, ROW, COL);
Playermove(board, ROW, COL);
if (isGameOver(board, ROW, COL)) {
printf("游戏结束,你获胜了!\n");
break;
}
Computermove(board, ROW, COL);
if (isGameOver(board, ROW, COL)) {
printf("游戏结束,电脑获胜!\n");
break;
}
}
Printboard(board, ROW, COL);
return 0;
}
如果需要将该游戏扩展为n字棋,仅需要将头文件中对ROL、COL、WIN_OOUNT的值进行修改。
另:本次只针对游戏主体进行了设计,如需菜单,游戏进入,游戏退出等请自行进行设计。
以上---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------END