先说明一下,定义几个宏。可以自定义棋盘长度和宽度,以及几子相同获胜。
#define ROW 10//棋盘长度
#define COL 10//棋盘宽度
#define MODEL 5//几个子相同获胜
首先,创建一个数组board,用initboard()初始数组
void initboard(char Board[ROW][COL], int row, int col)//初始数组
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
Board[i][j] = ' ';
}
//memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));
}
用printfboard()打印棋盘
void printboard(char Board[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", Board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
然后定义函数playmove()玩家下棋,当玩家输入坐标对相应数组赋值为'*';定义函数computermove()表示电脑下棋,用函数rand()产生随机值提供坐标,然后对其相应数组赋值为‘#’。每次调用playmove()和computer后,都要用函数end()对当前棋盘状况进行判断,玩家赢end()返回‘*’,电脑赢返回‘#’,平局返回‘q’,如果都未返回上述情况就返回‘c’,代表继续下棋。
void playmove(char Board[ROW][COL], int row, int col)//玩家下棋
{
printf("玩家走,请输入坐标:");
while (1)
{
int r = 0;
int c = 0;
scanf("%d%d", &r, &c);
if (r <= row && r > 0 && c <= col && c > 0)
{
if (Board[r - 1][c - 1] == ' ')
{
Board[r - 1][c - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入");
}
}
else
{
printf("坐标非法,请重新输入");
}
}
}
void computermove(char Board[ROW][COL], int row, int col)//电脑下棋
{
printf("电脑走\n");
while (1)
{
int r = rand() % row;
int c = rand() % col;
if (Board[r][c] == ' ')
{
Board[r][c] = '#';
break;
}
}
}
在函数end()中,当棋子有以下四种情况的是时候,就能判断输赢。1.连续横着有MODEL个相同棋子。2.连续竖着有MODEL个相同棋子。3.连续右斜着有MODEL个相同棋子。4。连续左斜着有个MODEL个相同棋子。否则就判断是不是其他状态。
int end(char Board[ROW][COL], int row, int col)//玩家赢 返回‘*’;电脑赢返回‘#’;平局返回‘q’;继续下棋返回‘c’
{
int i = 0;
int j = 0;
int k = 0;
int h = col;
//横着MODEL个相同棋子
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
int count = 1;
for (k = j; k < COL-1; k++)
{
if (Board[i][k] == Board[i][k + 1] && (Board[i][k] == '*' || Board[i][k] == '#'))
count++;
else
break;
}
if (count >= MODEL && Board[i][j] == '*')
{
return '*';
}
if (count >= MODEL && Board[i][j] == '#')
{
return '#';
}
}
}
//竖着MODEL个棋子
for (i = 0; i < col ; i++)
{
for (j = 0; j < row ; j++)
{
int count = 1;
for (k = j; k < ROW - 1; k++)
{
if (Board[k][i] == Board[k + 1][i]&&(Board[k][i]=='*'||Board[k][i]=='#'))
count++;
else
break;
}
if (count >= MODEL && Board[j][i] == '*')
{
return '*';
}
if (count >= MODEL && Board[j][i] == '#')
{
return '#';
}
}
}
//右斜着MODEL个棋子
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
int count0 = i;
int count = 1;
for (k = j; (k < COL - 1) && k < (ROW - 1); k++)
{
if (Board[count0][k] == Board[count0 + 1][k + 1] && (Board[count0][k] == '*' || Board[count0][k] == '#'))
{
count++;
count0++;
}
else
break;
}
if (count >= MODEL && Board[count0][k] == '*')
{
return '*';
}
if (count >= MODEL && Board[count0][k] == '#')
{
return '#';
}
}
}
//左斜着MODEL个棋子
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
int count0 = i;
int count = 1;
for (k = j; k>0; k--)
{
if (Board[count0][k] == Board[count0 + 1][k - 1] && (Board[count0][k] == '*' || Board[count0][k] == '#'))
{
count++;
count0++;
}
else
break;
}
if (count >= MODEL && Board[count0][k] == '*')
{
return '*';
}
if (count >= MODEL && Board[count0][k] == '#')
{
return '#';
}
}
}
//棋盘被下满
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (Board[i][j] == ' ')
return 'c';
}
}
if (i == row&&j == col)
{
return 'q';
}
return 'c';
}
头文件game.h
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#define ROW 10//棋盘长度
#define COL 10//棋盘宽度
#define MODEL 5//几个子相同获胜
void initboard(char Board[ROW][COL], int row, int col);
void printboard(char Board[ROW][COL], int row, int col);
void playmove(char Board[ROW][COL], int row, int col);
void computermove(char Board[ROW][COL], int row, int col);
int end(char Board[ROW][COL], int row, int col);
game. c代码
#include"game.h"
void initboard(char Board[ROW][COL], int row, int col)//初始数组
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
Board[i][j] = ' ';
}
//memset(&board[0][0], ' ', row*col*sizeof(board[0][0]));
}
void printboard(char Board[ROW][COL], int row, int col)//打印棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
printf(" %c ", Board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
void playmove(char Board[ROW][COL], int row, int col)//玩家下棋
{
printf("玩家走,请输入坐标:");
while (1)
{
int r = 0;
int c = 0;
scanf("%d%d", &r, &c);
if (r <= row && r > 0 && c <= col && c > 0)
{
if (Board[r - 1][c - 1] == ' ')
{
Board[r - 1][c - 1] = '*';
break;
}
else
{
printf("坐标被占用,请重新输入");
}
}
else
{
printf("坐标非法,请重新输入");
}
}
}
void computermove(char Board[ROW][COL], int row, int col)//电脑下棋
{
printf("电脑走\n");
while (1)
{
int r = rand() % row;
int c = rand() % col;
if (Board[r][c] == ' ')
{
Board[r][c] = '#';
break;
}
}
}
int end(char Board[ROW][COL], int row, int col)//玩家赢 返回‘*’;电脑赢返回‘#’;平局返回‘q’;继续下棋返回‘c’
{
int i = 0;
int j = 0;
int k = 0;
int h = col;
//横着MODEL个相同棋子
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
int count = 1;
for (k = j; k < COL-1; k++)
{
if (Board[i][k] == Board[i][k + 1] && (Board[i][k] == '*' || Board[i][k] == '#'))
count++;
else
break;
}
if (count >= MODEL && Board[i][j] == '*')
{
return '*';
}
if (count >= MODEL && Board[i][j] == '#')
{
return '#';
}
}
}
//竖着MODEL个棋子
for (i = 0; i < col ; i++)
{
for (j = 0; j < row ; j++)
{
int count = 1;
for (k = j; k < ROW - 1; k++)
{
if (Board[k][i] == Board[k + 1][i]&&(Board[k][i]=='*'||Board[k][i]=='#'))
count++;
else
break;
}
if (count >= MODEL && Board[j][i] == '*')
{
return '*';
}
if (count >= MODEL && Board[j][i] == '#')
{
return '#';
}
}
}
//右斜着MODEL个棋子
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
int count0 = i;
int count = 1;
for (k = j; (k < COL - 1) && k < (ROW - 1); k++)
{
if (Board[count0][k] == Board[count0 + 1][k + 1] && (Board[count0][k] == '*' || Board[count0][k] == '#'))
{
count++;
count0++;
}
else
break;
}
if (count >= MODEL && Board[count0][k] == '*')
{
return '*';
}
if (count >= MODEL && Board[count0][k] == '#')
{
return '#';
}
}
}
//左斜着MODEL个棋子
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
int count0 = i;
int count = 1;
for (k = j; k>0; k--)
{
if (Board[count0][k] == Board[count0 + 1][k - 1] && (Board[count0][k] == '*' || Board[count0][k] == '#'))
{
count++;
count0++;
}
else
break;
}
if (count >= MODEL && Board[count0][k] == '*')
{
return '*';
}
if (count >= MODEL && Board[count0][k] == '#')
{
return '#';
}
}
}
//棋盘被下满
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (Board[i][j] == ' ')
return 'c';
}
}
if (i == row&&j == col)
{
return 'q';
}
return 'c';
}
测试代码test.c
#include"game.h"
void Mune()
{
printf("********************\n");
printf("***** 1.play *****\n");
printf("***** 0.exit *****\n");
printf("********************\n");
}
void game()
{
char board[ROW][COL] = { 0 };
initboard(board, ROW, COL);
printboard(board, ROW, COL);
char a = 0;
while (1)
{
playmove(board, ROW, COL);
printboard(board, ROW, COL);
a=end(board, ROW, COL);
if (a != 'c')
{
break;
}
computermove(board, ROW, COL);
printboard(board, ROW, COL);
a = end(board, ROW, COL);
if (a != 'c')
{
break;
}
}
if (a == '*')
{
printf("玩家赢\n");
}
if (a == '#')
{
printf("电脑赢\n");
}
if (a == 'q')
{
printf("平局\n");
}
}
void test()
{
int input = 0;
do
{
Mune();
printf("请选择>");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,请重新输入\n");
break;
}
} while (input);
}
int main()
{
srand((unsigned int)time(NULL));
test();
system("pause");
return 0;
}