代码分为三部分:test->程序测试模块;game->为游戏业务逻辑部分
- 棋盘是以二维数组为载体来实现的,通过数组元素来记录落子信息;
- 首先要对棋盘初始化,将数组元素置为‘ ’;
- 打印棋盘 ,查看棋盘结构;
- 玩家落子:考察坐标合法性;有无已有棋子;
- 判断胜负:行3列3对角线三个条件可判断胜负,并且返回当前落子符号作为判断玩家赢还是电脑赢的条件;同时,遍历数组寻找有无‘ ’,有则继续对局,否则返回Q表示平局;
- 电脑落子:采用随机落子,同时判断落子坐标范围与是否所选坐标已有棋子,对坐标进行合法性判断;
在代码中来总结分析这个实现过程:
test.c
#include<stdio.h>
#include"game.h"
#define _CRT_SECURE_NO_WARNINGS
void meau() {
printf("************************\n");
printf("******* 1.play *********\n");
printf("******* 0.exit *********\n");
printf("************************\n");
}
void game() {
char boder[ROW][COL];//定义棋盘
char ret = "";
//初始化棋盘
initial(boder, ROW, COL);
//打印棋盘
display(boder, ROW, COL);
//玩家下棋
while (1) {
playMove(boder, ROW, COL);
display(boder, ROW, COL);
ret= isWin(boder,ROW,COL);
if (ret != 'c')
{
break;
}
pcMove(boder, ROW, COL);
display(boder, ROW, COL);
ret = isWin(boder, ROW, COL);
if (ret != 'c')
{
break;
}
}
if (ret == '*') {
printf("玩家赢了\n");
}
if (ret == '#') {
printf("电脑赢了\n");
}
if (ret == 'Q') {
printf("平局\n");
}
}
void main() {
int input = 0;
srand((unsigned int)time(NULL));
do
{
meau();
printf("请选择:-> \n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("开启游戏\n\n");
game();
break;
case 0:
printf("退出游戏\n\n");
break;
default:
printf("请重新输入\n\n");
break;
}
} while (input);
}
game.h模块
#pragma once
#include <stdlib.h>
#include<time.h>
#define ROW 3
#define COL 3
//初始化
void initial(char boder[ROW][COL], int row, int col);
//打印棋盘
void display(char boder[ROW][COL], int row, int col);
//玩家下棋
void playMove(char boder[ROW][COL], int row, int col);
//电脑下棋
void pcMove(char boder[ROW][COL], int row, int col);
//判断输赢
char isWin(char boder[ROW][COL], int row, int col);
game.c 模块
#include"game.h"
#include<stdio.h>
void initial(char boder[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for (i = 0; i < ROW; i++)
{
for (j = 0; j < COL; j++)
{
boder[i][j] =' ';
}
}
}
void display(char boder[ROW][COL], int row, int col) {
int i = 0;
int j = 0;
for ( i = 0; i < row; i++)
{
for (j = 0; j < row; j++)
{
printf(" %c ", boder[i][j]);
if (j<col-1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j < row; j++)
{
if (i < row - 1)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void playMove(char boder[ROW][COL], int row, int col) {
printf("玩家走:->\n");
printf("输入坐标 X Y\n");
int x = 0;
int y = 0;
while (1) {
scanf("%d%d", &x, &y);
//判断坐标的合法性
if (x >= 1 && x <= ROW && y >= 1 && y <= COL) {
//判断落子位置有无被占用
if (boder[x-1][y-1]==' ')
{
boder[x-1][y-1] = '*';
break;
}
else {
printf("此处已有棋子,请重新选择\n");
}
}
else {
printf("坐标越界,请重新输入\n");
}
}
}
void pcMove(char boder[ROW][COL], int row, int col) {
printf("电脑走;->\n");
while (1)
{
int a = rand()%row;
int b = rand()%col;
if (boder[a][b] == ' ') {
boder[a][b] = '#';
break;
}
}
printf("Computer ... Done\n");
}
char isWin(char boder[ROW][COL], int row, int col) {
// 判断输赢
//行 获胜条件
for (int i = 0; i < row; i++)
{
if (boder[i][0] == boder[i][1] && boder[i][1] == boder[i][2]&& boder[i][0]!= ' ') {
return boder[i][0];
}
}
//列 获胜条件
for (int i = 0; i < col; i++)
{
if (boder[0][i] == boder[1][i] && boder[1][i] == boder[2][i] && boder[0][i] != ' ') {
return boder[0][i];
}
}
//对角线获胜条件
if (boder[0][0]== boder[1][1] && boder[1][1] == boder[2][2] && boder[1][1]!=' ')
{
return boder[1][1];
}
if (boder[0][2] == boder[1][1] && boder[1][1] == boder[2][0] && boder[1][1] != ' ')
{
return boder[1][1];
}
//判断平局
//判断是否继续
for (int i = 0; i < row; i++) {
for (int j = 0; j < col; j++)
{
if (boder[i][j] == ' ') {
return 'c';
}
}
}
//循环结束 能进行到此步 说明棋盘满了,返回平局标志Q;
return "Q";
}
结果展示: