目录
2.4玩家下棋并打印棋盘PlayerMove(board,ROW,COL)
2.5电脑下棋并打印ComputerMove(board,ROW,COL)
1.菜单界面
我们要建立test.c文件,game.c文件,game.h文件。test文件用检测程序game.c用来封装游戏的函数,头文件用来申明。
我们在设计游戏的界面的逻辑肯定是要有1.选择界面有进行游戏选项,有退出游戏的选项 2.这个游戏我们可以循环的玩。
有了以上的想法我们变需要个菜单用来选择,也要进行循环那这里用do while循环的效果会好一点因为相比其他循环 do while可以先讲菜单答应出在进行下一步的循环判断。这里我给出游戏菜单的代码
void meun()
{
printf("******************************************\n");
printf("************ 1.play ************\n");
printf("************ 0.exit ************\n");
printf("******************************************\n");
}
int main()
{
int input = 0;
do
{
meun();
printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("三子棋开始\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误请重新输入\n");
break;
}
} while (input);
return 0;
}
这串代码当我们输入1进入switch语句的1中且开始我们的game()函数,当选择0时会退出游戏。那么此时这个game函数的构造就显的很重要了
2.game()函数
//1.定义数组
//2.打印初始化棋盘
//3.玩家下棋
//4.打印玩家下棋后的棋盘
//5.电脑下棋并答应棋盘
//6.输赢的判断
整个游戏由这6个模块组成
2.1定义数组
首先定义数组这里面玩家的棋子用"*"表示而电脑的棋子用“#”表示这是字符型故类型便是char。
故任意一个3x3的数组都可以。但是我们发现无论是玩家还是电脑下棋都是在这个3x3的数组里下棋的也就是说我们后面的代码有着大量的3如果我们哪天想让他变成5x5的棋盘那么就需要吧所有的3都修改成5这样真的很不好所有呢我用ROW代表行COL代表列
void game()
{
//1.定义数组
char board[ROW][COL];
//2.打印初始化棋盘
//3.玩家下棋
//4.打印玩家下棋后的棋盘
//5.电脑下棋并答应棋盘
//6.输赢的判断
}
然后我们进入game.h文件用define定义的字符常量给COL和ROW给上三这个值。如下
我们在头文件定义好想在test文件中使用我们得想game.h文件申请所有在test.c文件中要申请头文件#include"game.h"
2.2初始化棋盘
初始化棋盘就是将数组里面的东西变成空白然后才能让让下棋,所有要让数组里的元素都为空格,然后呢我们还要将初始化的棋盘给打印出来,那打印这个棋盘肯定是需要我们构造的
这里面我们构造的棋盘是这个样子的.我们创建DisplayBoard()这个函数来打印这个棋盘数组只不过此时棋盘里的数组都是空白的。也就是空格
2.3打印初始化棋盘,并构造棋盘图案
oid DisplayBoard(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++)
{
if (j < col - 1)
printf(" %c |", board[i][j]);
else
printf(" %c ",board[i][j]);
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < row; j++)
{
if (j < col - 1)
printf("---|");
else
printf("---");
}
}
printf("\n");
}
}
这里我们便将棋盘数组给打印出来了。
那么下棋的时候肯定是玩家下棋,然后电脑下棋,那显然这是一个循环
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void game()
{
//1.定义数组
char board[ROW][COL];
//2.打印初始化棋盘
//2-1初始化棋盘
InitBoard(board,ROW,COL);
//2-2打印初始棋盘
DisplayBoard(board,ROW,COL);
while (1)
{ //3.玩家下棋 打印玩家下棋后的棋盘
PlayerMove(board, ROW, COL);
//4.电脑下棋并答应棋盘
//5.输赢的判断
}
}
void meun()
{
printf("******************************************\n");
printf("************ 1.play ************\n");
printf("************ 0.exit ************\n");
printf("******************************************\n");
}
int main()
{
int input = 0;
do
{
meun();
printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("三子棋开始\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误请重新输入\n");
break;
}
} while (input);
return 0;
}
所有很容易想到用循环
while(1) { 玩家下棋并答应棋盘。 判断输赢。 电脑下棋并打印棋盘 判断输赢 }
2.4玩家下棋并打印棋盘PlayerMove(board,ROW,COL)
void PlayerMove(char board[ROW][COL],int row,int col)
{
int x=0;
int y=0;
printf("玩家下棋 请输入坐标\n");
while(1)
{
scanf("%d %d",&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("坐标占用请重新输入");
}
else
printf("坐标有误请重新输入\n");
}
DispiayBoard(board,ROW,COL);
}
2.5电脑下棋并打印ComputerMove(board,ROW,COL)
void ComputerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
printf("电脑开始\n");
int x = rand() % row;
int y = rand()% col ;
if (board[x ][y] ==' ')
{
board[x][y] = '#';
break;
}
}
DisplayBoard(board,ROW,COL);
}
当我们用了rand()函数的时候一定要用srand这里随机产生的值应该时时间搓在main函数中写上srand((unsigned int)time(UNLL));才能保证随机值不断的产生变化。
2.6输赢的判断
输赢的判断应该是每下完一步就要判断一次输赢,如果没有输赢就继续下,这样应该是个循环
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0]) != ' ')
return board[i][0];
}
for (i = 0; i < col; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[0][i] != ' '))
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
if (IsFull(board, row, col))
return 'Q';
return 'C';
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
void game()
{
char ret = 0;
srand((unsigned int)time(NULL));
//1.定义数组
char board[ROW][COL];
//2.打印初始化棋盘
//2-1初始化棋盘
InitBoard(board,ROW,COL);
//2-2打印初始棋盘
DisplayBoard(board,ROW,COL);
while (1)
{ //3.玩家下棋 打印玩家下棋后的棋盘
PlayerMove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
//4.电脑下棋并答应棋盘
ComputerMove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '#')
printf("电脑赢\n");
if (ret == '*')
printf("玩家赢\n");
else
printf("平局\n");
}
3.完整代码
3.1 test.c
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include"game.h"
void game()
{
char ret = 0;
srand((unsigned int)time(NULL));
//1.定义数组
char board[ROW][COL];
//2.打印初始化棋盘
//2-1初始化棋盘
InitBoard(board,ROW,COL);
//2-2打印初始棋盘
DisplayBoard(board,ROW,COL);
while (1)
{ //3.玩家下棋 打印玩家下棋后的棋盘
PlayerMove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
//4.电脑下棋并答应棋盘
ComputerMove(board, ROW, COL);
ret = IsWin(board, ROW, COL);
if (ret != 'C')
break;
}
if (ret == '#')
printf("电脑赢\n");
if (ret == '*')
printf("玩家赢\n");
else
printf("平局\n");
}
void meun()
{
printf("******************************************\n");
printf("************ 1.play ************\n");
printf("************ 0.exit ************\n");
printf("******************************************\n");
}
int main()
{
int input = 0;
do
{
meun();
printf("请选择:>\n");
scanf("%d",&input);
switch (input)
{
case 1:
printf("三子棋开始\n");
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入有误请重新输入\n");
break;
}
} while (input);
return 0;
}
3.2game.c
#include"game.h"
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void InitBoard(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++)
{
board[i][j] = ' ';
}
}
}
void DisplayBoard(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++)
{
if (j < col - 1)
printf(" %c |", board[i][j]);
else
printf(" %c ",board[i][j]);
}
printf("\n");
if (i < row - 1)
{
for (j = 0; j < row; j++)
{
if (j < col - 1)
printf("---|");
else
printf("---");
}
}
printf("\n");
}
}
void PlayerMove(char board[ROW][COL], int row, int col)
{
printf("玩家开始\n");
int x = 0;
int y = 0;
while (1)
{
printf("请输入坐标");
scanf("%d %d", &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");
}
DisplayBoard(board, ROW, COL);
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
while (1)
{
printf("电脑开始\n");
int x = rand() % row;
int y = rand()% col ;
if (board[x ][y] ==' ')
{
board[x][y] = '#';
break;
}
}
DisplayBoard(board,ROW,COL);
}
char IsWin(char board[ROW][COL], int row, int col)
{
int i = 0;
for (i = 0; i < row; i++)
{
if ((board[i][0] == board[i][1]) && (board[i][1] == board[i][2]) && (board[i][0]) != ' ')
return board[i][0];
}
for (i = 0; i < col; i++)
{
if ((board[0][i] == board[1][i]) && (board[1][i] == board[2][i]) && (board[0][i] != ' '))
return board[0][i];
}
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
return board[1][1];
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
return board[1][1];
if (IsFull(board, row, col))
return 'Q';
return 'C';
}
int IsFull(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
3.3game.h
#pragma once
#define ROW 3
#define COL 3
void InitBoard(char board[ROW][COL], int row,int col);
void DisplayBoard( char board[ROW][COL],int row,int col);
void PlayerMove(char board[ROW][COL],int row,int col);
void ComputerMove(char board[ROW][COL],int row,int col);
char IsWin(char board[ROW][COL],int row, int col);