C语言三子棋小游戏

本文详细介绍了三子棋游戏的设计与实现过程,包括棋盘初始化、玩家与电脑走棋、判断胜负和平局的算法。通过C语言编程,实现了交互式的游戏体验,适合初学者理解和实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三子棋

玩家构思:
大家常玩五子棋,所以三子棋的更好理解,就是选择游戏,然后玩家走,电脑走,判断输赢,如果莫有赢或平局,则继续循环。直到最后分出输赢平

代码构思:
棋盘初始化为空格,然后打印棋盘,玩家走放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");
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值