用C语言来写一个3x3棋盘、与电脑对战的三子棋游戏!
game.h
#define _CRT_SECURE_NO_WARNINGS
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define ROW 3
#define COL 3
void BoardInit(char arr[ROW][COL], int row, int col); //二维数组初始化
void Print(char arr[ROW][COL], int row, int col); //打印棋盘
void PlayerRound(char arr[ROW][COL], int row, int col); //玩家回合
int Judge(char arr[ROW][COL], int row, int col); //判断输赢
int Tie(char arr[ROW][COL], int row, int col); //判断是否和局
void ComputerRound(char arr[ROW][COL], int row, int col); //电脑回合
game.h文件一般包含整个项目所需的头文件、宏定义、函数声明等。
game.c
1.二维数组初始化
void BoardInit(char arr[ROW][COL], int row, int col) //二维数组初始化,每个元素置为空格
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
arr[i][j] = ' ';
}
}
2.打印棋盘
void PrintBoard(char arr[ROW][COL], int row, int col) //打印棋盘
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", arr[i][j]);
if (j < col - 1)
printf("|");
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
3.玩家回合
void PlayerRound(char arr[ROW][COL], int row, int col) //玩家回合
{
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标:");
scanf("%d%d", &x, &y);
if ((x > row || x <= 0) || (y > col || y <= 0) || arr[x - 1][y - 1] != ' ')
{
printf("坐标有误,请重新输入!\n");
}
else
break;
}
arr[x - 1][y - 1] = '*';
}
1、将玩家输入的坐标-1传入。
2、此处需要判断非法坐标,即已下过的坐标和越界坐标。
4.判输赢
int Judge(char arr[ROW][COL], int row, int col) //判断输赢
{
for (int i = 0; i < row; i++) //判行
{
int j = 0;
if ((arr[i][j] != ' ') && (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i][j + 2]) && arr[i][j] == '*')
{
printf("玩家获胜!\n");
return 1;
}
if ((arr[i][j] != ' ') && (arr[i][j] == arr[i][j + 1] && arr[i][j] == arr[i][j + 2]) && arr[i][j] == '#')
{
printf("电脑获胜!\n");
return 2;
}
}
for (int j = 0; j < col; j++) //判列
{
int i = 0;
if ((arr[i][j] != ' ') && (arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 2][j]) && arr[i][j] == '*')
{
printf("玩家获胜!\n");
return 1;
}
if ((arr[i][j] != ' ') && (arr[i][j] == arr[i + 1][j] && arr[i][j] == arr[i + 2][j]) && arr[i][j] == '#')
{
printf("电脑获胜!\n");
return 2;
}
}
//判断斜列
if ((arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == '*') || arr[0][2] == arr[1][1] && arr[0][2] == arr[3][0] && arr[0][2] == '*')
{
printf("玩家获胜!\n");
return 1;
}
if ((arr[0][0] == arr[1][1] && arr[0][0] == arr[2][2] && arr[0][0] == '#') || arr[0][2] == arr[1][1] && arr[0][2] == arr[3][0] && arr[0][2] == '#')
{
printf("电脑获胜!\n");
return 2;
}
return 0;
}
若玩家行、列或斜列三连,则玩家获胜。反之 ,电脑获胜。
5.判和
int Tie(char arr[ROW][COL], int row, int col) //判断是否和局
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 1;
}
}
return 0;
}
和局判断条件是棋盘已满且胜负未分,由于test.c先调用判断输赢的函数,故此处无需判断胜负,仅需判断棋盘是否已满。
6.电脑回合
void ComputerRound(char arr[ROW][COL], int row, int col) //电脑回合
{
Sleep(2000);
printf("电脑回合:\n");
Sleep(1500);
while (1)
{
if (arr[1][1] == ' ')
{
arr[1][1] = '#';
break;
}
else
{
int x = rand() % row;
int y = rand() % col;
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
}
注:电脑下棋前先延迟2秒,再给出“电脑回合” 提示,提示完毕的1.5秒后,再打印棋盘。
test.c
#include "game.h"
void menu()
{
printf("##########################\n");
printf("##### 1.play 0.exit #####\n");
printf("##########################\n");
}
void game()
{
char arr[ROW][COL];
BoardInit(arr, ROW, COL); //二维数组初始化
int First = rand() % 3 + 1;
PrintBoard(arr, ROW, COL); //打印棋盘
int flag = 1;
while (flag)
{
if (First == 3)
printf("本回合电脑先下!\n");
switch (First)
{
case 1:
case 2:
PlayerRound(arr, ROW, COL); //玩家回合
Print(arr, ROW, COL); //打印棋盘
if (Judge(arr, ROW, COL) == 1) //判断输赢
{
flag = 0;
break;
}
if (Tie(arr, ROW, COL) == 0) //判断和局
{
printf("平局!\n");
flag = 0;
break;
}
case 3:
ComputerRound(arr, ROW, COL); //电脑回合
Print(arr, ROW, COL); //打印棋盘
if (Judge(arr, ROW, COL) == 2) //判断输赢
{
flag = 0;
break;
}
if (Tie(arr, ROW, COL) == 0) //判断是否和局
{
printf("平局!");
flag = 0;
break;
}
First = 1;
}
}
}
int main()
{
int input = 0;
srand((unsigned)time(NULL));
do
{
menu();
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
return 0;
}
此处用了switch语句 和rand()函数,实现了电脑概率先手。