返回

三子棋的实现(12)

发布时间:2023-12-15 02:54:57 276

题目要求:

三子棋如何实现玩家与电脑比赛的设计。

 * | # | #        //1 打印一行的数据:【   |   |   】
---|---|--- //1 打印分隔符:【---|---|---】
| * | # //2
---|---|--- //2
| | //3

分析:

1.首先如何实现玩家下棋和电脑下棋,其次判断输赢;

2.关于玩家下棋,如何实现函数PlayMove(board,ROW,COL)编写;

//玩家下棋函数
void PlayMove(char board[ROW][COL],int row,int col){
int x=0, y=0;
printf("玩家走:>\n");
while(1){
printf("输入要下的坐标:>\n");
scanf("%d %d",&x,&y);
//判断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("该坐标已占用,请重新输入!\n");
}
}
else{
printf("坐标非法,请重新输入!\n");
}
}
}

3.关于电脑下棋,如何实现函数ComputerMove()编写;

//电脑下棋
void ComputerMove(char board[ROW][COL],int row,int col){
int x=0, y=0;
printf("电脑走:>\n");
while(1){
x=rand()%row;
y=rand()%col;
if(board[x][y]==' '){
board[x][y]='#';
break;
}
}
}

4.输赢判断函数 IsWin()编写;

//输赢判断
char IsWin(char board[ROW][COL],int row,int col){
/* 4种游戏状态
玩家赢--'*'
电脑赢--'#'
平局----'Q'
继续----'C'
*/
int i=0;
//判断行
for(i=0;i<row;i++){
if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1]!=' ' ){
return board[i][1];
}
}
//判断列
for(i=0;i<row;i++){
if(board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i]!=' ' ){
return board[1][i];
}
}
//判断主副对角
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ' ){
return board[1][1];
}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1]!=' ' ){
return board[1][1];
}
//判断是否平局
if(1==IsFull(board,ROW,COL)){
return 'Q';
}
return 'C';
}

5.棋盘是否已满函数IsFull()编写;

//判断棋盘是否满子---作用与判断是否是平局
/*
0:棋盘没满
1:棋盘满了
*/
int IsFull(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++){
if(board[i][j]==' '){
return 0;//表示棋盘没满
}
}
}
return 1;//表示棋盘满了
}


代码实现:

#define _CRT_SECURE_NO_WARNINGS_1
#include
#include
#include
#define ROW 3
#define COL 3

//*****玩家下棋函数*****
void PlayMove(char board[ROW][COL],int row,int col){
int x=0, y=0;
printf("玩家走:>\n");
while(1){
printf("输入要下的坐标:>\n");
scanf("%d %d",&x,&y);
//判断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("该坐标已占用,请重新输入!\n");
}
}
else{
printf("坐标非法,请重新输入!\n");
}
}
}

//*****电脑下棋函数*****
void ComputerMove(char board[ROW][COL],int row,int col){
int x=0, y=0;
printf("电脑走:>\n");
while(1){
x=rand()%row;
y=rand()%col;
if(board[x][y]==' '){
board[x][y]='#';
break;
}
}
}

//*****判断棋盘是否满子*****
/*
0:棋盘没满
1:棋盘满了
*/
int IsFull(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++){
if(board[i][j]==' '){
return 0;//表示棋盘没满
}
}
}
return 1;//表示棋盘满了
}

//*****判断输赢 *****
char IsWin(char board[ROW][COL],int row,int col){
/* 4种游戏状态
玩家赢--'*'
电脑赢--'#'
平局----'Q'
继续----'C'
*/
int i=0;
//判断行
for(i=0;i<row;i++){
if(board[i][0]==board[i][1] && board[i][1]==board[i][2] && board[i][1]!=' ' ){
return board[i][1];
}
}
//判断列
for(i=0;i<row;i++){
if(board[0][i]==board[1][i] && board[1][i]==board[2][i] && board[1][i]!=' ' ){
return board[1][i];
}
}
//判断主副对角
if(board[0][0]==board[1][1] && board[1][1]==board[2][2] && board[1][1]!=' ' ){
return board[1][1];
}
if(board[2][0]==board[1][1] && board[1][1]==board[0][2] && board[1][1]!=' ' ){
return board[1][1];
}
//判断是否平局
if(1==IsFull(board,ROW,COL)){
return 'Q';
}
return 'C';
}

//*****打印棋盘3 (优化3)*****
void DisplayBoard(char board[ROW][COL],int row,int col){
int i;
for(i=0;i<row;i++){
//step1:打印一行的数据【 | | 】
int j;
for(j=0;j<col;j++){
printf(" %c ", board[i][j]);
if(j<col-1)
printf("|");
}
printf("\n");//打印完一行的数据进行换行

//step2:打印分割线【---|---|---】
if(i<row-1){
for(j=0;j<col;j++){
printf("---");
if(j<col-1)
printf("|");
}
printf("\n");//打印完一行的数据进行换行
}
}
}

//*****初始化棋盘*****
void InitBoard(char board[ROW][COL],int row,int col){
int i,j;
for(i=0;i<row;i++){
for(j=0;j<col;j++){
board[i][j]=' ';
}
}
}

//*************游戏的整个棋盘实现****************
void game(){

char ret = 0;//判断输赢标志量
//数组--存放棋盘走出的棋盘信息
char board[ROW][COL]={0};
//初始化棋盘
InitBoard(board,ROW,COL);
//打印棋盘
DisplayBoard(board,ROW,COL);

//*****人机对峙下棋*****
while(1){
//玩家下棋
PlayMove(board,ROW,COL);//玩家落子
DisplayBoard(board,ROW,COL);//打印棋盘结果
//玩家走完这一步,判断一次输赢
ret=IsWin(board,ROW,COL);
if(ret != 'C'){
break;
}

//电脑下棋
ComputerMove(board,ROW,COL);//电脑落子
DisplayBoard(board,ROW,COL);//打印棋盘结果
//电脑走完这一步,判断一次输赢
ret=IsWin(board,ROW,COL);
if(ret!='C'){
break;
}
}

//输赢判断
if(ret=='*'){
printf("玩家赢,嘻嘻!\n");
}
else if(ret=='#'){
printf("哎,电脑赢\n");
}
else{
printf("平局哎\n");
}
}

//*****菜单*****
void meun(){
printf("***************************\n");
printf("******1.Play 0.exit*******\n");
printf("***************************\n");
}

//*****测试*****
void test(){
int input=0;
srand((unsigned int)time(NULL));
do{
meun();
printf("请选择:>");
scanf("%d",&input);
switch(input){
case 1:
printf("三子棋!\n");
game();
break;
case 0:
printf("退出游戏!\n");
break;
default:
printf("选择错误,重新选择!\n");
break;
}

}while(input);
}

//********主函数********
int main(){
test();
return 0;
}

运行结果:

***************************
******1.Play 0.exit*******
***************************
请选择:>1
三子棋!
| |
---|---|---
| |
---|---|---
| |
玩家走:>
输入要下的坐标:>
2 2
| |
---|---|---
| * |
---|---|---
| |
电脑走:>
# | |
---|---|---
| * |
---|---|---
| |
玩家走:>
输入要下的坐标:>
1 1
该坐标已占用,请重新输入!
输入要下的坐标:>
3 3
# | |
---|---|---
| * |
---|---|---
| | *
电脑走:>
# | | #
---|---|---
| * |
---|---|---
| | *
玩家走:>
输入要下的坐标:>
3 2
# | | #
---|---|---
| * |
---|---|---
| * | *
电脑走:>
# | | #
---|---|---
| * |
---|---|---
# | * | *
玩家走:>
输入要下的坐标:>
2 1
# | | #
---|---|---
* | * |
---|---|---
# | * | *
电脑走:>
# | | #
---|---|---
* | * | #
---|---|---
# | * | *
玩家走:>
输入要下的坐标:>
1 2
# | * | #
---|---|---
* | * | #
---|---|---
# | * | *
玩家赢,嘻嘻!
***************************
******1.Play 0.exit*******
***************************
请选择:>

--------------END--------------
















特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线
下一篇
两种类型限定词const和volatile(16) 2023-12-15 00:10:49