使用工具:VS 2012
要如何实现三子棋?
1.用什么来实现三子棋的棋盘??
2.如何将三子棋的棋盘打印出来??
3.如何实现玩家和电脑的每一步棋??
4.如何检测哪一方的输赢??
5.打印菜单
1.用一个二维数组来实现三子棋的棋盘
char arr[ROW][COL] = { 0 };
void checkerboard(char arr[ROW][COL], int row, int col)//游戏棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("--------------------------\n");
printf("丨 | | 丨\n");
printf("丨 %c | %c | %c 丨\n",arr[i][0],arr[i][1],arr[i][2]);
printf("丨 | | 丨\n");
if (2 == i)
printf("--------------------------\n");
}
}
3.实现玩家出棋:(A)
(1.)在出棋时我们必须考虑两种情况:
a.棋子是否出界
b.棋子是否重复已经有的位置
(2.)玩家出棋的思维和程序员不一样必须考虑到是从下标1开始而不是0
实现电脑出棋:(B)
(1.)电脑出棋必须是随机的(这里我们用rand函数来实现)
srand((unsigned int)time(NULL));
(2.)在出棋时我们必须考虑两种情况:
a.棋子是否出界
b.棋子是否重复已经有的位值
void playermove(char arr[ROW][COL], int row, int col)//玩家走
{
int x = -1;
int y = -1;
while (1)
{
printf("玩家走\n请输入坐标:>");
scanf("%d%d", &x, &y);
if ((x - 1) < row && (x - 1) >= 0 && (y - 1) < row && (y - 1) >= 0)
{
if (arr[x-1][y-1] == ' ')
{
arr[x - 1][y - 1] = 'X';//玩家的棋子用X代替
break;
}
else
{
printf("此坐标已有棋子,请重新选择坐标!\n");
}
}
else
{
printf("输入坐标错误!\n");
}
}
}
void comermove(char arr[ROW][COL], int row, int col)//电脑走
{
int x = -1;
int y = -1;
printf("电脑走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col; //取余数是为了保证x,y在棋盘的范围内 即 0 1 2
if (x< row && x >= 0 && y < row && y >= 0)
{
if (arr[x][y] == ' ')
{
arr[x][y] = '*'; //电脑的棋子用*代替
break;
}
}
}
}
4.判断输赢
(1)判断玩家是否赢
(2)判断电脑是否赢
(3)平局
//判断输赢
int win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int execute = 1;
for (i = 0; i < row; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(row-2)&& i<(col - 2)
|| arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(col-2)
|| arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(row-2)
|| arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(row-2)&&(j>=2)) // 判断玩家是否赢
{
printf("恭喜你赢了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == '*'&&arr[i + 1][j + 1] == '*'&&arr[i + 2][j + 2] == '*'&& i<(row - 2) && i<(col - 2)
|| arr[i][j] == '*'&&arr[i][j + 1] == '*'&&arr[i][j + 2] == '*'&&j<(col - 2)
|| arr[i][j] == '*'&&arr[i + 1][j] == '*'&&arr[i + 2][j] == '*'&&i<(row - 2)
|| arr[i][j] == '*'&&arr[i + 1][j - 1] == '*'&&arr[i + 2][j - 2] == '*' && i<(row - 2) && (j >= 2))// 判断电脑是否赢
{
printf("电脑赢了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
execute = 0;
}
}
}
if(1 == execute)
{
printf("平局!\n");
return 1;
}
return 0;
}
5.菜单
void menu(void)
{
printf("---------------------------\n");
printf("丨 三 子 棋 游 戏 丨\n");
printf("\n");
printf("丨 1. 开始游戏 丨\n");
printf("\n");
printf("丨 0. 退出游戏 丨\n");
printf("---------------------------\n");
}
完整代码分为三部分 game.h(函数声明) game.c(实现函数功能) test.c(main函数)
game.h
#ifndef __GAME_H__
#define __GAME_H__
#include
#include
#include
#define ROW 3
#define COL 3
void menu(void); //开始菜单
void init(char arr[ROW][COL], int row, int col); //初始化
void checkerboard(char arr[ROW][COL], int row, int col); //游戏棋盘
void playermove(char arr[ROW][COL], int row, int col); //玩家走
void comermove(char arr[ROW][COL], int row, int col); //电脑走
int win(char arr[ROW][COL], int row, int col); //判断胜利
#endif
game.c
#include "game.h"
void menu(void)
{
printf("---------------------------\n");
printf("丨 三 子 棋 游 戏 丨\n");
printf("\n");
printf("丨 1. 开始游戏 丨\n");
printf("\n");
printf("丨 0. 退出游戏 丨\n");
printf("---------------------------\n");
}
void init(char arr[ROW][COL], int row, int col)//初始化数组
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
arr[i][j] = ' ';//将数组的所有元素初始化为一个空格
}
}
}
void checkerboard(char arr[ROW][COL], int row, int col)//游戏棋盘
{
int i = 0;
for (i = 0; i < row; i++)
{
printf("--------------------------\n");
printf("丨 | | 丨\n");
printf("丨 %c | %c | %c 丨\n",arr[i][0],arr[i][1],arr[i][2]);
printf("丨 | | 丨\n");
if (2 == i)
printf("--------------------------\n");
}
}
void playermove(char arr[ROW][COL], int row, int col)//玩家走
{
int x = -1;
int y = -1;
while (1)
{
printf("玩家走\n请输入坐标:>");
scanf("%d%d", &x, &y);
if ((x - 1) < row && (x - 1) >= 0 && (y - 1) < row && (y - 1) >= 0)
{
if (arr[x-1][y-1] == ' ')
{
arr[x - 1][y - 1] = 'X';
break;
}
else
{
printf("此坐标已有棋子,请重新选择坐标!\n");
}
}
else
{
printf("输入坐标错误!\n");
}
}
}
void comermove(char arr[ROW][COL], int row, int col)//电脑走
{
int x = -1;
int y = -1;
printf("电脑走:>\n");
while (1)
{
x = rand() % row;
y = rand() % col; //取余数是为了保证x,y在棋盘的范围内 即 0 1 2
if (x< row && x >= 0 && y < row && y >= 0)
{
if (arr[x][y] == ' ')
{
arr[x][y] = '*'; //电脑的棋子用*代替
break;
}
}
}
}
//判断输赢
int win(char arr[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
int execute = 1;
for (i = 0; i < row; i++)
{
for (j = 0; j < row; j++)
{
if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(row-2)&& i<(col - 2)
|| arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(col-2)
|| arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(row-2)
|| arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(row-2)&&(j>=2)) // 判断玩家是否赢
{
printf("恭喜你赢了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == '*'&&arr[i + 1][j + 1] == '*'&&arr[i + 2][j + 2] == '*'&& i<(row - 2) && i<(col - 2)
|| arr[i][j] == '*'&&arr[i][j + 1] == '*'&&arr[i][j + 2] == '*'&&j<(col - 2)
|| arr[i][j] == '*'&&arr[i + 1][j] == '*'&&arr[i + 2][j] == '*'&&i<(row - 2)
|| arr[i][j] == '*'&&arr[i + 1][j - 1] == '*'&&arr[i + 2][j - 2] == '*' && i<(row - 2) && (j >= 2))// 判断电脑是否赢
{
printf("电脑赢了!\n");
return 1;
}
}
}
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
{
execute = 0;
}
}
}
if(1 == execute)
{
printf("平局!\n");
return 1;
}
return 0;
}
test.c
#include "game.h"
int main()
{
int i = 0;
int start = 0;
char arr[ROW][COL] = { 0 };
srand((unsigned int)time(NULL));
while(1)
{
if (i == 0)
{
menu();
init(arr, ROW, COL);
printf("请选择是否开始游戏(1/0):>");
}
i = 1; //i用来控制 if (i == 0)中的语句是否进行
scanf("%d", &start);
switch (start)
{
//case 1: 表示游戏开始
//case 0: 表示退出游戏
// default: 表示输入错误
case 1:
checkerboard(arr, ROW, COL);
while (1)
{
playermove(arr, ROW, COL);
checkerboard(arr, ROW, COL);
if(win(arr, ROW, COL)==1)
{
i = 0;
break;
}
comermove(arr, ROW, COL);
checkerboard(arr, ROW, COL);
if (win(arr, ROW, COL) == 1)
{
i = 0;
break;
}
}
break;
case 0:
printf("游戏退出!\n");
return 0;
break;
default:
printf("输入错误!请重新输入:");
break;
}
}
return 0;
}