下棋双方分别为玩家和电脑
定义二维数组来实现棋盘,玩家只要输入坐标即可和电脑对战,一个正常的五子棋游戏应该是电脑会对玩家进行阻挡并且想方设法取得胜利,但我在此实现的是电脑随机下子,在后期我会继续优化算法使得电脑的阻挡和电脑如何取得胜利得以实现。
本次五子棋的实现分以下几个步骤
1、写头文件,并定义棋盘大小
#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#include"string.h"
#define ROW 15
#define COL 15
int row, col;
int sum[5]; //存放下棋后四个方向的棋子数
2.首先为了美观,需要打印一个菜单,此菜单可供玩家选择
3、定义一个初始化棋盘的函数
4、定义一个打印棋盘的函数,通过二维数组实现对棋盘的构建
5.设计两个函数,分别用来定义 玩家下和电脑下,此处电脑下子是随机的,因此需要引入随机种子srand,所以需要头文件time.h。然而玩家只需要输入坐标即可。
6.判断输赢也是不可忽略的一个问题,我们都知道五子棋游戏,凡是只要五个棋子连成一条线便取得胜利,因此如果某一方在任意一个方向连成了一条线,便获得胜利,所以我定义了一个判断输赢的函数,让它分别从水平方向,竖直方向和斜方向都进行判断。若整个棋盘都下满了依然没有分出胜负,便是平局。
在判断输赢是,一开始我使用了evaluate函数,但需要注意的是并不是所有的路径对它都可以有返回值。
7.最后,需要在主函数中调用这些函数,使程序能够运行起来并达到预期的结果。
源程序:
#define _CRT_SECURE_NO_WARNINGS
#include"stdio.h"
#include"stdlib.h"
#include"time.h"
#include"string.h"
#define ROW 15
#define COL 15
int row, col;
int sum[5]; //存放下棋后四个方向的棋子数
menu(){ //打印菜单
printf("*************welcome to the chess!*************\n");
printf("*************1.进入游戏!***********************\n");
printf("*************0.退出游戏!***********************\n");
}
void InitChessBoard(char board[ROW][COL], int row, int col){ //初始化棋盘
int i, j = 0;
for (i = 0; i < row; i++){
for (j = 0; j < col; j++){
board[i][j] = ' ';
}
}
}
void ShowBoard(char board[ROW][COL], int row, int col){
//打印棋盘
int i = 0, j = 0;
for (i = 0; i < row; i++){
printf("%d", i + 1); //x轴坐标
}
printf("\n");
for (j = 0; j < col; j++)
{
printf("---|"); //打印第一行
}
for (i = 0; i < row; i++){
printf("\n");
for (j = 0; j < col; j++){
printf("%c |", board[i][j]); //打印竖标
}
printf("%d", i + 1); //打印y坐标
printf("\n");
for (j = 0; j < col; j++){
printf("--|"); //横标
}
printf("\n");
}
}
//int evaluate(int x, int y){
// //判定输赢
// int i, j;
// sum[1] = 0, sum[2] = 0; sum[3] = 0, sum[4] = 0;
// for (i = x, j = y - 1; j >= 1; j--){ //向前
// if (board[i][j] == board[x][y])
// sum[1]++;
// else
// break; //棋子连续
// }
// for (i = x, j = y + 1; j <= 15; j++){ //向后
// if (board[i][j] == board[x][y])
// sum[1]++;
// else
// break; //棋子连续
// }
// if (sum[1] >= 4)
// return 1;
//
// for (i = x - 1, j = y; i >= 1; i--){ //向上
// if (board[i][j] == board[x][y]){
// sum[2]++;
// }
// else
// {
// break;
// }
// }
//
// for (i = x + 1, j = y; j <= 15; j++){ //向下
// if (board[i][j] == board[x][y])
// sum[2]++;
// else
// break; //棋子连续
// }
// if (sum[2] >= 4)
// return 1;
//
// for (i = x - 1, j = y - 1; i >= 1 && j >= i; i--, j--) //左斜边
// {
// if (board[i][j] == board[x][y])
// sum[3]++;
// else
// break;
// }
// for (i = x + 1, j = y + 1; i <= 15 && j <= 15; i++, j++)
// {
// if (board[i][j] == board[x][y])
// sum[3]++;
// else
// break;
// }
// if (sum[3] >= 4)
// return 1;
//
//
// for (i = x - 1, j = y + 1; i >= 1 && j >= i; i--, j++) //右斜边
// {
// if (board[i][j] == board[x][y])
// sum[4]++;
// else
// break;
// }
// for (i = x + 1, j = y - 1; i <= 15 && j <= 15; i++, j--)
// {
// if (board[i][j] == board[x][y])
// sum[4]++;
// else
// break;
// }
// if (sum[4] >= 4)
// return 1;
//}
char WIN(char board[ROW][COL], int row, int col){ //水平
int x = 0, y = 0;
for (x = 0; x < row; x++){
for (y = 0; y < col - 1; y++){
if (((board[x][y] == board[x][y + 1]) && board[x][y + 1] == board[x][y + 2] && board[x][y + 2] == board[x][y + 3] && board[x][y + 3] == board[x][y + 4]) && board[x][y] != ' '){
return board[x][y];
}
}
}
//斜线
for (x = 0; x < row - 4; x++){
if (((board[x][x] == board[x + 1][x + 1]) && board[x + 1][x + 1] == board[x + 2][x + 2] && board[x + 2][x + 2] == board[x + 3][x + 3] && board[x + 3][x + 3] == board[x + 4][x + 4]) && board[x][x] != ' '){
return board[x][x];
}
if (((board[x][x + 4] == board[x + 1][x + 3]) && board[x + 1][x + 3] == board[x + 2][x + 2] && board[x + 2][x + 2] == board[x + 3][y + 1] && board[x + 3][y + 1] == board[x + 4][x]) && board[x][x + 4] != ' '){
return board[x][x + 4];
}
}
//竖直
for (y = 0; y < col; y++){
for (x = 0; x < row - 4; x++){
if (((board[x][y] == board[x + 1][y]) && board[x + 1][y] == board[x + 2][y] && board[x + 2][y] == board[x + 3][y] && board[x + 3][y] == board[x + 4][y]) && board[x][y] != ' '){
return board[x][y];
}
}
}
return ' ';
}
IsFull(char board[ROW][COL], int row, int col){ //判断平局
int x = 0, y = 0;
for (x = 0; x < row; x++){
for (y = 0; y < col; y++){
if (board[x][y] == ' ')
{
return 0;
}
}
}
return 1; //平局返回1,棋盘已无空位置还没判断谁赢,则平局
}
//void PlayerPlaying(char board[ROW][COL], int row, int col){
// int x = 0, y = 0;
// printf("the player move: ");
// printf("请输入坐标(%d,%d) :>", row, col);
// while (1){
// scanf("%d %d", &x, &y);
// if (x >= 1 && x <= row&&y >= 1 && y <= col){ //成功下棋的条件
// if (board[x - 1][y - 1] == ' '){
// board[x - 1][y - 1] = '*';
// break;
// }
//
// else{
// printf("坐标已用,请重新输入:>");
// continue;
// }
// }
// else{
// printf("坐标不合法\n");
// printf("请重新输入:>");
// continue;
// }
// }
//}
//电脑
void ComputerPlaying(char board[ROW][COL], int row, int col){
int x = 0;
int y = 0;
printf("电脑走: \n");
while (1){
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' '){
board[x][y] = '#';
break;
}
else{
continue;
}
}
}
void PlayerPlaying(char board[ROW][COL], int row, int col){
int x = 0, y = 0;
printf("the player move: ");
printf("请输入坐标(%d,%d) :>", row, col);
while (1){
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row&&y >= 1 && y <= col){ //成功下棋的条件
if (board[x - 1][y - 1] == ' '){
board[x - 1][y - 1] = '*';
break;
}
else{
printf("坐标已用,请重新输入:>");
continue;
}
}
else{
printf("坐标不合法\n");
printf("请重新输入:>");
continue;
}
}
}
void playing(){
char ret;
char board[ROW][COL] = { 0 };
InitChessBoard(board, ROW, COL);
ShowBoard(board, ROW, COL);
while (1){
ComputerPlaying(board, ROW, COL);
ret = WIN(board, ROW, COL);
if (ret != ' '){
break;
}
system("CLS");
ShowBoard(board, ROW, COL);
PlayerPlaying(board, ROW, COL);
ret = WIN(board, ROW, COL);
if (ret != ' '){
break;
}
ShowBoard(board, ROW, COL);
}
if (ret == '*'){
printf("the player win!\n");
ShowBoard(board, ROW, COL);
}
else if (ret == '#'){
printf("the computer win!\n");
}
else
printf("平局\n");
}
main(){
int a;
srand((unsigned int)time(NULL));
printf("please choose:\n");
do{
menu();
scanf("%d", &a);
switch (a){
case 0:
break;
case 1:
playing();
break;
default:
printf("please repeat again: ");
}
} while (a);
system("pause");
}
运行结果:
共勉