摘要:因為每個格子在游戲開始的時候都是空著的狀態,而在玩家與電腦進行游戲中是要輸入符號的,所以我們還要定義一個型的二維數組,并初始化為。函數聲明打印棋盤初始化數組玩家下棋二維數組進行函數傳參時可以不用寫行數電腦下棋判斷是否勝利定義一個二維數組。
三子棋是大家小時候和同桌在紙上都玩過的簡單小游戲,這個游戲我們在c語言中就可以實現。
在這篇文章我推薦大家使用vs2013,vs2019,vs2022等的編譯器。部分學校使用的vc6.0以及Devc++。前者是1998年推出的c語言編譯器,在現在的win10或者win11的系統中并不兼容,可能會出現一些問題,后者也在2015年停更,這兩款祖傳c語言編譯器并不推薦使用,但是如果你們學校考試需要使用或者有明確要求,那當我沒說。
首先,我們要先創建一個項目,常見三個文件分別是頭文件game.h,源文件game.c,text.c。在這個game.h的頭文件中我們放入函數的聲明,定義常量以及頭文件的引用,在text.c文件中我們寫入游戲進行的程序,在game.c文件中我們寫入實現游戲的函數。?
因為我們玩一把游戲肯定不過癮,我們要多玩幾把游戲,我們在text.c文件中的main函數里寫入一個do while循環語句,實現多次進行游戲。然后我們在循環語句中寫入一個menu函數用來打印菜單。然后我們要在鍵盤上輸入一個值去判斷是否進行游戲,這里使用一個switch分支。當使用者輸入正確的輸入值時開始進行游戲。這里使用一個game函數實現游戲流程。
int main(){ int n = 0; srand((size_t)time(NULL)); do { menu();//打印菜單 printf("請輸入 "); scanf("%d", &n); switch (n) { case 1:game(); break; case 0:printf("游戲結束/n"); break; default:printf("輸入錯誤,請重新輸入!/n"); break; } } while (n != 0); }
main函數部分
?void menu(){ printf("******************************************/n"); printf("******** 1.play *********/n"); printf("******** 0.exit *********/n"); printf("******************************************/n");}??
menu函數部分
2、game函數部分
在game函數中我們要實現游戲的主要流程,首先我們要打印一個3*3的棋盤,大概是這樣的。
(在這里我們先把游戲的流程捋清楚,至于實現那些游戲步驟的函數我們放在后面game源文件部分去細說。)
?因為每個格子在游戲開始的時候都是空著的狀態,而在玩家與電腦進行游戲中是要輸入符號的,所以我們還要定義一個char型的二維數組,并初始化為‘? ’。然后就是下棋階段,我們要連續下很多次棋所以說這里使用一個while循環語句實現,這里可以寫成一個死循環,當后面的函數判斷到有玩家已經勝出或者平局的時候使用break跳出循環,因為不論是電腦還是玩家下棋后,我們要看到下到了哪里,所以說我們要在玩家和電腦下棋后面再打印一次棋盤。每個人在下完棋之后,我們要判斷是否已經勝利所以我們使用條件語句來判斷是否勝利,失敗或是平局。在配合循環我們基本游戲流程已經寫完了。
void game(){ char board[ROW][COL];//定義一個二維數組。 initboard(board, ROW, COL);//初始化數組。 printboard(board, ROW, COL);//打印棋盤。 while (1) { //玩家下棋 playerboard(board, ROW, COL); //打印棋盤 printboard(board, ROW, COL); //判斷是否勝利 if (iswinboard(board, ROW, COL) == "*") { printf("玩家勝利/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "#") { printf("電腦獲勝/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "Q") { printf("平局/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } //電腦下棋 computermove(board, ROW, COL); //打印棋盤 printboard(board, ROW, COL); //判斷是否勝利 if (iswinboard(board, ROW, COL) == "*") { printf("玩家勝利/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "#") { printf("電腦獲勝/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "Q") { printf("平局/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } }}
game函數部分
在頭文件中我們需要對函數進行聲明,定義常量。具體怎么實現可以看下面代碼的注釋。
在這里我們棋盤的行列在頭文件使用ROW和COL來定義是為了方便我們以后在更改棋盤大小時,更加容易,只用在頭文件中更改,在下面我們也能看到有很多地方使用這兩個常量。
#pragma once//在game頭文件里面去聲明函數,定義常量。#include#include#include//定義常量#define ROW 3//這里通過更改ROW,COL的值來改變棋盤的大小#define COL 3//可以更改成為n*n的棋盤。//函數聲明//打印棋盤void printboard(char board[ROW][COL], int row, int col);//初始化數組void initboard(char board[ROW][COL], int row, int col);//玩家下棋//二維數組進行函數傳參時可以不用寫行數void playerboard(char board[][COL], int row, int col); //電腦下棋void computermove(char board[ROW][COL], int row, int col);//判斷是否勝利char iswinboard(char board[ROW][COL], int row, int col);
game.h部分
還記得我們在text.c中使用了哪些函數嗎?
1、我們先要初始化二維數組
2、打印棋盤
3、玩家下棋
4、電腦下棋
5、判斷勝利
接下來的game.c文件就是要寫入實現這幾個步驟的函數。
首先,初始化數組非常容易,兩個for循環即可。
//初始化數組元素void initboard(char board[ROW][COL], int row, int col){ int i = 0, j = 0; //先對數組進行賦值,因為是n*n的數組所以要賦值n*n次 //這里使用兩個for循環來實現。 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = " "; } }}
初始化數組元素函數
然后是打印棋盤函數。
在打印棋盤中我們要注意,需要打印一行數組,一行“---”符號。在每一行的最后“|”不打印。在最下面一行“---|---|---”不打印,在這里我們只需要去控制for循環條件即可實現,并不困難。
?
//打印棋盤void printboard(char board[ROW][COL], int row, int col){ int i = 0, j = 0; for (i = 0; i < row; i++) { 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 < row; j++) { printf("---"); if (j < row - 1) { printf("|"); } } } printf("/n"); }}
然后是玩家下棋函數
也就是對數組進行賦值,因為玩家不一定學過c語言,也不一定知道c語言中數組的下標是從0開始的,所以我們要對輸入的坐標-1之后在進行數組的相關操作。這里可以寫上一個死循環,當玩家下出非法坐標時提醒玩家重新下,當玩家下出正確時再break跳出。
//玩家下棋函數void playerboard(char board[][COL], int row, int col){ int x = 0, y = 0; printf("請玩家下棋/n"); while (1)//這里可以寫上一個死循環,當玩家下出非法坐標時提醒玩家重新下。 //當玩家下出正確時再break跳出。 { printf("請輸入坐標,請用空格隔開。 /n"); 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("坐標已被占用,請重新輸入!"); } } else { printf("坐標非法,請重新輸入!"); } }}
?再然后是電腦下棋
相較于玩家下棋電腦下棋就比較容易了,只用使用rand()%3隨機生成0-2之間的值,再判斷是否已被占用即可。
//電腦下棋void computermove(char board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("電腦下棋:>/n"); while (1) { x= rand() % ROW;//隨機取值如果放在循環外面則可能陷入死循環。 y= rand() % COL; if (board[x][y] == " ") { board[x][y] = "#"; break; } }}
最后是判斷是否勝利的函數
這個比較長,但是基本就是if條件語句進行判斷,分別判斷行、列、對角線以及平局。如果勝利成立則返回已連成線的其中一個格中的符號即可,這樣就不用再麻煩這判斷到底是電腦贏還是玩家贏了。返回到text.c中再進行相應的輸出。
//判斷是否勝利char iswinboard(char board[ROW][COL], int row, int col){ int i = 0, j = 0, count = 0; //判斷行是否勝利 for (i=0;i|
這樣我們的一個三子棋游戲就寫好了。你就可以發給朋友,或是自己私藏了。(steam是上不了了,自己玩玩算了。)
?最后全部代碼放在這里
game.h
#pragma once//在game頭文件里面去聲明函數,定義常量。#include#include#include//定義常量#define ROW 3//這里通過更改ROW,COL的值來改變棋盤的大小#define COL 3//可以更改成為n*n的棋盤。//函數聲明//打印棋盤void printboard(char board[ROW][COL], int row, int col);//初始化數組void initboard(char board[ROW][COL], int row, int col);//玩家下棋//二維數組進行函數傳參時可以不用寫行數void playerboard(char board[][COL], int row, int col); //電腦下棋void computermove(char board[ROW][COL], int row, int col);//判斷是否勝利char iswinboard(char board[ROW][COL], int row, int col);
text.c
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"void menu(){ printf("******************************************/n"); printf("******** 1.play *********/n"); printf("******** 0.exit *********/n"); printf("******************************************/n");}void game(){ char board[ROW][COL];//定義一個二維數組。 initboard(board, ROW, COL);//初始化數組。 printboard(board, ROW, COL);//打印棋盤。 while (1) { //玩家下棋 playerboard(board, ROW, COL); //打印棋盤 printboard(board, ROW, COL); //判斷是否勝利 if (iswinboard(board, ROW, COL) == "*") { printf("玩家勝利/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "#") { printf("電腦獲勝/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "Q") { printf("平局/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } //電腦下棋 computermove(board, ROW, COL); //打印棋盤 printboard(board, ROW, COL); //判斷是否勝利 if (iswinboard(board, ROW, COL) == "*") { printf("玩家勝利/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "#") { printf("電腦獲勝/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } else if (iswinboard(board, ROW, COL) == "Q") { printf("平局/n"); printf("********** 是否進行下一局 **********/n"); printf("/n"); break; } }}int main(){ int n = 0; srand((size_t)time(NULL)); do { menu();//打印菜單 printf("請輸入 "); scanf("%d", &n); switch (n) { case 1:game(); break; case 0:printf("游戲結束/n"); break; default:printf("輸入錯誤,請重新輸入!/n"); break; } } while (n != 0); }
game.c
#define _CRT_SECURE_NO_WARNINGS 1#include"game.h"http://初始化數組元素void initboard(char board[ROW][COL], int row, int col){ int i = 0, j = 0; //先對數組進行賦值,因為是n*n的數組所以要賦值n*n次 //這里使用兩個for循環來實現。 for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = " "; } }}//打印棋盤void printboard(char board[ROW][COL], int row, int col){ int i = 0, j = 0; for (i = 0; i < row; i++) { 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 < row; j++) { printf("---"); if (j < row - 1) { printf("|"); } } } printf("/n"); }}//玩家下棋函數void playerboard(char board[][COL], int row, int col){ int x = 0, y = 0; printf("請玩家下棋/n"); while (1)//這里可以寫上一個死循環,當玩家下出非法坐標時提醒玩家重新下。 //當玩家下出正確時再break跳出。 { printf("請輸入坐標,請用空格隔開。 /n"); 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("坐標已被占用,請重新輸入!"); } } else { printf("坐標非法,請重新輸入!"); } }}//電腦下棋void computermove(char board[ROW][COL], int row, int col){ int x = 0; int y = 0; printf("電腦下棋:>/n"); while (1) { x= rand() % ROW;//隨機取值如果放在循環外面則可能陷入死循環。 y= rand() % COL; if (board[x][y] == " ") { board[x][y] = "#"; break; } }}//判斷是否勝利char iswinboard(char board[ROW][COL], int row, int col){ int i = 0, j = 0, count = 0; //判斷行是否勝利 for (i=0;i|
借用鵬哥的頭像(狗頭保命)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125073.html
摘要:三子棋代碼耗時三天,本人很菜,瘋狂不細心寫代碼真的很累本代碼使用編譯所以使用了懂得都懂如果使用別的編譯器請注意將起改為宏定義行數為為行,為列不會列的英文宏定義列數為也可以改為大棋盤,但要更改游戲機制初始 ...
摘要:三子棋目錄一問題介紹三子棋,在民間又叫井字棋。因為人們在游玩時常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋 目錄 一、問題介紹 ? ? ? ? 三子棋,在民間又叫井字棋。因為人們在游玩時常常不畫棋盤的邊框,正如漢字中的井字,多稱為井字棋。 三子棋的游戲規則十分的簡單: ...
摘要:簡單介紹了三子棋原理后接下來為大家講解分步目標及代碼如何實現。電腦下棋我們實現了玩家和電腦的下棋后,我們需要編寫一個函數來判斷雙方的輸贏。我們使用函數來實現這一目標。 目錄 1.三子棋原理 2.分塊代碼實現 3.總結 1.首先向大家介紹一下三子棋的原理 首先我們需要有一個棋盤,初始時棋...
摘要:今天博主將為大家帶來語言入門級小游戲三子棋井字棋的詳細介紹,希望這篇文章對大家能有幫助。在這里,我們使用函數來實現這一功能。 ?? ? ??今天博主將為大家帶來C語言入門級小游戲——三子棋(井字棋)的詳細介紹,希望這篇文章對大家能有幫助?。?? ? ? 在編程的學習過程中,編寫一些中這樣...
閱讀 2538·2023-04-26 00:57
閱讀 911·2021-11-25 09:43
閱讀 2221·2021-11-11 16:55
閱讀 2205·2019-08-30 15:53
閱讀 3592·2019-08-30 15:52
閱讀 1458·2019-08-30 14:10
閱讀 3379·2019-08-30 13:22
閱讀 1209·2019-08-29 11:18