C语言——五子棋、井字棋人机对“战”
针对C语言学习过程中的五子棋、三子棋实现记录
五子棋人机对战
实际效果
五子棋
做的动图太大了,传不上,那就传视频吧。
一、头文件(game.h)
包含了一些会使用到的函数声明、头文件、宏定义等。需要注意的是宏定义的ROW,COL为棋盘的大小规格,可自行调整,ROW为行,COL为列。RULE为棋盘规则,如:RULE = 5,为五子连成为胜;RULE = 3,为三子连成为胜。 可自行调整,但不要超过5,因为我没有为超过5的棋盘规则计算权值。
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <windows.h>
//符号的定义 - 棋盘的大小
#define ROW 10
#define COL 10
//符号的定义 - 棋盘规则
#define RULE 5
//游戏菜单
void menu();
/*
选项1为开始游戏
选项2为退出游戏
*/
//游戏具体实现
void game();
//棋盘初始化
void board_init(char board[ROW][COL], int row, int col);
//棋盘打印
void board_display(char board[ROW][COL], int row, int col);
//判断游戏输赢
char board_wolf(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);
//判断棋盘是否已满
int isfull(char board[ROW][COL], int row, int col);
//电脑智能下棋系统(包含计分)
void computer_calc(char board[ROW][COL], int row, int col);
//电脑智能判断
void computer_think(int calc_score[ROW][COL], char board[ROW][COL], int row, int col);
二、测试文件(test.c)
包含游戏主函数的实现,flag控制如果输入错误选项,可以再次回到菜单。
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//游戏主函数实现
int main()
{
int flag = 0;
do
{
int input = 0;
menu();//菜单
printf("请选择:>");
scanf("%d", &input);
switch (input)
{
case 1:
printf("开始游戏\n");
game();//游戏运行
break;
case 0:
printf("退出游戏");
break;
default:
printf("输入错误\n");
flag = 1;
break;
}
} while (flag);
return 0;
}
三、游戏程序文件(game.c)
包含了一些游戏程序上的函数实现。思路上并不是根据大多数人所做的:按照落子位置上下左右斜方向扫描,来判断输赢。这里我选用了扫描全棋盘,每个棋子都扫描到。当然他们的想法会更好,这里为了简单就这样写了。需要注意的是,这部分代码未写死,比较通用,更改头文件的ROW,COL,RULE都有效。
此部分已在2022/09/07按照本文末尾关于本文章的详细介绍更新。
可放心食用
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
//游戏菜单
void menu()
{
printf("***************************\n");
printf("******* 1.play *****\n");
printf("******* 0.exit *****\n");
printf("***************************\n");
}
//游戏实现
void game()
{
//设置随机数的生成器
srand((unsigned int)time(NULL));
//存储数据 - 二维数组
char board[ROW][COL];
//初始化棋盘 - 初始化空格
board_init(board, ROW, COL);
//打印一下棋盘
board_display(board, ROW, COL);
char ret = 0;
while (1)
{
//玩家下棋
PlayerMove(board, ROW, COL);
//清屏
system("cls");
board_display(board, ROW, COL);
//判断游戏输赢
ret = board_wolf(board, ROW, COL);
if (ret != 'C')
break;
//电脑下棋
printf("对方正在下棋......\n");
Sleep(1000);//让电脑假装思考