思路:
要实现一个三子棋,肯定少不了一个放置子的棋盘,在这里我们可以用一个二维数组arr[3][3]当作棋盘,再通过几个函数实现棋盘之间逻辑关系,在测试时用循环判断人和电脑之间的胜负。以下是具体的过程:
首先为了增加程序的可拓展性,可改造性,我们用宏来定义棋盘的大小。
#define ROWS 3
#define COLS 3
将数组写成arr[ROWS][COLS];在以后想要改造棋盘的大小,就只需将宏定义里的行和列的大小已改就可。然后构造打印棋盘函数、电脑下棋函数,玩家下棋函数,每次下棋判断输赢,棋盘是否满再构造两个函数,最后在main()中用while循环判断结果,直到分出输赢或者平局,跳出while,
源代码主要又三个模块组成:1.头文件模块。2.函数实现模块。3.测试模块。
头文件代码:
包含对各个函数的声明以及宏定义的棋盘大小
#ifndef __GAME_H__
#define __GAME_H__
#define _CRT_SECURE_NO_WARNINGS 1
#define ROWS 3
#define COLS 3
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void Init_board(int arr[ROWS][COLS]);
void print_board(int arr[ROWS][COLS]);
void Player_move(int arr[ROWS][COLS]);
void Computer_move(int arr[ROWS][COLS]);
char Check(int arr[ROWS][COLS]);
void winer(int arr[ROWS][COLS]);
#endif
各子函数实现代码:
包括初始化棋盘、打印棋盘、电脑下子、人下子、判断棋盘是否满和核对输赢几个函数。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void Init_board(int arr[ROWS][COLS])
{
int rows = 0;
int cols = 0;
for (rows=0; rows<ROWS; rows++)
{
for (cols=0; cols<COLS; cols++)
{
arr[rows][cols] = ' ';
}
}
}
void print_board(int arr[ROWS][COLS])
{
int rows = 0;
int cols = 0;
for(cols=0;cols<COLS;cols++)
{
printf(" %c | %c | %c \n",arr[cols][0],arr[cols][1],arr[cols][2]);
if(cols != 2)
printf("---|---|---");
printf("\n");
}
}
int board_full(int arr[ROWS][COLS])
{
int rows = 0;
int cols = 0;
for (rows = 0; rows < ROWS; rows++)
{
for (cols = 0; cols <COLS; cols++)
{
if (arr[cols][rows] == ' ')
{
return 0;
}
}
}
return 1;
}
void Computer_move(int arr[ROWS][COLS])
{
srand((unsigned)time(NULL));
printf("电脑下子:\n");
while (board_full(arr) != 1)
{
int rows = 0;
int cols = 0;
rows = rand()%ROWS;
cols = rand()%COLS;
if (arr[rows][cols] == ' ')
{
arr[rows][cols] = 'X';
break;
}
else
{
if (board_full(arr) == 0)
{
continue;
}
else
{
break;
}
}
}
}
void Player_move(int arr[ROWS][COLS])
{
int rows = 0;
int cols = 0;
while(board_full(arr) != 1)
{
printf("人下子,请输入坐标:> ");
scanf("%d%d",&rows,&cols);
rows--;
cols--;
if (arr[rows][cols] == ' ')
{
arr[rows][cols] ='0';
break;
}
else
{
printf("输入错误,重新输入!!!");
continue;
}
}
}
char Check(int arr[ROWS][COLS])
{
int rows = 0;
int ret = 0;
for (rows = 0; rows < ROWS; rows++) //判断行和列
{
if ((arr[rows][0] == arr[rows][1]) && (arr[rows][2] == arr[rows][1]))
{
return arr[rows][0];
}
if ((arr[0][rows] == arr[1][rows]) && (arr[2][rows] == arr[1][rows]))
{
return arr[0][rows];
}
}
if ((arr[0][0] == arr[1][1]) && (arr[1][1] == arr[2][2])) //判断斜
{
return arr[0][0];
}
if ((arr[0][2] == arr[1][1]) && (arr[1][1] == arr[2][0])) //判断斜
{
return arr[0][2];
}
if (board_full(arr) == 1)
{
return 'q';
}
return ' ';
}
void winer(int arr[ROWS][COLS])
{
char ret = 0;
ret = Check(arr);
if (ret == 'X')
{
printf("电脑赢!!!\n");
}
if (ret == '0')
{
printf("玩家赢!!!\n");
}
if (ret == 'q')
{
printf("平局!!!\n");
}
}
测试代码:逻辑显示部分
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include "game.h"
void menu()
{
printf("***************************************\n");
printf("********** 1.play 0.exit **********\n");
printf("***************************************\n");
}
int main()
{
int arr[ROWS][COLS] = {0};
int input = 1;
int tmp = 0;
char ret= 0;
while (input)
{ menu();
printf("请选择:>");
scanf("%d",&input);
Init_board(arr);
switch(input)
{
case 1:
{
do
{
print_board(arr);
Computer_move(arr);
print_board(arr);
if(Check(arr) != ' ')
{
ret=Check(arr);
break;
}
Player_move(arr);
print_board(arr);
ret=Check(arr);
}while (ret == ' ');
winer(arr);
break;
}
case 0:
break;
}
}
return 0;
}
运行截图:
总结:要实现一个简单的三子棋小游戏,只要思路清晰、逻辑明确,实现起来还是比较简单的。。。