三子棋的實現(xiàn)——C語言-創(chuàng)新互聯(lián)

“一名優(yōu)秀的程序員,在穿越單行道時也會確認雙向的來車情況?!薄栏窭埂ち值拢―oug?Linder)

目錄

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請、虛擬主機、營銷軟件、網(wǎng)站建設(shè)、孝感網(wǎng)站維護、網(wǎng)站推廣。

一:三子棋的基本流程

二:三子棋的具體步驟

1.創(chuàng)建文件

2.打印菜單

3.創(chuàng)建棋盤

4.初始化棋盤

5.打印棋盤

6.玩家下棋

7.電腦下棋

8.判斷輸贏

三:三子棋的演示


一:三子棋的基本流程:

首先選擇菜單——>選擇開始游戲——>輸入你要下棋的坐標——>如果滿足每行或者每列或者對角線上的都是你的棋子,則游戲勝利。

二:三子棋的基本步驟:

1.創(chuàng)建文件

首先我們創(chuàng)建三個文件,分別為test.c,game.c,game.h? 三個文件,test.c文件主要是測試邏輯,game.c game.h去實現(xiàn)這個三子棋,在game.h文件主要用來聲明函數(shù)和定義一些常量。

2.打印菜單

這個菜單就是我們進入游戲的界面,我們可以定義一個菜單函數(shù),在主函數(shù)里面定義一個test()函數(shù),將后面實現(xiàn)的代碼全部放在里面

int main() {
	test();
	return 0;
}

為了讓我們能一直玩,這里采用了do while循環(huán),將打印的菜單函數(shù)放在這個循環(huán),再用switch語句來選擇輸入選項,是進入游戲還是退出游戲,用1來表示進入游戲,0表示退出游戲,正好while循環(huán)的條件表達式就為輸入的數(shù),為0正好循環(huán)結(jié)束。

打印菜單:

void menu() {
	printf("*****************************\n");
	printf("********   1. play     ******\n");
	printf("********   0. eixt     ******\n");
	printf("*****************************\n");
}
void test() {
	//rand函數(shù)(隨機數(shù)范圍0~32767)調(diào)用之前要使用srand函數(shù) 調(diào)用一次即可
	srand((unsigned int)time(NULL));
	int input=0;//要輸入的數(shù)
	do {
		//游戲進去前首先打印一個菜單
		menu();
		printf("請選擇->");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			printf("游戲開始啦?。?!\n");
			game();
			break;
		case 0:
			printf("退出游戲\n");
			break;
		default:
			printf("選擇錯誤\n");
			break;
		}
	} while (input);//可以一直玩下去,一直到輸入0游戲結(jié)束

}

3.創(chuàng)建棋盤:

創(chuàng)建棋盤就用到二維數(shù)組,我們把棋子用字符表示,所以創(chuàng)建一個字符數(shù)組。

char board[ROW][COL];

在game.h文件中定義常量行和列?

//聲明行和列,便于以后修改,改該頭文件數(shù)據(jù)就可以了
#define ROW 3
#define COL 3

4.初始化棋盤:

創(chuàng)建完畢后要對棋盤清空,初始化棋盤都為空格,再創(chuàng)建一個初始化棋盤函數(shù)。

init_board(board,ROW,COL);
//此函數(shù)讓數(shù)組的每個元素都是空格
void init_board(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] = ' ';
		}
	}
}

5.打印棋盤

初始化完畢要將這個棋盤打印在屏幕上,再創(chuàng)建一個打印函數(shù)。

print_board(board, ROW, COL);
void print_board(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++) {
			printf(" %c ",board[i][j]);
			if(j

6.玩家下棋:

棋局已經(jīng)布置好了,開始讓電腦和玩家下棋。

player_move(board, ROW, COL);

//實現(xiàn)玩家下棋的函數(shù)
void player_move(char board[ROW][COL], int row, int col) {
	printf("玩家下棋\n");
	//因為要讓玩家一直下棋,可以想到用while循環(huán)來實現(xiàn)
	while (1) {
		printf("請輸入要下棋的坐標:\n");
		int x = 0;
		int y = 0;
		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;                         //然后通過break跳出循環(huán)
			}
			else 
			{
				printf("該坐標被占用,請重新輸入:\n");
			}
		}
		else {
			printf("輸入坐標非法\n");
		}
	}
}

7.電腦下棋:

computer_move(board, ROW, COL);

在這里電腦下棋是編譯器隨機下棋,如果追求難度的話,還可以寫算法來控制電腦下棋,哈哈,這應(yīng)該算智能三子棋,希望各位可以寫寫看。

在這里有一個點,C語言的rand()生成隨機數(shù),rand函數(shù)(隨機數(shù)范圍0~32767)調(diào)用之前要使用srand函數(shù) 調(diào)用一次即可。

//實現(xiàn)電腦下棋的函數(shù)
void computer_move(char board[ROW][COL], int row, int col) {
	//讓電腦隨機下棋,自己隨機生成坐標
	//用rand()函數(shù)生成隨機值,因為電腦行和列都要隨機生成0~2之間的數(shù)字,所以讓隨機數(shù)對行和列取余即可
	printf("電腦下棋\n");
	int x = rand() % row;
	int y = rand() % col;
	while (1) {
		if (board[x][y] == ' ') {
			board[x][y] = '#';
			break;
		}
		
	}
}

8.判斷輸贏:
在走到這一步了,首先要分析判斷輸贏的條件:

這時候我們再定義一個判斷輸贏的函數(shù),返回值返回上圖:

//玩家下一次判斷輸贏
		 ret=is_win(board, ROW, COL);
//判斷棋盤是否滿了,滿了就是平局
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;
}

//判斷輸贏的函數(shù)
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][0] != ' ') {
			//因為條件滿足三個都為同樣的字符,隨便返回哪一個
			return board[i][0];
		}
	}
	//判斷列是否相等
	for (i = 0; i< col; i++) {
		if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') {
			return board[0][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];
	}
	//是否平局
	int ret = 0;
	if (ret = is_full(board,row,col) == 1) {
		return 'Q';
	}
	//游戲繼續(xù)
	return 'C';
}

最后我們將這些函數(shù)放在while循環(huán)中,讓玩家一直下棋,直到游戲勝利或者平局或者游戲失敗:

//while循環(huán)讓玩家一直下棋
	while (1) {
		player_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//玩家下一次判斷輸贏
		 ret=is_win(board, ROW, COL);
		 if (ret != 'C') {   //如果等于C,一直往下走,否則跳出循環(huán)判斷誰贏了
			 break;
		 }
		//電腦下棋
		computer_move(board, ROW, COL);
		print_board(board, ROW, COL);
		//電腦下一次判斷輸贏
		if (ret != 'C') {
			break;
		}
	}
	if (ret == '#') {
		printf("電腦贏了哇哈哈哈哈,玩家你真菜\n");
	}
	else if (ret == '*') {
		printf("可以啊你贏了,靚仔\(zhòng)n");
	}
	else if (ret == 'Q') {
		printf("平局了沒意思\n");
	}

}

自此,整個三子棋的實現(xiàn)就完成了,另外重申的是,在game.h頭文件中,聲明了這些函數(shù),在其他文件直接包含頭文件即可/

#pragma once
#include#include#include//聲明行和列,便于以后修改,改該頭文件數(shù)據(jù)就可以了
#define ROW 3
#define COL 3

//頭文件聲明函數(shù)
//初始化棋盤
void init_board(char board[ROW][COL], int row, int col);

//打印棋盤
void print_board(char board[ROW][COL], int row, int col);

//玩家下棋的函數(shù)
void player_move(char board[ROW][COL], int row, int col);

//電腦下棋的函數(shù)
void computer_move(char board[ROW][COL], int row, int col);

//判斷輸贏的條件
char is_win(char board[ROW][COL], int row, int col);

最后來看看三子棋最終的實現(xiàn)效果:

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

名稱欄目:三子棋的實現(xiàn)——C語言-創(chuàng)新互聯(lián)
網(wǎng)頁鏈接:http://muchs.cn/article12/csgidc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)頁設(shè)計公司建站公司、商城網(wǎng)站服務(wù)器托管、網(wǎng)站設(shè)計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)