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

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

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

游戲思路:

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

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

          初始化棋盤  打印棋盤 設置兩方棋子 

          玩家下  電腦下  判斷輸贏

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

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

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

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

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

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

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

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

void menu()
{
	printf("************************\n");
	printf("******  1.play  ********\n");
	printf("******  0.exit  ********\n");
	printf("************************\n");
}
 
 
void test()
{
	int input;
 
	do
	{
		printf("請選擇>:\n");
		menu();                     //調用創(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)建游戲內容

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 里調用,在.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里面用宏定義直接進行行列的表達:
 
#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);   //玩家下棋

玩家只需看棋盤輸入坐標即可:

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

game.c
 
void play_move(char board[ROW][COL], int row, int col)   //玩家下棋
{
	int x = 0;
	int y = 0;
	printf("玩家下棋>:");
	while (1)                                          需要重復下棋,是循環(huán)
	{
		scanf("%d %d",&x,&y);
		if (x >= 1 && x <= row &&y >= 1 && y <= col)   //判斷輸入坐標是否越界
		{
			if (board[x - 1][y - 1] == ' ')             //判斷輸入坐標是否已經(jīng)落子
			{
				board[x - 1][y - 1] = '*';               //玩家為'*'
				break;                              //走一步后跳出,防止死循環(huán)
			}
			else
				printf("該坐標被占用,請重新輸入:\n");
		}
 
		else
		{
			printf("坐標非法,請重新輸入:\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ù),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ù)需要用到時間戳
#include <stdlib.h>      //設置隨機數(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ù)設置電腦落子坐標

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

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

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ù),并分析游戲結果:三行相同 三列相同 對角線相同  玩家贏或電腦贏 或者是下滿棋盤平局。用不同符號表示不同結果:

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;                                  //沒有空的坐標時返回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))      //當坐標沒空子時,且上述條件不成立則等于1
	{
		return 'Q';                          //返回'Q'
	}
	//繼續(xù)
	return 'C';
}

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

test.c和game.c都需要調用頭文件stdio.h,我們將它放入game.h里面,并且test.c和game.c都調用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("該坐標被占用,請重新輸入:\n");
		}
 
		else
		{
			printf("坐標非法,請重新輸入:\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ā)布的?。。?!

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

相關文章

  • 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
  • 深入解析最長公共子串

    深入解析最長公共子串

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

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

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

    C語言基礎全局變量與局部變量教程詳解

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

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

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

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

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

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

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

    c/c++拷貝構造函數(shù)和關鍵字explicit詳解

    這篇文章主要介紹了c/c++拷貝構造函數(shù)和關鍵字explicit的相關知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    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++舉例講解關鍵字的用法

    C/C++舉例講解關鍵字的用法

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

最新評論

广安市| 保山市| 建湖县| 屏东县| 将乐县| 丰顺县| 新化县| 乐昌市| 江津市| 六枝特区| 平山县| 九龙坡区| 科技| 铜川市| 廊坊市| 乌鲁木齐市| 黄大仙区| 葫芦岛市| 旅游| 珲春市| 辽宁省| 新平| 静海县| 日喀则市| 东乡族自治县| 萨嘎县| 师宗县| 婺源县| 南汇区| 盐津县| 天长市| 五家渠市| 山阳县| 华池县| 汝阳县| 屯留县| 获嘉县| 临江市| 田东县| 赤峰市| 洛宁县|