前面用数组知识写过一个三子棋的游戏,由于电脑下是瞎逼下(随机值),玩家很轻松就赢了,现在将电脑下改得更智能一些,并将三子棋扩展成了五子棋(9*9棋盘),依然是利用数组知识。
电脑下的主要规则如下:
1.先判断电脑是否将要成5,已有活4/冲4;
2.再判断玩家是否将要成5,已有活4/冲4,堵住玩家赢的路;
3.然后判断电脑是否将要成4,已有活3;
4.最后判断玩家是否将要成4,已有活3,堵住玩家赢的路;
此游戏中暂时先实现了这几个智能落子的功能
游戏效果如下:
详细代码如下:
1.test.c
/*
date:2018/12/24
author:Better Me1
program:The Five Son Of Chess Games
compiler:Visual Studio 2013
*/
/*测试部分*/
#include "game.h"
void menu(){
printf("************ 五子棋小游戏 ************\n");
printf("****** 1.进入游戏 2.退出游戏 ******\n");
printf("**************************************\n");
}
void game(){
char chess[ROW][COL] = { ' ' };
InitBoard(chess, ROW, COL, ' ');//初始化
DisplayBoard(chess, ROW, COL);//打印棋盘
PlayGame(chess, ROW, COL);//玩游戏
}
void test(){
int input = 0;
while (input!=2){
menu();
printf("请选择:>");
scanf("%d", &input);
system("cls");
switch (input){
case 1:
game();
break;
case 2:
printf("退出游戏!\n");
break;
default:
printf("输入有误,请重新选择!\n");
break;
}
}
}
void main(){
test();
system("pause");
}
2.game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define ROW 9
#define COL 9
void InitBoard(char board[ROW][COL], int row, int col, char set);
void DisplayBoard(char board[ROW][COL], int row,int col);
void PlayerMove(char board[ROW][COL], int row, int col);
int FiveSon(char board[ROW][COL], int row, int col, int k,char a,char b,char c);//用于检测成5,活4/冲4
int ThreeSon(char board[ROW][COL], int row, int col, int k, char a, char b, char c);//用于检测活3,成4
void ComputerMove(char board[ROW][COL], int row, int col);
int CheckWiner(char board[ROW][COL], int row, int col);
void PlayGame(char board[ROW][COL], int row, int col);
3.game.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void InitBoard(char board[ROW][COL], int row, int col, char set){//初始化棋盘
memset(board, set, row*col*sizeof(board[0][0]));
}
void DisplayBoard(char board[ROW][COL], int row, int col){ //打印棋盘
int i = 0;
int j = 0;
for (i = -1; i < row; i++){
for (j = -1; j < col; j++){
if (i == -1){
printf(" %d ",j+1);
}
else if (j == -1){
printf(" %d ", i+1);
}
else{
printf(" %c ", board[i][j]);
}
if (j != col - 1){
printf("|");
}
}
printf("\n");
if (i != row - 1){
printf("---+---+---+---+---+---+---+---+---+---");
printf("\n");
}
}
}
void PlayerMove(char board[ROW][COL], int row, int col){
int i = 0;//横坐标
int j = 0;//纵坐标
while (1){
printf("请输入放置棋子的坐标(如:a b):>");
scanf("%d %d", &i, &j);
if (i<1 || i>row || j<1 || j>col){
printf("坐标输入错误,请重新输入!\n");
}
else if (board[i - 1][j - 1] != ' '){
printf("此坐标已被棋子占用!请重新输入!\n");
}
else{
break;
}
}
system("cls");
printf("玩家走:\n");
printf("\n");
board[i - 1][j - 1] = 'X';
}
int FiveSon(char board[ROW][COL], int row, int col, int k, char a, char b, char c){
int i = 0;//横坐标
int j = 0;//纵坐标
//检测行中的成5,活4/冲4
if (k == 1){
for (i = 0; i < row; i++){
for (j = 0; j < col - 4; j++){
if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] &&
board[i][j] == board[i][j + 3] && board[i][j] == a && board[i][j + 4] == b){
board[i][j + 4] = c;
k = 0;
break;
}
if (board[i][j] == board[i][j + 1] && board[i][j] == board[i][j + 2] &&
board[i][j] == board[i][j + 4] && board[i][j] == a && board[i][j + 3] == b){
board[i][j + 3] = c;
k = 0;
break;
}
if (board[i][j] == board[i]