设计思路:
1* 菜单——输入选择:1.PLAY(开始游戏
0.EXIT(退出游戏
其他,重新进入菜单选择
2* PLAY(开始游戏)(大致结构):
1.创建并打印棋盘-2.玩家下棋-3.电脑下棋-4.判断局势-5.得出结果-6.返回1*菜单
3*创建并打印棋盘:
棋盘为3*3结构,创建一个二维数组存放棋子即可
1.创建二位数组char ch[3][3]
2.数组ch初始化为空格
void init(char ch[R][C], int r, int c)
{
//数组初始化,赋予空格
int i = 0; int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
ch[i][j] = ' ';
}
}
}
3.棋盘框架的构建
void Printf(char ch[R][C],int r, int c)//r和c分别是棋盘的行和列数
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)//打印表格以“空格字符空格竖杠”为一组( %c |)
{ //在打印最后一组的时候不用输出竖杠
printf(" %c ", ch[i][j]);
if (j < r - 1)//竖杠的打印,只输出两组
{
printf("|");
}
}
printf("\n");在第一行打印完后记得换行
if (i < r-1)//以三个短横杠和一个竖杠为一组,组成划分横行的界线(三子棋只需要两组划分
{
for (j = 0; j < c; j++)
{
printf("---");
if (j < c - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
//棋盘效果图,上部分为菜单//
4*玩家下棋
void human(char ch[R][C], int r, int c)
{
printf("玩家回合\n");
while (1)//因为有输入错误超出棋盘范围及输出到有棋子的格子的情况
{ //所以选择循环结果,当成功数组成功被赋值(即下棋到一个空位的情况
int a = 0;//可以直接选择break跳出循环就可以了
int b = 0;
printf("请输入要填放的坐标\n");
scanf("%d %d", &a, &b);
if (a >= 1 && a <= r && b >= 1 && b <= c)//判断坐标是否在棋盘内
//注意数组的下标从0开始
{ //对应的存放的数组坐标为棋盘的行列坐标-1
if (ch[a - 1][b - 1] == ' ')//判断是否有空位
{
ch[a - 1][b - 1] = '*';//没有则赋值*
break;//赋值成功跳出循环
}
else
{
printf("已有棋子,请重新输入\n");
}
}
else
{
printf("超出范围,请重新输入\n");
}
}
}
5*电脑下棋
void pc(char ch[R][C], int r, int c)
{
printf("电脑回合\n");
while (1)
{ //rand取余多少就是在取余数的范围内随机输出 例如%3,随机值就在3内
int x = rand() % r;
int y = rand() % c;
if (ch[x][y] == ' ')
{
ch[x][y] = '#';
break;
}
}
}
6*判断局势
char win(char ch[R][C], int r, int c)
{
int i = 0;
for (i = 0; i < R; i++)//判断行
{
if (ch[i][0] == ch[i][1] && ch[i][0] == ch[i][2] && ch[i][0] != ' ')
{
return ch[i][0];
}
}
for (i = 0; i < R; i++)//判断列
{
if (ch[0][i] == ch[1][i] && ch[0][i] == ch[2][i] && ch[0][i] != ' ')
{
return ch[0][i];
}
}
//判断对角线
if (ch[0][0] == ch[1][1]&& ch[0][0] == ch[2][2] && ch[0][0] != ' ')
{
return ch[1][1];
}
if (ch[0][2] == ch[1][1]&&ch[0][2] == ch[2][0] && ch[0][2] != ' ')
{
return ch[1][1];
}
//判断是否满棋盘
if (full(ch, r, c) == 1)//判断是否棋盘满的函数在下列
{
return 'q';//q返回代表满棋盘,平局
}
return 'c';//均不符合以上条件,没人胜利,棋盘没满继续游戏
}
判断棋盘是否满的函数
static int full(char ch[R][C], int r, int c)
{
int i = 0;
int j = 0;
for (i = 0; i < R; i++)
{
for (j = 0; j < C; j++)
{
if (ch[i][j] == ' ')
{
return 0;//任意一个坐标有空位则继续游戏
}
}
}
return 1;//返回1代表棋盘满了
}
7*得出结果
void game()
{
char ch[R][C];
char ret;
init(ch, R, C);//数组初始化
Printf(ch, R, C);//打印棋盘
while (1)
{
human(ch, R, C);//玩家回合
Printf(ch, R, C);//打印玩家下棋后的棋盘
ret = win(ch, R, C);//判断是否获胜
if (ret != 'c')
{
break;//如果在win函数中返回值不为c(c的含义是没人胜利,棋盘没满
} //则跳出循环,经行下方的结果判断
pc(ch, R, C);//电脑回合
Printf(ch, R, C);//打印电脑下棋后的棋盘
ret = win(ch, R, C);//判断是否获胜
if (ret != 'c')
{
break;
}
}
//结果判断
if (ret == '#')
{
printf("电脑获胜\n");
}
else if (ret == '*')
{
printf("玩家获胜\n");
}
else if (ret == 'q')
{
printf("平局\n");
}
}
完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include
#include
#include
#define R 3
#define C 3
void init(char ch[R][C], int r, int c);
void Printf(char ch[R][C], int r, int c);
void human(char ch[R][C], int r, int c);
void pc(char ch[R][C], int r, int c);
char win(char ch[R][C], int r, int c);
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void game()
{
char ch[R][C];
char ret;
init(ch, R, C);//数组初始化
Printf(ch, R, C);//打印棋盘
while (1)
{
human(ch, R, C);
Printf(ch, R, C);
ret = win(ch, R, C);
if (ret != 'c')
{
break;
}
pc(ch, R, C);
Printf(ch, R, C);
ret = win(ch, R, C);
if (ret != 'c')
{
break;
}
}
if (ret == '#')
{
printf("电脑获胜\n");
}
else if (ret == '*')
{
printf("玩家获胜\n");
}
else if (ret == 'q')
{
printf("平局\n");
}
}
int main()
{
srand((unsigned int)time(NULL));
int a = 0;
do
{
menu();
printf("请选择项\n");
scanf("%d", &a);
switch (a)
{
case 1: printf("开始游戏\n"); game(); break;
case 0: printf("退出游戏\n"); break;
default: printf("选择无效,请重新选择\n"); break;
}
} while (a);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include "game.h"
void menu()
{
printf("***************************\n");
printf("******* 1.PLAY *********\n");
printf("******* 0.EXIT *********\n");
printf("***************************\n");
}
void init(char ch[R][C], int r, int c)
{
//数组初始化,赋予空格
int i = 0; int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
ch[i][j] = ' ';
}
}
}
void Printf(char ch[R][C],int r, int c)
{
int i = 0;
int j = 0;
for (i = 0; i < r; i++)
{
for (j = 0; j < c; j++)
{
printf(" %c ", ch[i][j]);
if (j < r - 1)
{
printf("|");
}
}
printf("\n");
if (i < r-1)
{
for (j = 0; j < c; j++)
{
printf("---");
if (j < c - 1)
{
printf("|");
}
}
}
printf("\n");
}
}
void human(char ch[R][C], int r, int c)
{
printf("玩家回合\n");
while (1)
{
int a = 0;
int b = 0;
printf("请输入要填放的坐标\n");
scanf("%d %d", &a, &b);
if (a >= 1 && a <= r && b >= 1 && b <= c)
{
if (ch[a - 1][b - 1] == ' ')
{
ch[a - 1][b - 1] = '*';
break;
}
else
{
printf("请勿重新输入,请重新输入\n");
}
}
else
{
printf("超出范围,请重新输入\n");
}
}
}
void pc(char ch[R][C], int r, int c)
{
printf("电脑回合\n");
while (1)
{
int x = rand() % r;//rand取余多少就是在取余数的范围内随机输出例如%3,随机值就不超过3
int y = rand() % c;
if (ch[x][y] == ' ')
{
ch[x][y] = '#';
break;
}
}
}
static int full(char ch[R][C], int r, int c)
{
int i = 0;
int j = 0;
for (i = 0; i < R; i++)
{
for (j = 0; j < C; j++)
{
if (ch[i][j] == ' ')
{
return 0;
}
}
}
return 1;
}
char win(char ch[R][C], int r, int c)
{
int i = 0;
for (i = 0; i < R; i++)//判断行
{
if (ch[i][0] == ch[i][1] && ch[i][0] == ch[i][2] && ch[i][0] != ' ')
{
return ch[i][0];
}
}
for (i = 0; i < R; i++)//判断列
{
if (ch[0][i] == ch[1][i] && ch[0][i] == ch[2][i] && ch[0][i] != ' ')
{
return ch[0][i];
}
}
//判断对角线
if (ch[0][0] == ch[1][1]&& ch[0][0] == ch[2][2] && ch[0][0] != ' ')
{
return ch[1][1];
}
if (ch[0][2] == ch[1][1]&&ch[0][2] == ch[2][0] && ch[0][2] != ' ')
{
return ch[1][1];
}
//判断是否满棋盘
if (full(ch, r, c) == 1)
{
return 'q';//q返回代表满棋盘,平局
}
return 'c';//均不符合以上条件,没人胜利,棋盘没满继续游戏
}