今天定个小目标,用C语言实现三子棋的玩法。里面有精彩情景故事帮助你更快理解代码内容,不进来了解一下吗?(内附代码)

  如标题所示,今天我们要用C语言来实现三子棋的游戏。相信大家都玩过这个游戏。我们来回忆一下游戏步骤。
  一、今天你在家里看书,你的朋友小红邀请你和她一起玩三子棋。这时你有两个选择。
    1.接受她的邀请,在玩游戏的同手,促进你们的感情。
    0.残忍拒绝她,三子棋有什么好玩的,是书不好看了吗。
   那我们在设计游戏时,第一步也应该是让玩家进行选择。
  二、假设你因为暗恋小红接受了小红发来的游戏邀请,这时你们决定开始玩三子棋。那你们首先要拿出棋谱和棋子并且选择各自要执子的颜色。
  那这个对应我们在写代码时就是要打印棋盘,并且用不同的符号区分你和小红所执的子。在本文中,我们将小红看成是电脑玩家(小红是一个没有感情的棋手)小红执子为黑子,用符号“@”表示,将你看成是个人玩家,执白色棋子,用符号“X”表示你所执的子。
  三、游戏就要开始了,你很紧张。你不知道要不要向小红展示你的真实实力(其实你是全世界三子棋冠军,但因为你为人低调,每次比赛时都要戴口罩,所以小红并不知道你的真实身份)。向小红展示你的真实实力,小红可能因为输了就不太想跟你玩了。如果装的太菜,小红可能会嘲笑你。真是一个艰难的选择。
  因此我们在写代码时,也可以将游戏进行不同难度程度的划分。这里我们说一下简单模式的,也就是让电脑不进行任何分析而随机落子。困难模式目前我想到的只有穷举法,但是显然这个算法太麻烦了。所以在代码中。我将困难模式模板目前没有po上代码,后面我会考虑优化算法,再对本文进行编辑。
  完成上述准备工作后,要正式开始玩了。我们将棋盘看成一个二维数组,每一次落子就是对空白数组进行赋值的过程。因此写代码时我们要先初始化一个二维数组,对数组的行和列进行限制。这离我们是三子棋,将行ROW和列COL都定义为3。将下棋过程中的电脑落子和玩家落子分别用两个函数表示。每次落子结束后都要进行判断是否有人赢了,因此还需要一个判断输赢的函数。下面我们附上代码。

//game.h部分
#ifndef __GAME_H__
#define __GAME_H__
#define ROW 3  //行
#define COL 3  //列
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void menu(void);//开始菜单
void init(char arr[ROW][COL], int row, int col);//初始化数组
void printboard(char arr[ROW][COL], int row, int col);//游戏棋盘
void playermove(char arr[ROW][COL],int row,int col);  //玩家走
void computermove(char arr[ROW][COL], int row, int col);  //电脑走
int win(char arr[ROW][COL], int row, int col);   //判断胜利
#endif // __GAME_H__
//我们将游戏中涉及到的所有的函数放在game.h的头文件中方便我们调用
//game.c部分   
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"
void menu(void)									 	  	//打印菜单,让玩家进行选择
{
    printf("************************\n");      
    printf("***  1.开始  0.退出  ***\n");
    printf("************************\n");
}

void init(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++)
        {
            arr[i][j] = ' ';
        }
    }
}
 void printboard(char arr[ROW][COL], int row, int col)				//  打印棋盘
{
    int i = 0;
    for (i = 0; i < row; i++)
    {
        printf("------------------------\n");
        printf("|      |       |       |\n");
        printf("|   %c  |   %c   |   %c   |\n",arr[i][0],arr[i][1],arr[i][2]);
        printf("|      |       |       |\n");


    }
			printf("------------------------\n");
}

 void playermove(char arr[ROW][COL], int row, int col)				/  /玩家落子
 {
     int x = 0;
     int y = 0;
     while (1)
     {
         printf("玩家走\n请输入坐标:>");										
         scanf("%d%d", &x, &y);
         if ((x - 1) < row && (x - 1) >= 0 && (y - 1) < col && (y - 1) >= 0)//落子时要考虑取值范围,不能超过棋盘
         {
             if (arr[x-1][y-1] == ' ')      //此处为空时,才可以落子
             {
                 arr[x - 1][y - 1] = 'X';
                 break;
             }
             else							//否则进行重新选择
             {
                 printf("此坐标已有棋子,请重新选择坐标!\n");
             }
         }
         else
         {
             printf("输入坐标错误!\n");
         }
     }

 }

	 void computermove(char arr[ROW][COL], int row, int col)	 	/ /电脑落子
 {
     int x = 0;
     int y = 0;

     printf("电脑走:>\n");
     while (1)
     {
         x = rand() % row;			//电脑落子取随机数表示,取余对随机数范围进行限定
         y = rand() % col;  
         if (x< row && x >= 0 && y < col && y >= 0)
         {
             if (arr[x][y] == ' ')
             {
                 arr[x][y] = '@'; 
                 break;
             }
         }
     }
 }



 int win(char arr[ROW][COL], int row, int col)					  	//判断输赢
 {
     int i = 0;
     int j = 0;
     int execute = 1;

         for (i = 0; i < row; i++)
         {
             for (j = 0; j < col; j++)	//这里我是用穷举法列出了所有赢的可能,此处可以不用穷举
             {
                 if (arr[i][j] == 'X'&&arr[i + 1][j + 1] == 'X'&&arr[i + 2][j + 2] == 'X'&& i<(row-2)&& i<(col - 2)
                     || arr[i][j] == 'X'&&arr[i][j + 1] == 'X'&&arr[i][j + 2] == 'X'&&j<(col-2)
                     || arr[i][j] == 'X'&&arr[i + 1][j] == 'X'&&arr[i + 2][j] == 'X'&&i<(row-2)
                     || arr[i][j] == 'X'&&arr[i + 1][j - 1] == 'X'&&arr[i + 2][j - 2] == 'X'&&i<(row-2)&&(j>=2))  									
                 {
                     printf("恭喜你赢了!\n");
                     return 1;
                 }
             }
         }
         for (i = 0; i < row; i++)
         {
             for (j = 0; j < col; j++)
             {
                 if (arr[i][j] == '@'&&arr[i + 1][j + 1] == '@'&&arr[i + 2][j + 2] == '@'&& i<(row - 2) && i<(row - 2)
                     || arr[i][j] == '@'&&arr[i][j + 1] == '@'&&arr[i][j + 2] == '@'&&j<(col - 2)
                     || arr[i][j] == '@'&&arr[i + 1][j] == '@'&&arr[i + 2][j] == '@'&&i<(row - 2)
                     || arr[i][j] == '@'&&arr[i + 1][j - 1] == '@'&&arr[i + 2][j - 2] == '@' && i<(row - 2) && (j >= 2))
                 {
                     printf("电脑赢了!\n");
                     return 1;
                 }
             }
         }

         for (i = 0; i < row; i++)
         {
             for (j = 0; j < col; j++)
             {
                 if (arr[i][j] == ' ')
                 {
                     execute = 0;
                 }
             }
         }
         if(1 == execute)
         { 
             printf("平局!\n");
             return 1;
         }
     return 0;
 }

//test.c部分
#define _CRT_SECURE_NO_WARNINGS
#include"game.h"

int main()
{
	int chose = 0;									
    int input = 0;
    int i = 0;
	char arr[ROW][COL] = { 0 };
    srand((unsigned int)time(NULL));
    while(1)
    {
        if (i == 0)
        {
            menu();
            init(arr, ROW, COL);
            printf("请选择是否开始游戏:");
        }
         i = 1;   
        scanf("%d", &input);
        switch (input)
        {
        case 1:
			printf("请输入你要选择的游戏难度\n");
			printf("*******************************\n");
			printf("********   0.简单   ***********\n");
			printf("***********1.困难   ***********\n");
			printf("*******************************\n");
			scanf("%d",&chose);
			if(chose==0)
			{
				 printboard(arr, ROW, COL);
				 while (1)
				{
					 playermove(arr, ROW, COL);
					 printboard(arr, ROW, COL);         
					 if(win(arr, ROW, COL)==1)
						 {
							 i = 0;
							 break;
						 }
					 computermove(arr, ROW, COL); 
					 printboard(arr, ROW, COL);
					if (win(arr, ROW, COL) == 1)
						{
						  i = 0;
						 break;
						 }
				  }
            break;
			}
			else if(chose==1)
			printf("正在筹备中,敬请期待\n");
			else
			printf("输入错误,请重新输入\n");
		
		
        case 0:
            printf("游戏退出!\n");
            system("pause");
            return 0;
            break;
        default:
            printf("输入错误!请重新输入:");
            break;
        }
    }
     return 0;
	}
	


猜你喜欢

转载自blog.csdn.net/qq_43232778/article/details/83029531