思路与完成步骤
1、思路:
首先有个菜单要玩家选择是否开始游戏 随后要完成三子棋 我们首先得建立一个棋盘,然后让玩家落子,再让电脑落子,每次落子完之后,判断输赢,倘若有一方胜利结束游戏,倘若是平局也结束游戏,只有两方都没有胜利且没有平局的时候游戏继续!直到有结果为止
2、步骤:
1> 打印菜单(让用户进行选择)
#inclue <stdio.h>
//打印菜单
void Menu(void)
{
printf("********************\n");
printf("****** 1、play *****\n");
printf("****** 0、exit *****\n");
printf("********************\n");
}
//测试游戏
void Text(void)
{
int n = 0;//用来封装用户的选择
//运用一个do while循环 最少要执行一次
//当选择无效的时候可循环重新选择
//当选择为0的时候退出游戏,结束循环
do{
// 1> 打印菜单
Menu();
printf("请选择是否开始游戏-> ");
scanf("%d", &n);//让用户按照菜单输入
//判断用户选择是否开始游戏
switch (n)
{
case 1:
//开始游戏
Games();
break;
case 0:
printf("退出成功\n");
break;
default:
printf("选择无效,请重新选择\n");
break;
}
} while (n);
}
int main()
{
//游戏开始
Text();
return 0;
}
2>开始游戏(创建并初始化棋盘)
#define ROW 3
#define COL 3
//初始化棋盘
void init_arr(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
//将棋盘全部初始化为空格
arr[i][j] = ' ';
}
}
}
//进入游戏
void Games(void)
{
//创建棋盘
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
}
3>、打印棋盘
//打印棋盘
void print_arr(char arr[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 ", arr[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
int k = 0;
for (k = 0; k < col; k++)
{
printf("___");
if (k < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
//进入游戏
void Games(void)
{
//创建棋盘
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
//打印棋盘
print_arr(arr, ROW, COL);
}
4>、玩家下棋
//玩家开始下棋
void gams_player(char arr[ROW][COL], int row, int col)
{
//定义两个坐标,让玩家输入坐标进行落子
int x = 0;
int y = 0;
printf("玩家请落子:(输入位置坐标)->");
//当坐标合法并且该位置没有棋子的时候结束循环
while (1)
{
scanf("%d %d", &x, &y);
//判断玩家输入的坐标是否合法
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
//判断玩家的落子位置是否已经有棋子
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已有棋子,请重新落子:->");
}
}
else
{
printf("坐标非法,请重新落子:->");
}
}
}
//进入游戏
void Games(void)
{
//创建棋盘
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
//打印棋盘
print_arr(arr, ROW, COL);
//玩家开始下棋
gams_player(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
}
5>、电脑下棋
//电脑下棋
void gams_computer(char arr[ROW][COL], int row, int col)
{
printf("电脑落子:\n");
//直到落子成功跳出循环
while (1)
{
//创建两个随机坐标
int x = rand() % row;//生成一个大于等于0小于row的随机数
int y = rand() % col;//生成一个大于等于0小于col的随机数
//判断该位置是否有棋子
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
//进入游戏
void Games(void)
{
//创建棋盘
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
//打印棋盘
print_arr(arr, ROW, COL);
//玩家开始下棋
gams_player(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
//电脑开始下棋
gams_computer(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
}
6>、判断输赢
//判断是否是平局(棋盘是否满了)
int is_full(char arr[ROW][COL],int row,int col)
{
//当棋盘未满时返回0 满了返回1
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char Decision(char arr[ROW][COL], int row, int col)
{
//判断行
int i = 0;
for (i = 0; i < row; i++)
{
int a = 0;//记录一行玩家的棋子数
int b = 0;//记录一行电脑的棋子数
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == '*') a++;
if (arr[i][j] == '#') b++;
}
if (a == col) return '*';
if (b == col) return '#';
}
//判断列
for (i = 0; i < col; i++)
{
int a = 0;//记录一列中玩家的棋子数
int b = 0;//记录一列中电脑的棋子数
int j = 0;
for (j = 0; j < row; j++)
{
if (arr[j][i] == '*') a++;
if (arr[j][i] == '#') b++;
}
if (a == row) return '*';
if (b == row) return'#';
}
//右对角线
int a = 0;//表示玩家的棋子数
int b = 0;//表示电脑的棋子数
for (i = 0; i < row; i++)
{
if (arr[i][i] == '*') a++;
if (arr[i][i] == '#') b++;
}
if (a == row) return '*';
if (b == row) return '#';
//左对角线
int k = 0;
int s = row - 1;
if (arr[k][s] == arr[1][1] && arr[1][1] == arr[s][k] && arr[1][1] != ' ')
{
return arr[1][1];
}
//判断是否平局(棋盘是否满了)
if (is_full(arr, row, col) == 1)
{
return 'P';
}
return 'Q';
}
//进入游戏
void Games(void)
{
//创建棋盘
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
//打印棋盘
print_arr(arr, ROW, COL);
//玩家开始下棋
gams_player(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
//电脑开始下棋
gams_computer(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
//判断输赢
char ret = Decision(arr, ROW, COL);
//返回* 玩家胜利
//返回# 电脑胜利
//返回P 平局
//返回Q 继续
if (ret == '*') printf("玩家胜利\n");
if (ret == '#') printf("电脑胜利\n");
if (ret == 'P') printf("平局\n");
}
总代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ROW 3
#define COL 3
//打印菜单
void Menu(void)
{
printf("********************\n");
printf("****** 1、play *****\n");
printf("****** 0、exit *****\n");
printf("********************\n");
}
//初始化棋盘
void init_arr(char arr[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
//将棋盘全部初始化为空格
arr[i][j] = ' ';
}
}
}
//打印棋盘
void print_arr(char arr[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 ", arr[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
int k = 0;
for (k = 0; k < col; k++)
{
printf("___");
if (k < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
//玩家开始下棋
void gams_player(char arr[ROW][COL], int row, int col)
{
//定义两个坐标,让玩家输入坐标进行落子
int x = 0;
int y = 0;
printf("玩家请落子:(输入位置坐标)->");
//当坐标合法并且该位置没有棋子的时候结束循环
while (1)
{
scanf("%d %d", &x, &y);
//判断玩家输入的坐标是否合法
if ((x >= 1 && x <= row) && (y >= 1 && y <= col))
{
//判断玩家的落子位置是否已经有棋子
if (arr[x - 1][y - 1] == ' ')
{
arr[x - 1][y - 1] = '*';
break;
}
else
{
printf("该位置已有棋子,请重新落子:->");
}
}
else
{
printf("坐标非法,请重新落子:->");
}
}
}
//电脑下棋
void gams_computer(char arr[ROW][COL], int row, int col)
{
printf("电脑落子:\n");
//直到落子成功跳出循环
while (1)
{
//创建两个随机坐标
int x = rand() % row;//生成一个大于等于0小于row的随机数
int y = rand() % col;//生成一个大于等于0小于col的随机数
//判断该位置是否有棋子
if (arr[x][y] == ' ')
{
arr[x][y] = '#';
break;
}
}
}
//判断是否是平局(棋盘是否满了)
int is_full(char arr[ROW][COL],int row,int col)
{
//当棋盘未满时返回0 满了返回1
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == ' ')
return 0;
}
}
return 1;
}
//判断输赢
char Decision(char arr[ROW][COL], int row, int col)
{
//判断行
int i = 0;
for (i = 0; i < row; i++)
{
int a = 0;//记录一行玩家的棋子数
int b = 0;//记录一行电脑的棋子数
int j = 0;
for (j = 0; j < col; j++)
{
if (arr[i][j] == '*') a++;
if (arr[i][j] == '#') b++;
}
if (a == col) return '*';
if (b == col) return '#';
}
//判断列
for (i = 0; i < col; i++)
{
int a = 0;//记录一列中玩家的棋子数
int b = 0;//记录一列中电脑的棋子数
int j = 0;
for (j = 0; j < row; j++)
{
if (arr[j][i] == '*') a++;
if (arr[j][i] == '#') b++;
}
if (a == row) return '*';
if (b == row) return'#';
}
//右对角线
int a = 0;//表示玩家的棋子数
int b = 0;//表示电脑的棋子数
for (i = 0; i < row; i++)
{
if (arr[i][i] == '*') a++;
if (arr[i][i] == '#') b++;
}
if (a == row) return '*';
if (b == row) return '#';
//左对角线
int k = 0;
int s = row - 1;
if (arr[k][s] == arr[1][1] && arr[1][1] == arr[s][k] && arr[1][1] != ' ')
{
return arr[1][1];
}
//判断是否平局(棋盘是否满了)
if (is_full(arr, row, col) == 1)
{
return 'P';
}
return 'Q';
}
//进入游戏
void Games(void)
{
//创建棋盘
char arr[ROW][COL];
//初始化棋盘
init_arr(arr, ROW, COL);
//打印棋盘
print_arr(arr, ROW, COL);
char ret = 0;
//用循环让玩家电脑持续落子
//若有结果便停止循环
while (1)
{
//玩家开始下棋
gams_player(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
//下棋之后判断是否要继续下棋
ret = Decision(arr, ROW, COL);
if (ret != 'Q') break;
//电脑开始下棋
gams_computer(arr, ROW, COL);
print_arr(arr, ROW, COL);//落子之后打印一下棋盘
//下棋之后判断是否要继续下棋
ret = Decision(arr, ROW, COL);
if (ret != 'Q') break;
}
//判断输赢
//返回* 玩家胜利
//返回# 电脑胜利
//返回P 平局
//返回Q 继续
if (ret == '*') printf("玩家胜利\n");
if (ret == '#') printf("电脑胜利\n");
if (ret == 'P') printf("平局\n");
}
//测试游戏
void Text(void)
{
srand((unsigned int)time(NULL));
int n = 0;//用来封装用户的选择
//运用一个do while循环 最少要执行一次
//当选择无效的时候可循环重新选择
//当选择为0的时候退出游戏,结束循环
do{
//打印菜单
Menu();
printf("请选择是否开始游戏-> ");
scanf("%d", &n);//让用户按照菜单输入
//判断用户选择是否开始游戏
switch (n)
{
case 1:
// 2>开始游戏
Games();
break;
case 0:
printf("退出成功\n");
break;
default:
printf("选择无效,请重新选择\n");
break;
}
} while (n);
}
int main()
{
//游戏开始
Text();
return 0;
}