三子棋
玩家构思:
大家常玩五子棋,所以三子棋的更好理解,就是选择游戏,然后玩家走,电脑走,判断输赢,如果莫有赢或平局,则继续循环。直到最后分出输赢平
代码构思:
棋盘初始化为空格,然后打印棋盘,玩家走放x,电脑放0,判断输赢,如果三个连在一起则赢了,或者棋盘满了无三个连在一起,则平局。全部代码分为三个文件,分别为test.h , test.c, game.c ,具体实现如下:
game.c----文件
# include "test.h"
1,先进行棋盘的初始化,然后利用memset函数给数组赋初值全为空格,但是棋盘并不会显示出来
void init (char arr[ROW][COL],int row,int col) //自定义二维数组初始化函数
{
memset (&arr[0][0],' ',row*col*sizeof (arr[0][0])); //从二维数组的首地址开始进行赋值,把' '赋给arr[ROW][COL]
}
2,利用for循换输出,并且使用if语句和for语句打印棋盘
void display (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++)
{
printf(" %c ",arr[i][j]); // 输出二维数组的值
if (j<row-1)
{
printf("|");
}
}
printf("\n");
if (i<row-1)
{
for (j=0; j<col; j++)
{
printf("---");
if (j<row-1)
{
printf("|");
}
}
printf("\n"); //以上为以行和列控制出#型棋盘
}
}
printf ("-----------------------\n"); //使用———隔开下一行
}
棋盘打印的形状
3,玩家输入
void player(char arr[ROW][COL],int row,int col) //自定义玩家坐标输入函数
{
int x=0;
int y=0; // 定义2个整形的坐标变量
while (1)
{ printf ("请输入坐标: "); //提示玩家输入
scanf ("%d %d",&x,&y); //输入格式
if (x>0 && x<=row && y>0 && y<=col) //判断输入坐标的正确 (x,y大于0,是考虑玩家心理)
{
if (arr[x-1][y-1]==' ') //(x,y等于0,更符合开发人员心理)
{
arr[x-1][y-1]='x'; //数组为空格时,将'x'赋给玩家输入的坐标
break;
}
else
printf ("坐标已被占用,请重新输入\n"); //输入坐标被占,提示玩家重新输入
}
else
printf ("输入错误,请重新输入!\n"); //玩家输入不不符合时提示重新输入
}
}
4,电脑输入
void computer(char arr[ROW][COL],int row,int col) //自定义电脑坐标输入函数
{
int x=0;
int y=0;
while (1)
{ x=rand()%row;
y=rand()%col; //电脑随机输入
if (arr[x][y]==' ') //判断坐标是否被占
{
arr[x][y]='0'; //把'0'赋值给电脑随机坐标
break;
}
}
}
5,判断输赢
int FALL(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++)
{
if(arr[i][j]==' ') //判断数组是否有空
{
return 0;
}
}
}
return 1;
}
char win(char arr[ROW][COL],int row,int col) //自定义判断输赢函数
{ int i=0;
int j=0;
for (i=0;i<row;i++)
{
if (arr[i][0]==arr[i][1] && arr[i][1]==arr[i][2]&& arr[i][2]!=' ')
return arr[i][0];
}
for (j=0;j<col;j++)
{
if (arr[0][j]==arr[1][j] && arr[1][j]==arr[2][j]&& arr[2][j]!=' ')
return arr[0][j];
}
if (arr[0][0]==arr[1][1] && arr[1][1]==arr[2][2]&& arr[2][2]!=' ')
return arr[2][2];
if (arr[0][2]==arr[1][1] && arr[1][1]==arr[2][0]&& arr[2][0]!=' ') //以上全为判断数组是否有三个连在一起,如横竖直线,2条对角线,然后返回数组里边的值
return arr[2][0];
if (FALL (arr,row,col)==1) //FALL函数返回1,则数组已满
{
return 'A'; //返回’A时,说明数组满了还没莫有三个连在一起
}
}
test.h----头文件
#ifndef _GAME_H_
#define _GAME_H_
#define _CRT_SECURE_NO_WARNINGS 1
# include <stdio.h>
# include <stdlib.h>
# include <time.h>
# include <string.h>
#define ROW 3 //三子棋行数
#define COL 3 //三子棋列数
void init(char arr[ROW][COL],int row,int col);
void display(char arr[ROW][COL],int row,int col); //打印棋盘函数
void player(char arr[ROW][COL],int row,int col); //玩家走函数
void computer(char arr[ROW][COL],int row,int col); //电脑走函数
char win(char arr[ROW][COL],int row,int col); //判断输赢函数
#endif _GAME_H_
test.c----文件
# include "test.h"
1.菜单函数
2.游戏函数
3.主函数
void meun () //菜单函数
{ printf ("*********************\n");
printf ("****** 1.play *******\n");
printf ("****** 0.exit ******\n");
printf ("*********************\n");
}
void game () //游戏函数
{ char retu=0; //定义返回值为字符型
char num[ROW][COL]={0}; //定义二维数组
init (num,ROW,COL); //初始化函数的调用
display (num ,ROW,COL); //数组输出函数的调用
while (1)
{
player (num,ROW,COL); //玩家输入函数调用
display (num,ROW,COL);
// system("CLS"); (系统函数)
retu=win (num,ROW,COL); //接受返回值
if(retu=='x') //判断返回值是否等于'x'
{
printf("玩家胜利\n");
break;
}
if(retu=='0') //判断返回值是否等于'0'
{
printf("电脑胜利\n");
break;
}
if(retu=='A') //判断返回值是否等于'A'
{
printf("和局\n");
break;
}
computer(num,ROW,COL); //电脑输入函数的调用
display(num,ROW,COL);
retu=win(num,ROW,COL);
if(retu=='x')
{
printf("玩家胜利\n");
break;
}
if(retu=='0')
{
printf("电脑胜利\n");
break;
}
if(retu=='A')
{
printf("和局\n");
break;
}
}
}
int main ()
{
int input =0;
srand((unsigned int)time(NULL)); //随机函数调用
do
{ meun (); //调用菜单函数
scanf ("%d",&input); //输入
switch (input) //判断输入执行退出还是玩游戏
{case 1:
game (); //游戏函数调用
break;
case 0:
break;
default :
printf ("输出错误,请重新选择");
break;
}
}
while (input);
return 0;
system ("pause");
}