【井字棋】
文章目錄
- 前言
- 一、內容封裝
- 二、基本流程
- (一)游戲菜單
- (二)數(shù)組初始化
- (三)棋盤打印
- (四)玩家落子
- (五)電腦落子
- (六)判斷輸贏
- 三、運行實例
- 四、完整代碼
- (一)game.h
- (二)game.c
- (三)test.c
- 總結
點擊跳轉:n子棋
前言
大家好,今天我們一起來動手完成學習數(shù)組時必寫小游戲之一 – 井字棋,
井字棋也叫三子棋,是一種在3*3格子上進行的連珠游戲,
和五子棋類似,由于棋盤一般不畫邊框,格線排成井字故得名。
由分別代表O和X的兩個游戲者輪流在格子里留下標記(一般來說先手者為X),
任意三個標記形成一條直線,則為獲勝。
示例如下 :
一、內容封裝
game.h:頭文件的引入,全局變量、自定義函數(shù)的聲明
game.c:自定義函數(shù)的實現(xiàn)
test.c:主函數(shù)所在
二、基本流程
(一)游戲菜單
游戲第一步當然是設計游戲菜單來告訴玩家如何開始游戲
代碼如下(示例):
void Menu() {puts("********************");puts("***** 1.play *****");puts("***** 0.quit *****");puts("********************"); }添加鏈接描述
(二)數(shù)組初始化
我們在創(chuàng)建數(shù)組時給數(shù)組賦值為‘0’,而字符‘0’是不會在屏幕上輸出的,
為了讓玩家知道應該在何處下棋,我們可以將他賦值為空格
代碼如下(示例):
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 Chess(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++) {printf(" %c ", arr[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");} }(四)玩家落子
玩家通過棋盤的坐標落子,我們讓玩家使用‘X’作為棋子,
這里我們就要來判斷該坐標是否存在,存在的話該坐標是否為空
代碼入下(示例):
void Piece_w(char arr[ROW][COL], int row, int col, char ch) {int x = 0;int y = 0;printf("玩家落子:");while (1) {scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col) {//位置存在if (arr[x - 1][y - 1] == ' ') {//該位置為空arr[x - 1][y - 1] = ch;break;}elseprintf("該位置不為空,請重新輸入\n");}elseprintf("該位置不存在,請重新輸入\n");} }(五)電腦落子
電腦落子和和玩家不同的一點為:x,y為隨機值,其他判斷條件相同
void Piece_c(char arr[ROW][COL], int row, int col, char ch) {printf("電腦落子:");while (1) {int x = rand() % row;int y = rand() % col;if (x >= 0 && x < row && y >= 0 && y < col) {//位置存在if (arr[x][y] == ' ') {//該位置為空printf("%d %d\n", x + 1, y + 1);arr[x][y] = ch;break;}}} }(六)判斷輸贏
井字棋獲勝的條件為:有三個連續(xù)且相同的棋子
這里分為三種情況:行連續(xù),列連續(xù)以及對角線連續(xù);
如果沒有人獲勝的話就判斷是否為平局。
三、運行實例
四、完整代碼
(一)game.h
代碼如下(示例):
#pragma once #include<stdio.h> #include<stdlib.h> #include<time.h> #define ROW 3 #define COL 3void Menu();void Init(char arr[ROW][COL], int row, int col);void Chess(char arr[ROW][COL], int row, int col);void Piece_w(char arr[ROW][COL], int row, int col, char ch);void Piece_c(char arr[ROW][COL], int row, int col, char ch);char Judge(char arr[ROW][COL], int row, int col);(二)game.c
代碼如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h"void Menu() {puts("********************");puts("***** 1.play *****");puts("***** 0.quit *****");puts("********************"); }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 Chess(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++) {printf(" %c ", arr[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 Piece_w(char arr[ROW][COL], int row, int col, char ch) {int x = 0;int y = 0;printf("玩家落子:");while (1) {scanf("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col) {//位置存在if (arr[x - 1][y - 1] == ' ') {//該位置為空arr[x - 1][y - 1] = ch;break;}elseprintf("該位置不為空,請重新輸入\n");}elseprintf("該位置不存在,請重新輸入\n");} }void Piece_c(char arr[ROW][COL], int row, int col, char ch) {printf("電腦落子:");while (1) {int x = rand() % row;int y = rand() % col;if (x >= 0 && x < row && y >= 0 && y < col) {//位置存在if (arr[x][y] == ' ') {//該位置為空printf("%d %d\n", x + 1, y + 1);arr[x][y] = ch;break;}}} }char draw(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++) {if (arr[i][j] == ' ')return 'c';}}return 'p'; }char Judge(char arr[ROW][COL], int row, int col) {int i = 0;//rowfor (i = 0; i < row; i++) {if (arr[i][0] == arr[i][1] && arr[i][1] == arr[i][2] && arr[i][1] != ' ')return arr[i][0];}//colfor (i = 0; i < col; i++) {if (arr[0][i] == arr[1][i] && arr[1][i] == arr[2][i] && arr[1][i] != ' ')return arr[0][i];}//對角線if (arr[0][0] == arr[1][1] && arr[1][1] == arr[2][2] && arr[1][1] != ' ')return arr[1][1];if (arr[0][2] == arr[1][1] && arr[1][1] == arr[2][0] && arr[1][1] != ' ')return arr[1][1];//平局return draw(arr, row, col); }(三)test.c
代碼如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #include"game.h"void Game(char arr[ROW][COL]) {//設置棋盤Chess(arr, ROW, COL);char ch = 'c';while (1) {//下棋Piece_w(arr, ROW, COL, 'X');Chess(arr, ROW, COL);//判斷ch = Judge(arr, ROW, COL);if (ch != 'c')break;Piece_c(arr, ROW, COL, 'O');Chess(arr, ROW, COL);ch = Judge(arr, ROW, COL);if (ch != 'c')break;}if ('X' == ch)printf("玩家獲勝\n");else if ('O' == ch)printf("電腦獲勝\n");elseprintf("平局\n"); }int main() {char arr[ROW][COL] = { 0 };srand((unsigned int)time(NULL));int input = 0;do {//菜單Menu();//初始化棋子Init(arr, ROW, COL);printf("請選擇:");scanf("%d", &input);switch (input) {case 1: Game(arr);break;case 0:printf("游戲結束\n");break;default:printf("無效數(shù)字,請重新輸入\n");break;}system("pause"); //按下任意鍵繼續(xù)system("cls"); //清空屏幕} while (input);return 0; }總結
以上就是今天要講的內容,本文僅僅簡單介紹了井字棋的實現(xiàn),
而該井字棋實現(xiàn)還有很多可以改進的地方,
比如判斷條件只對33的井字棋有效,若改為55便不行了、
還有就是只能判斷三連子,更多的四連、五連則不行、
5*5時對角線就不止主反對角線了等等;
而這些問題就留在下一篇博客我們再一起討論吧,
在此感謝大家對的支持,這是熊貓持續(xù)更新下去的巨大推進力!
總結
- 上一篇: 浅谈:刷机必备神器,不断更新
- 下一篇: 今日骑行路线里程。。。