最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言三子棋一步步實現(xiàn)詳程

 更新時間:2022年02月11日 15:45:52   作者:i跑跑  
三子棋是一種民間傳統(tǒng)游戲,又叫九宮棋、圈圈叉叉、一條龍、井字棋等。將正方形對角線連起來,相對兩邊依次擺上三個雙方棋子,只要將自己的三個棋子走成一條線,對方就算輸了,想用c語言做出這個游戲,事實上也是比較簡單的,下面通過c語言進行對五子棋的分析

游戲思路:

1.創(chuàng)建初始游戲界面菜單

2.創(chuàng)建游戲內(nèi)容:

          初始化棋盤  打印棋盤 設(shè)置兩方棋子 

          玩家下  電腦下  判斷輸贏

代碼行數(shù)較多,這里我們 :

          創(chuàng)建 game.h 頭文件來聲明函數(shù)

          創(chuàng)建 game.c 源文件來定義函數(shù)

          創(chuàng)建   test.c   源文件來運行游戲

一.創(chuàng)建菜單(在test.c中)

首先我們來分析,運行程序時,我們要讓電腦顯示出 是進入游戲還是退出游戲,創(chuàng)建菜單menu

要進行選擇,因此選擇 switch 語句,并且當(dāng)玩家進入游戲結(jié)束游戲后,還要再來一把,那么就要再一次顯示 menu,因此這里是先進行一次的循環(huán),再判斷,選擇 do...while 語句。

為了閱讀方便,我們分開寫,進行函數(shù)嵌套調(diào)用,如下:

void menu()
{
	printf("************************\n");
	printf("******  1.play  ********\n");
	printf("******  0.exit  ********\n");
	printf("************************\n");
}
 
 
void test()
{
	int input;
 
	do
	{
		printf("請選擇>:\n");
		menu();                     //調(diào)用創(chuàng)建的菜單
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			printf("三子棋\n");
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入>:");
			break;
		}
	} while (input);
}
 
 
int main()
{
	test();
	return 0;
}

二.創(chuàng)建游戲內(nèi)容

1.棋盤的創(chuàng)建和初始化

先創(chuàng)建 game() 函數(shù)替代 case1 中 printf("三子棋\n");

再來分析,三子棋游戲有行列,因此我們想到二維數(shù)組三行三列,并且都為空格,在 game 函數(shù)中創(chuàng)建棋盤    char board[3][3] = {0};  并且初始化棋盤,initboard(board,3,3); ,這里的初始化棋盤函數(shù)我們直接在 game 里調(diào)用,在.h里面進行聲明,在 game.c 中進行定義:

game.h
 
void initboard(char board[3][3], int row, int col);    //初始化棋盤
game.c
 
void initboard(char board[3][3], 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] = ' ';
		}
	}
}

這里有一點我們可以優(yōu)化,若我們要創(chuàng)建五行五列,六行六列時,又要在三個文件里面都改動數(shù)組的行列,那能不能一步到位呢?

game.h
 
//這里我們在.h里面用宏定義直接進行行列的表達(dá):
 
#define ROW 3
#define COL 3
 
void initboard(char board[ROW][COL], int row, int col);    //初始化棋盤
game.c
 
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] = ' ';
		}
	}
}
test.c
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
}

這樣我們只需要改變 宏定義的值,打印的棋盤行列便可以直接改變。

2.打印棋盤

在 game 函數(shù)中創(chuàng)建打印棋盤函數(shù)

test.c
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
	displayboard(board, ROW, COL);  //打印棋盤
}
game.h
 
#define ROW 3
#define COL 3
//函數(shù)聲明
void initboard(char board[ROW][COL], int row, int col);    //初始化棋盤
 
void displayboard(char board[ROW][COL], int row, int col); //打印棋盤
game.c
 
void displayboard(char board[ROW][COL], int row, int col)    //打印棋盤
{
	int i = 0;
	int j = 0;
	for (i = 0; i < row; i++)            //三行
	{
		//打印數(shù)據(jù)
		for (j = 0; j < col; j++)         //三列數(shù)據(jù)
		{
			printf(" %c ",board[i][j]);
			if (j < col - 1)               //看圖可知打印2個豎分割線 因此是 col-1
				printf("|");
		}
		printf("\n");                //換行打印
		//打印分割行
		if (i<row-1)                 //看圖知只打印2行分割線 因此是 row-1
		for (j = 0; j < col; j++)     //打印三列
		{
			printf("---");
			if (j < col - 1)           //看圖可知打印2個豎分割線 因此是 col-1
			printf("|");
		}
		printf("\n");                  //不要忘記換行
	}
}

棋盤如下:

3.玩家下棋

在 game 函數(shù)中創(chuàng)建玩家下棋函數(shù)

test.c
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
	displayboard(board, ROW, COL);  //打印棋盤
	play_move(board, ROW, COL);   //玩家下棋
	displayboard(board, ROW, COL);  //打印棋盤       走一步打印一次
}
game.h
 
#define ROW 3
#define COL 3
//函數(shù)聲明
void initboard(char board[ROW][COL], int row, int col);    //初始化棋盤
 
void displayboard(char board[ROW][COL], int row, int col); //打印棋盤
 
void play_move(char board[ROW][COL], int row, int col);   //玩家下棋

玩家只需看棋盤輸入坐標(biāo)即可:

注:這里要注意 數(shù)組行列下標(biāo)都是從0開始,因此賦子時行列必須對應(yīng)的減去1

game.c
 
void play_move(char board[ROW][COL], int row, int col)   //玩家下棋
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:");
	while (1)                                          需要重復(fù)下棋,是循環(huán)
	{
		scanf("%d %d",&x,&y);
		if (x >= 1 && x <= row &&y >= 1 && y <= col)   //判斷輸入坐標(biāo)是否越界
		{
			if (board[x - 1][y - 1] == ' ')             //判斷輸入坐標(biāo)是否已經(jīng)落子
			{
				board[x - 1][y - 1] = '*';               //玩家為'*'
				break;                              //走一步后跳出,防止死循環(huán)
			}
			else
				printf("該坐標(biāo)被占用,請重新輸入:\n");
		}
 
		else
		{
			printf("坐標(biāo)非法,請重新輸入:\n");
		}
	}
}

4.電腦下棋

在 game 函數(shù)中創(chuàng)建電腦下棋函數(shù)

test.c
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
	displayboard(board, ROW, COL);  //打印棋盤
 
	play_move(board, ROW, COL);   //玩家下棋
	displayboard(board, ROW, COL);  //打印棋盤       走一步打印一次
 
	computer_move(board, ROW, COL);  //電腦下棋
	displayboard(board, ROW, COL);   //走一步打印一次
}
 
 
void test()
{
	int input;
	srand((unsigned int)time(NULL));    //在test函數(shù)里設(shè)置隨機數(shù),srand需在rand之前使用
	do
	{
		printf("請選擇>:\n");
		menu();
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入>:");
			break;
		}
	} while (input);
}
game.h
 
#include <time.h>        //設(shè)置隨機數(shù)需要用到時間戳
#include <stdlib.h>      //設(shè)置隨機數(shù)需要用到 srand 和rand 
 
#define ROW 3
#define COL 3
//函數(shù)聲明
void initboard(char board[ROW][COL], int row, int col);    //初始化棋盤
 
void displayboard(char board[ROW][COL], int row, int col); //打印棋盤
 
void play_move(char board[ROW][COL], int row, int col);   //玩家下棋
 
void computer_move(char board[ROW][COL], int row, int col);  //電腦下棋

用隨機數(shù)設(shè)置電腦落子坐標(biāo)

game.c
 
void computer_move(char board[ROW][COL], int row, int col)    //電腦下棋
{
	printf("電腦下棋:\n");
 
	while (1)                                 //重復(fù)下,因此是循環(huán)
	{
		int x = rand() % ROW;    //0~2          //電腦下棋為隨機
		int y = rand() % COL;    //0~2          //我們只需要設(shè)置隨機數(shù)和隨機數(shù)的范圍
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';                   //設(shè)置電腦棋子為'#'
			break;                              //走一步跳出循環(huán),防止死循環(huán)
		}
	}
}

注意:玩家和電腦下棋均為循環(huán),因此在調(diào)用下棋函數(shù)是都應(yīng)重復(fù)調(diào)用,則game函數(shù)里應(yīng)為:

test.c
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
	displayboard(board, ROW, COL);  //打印棋盤
 
	while (1)
	{
		play_move(board, ROW, COL);   //玩家下棋
		displayboard(board, ROW, COL);
 
		computer_move(board, ROW, COL);
		displayboard(board, ROW, COL);
 
	}

5.判斷輸贏

聲明函數(shù),并分析游戲結(jié)果:三行相同 三列相同 對角線相同  玩家贏或電腦贏 或者是下滿棋盤平局。用不同符號表示不同結(jié)果:

game.h
 
#include <time.h>
#include <stdlib.h>
 
#define ROW 3
#define COL 3
//函數(shù)聲明
void initboard(char board[ROW][COL], int row, int col);    //初始化棋盤
 
void displayboard(char board[ROW][COL], int row, int col); //打印棋盤
 
void play_move(char board[ROW][COL], int row, int col);   //玩家下棋
 
void computer_move(char board[ROW][COL], int row, int col);  //電腦下棋
 
char is_win(char board[ROW][COL], int row, int col);  //判斷輸贏  玩家贏'*' 電腦贏'#'  平局'Q'  繼續(xù)'C'
test.c
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
	displayboard(board, ROW, COL);  //打印棋盤
 
	char ret = 0;                                   //創(chuàng)建ret方便函數(shù)返回字符
	while (1)
	{
		play_move(board, ROW, COL);   //玩家下棋
		displayboard(board, ROW, COL);
 
		ret = is_win(board, ROW, COL);              //返回字符并判斷     C為繼續(xù)
		if (ret!='C')
		{
			break;
		}
		computer_move(board, ROW, COL);
		displayboard(board, ROW, COL);
 
		ret = is_win(board, ROW, COL);               //返回字符并判斷     C為繼續(xù)
		if (ret!='C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家贏\n");
	}
	else if (ret == '#')
	{
		printf("電腦贏\n");
	}
	else                                    //這里ret='Q'
	{
		printf("平局\n");
	}
}

函數(shù)實現(xiàn):

game.c
 
int is_full(char board[ROW][COL], int row, int col)   //平局的函數(shù)
{
	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;                                  //沒有空的坐標(biāo)時返回1
}
 
 
char is_win(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][1] != ' ')
		{
			return board[i][1];
		}
	}
	//三列相同
	for (i = 0; i < col; 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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
 
	//判斷平局
	if (1 == is_full(board, row, col))      //當(dāng)坐標(biāo)沒空子時,且上述條件不成立則等于1
	{
		return 'Q';                          //返回'Q'
	}
	//繼續(xù)
	return 'C';
}

這里平局函數(shù)is_full,在函數(shù)is_win里調(diào)用,直接在game.c文件里面, is_win 函數(shù)外面定義就行,沒有必要放在test.c里面單獨調(diào)用。

test.c和game.c都需要調(diào)用頭文件stdio.h,我們將它放入game.h里面,并且test.c和game.c都調(diào)用game.h就可以了

完整代碼

1.game.h

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
 
#define ROW 3
#define COL 3
//函數(shù)聲明
void initboard(char board[ROW][COL], int row, int col);    //初始化棋盤
 
void displayboard(char board[ROW][COL], int row, int col); //打印棋盤
 
void play_move(char board[ROW][COL], int row, int col);   //玩家下棋
 
void computer_move(char board[ROW][COL], int row, int col);  //電腦下棋
 
char is_win(char board[ROW][COL], int row, int col);  //判斷輸贏  玩家贏'*' 電腦贏'#'  平局'Q'  繼續(xù)'C'

2.game.c

#include "game.h"
//函數(shù)實現(xiàn)
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;
	int j = 0;
	for (i = 0; i < row; i++)
	{
		//數(shù)據(jù)
		for (j = 0; j < col; j++)
		{
			printf(" %c ",board[i][j]);
			if (j < col - 1)
				printf("|");
		}
		printf("\n");
		//分割行
		if (i<row-1)
		for (j = 0; j < col; j++)
		{
			printf("---");
			if (j < col - 1)
			printf("|");
		}
		printf("\n");
	}
}
 
void play_move(char board[ROW][COL], int row, int col)   //玩家下棋
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:");
	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("該坐標(biāo)被占用,請重新輸入:\n");
		}
 
		else
		{
			printf("坐標(biāo)非法,請重新輸入:\n");
		}
	}
}
 
 
void computer_move(char board[ROW][COL], int row, int col)    //電腦下棋
{
	printf("電腦下棋:\n");
 
	while (1)
	{
		int x = rand() % ROW;
		int y = rand() % COL;
		if (board[x][y] == ' ')
		{
			board[x][y] = '#';
			break;
		}
	}
}
 
int is_full(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 is_win(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][1] != ' ')
		{
			return board[i][1];
		}
	}
	//三列
	for (i = 0; i < col; 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[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
	{
		return board[1][1];
	}
 
	//判斷平局
	if (1 == is_full(board, row, col))
	{
		return 'Q';
	}
	//繼續(xù)
	return 'C';
}

3.test.c

#include "game.h"
 
 
 
void menu()
{
	printf("************************\n");
	printf("******  1.play  ********\n");
	printf("******  0.exit  ********\n");
	printf("************************\n");
}
 
void game()
{
	char board[ROW][COL] = {0};
	initboard(board,ROW,COL);  //初始化棋盤
	displayboard(board, ROW, COL);  //打印棋盤
 
	char ret = 0;
	while (1)
	{
		play_move(board, ROW, COL);   //玩家下棋
		displayboard(board, ROW, COL);
 
		ret = is_win(board, ROW, COL);
		if (ret!='C')
		{
			break;
		}
		computer_move(board, ROW, COL);
		displayboard(board, ROW, COL);
 
		ret = is_win(board, ROW, COL);
		if (ret!='C')
		{
			break;
		}
	}
	if (ret == '*')
	{
		printf("玩家贏\n");
	}
	else if (ret == '#')
	{
		printf("電腦贏\n");
	}
	else
	{
		printf("平局\n");
	}
}
 
 
void test()
{
	int input;
	srand((unsigned int)time(NULL));
	do
	{
		printf("請選擇>:\n");
		menu();
		scanf("%d",&input);
		switch (input)
		{
		case 1:
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("輸入錯誤,請重新輸入>:");
			break;
		}
	} while (input);
}
 
 
int main()
{
	test();
	return 0;
}

游戲效果如下:

這樣我們簡易的三子棋就寫完啦,中間還有很多可以優(yōu)化的地方,之后改進了會發(fā)布的?。。?!

到此這篇關(guān)于C語言三子棋一步步實現(xiàn)詳程的文章就介紹到這了,更多相關(guān)C語言 三子棋內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言詳解strcmp函數(shù)的分析及實現(xiàn)

    C語言詳解strcmp函數(shù)的分析及實現(xiàn)

    strcmp函數(shù)語法為“int strcmp(char *str1,char *str2)”,其作用是比較字符串str1和str2是否相同,如果相同則返回0,如果不同,前者大于后者則返回1,否則返回-1
    2022-05-05
  • 深入解析最長公共子串

    深入解析最長公共子串

    本篇文章是對最長公共子串進行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • c++ 如何在libuv中實現(xiàn)tcp服務(wù)器

    c++ 如何在libuv中實現(xiàn)tcp服務(wù)器

    這篇文章主要介紹了c++ 如何在libuv中實現(xiàn)tcp服務(wù)器,幫助大家更好的理解和使用libuv,感興趣的朋友可以了解下
    2021-02-02
  • C語言基礎(chǔ)全局變量與局部變量教程詳解

    C語言基礎(chǔ)全局變量與局部變量教程詳解

    此處對于全局與局部做一些簡要的介紹,包括全局變量與局部變量,靜態(tài)全局變量與靜態(tài)局部變量,全局函數(shù)與靜態(tài)函數(shù),作者實屬初學(xué),文中若有理解不當(dāng)之處,還請朋友們不吝指正
    2021-11-11
  • C++ OpenCV實戰(zhàn)之手勢識別

    C++ OpenCV實戰(zhàn)之手勢識別

    這篇文章主要介紹了如何利用C++?OpenCV實現(xiàn)手勢識別,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下
    2022-04-04
  • C++二叉樹的創(chuàng)建及遍歷詳情

    C++二叉樹的創(chuàng)建及遍歷詳情

    這篇文章主要介紹了C++二叉樹的創(chuàng)建及遍歷詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學(xué)習(xí)有所幫助
    2022-07-07
  • C語言?超詳細(xì)順序表的模擬實現(xiàn)實例建議收藏

    C語言?超詳細(xì)順序表的模擬實現(xiàn)實例建議收藏

    程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要創(chuàng)建這種元素組,用變量記錄它們,傳進傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲區(qū)里,元素間的順序關(guān)系由它們的存儲順序自然表示
    2022-03-03
  • c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解

    c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解

    這篇文章主要介紹了c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-08-08
  • linux c語言操作數(shù)據(jù)庫(連接sqlite數(shù)據(jù)庫)

    linux c語言操作數(shù)據(jù)庫(連接sqlite數(shù)據(jù)庫)

    linux下c語言操作sqlite數(shù)據(jù)庫實例方法,大家參考使用吧
    2013-12-12
  • C/C++舉例講解關(guān)鍵字的用法

    C/C++舉例講解關(guān)鍵字的用法

    相對于其他語言來說,C語言的關(guān)鍵字算是少的了。在C98中關(guān)鍵子總共只有32個,我們來分析一下部分關(guān)鍵字在C/C++中它獨特的作用
    2022-05-05

最新評論

高雄市| 珲春市| 石柱| 赞皇县| 绥芬河市| 吉安县| 准格尔旗| 本溪市| 茂名市| 双辽市| 沁源县| 丁青县| 农安县| 太仆寺旗| 平原县| 乌兰浩特市| 延庆县| 开封县| 南华县| 芜湖县| 晋江市| 洪湖市| 广昌县| 墨玉县| 尉氏县| 吕梁市| 利辛县| 来安县| 九寨沟县| 中西区| 岗巴县| 仪陇县| 天柱县| 许昌县| 稻城县| 凤城市| 同心县| 水城县| 龙川县| 措美县| 平度市|